Itasca C++ Interface
Loading...
Searching...
No Matches
ithing.h
Go to the documentation of this file.
1#pragma once
5
6#include "igroup.h"
7#include "base/src/farray.h"
8#include "base/src/spinlock.h"
9#include <mutex>
10
11namespace fish {
12 class IParameter;
13}
14
15namespace itasca {
16#ifndef DOXYGEN
17 class Archive2;
18 class IContainer;
19 class IGroup;
20#endif
21
22//#define ITHINGMUTEX
23
31 class IThing {
32 public:
33#ifdef ITHINGMUTEX
34 using LockType = std::mutex;
35#else
36 using LockType = SpinLock;
37#endif
38
39 class Lock : public std::lock_guard<LockType> {
40 public:
41 inline Lock(const IThing *t) : std::lock_guard<LockType>(t->thingLock_) { }
42 };
43
44 class LockIf : public ConditionalLock<LockType> {
45 public:
46 inline LockIf(const IThing *t, bool b) : ConditionalLock<LockType>(t ? &t->thingLock_ : nullptr,b) { }
47 };
48
49 class BreakLock : public ReverseLock<LockType> {
50 public:
51 inline BreakLock(const IThing *t) : ReverseLock<LockType>(t->thingLock_) {}
52 };
53
54 struct Handle { // Used in the Handle system, so we have some opacity and flexibility in the future
55 Handle() {}
56 explicit Handle(uint64 h) : val_(h) { }
57 bool operator<(const Handle &h) const { return val_<h.val_; }
58 bool operator==(const Handle &h) const { return val_==h.val_; }
59 bool valid() const { return val_ ? true : false; }
60 uint64 val_ = 0;
61 };
62
64 inline static const TType type_ = 0x4c815a59;
66 inline static const uint32 maxGroupSlot_ = 128;
68 inline static const uint32 maxExtraIndex_ = 128;
69
70 inline IThing() { }
71 virtual ~IThing() { }
72 //inline ~IThing() { sendDeleteNotice(); }
73
75 virtual const IThing *getIThing() const=0;
76 virtual IThing * getIThing()=0;
77
82 virtual TType getType() const=0;
83
85 virtual string getTypeName() const=0;
86
93 virtual TType getGeneralType() const=0;
94
100 virtual const void *convertToType(const TType &id) const=0;
101 virtual void * convertToTypeNC(const TType &id)=0;
102
105 template <class T> const T *convert() const { return (const T *)convertToType(T::type_); }
106 template <class T> T * convert() { return (T *)convertToType(T::type_); }
107
109 virtual uint64 getID() const=0;
110 virtual void setID(uint64)=0;
111
116 virtual uint64 getCollectionID() const=0;
117
120 virtual bool getIsSet() const=0;
121
124 virtual const IThing * getSet() const=0;
125
127 virtual void getAssociatedThings(const TType &type,FArray<const IThing*> *ret) const=0;
128
131
133 virtual string getName() const=0;
134
137 virtual DVect3 getLocation() const=0;
138
141 virtual DExtent3 getExtent() const=0;
142
146 virtual DVect3 getClosest(const DVect3 &pos) const=0;
147
149 virtual DVect3 getNormal() const=0;
150
152 virtual DVect3 getDisplacementThing() const=0;
153
155 virtual DVect3 getVelocityThing() const=0;
156
158 virtual double getVolume() const=0;
159
163 virtual bool isWithinOrientation(const Orientation3 &orientation,const DVect2 &tol) const=0;
164
166 virtual bool isOnSurface() const=0;
167
170 virtual const IContainer *getContainer() const=0;
174 virtual uint64 getContainerOrder() const=0;
175
178 //virtual bool addGroup(IGroupID *id)=0;
179 virtual bool addGroup(const IGroupID &id) = 0;
183 virtual bool removeGroup(const IGroupID &id)=0;
190 virtual uint32 isInGroup(const FArray<IGroupID> &ids,TType type=0,bool only=false) const=0;
193 virtual const IGroup *getGroup(const ISlotID &slot) const=0;
197 virtual string getGroupName(const ISlotID &slot=ISlotID()) const=0;
199 virtual void getGroupInfo(std::vector<std::pair<int,string>> *) const = 0;
201 virtual uint32 getGroupList(FArray<IGroupID> *list) const=0;
203 virtual void copyGroups(const IThing *t)=0;
204 virtual void clearGroup()=0;
205
207 virtual std::vector<uint32> getExtraIndices() const=0;
210 virtual const fish::IParameter *getExtra(uint32 index) const=0;
211 virtual void setExtra(uint32 index,const fish::IParameter &p)=0;
212 virtual void clearExtra()=0;
213
215 virtual bool getHidden() const=0;
217 virtual bool setHidden(bool b)=0;
218
220 virtual bool getSelected() const=0;
222 virtual bool setSelected(bool b)=0;
223
225 virtual void save(Archive2 &) const=0;
226 virtual bool restore(Archive2 &,uint64)=0;
227 virtual void remap(Archive2 &)=0;
228 virtual Handle getRemapHandle(bool allowCreate,uint32 thread) const=0;
229 //virtual void clearRemapHandle()=0;
230
233 virtual void destroy()=0;
234
235 private:
236 mutable LockType thingLock_; // Generic spin lock for access to this IThing
237 };
238
240 template <class Dest> inline const Dest *convert_cast(const IThing *src) { return src ? src->convert<Dest>() : 0; }
242 template <class Dest> inline Dest * convert_cast(IThing *src) { return src ? src->convert<Dest>() : 0; }
243
245 template <class Dest, class Src> inline const Dest* convert_getcast(const Src* src) { return src ? src->getIThing()->template convert<Dest>() : 0; }
247 template <class Dest, class Src> inline Dest* convert_getcast(Src* src) { return src ? src->getIThing()->template convert<Dest>() : 0; }
248
249 inline int64 pointCompare(const IThing *p1,const IThing *p2) {
250 int64 i1 = p1 ? p1->getType() : 0;
251 int64 i2 = p2 ? p2->getType() : 0;
252 if (i1 == i2) {
253 i1 = p1 ? p1->getID() : 0;
254 i2 = p2 ? p2->getID() : 0;
255 }
256 return i1 - i2;
257 }
258} // namespace itasca
259namespace std {
260 template <>
261 struct hash<itasca::IThing::Handle> {
262 std::size_t operator()(const itasca::IThing::Handle &h) const { return hash<uint64>()(h.val_); }
263 };
264} // namespace std
265namespace utility {
266 using itasca::IThing;
269}
270
271// EoF
Definition spinlock.h:66
An array class that attempts to minimize unnecessary heap access.
Definition farray.h:25
Class for storing an "orientation", or a direction in 2D or 3D space.
Definition orientation.h:99
Definition spinlock.h:56
Definition spinlock.h:27
Definition iparameter.h:19
Interface for containers of IThings.
Definition icontainer.h:21
Interface to a group object.
Definition igroup.h:9
Definition igroup.h:82
Definition igroup.h:41
Definition ithing.h:49
Definition ithing.h:39
Definition ithing.h:44
Base class for items that will be stored in containers.
Definition ithing.h:31
virtual DVect3 getLocation() const =0
virtual bool getIsSet() const =0
virtual DVect3 getClosest(const DVect3 &pos) const =0
virtual DVect3 getVelocityThing() const =0
Returns the instantaneous velocity for things supporting velocity.
virtual void setExtra(uint32 index, const fish::IParameter &p)=0
virtual bool setSelected(bool b)=0
Sets the selected flag at index.
virtual DVect3 getDisplacementThing() const =0
Returns the accumulated displacement for things supporting displacement.
virtual void getAssociatedThings(const TType &type, FArray< const IThing * > *ret) const =0
Returns a list of things associated with this thing with TType type.
virtual bool addGroup(const IGroupID &id)=0
static const TType type_
The base type of an IThing.
Definition ithing.h:64
virtual DVect3 getNormal() const =0
Returns a normal vector representing the orientation of the object, if this is appropriate....
virtual bool isOnSurface() const =0
Returns TRUE if this is a "Surface".
virtual void destroy()=0
virtual void resetAssociatedThings(FArray< const IThing * > *ret)=0
Resets any data used with the associated things.
virtual bool getHidden() const =0
Returns the Hide flag at index.
virtual uint32 isInGroup(const FArray< IGroupID > &ids, TType type=0, bool only=false) const =0
static const uint32 maxExtraIndex_
Maximum number of extra FISH variables per object.
Definition ithing.h:68
virtual IThing * getIThing()=0
Return the IThing interface.
virtual DExtent3 getExtent() const =0
virtual void getGroupInfo(std::vector< std::pair< int, string > > *) const =0
Returns the group name/slot for all groups.
virtual TType getGeneralType() const =0
virtual const IThing * getIThing() const =0
Return the IThing interface.
virtual std::vector< uint32 > getExtraIndices() const =0
Returns the number of extra FISH extra variables for this object.
virtual bool isWithinOrientation(const Orientation3 &orientation, const DVect2 &tol) const =0
virtual uint64 getID() const =0
Returns a value - the exact meaning of which is defined by the container and the implementing class.
T * convert()
Definition ithing.h:106
virtual string getTypeName() const =0
Returns a description of the type of the class.
const T * convert() const
Definition ithing.h:105
virtual IContainer * getContainer()=0
virtual const IGroup * getGroup(const ISlotID &slot) const =0
virtual void * convertToTypeNC(const TType &id)=0
virtual bool getSelected() const =0
Returns the selected flag at index.
virtual string getGroupName(const ISlotID &slot=ISlotID()) const =0
virtual double getVolume() const =0
Returns the volume if this is appropraite. 0 is returned otherwise.
virtual const IContainer * getContainer() const =0
virtual bool removeGroup(const IGroupID &id)=0
virtual TType getType() const =0
static const uint32 maxGroupSlot_
Maximum number of group slots per object.
Definition ithing.h:66
virtual const fish::IParameter * getExtra(uint32 index) const =0
virtual const IThing * getSet() const =0
virtual uint32 getGroupList(FArray< IGroupID > *list) const =0
Return all groups and all slots assigned to the object in a list.
virtual const void * convertToType(const TType &id) const =0
virtual void save(Archive2 &) const =0
Archives the Thing to a file (if appropriate).
virtual uint64 getCollectionID() const =0
virtual bool setHidden(bool b)=0
Sets the hidden flag at index.
virtual void copyGroups(const IThing *t)=0
Copies group data from one IThing to this, all original group data is lost.
virtual string getName() const =0
Returns a name string - the exact meaning of which is defined by the container and the implementing c...
An array class that attempts to minimize unnecessary heap access.
uint32 TType
class type indicator
Definition basedef.h:47
namespace Itasca
Definition basememory.cpp:14
const Dest * convert_cast(const IThing *src)
A cast operator (use similar to dynamic_cast) for types derived from IThing (const).
Definition ithing.h:240
const Dest * convert_getcast(const Src *src)
A cast operator for Interface types that define getThing() (const).
Definition ithing.h:245
namespace itasca
Definition igenerictet.h:11
Definition ithing.h:54