GranOO  3.0
A robust and versatile workbench to build 3D dynamic simulations based on the Discrete Element Method
Base.hpp
Go to the documentation of this file.
1 // This file is part of GranOO, a workbench for DEM simulation.
2 //
3 // Author(s) : - Damien Andre IRCER/UNILIM, Limoges France
4 // <damien.andre@unilim.fr>
5 // - Jean-luc Charles Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
6 // <jean-luc.charles@ensam.eu>
7 // - Jeremie Girardot Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
8 // <jeremie.girardot@ensam.eu>
9 // - Cedric Hubert LAMIH/UPHF, Valenciennes France
10 // <cedric.hubert@uphf.fr>
11 // - Ivan Iordanoff Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
12 // <ivan.iordanoff@ensam.eu>
13 //
14 // Copyright (C) 2008-2019 D. Andre, JL. Charles, J. Girardot, C. Hubert, I. Iordanoff
15 //
16 // This program is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 // This program is distributed in the hope that it will be useful,
22 // but WITHOUT ANY WARRANTY; without even the implied warranty of
23 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 // GNU General Public License for more details.
25 //
26 // You should have received a copy of the GNU General Public License
27 // along with this program. If not, see <http://www.gnu.org/licenses/>.
28 
29 
30 
31 #ifndef _Core_Base_hpp_
32 #define _Core_Base_hpp_
33 
34 
35 #include <string>
36 
37 #include "GranOO3/Core/Null.hpp"
40 #include "GranOO3/Core/SetOf.hpp"
41 #include "GranOO3/Core/Macro.hpp"
42 #include "GranOO3/Core/String.hpp"
44 
45 // To automatize registering with Set (see SetOf.hpp), the classes
46 // must inherit from Base class and Register<T> class and
47 // implements the macros below.
48 
49 
50 
51 namespace GranOO3
52 {
53  namespace Physic {class Material;}
54  namespace Core
55  {
56 
57  class Base : public Null,
58  public Core::Drawable,
59  public Register<Base>
60 
61  {
62  GRANOO_CLASS_BASE(Core::Base, Null);
63 
64  public:
65  static Base &get_by_numID(size_t);
66  static void clear_all_numID();
67  static unsigned int get_sub_class_number();
68 
69  protected:
70  static unsigned int affect_class_rank_ID();
71 
72  private:
73  static unsigned int _sub_class_number;
74  static size_t uID_counter;
75 
76  public:
77  virtual ~Base();
78 
79  virtual std::string info() const;
80  size_t numID() const;
81  size_t uID() const;
82  void set_numID(size_t val);
83  void clear_numID();
84 
85  // material management
86  Physic::Material& get_mat() const;
88 
89  // Hum.. it's a hack, not very proud of that, but it works.
90  Base& item();
91  const Base& item() const;
92 
93  // check if two base object are the same
94  bool is_same(const Base&) const;
95 
96  template<class T> T& cast_to();
97  template<class T> const T& cast_to() const;
98  template<class T> bool is() const;
99 
100  virtual bool is(size_t) const; // Check ClassNumID
101  virtual const std::string& get_ID() const;
102 
103  // clone
104  virtual Base& clone();
105  template<class T> T& clone_to();
106 
107  virtual std::ostream& write_ascii (std::ostream& out) const;
108  virtual std::istream& read_ascii (std::istream& in);
109  virtual std::ostream& export_to_povray (std::ostream& out) const;
110 
111  // Signal
113 
114  protected:
115  Base();
116 
117  private:
118  Base & operator=(const Base &) = delete;
119  // serialization
121  template<class Archive> void serialize(Archive & ar, const unsigned int );
122 
123  private:
124  static std::map<size_t, Base*> _registered_num;
125 
126  private:
127  size_t _numID;
128  size_t _uID;
131  };
132 
133  inline Signal<Base &>&
135  return _deleted_signal;
136  }
137 
138  inline bool
139  Base::is(size_t classID) const {
140  return (classID == class_num_ID());
141  }
142 
143  inline const std::string&
144  Base::get_ID() const {
146  }
147 
148  template<class T>
149  inline bool
150  Base::is() const {
151  return is(T::class_num_ID());
152  }
153 
154  template<class T>
155  inline T&
157  static_assert(std::is_base_of<Base, T>::value,
158  "T must inherit from Core::Base class");
159  SafeModeAssert(is(T::class_num_ID()),
160  "Can't cast this item to " + Core::String::quote(T::class_ID()));
161  return reinterpret_cast<T&>(*this);
162  }
163 
164  template<class T>
165  inline const T&
166  Base::cast_to() const {
167  static_assert(std::is_base_of<Base, T>::value,
168  "T must inherit from Core::Base class");
169  SafeModeAssert(is(T::ClassnumID()),
170  "Can't cast this item to " + Core::String::quote(T::class_ID()));
171  return reinterpret_cast<const T&>(*this);
172  }
173 
174 
175  template<class T>
176  inline T& Base::clone_to() {
177  Base& b = clone();
178  return b.cast_to<T>();
179  }
180 
181  inline bool
182  Base::is_same(const Base&b) const {
183  return this == &b;
184  }
185 
186  template<class Archive>
187  void
188  Base::serialize(Archive& ar, const unsigned int version) {
189  if (version >= 1)
190  ar & _uID;
191  }
192 
193  inline std::string
194  Base::info() const {
195  std::ostringstream os;
196  os << "** " << top_class_ID() << " ** ID:" << Register<Base>::get_numeric_ID() << '\n';
197  return os.str();
198  }
199 
200  inline
201  size_t Base::numID() const {
202  return _numID;
203  }
204  inline
205  size_t Base::uID() const {
206  return _uID;
207  }
208 
209 
210  inline
211  void Base::set_numID(size_t val) {
212  _numID = val;
213  _registered_num[_numID] = this;
214  }
215 
216  inline void
219  SafeModeAssert(_registered_num.count(_numID) == 1, "");
220  _registered_num.erase(_numID);
222  }
223  }
224 
225  inline Physic::Material&
226  Base::get_mat() const {
227  AssertMsg(_mat != nullptr, "no material is available for this item");
228  return *_mat;
229  }
230 
231  inline void
233  _mat = m;
234  }
235 
236  inline
238  return *this;
239  }
240 
241  inline
242  const Base& Base::item() const {
243  return *this;
244  }
245 
246  template<> inline
247  SetOf<Null>*
249  return nullptr;
250  }
251 
252  template<> inline
253  void*
254  SetOf<Base>::get_item_by_base_class_rank(size_t i, size_t classNumID) {
255  Base& pt = Base::get_by_numID(i);
256  SafeModeAssert(pt.is(classNumID), "");
257  return &pt;
258  }
259 
260  template<>
261  struct Read<Base>
262  {
263  static Base* new_object(const std::string& classID, std::istream& in) {
264  UserAssert(0, "Can't instanciate an object of class " + Core::String::quote(classID) +
265  ". You must specialize the Read struct with the given class.");
266  return nullptr;
267  }
268 
269  };
270 
271  }
272  GRANOO_CLASS_DECLARE_TPL(Core::Base);
273 }
274 
275 
276 #include <boost/serialization/version.hpp>
278 
279 
280 // - Concat allows to recursive concatenation of classID with variadic template
281 namespace GranOO3
282 {
283  namespace Core
284  {
285 
286  template <typename ... Args>
287  struct Concat;
288 
289  template <typename First, typename ... Args>
290  struct Concat<First, Args...>
291  {
292  static std::string ID() {
293  return First::class_ID() + Concat<Args...>::SEP() + Concat<Args...>::ID();
294  }
295 
296  static std::string SEP() {
297  return ",";
298  }
299 
300  };
301 
302  template <>
303  struct Concat<>
304  {
305  static std::string ID() {
306  return "";
307  }
308 
309  static std::string SEP() {
310  return "";
311  }
312 
313  };
314 
315  template <typename ... Args>
316  std::string Concatclass_ID() {
317  return Concat<Args...>::ID();
318  }
319 
320  }
321 }
322 
323 #endif
324 
325 
326 
BOOST_CLASS_VERSION(GranOO3::Core::Base, 1) namespace GranOO3
Definition: Base.hpp:277
#define SafeModeAssert(condition, message)
Definition: Macro.hpp:47
#define AssertMsg(condition, message)
Definition: Macro.hpp:67
#define UserAssert(condition, message)
Definition: Macro.hpp:54
Definition: Base.hpp:61
Base & operator=(const Base &)=delete
Base & item()
Definition: Base.hpp:237
size_t numID() const
Definition: Base.hpp:201
virtual std::string info() const
Definition: Base.hpp:194
size_t uID() const
Definition: Base.hpp:205
void serialize(Archive &ar, const unsigned int)
Definition: Base.hpp:188
Signal< Base & > _deleted_signal
Definition: Base.hpp:129
bool is() const
Definition: Base.hpp:150
Signal< Base & > & deleted_signal()
Definition: Base.hpp:134
virtual std::ostream & export_to_povray(std::ostream &out) const
Definition: Base.cpp:97
virtual std::istream & read_ascii(std::istream &in)
Definition: Base.cpp:92
T & cast_to()
Definition: Base.hpp:156
static unsigned int get_sub_class_number()
Definition: Base.cpp:59
void set_numID(size_t val)
Definition: Base.hpp:211
Physic::Material * _mat
Definition: Base.hpp:130
static void clear_all_numID()
Definition: Base.cpp:53
virtual ~Base()
Definition: Base.cpp:75
static unsigned int _sub_class_number
Definition: Base.hpp:73
bool is_same(const Base &) const
Definition: Base.hpp:182
static size_t uID_counter
Definition: Base.hpp:74
static Base & get_by_numID(size_t)
Definition: Base.cpp:46
Physic::Material & get_mat() const
Definition: Base.hpp:226
void clear_numID()
Definition: Base.hpp:217
void set_mat(Physic::Material *)
Definition: Base.hpp:232
size_t _uID
Definition: Base.hpp:128
static unsigned int affect_class_rank_ID()
Definition: Base.cpp:64
friend class boost::serialization::access
Definition: Base.hpp:120
T & clone_to()
Definition: Base.hpp:176
Base()
Definition: Base.cpp:70
virtual Base & clone()
Definition: Base.cpp:81
virtual std::ostream & write_ascii(std::ostream &out) const
Definition: Base.cpp:87
size_t _numID
Definition: Base.hpp:127
virtual const std::string & get_ID() const
Definition: Base.hpp:144
static std::map< size_t, Base * > _registered_num
Definition: Base.hpp:124
Definition: Drawable.hpp:55
Definition: Null.hpp:47
Definition: SetOf.hpp:346
unsigned long long int get_numeric_ID() const
Definition: Null.hpp:59
Definition: SetOfGeneric.hpp:46
static type & get_item_by_base_class_rank(size_t i)
SetOf< typename type::base > * get_base_class_set(SetOfGeneric *)
Definition: Signal.hpp:53
Definition: Material.hpp:69
Definition: Common.hpp:198
T max(const T v0, const T v1)
Definition: Exprtk.hpp:1463
T value(details::expression_node< T > *n)
Definition: Exprtk.hpp:15070
static char_cptr version
Definition: Exprtk.hpp:44221
static Base * new_object(const std::string &classID, std::istream &in)
Definition: Base.hpp:263
Definition: SetOfManager.hpp:63
static std::string quote(const std::string &str)
Definition: String.cpp:73
static const std::string empty_string
Definition: String.hpp:45