Itasca C++ Interface
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
icontainer.h
Go to the documentation of this file.
1 #pragma once
2 
5 #include "base/src/baseqt.h"
6 #include "isignalbase.h"
7 #include "ithing.h"
8 
9 
10 namespace itasca {
11  class IThing;
12 
23  class IContainer {
24  public:
26  inline static const TType type_ = 0x51cdf4ed;
27 
30 
32  class IOpaqueIterator { };
33 
35  virtual IThing * getIThing()=0;
37  virtual const IThing *getIThing() const=0;
39  virtual IContainer * getIContainer()=0;
41  virtual const IContainer *getIContainer() const=0;
43  virtual bool getValueBased() const=0;
45  virtual quint64 getSize() const=0;
47  virtual quint64 getNumberHidden() const=0;
49  virtual quint64 getNumberSelected() const=0;
52  virtual quint64 getNextID() const=0;
54  virtual void setNextID(quint64)=0;
59  virtual IThing * remove(IThing *t)=0;
64  virtual void erase(IThing *t)=0;
69  virtual IThing * add(IThing *t,quint64 id=0)=0;
72  virtual void clear()=0;
76  virtual IThing * findWithID(quint64 id)=0;
80  virtual const IThing *findWithID(quint64 id) const=0;
82  virtual quint64 getInstance(quint64 id) const=0;
87  virtual IThing * findWithName(const QString &s)=0;
92  virtual const IThing *findWithName(const QString &s) const=0;
98  virtual signal_type *getAddedSignal() const=0;
103  virtual signal_type *getRemovedSignal() const=0;
108  virtual signal_type *getDestroySignal() const=0;
109 
111  virtual IOpaqueIterator *acquire() const=0;
114  virtual void release(IOpaqueIterator *i) const=0;
117  virtual bool atEnd(IOpaqueIterator *i) const=0;
120  virtual IThing * get(IOpaqueIterator *i)=0;
123  virtual const IThing * get(IOpaqueIterator *i) const=0;
127  virtual bool increment(IOpaqueIterator *i) const=0;
131  virtual bool copy(IOpaqueIterator *iSrc,IOpaqueIterator *iDst) const=0;
134  virtual IThing * doSilentRemove(IThing *t)=0;
135  };
136 
145  template <class T> class ICIterator {
146  public:
149  ICIterator(const IContainer *c) : c_(c), i_(nullptr) { if (c_) i_ = c_->acquire(); }
151  ~ICIterator() { if (c_&&i_) c_->release(i_); }
153  void setContainer(const IContainer *c) { if (c_&&i_) c_->release(i_); i_ = 0; c_ = c; if (c_) i_ = c_->acquire(); }
155  const IContainer *getContainer() const { return c_; }
157  bool atEnd() const { if (!c_ || !i_) return true; return c_->atEnd(i_); }
159  const ICIterator<T> &operator++() { if (c_&&i_) c_->increment(i_); return *this; }
160 
163  //const ICIterator<T> &operator+=(int i) { if (c_&&i_) c_->incrementBy(i_, i); return *this; }
167  //quint64 operator-(const ICIterator& earlier) { if (c_&&i_) return c_->subtract(this, &earlier); return 0; }
168 
170  const T *get() const { if (!c_ || !i_) return 0; return convert_cast<T>(c_->get(i_)); }
172  const T *operator->() const { return get(); }
174  const T &operator*() const { return *get(); }
176  operator const T *() const { return get(); }
178  void copy(const ICIterator<T> &c) { if (c_&&i_) c_->release(i_); i_ = 0; c_ = c.c_; if (c_) i_ = c_->acquire(); if (c_&&c.i_) c_->copy(c.i_,i_); }
179  private:
180  ICIterator(const ICIterator &); // DISALLOWED
181  void operator=(const ICIterator &); // DISALLOWED
182  const IContainer * c_;
184  };
185 
194  template <class T> class IIterator : public ICIterator<T> {
195  public:
200  const IIterator<T> &operator++() { ICIterator<T>::operator++(); return *this; }
204  T *get() const { return const_cast<T *>(ICIterator<T>::get()); }
206  T *operator->() const { return get(); }
208  T &operator*() const { return *get(); }
210  operator T *() const { return get(); }
211  private:
212  IIterator(const IIterator &); // DISALLOWED
213  void operator=(const IIterator &); // DISALLOWED
214  };
215 
216 }
217 // EoF
const ICIterator< T > & operator++()
Increment the const iterator to the next entry in the IContainer.
Definition: icontainer.h:159
virtual IThing * add(IThing *t, quint64 id=0)=0
const T * operator->() const
Return a const pointer to T.
Definition: icontainer.h:172
virtual void release(IOpaqueIterator *i) const =0
Interface class for iterating through the container that has a null implementation.
Definition: icontainer.h:32
namespace Itasca
Definition: basememory.cpp:9
Definition of a Signal2 object, holding a list of ISlot2 objects.
Definition: isignalbase.h:76
virtual signal_type * getRemovedSignal() const =0
virtual bool copy(IOpaqueIterator *iSrc, IOpaqueIterator *iDst) const =0
Base class for items that will be stored in containers.
Definition: ithing.h:31
virtual bool getValueBased() const =0
Returns TRUE if the container is value based, or pointer based.
virtual bool increment(IOpaqueIterator *i) const =0
Interface for the small-granularity callback utility.
Const iterator for an IContainer.
Definition: icontainer.h:145
virtual quint64 getSize() const =0
Returns the IThing count or number of IThings held in the container.
virtual quint64 getNumberHidden() const =0
Returns the number of IThings that have getHidden()==true.
virtual quint64 getNextID() const =0
Iterator for an IContainer.
Definition: icontainer.h:194
virtual IThing * findWithName(const QString &s)=0
unsigned int TType
class type indicator
Definition: basedef.h:41
virtual void erase(IThing *t)=0
T & operator *() const
Return a referenc to T.
Definition: icontainer.h:208
static const TType type_
The type identification number for this class, for use in convert_cast() and convert_getcast().
Definition: icontainer.h:26
virtual quint64 getNumberSelected() const =0
Returns the number of IThings that have getSelected()==true.
const IContainer * getContainer() const
Get the IContainer pointer that this iterator is associated with.
Definition: icontainer.h:155
virtual IThing * remove(IThing *t)=0
ICIterator(const IContainer *c)
Definition: icontainer.h:149
T * get() const
Return a pointer to T.
Definition: icontainer.h:204
virtual bool atEnd(IOpaqueIterator *i) const =0
virtual void clear()=0
virtual signal_type * getDestroySignal() const =0
void setContainer(const IContainer *c)
Associate this with a different container.
Definition: icontainer.h:153
IIterator(IContainer *c)
Definition: icontainer.h:198
const T * get() const
Return a const pointer to T.
Definition: icontainer.h:170
virtual void setNextID(quint64)=0
Set the maximum ID. This should only be used on a restore if manipulating the container under the hoo...
virtual signal_type * getAddedSignal() const =0
~ICIterator()
Destructor for the const iterator.
Definition: icontainer.h:151
Signal2< const IThing *, const IContainer * > signal_type
Defines the Signal2<> type used for removed, added, and destroy signals sent from the container.
Definition: icontainer.h:29
virtual IThing * getIThing()=0
Returns the IThing pointer of the container.
Interface for containers of IThings.
Definition: icontainer.h:23
void copy(const ICIterator< T > &c)
Copy another iterator.
Definition: icontainer.h:178
bool atEnd() const
Returns true if at the end of the IContainer.
Definition: icontainer.h:157
void setContainer(IContainer *c)
Associate this with a different container.
Definition: icontainer.h:202
const T & operator *() const
Return a const reference to T.
Definition: icontainer.h:174
T * operator->() const
Return a pointer to T.
Definition: icontainer.h:206
virtual IThing * get(IOpaqueIterator *i)=0
virtual IOpaqueIterator * acquire() const =0
Acquire a new IOpaqueIterator for use iterating through the container.
virtual quint64 getInstance(quint64 id) const =0
Return instance count associated with id, this is always 0 if not a value based container.
All default base headers if Qt is being used.
const IIterator< T > & operator++()
Increment the iterator to the next entry in the IContainer.
Definition: icontainer.h:200
virtual IContainer * getIContainer()=0
Returns the IThing pointer of the container.
virtual IThing * doSilentRemove(IThing *t)=0
Base class for items that will be stored in containers.
virtual IThing * findWithID(quint64 id)=0