FARGOS/VISTA Object Management Environment Core  ..
FARGOS/VISTA Object Management Environment Core Table of Contents
OMEset.h
Go to the documentation of this file.
1 #ifndef _OME_SET_H
2 # define _OME_SET_H "$Id: OMEset.h 312 2020-03-21 21:25:35Z geoff $"
3 
11 # include <deque>
12 
13 # include <OMErefCount.h>
14 
15 typedef class OMEbaseType *OMEbaseTypeP;
16 
17 // OMEsetStorage is used internally by OMEset, thus all of its
18 // members are private and OMEset is listed as a friend.
19 
20 class OMEsetStorage final : public OMEreferenceCount
21 {
22  friend class OMEset;
24 
25 private:
26  _STD deque<OMEbaseTypeP> dataSet;
27 
28  // default initializer
29  OMEsetStorage();
30 
31  // destructor
33 
34  virtual OMEreferenceCount *deepCopy() const override;
35 
36  OMEsetStorage &operator+=(const OMEbaseType &);
37 
38  OMEsetStorage &operator-=(const OMEbaseType &);
39 
40  OMEsetStorage &operator|=(const OMEbaseType &);
41 
42  OMEsetStorage &operator&=(const OMEbaseType &);
43 
44  bool operator==(const OMEsetStorage &arg) const;
45 
46  bool operator!=(const OMEsetStorage &arg) const;
47 
49  {
50  return (dataSet.size());
51  }
52 
53  uint32_t isEmpty() const OME_ALWAYS_INLINE
54  {
55  return (dataSet.empty());
56  }
57 
58  bool elementExists(const OMEbaseType &elem) const;
59 
60  template <typename STREAMTYPE> STREAMTYPE &outputOnStream(STREAMTYPE &outputStream,
61  int_fast16_t indent = 0, uint8_t includeTypePrefix = OME_DEFAULT_COMPLEX_OUTPUT_MODE) const;
62 }; // end class OMEsetStorage
63 
64 class OME_DLL_EXPORT OMEset final : public OMEreferenceToData<OMEsetStorage>
65 {
66 private:
67  _STD deque<OMEbaseTypeP>::const_iterator *iterator;
68 
69 
70  explicit OMEset(OMEsetStorage *s)
71  {
72  // only used by deepCopy()
73  iterator = nullptr;
74  data = s;
75  }
76 
77 public:
78  // default initializer
80  {
81  iterator = nullptr;
82  data = new OMEsetStorage();
83  }
84 
85  // copy initializer
86  explicit OMEset(const OMEset &org) : OMEreferenceToData<OMEsetStorage>(org.data)
87  {
88  iterator = nullptr;
89 // data = org.data;
90 // addReadOnlyReference();
91  }
92 
94  {
95  OME_DELETE_OBJECT(iterator);
96  }
97 
98  // ASSIGNMENT
99  OMEset &operator=(const OMEset &arg)
100  {
101  if (this->data == arg.data) {
102  std::cerr << "OMEset assignment to self, ref=" << totalReferences() << "\n";
103  return (*this); // asignment to self...
104  }
105  arg.data->addReadOnlyReference();
106  OME_DELETE_OBJECT(iterator);
107  iterator = nullptr;
108 
109  dropReference(arg.data);
110  return (*this);
111  }
112 
113  // COMPARISON
114  bool operator==(const OMEset &arg) const
115  {
116  if (data == arg.data) {
117  return (true); // fast path
118  }
119  return (*data == *arg.data);
120  }
121 
122  bool operator!=(const OMEset &arg) const
123  {
124  if (data == arg.data) {
125  return (false); // fast path
126  }
127  return (*data != *arg.data);
128  }
129 
130  bool operator==(const OMEbaseType &arg) const;
131 
132  bool operator!=(const OMEbaseType &arg) const;
133 
134  OMEset *deepCopy() const
135  {
136  OMEsetStorage *storageCopy = static_cast<OMEsetStorage *>(data->deepCopy());
137  OMEset *copy = new OMEset(storageCopy);
138  return (copy);
139  }
140 
141  OMEset &operator+=(const OMEbaseType &item)
142  {
144  OME_DELETE_OBJECT(iterator);
145  iterator = nullptr;
146  *data += item;
147  return (*this);
148  }
149 
150  OMEset &operator-=(const OMEbaseType &item)
151  {
153  OME_DELETE_OBJECT(iterator);
154  iterator = nullptr;
155  *data -= item;
156  return (*this);
157  }
158 
159  OMEset &operator|=(const OMEbaseType &item)
160  {
161  // set union
163  OME_DELETE_OBJECT(iterator);
164  iterator = nullptr;
165  *data |= item;
166  return (*this);
167  }
168 
169  OMEset &operator&=(const OMEbaseType &item)
170  {
171  // set intersection
173  OME_DELETE_OBJECT(iterator);
174  iterator = nullptr;
175  *data &= item;
176  return (*this);
177  }
178 
179  OMEset *operator+(const OMEbaseType &item) const
180  {
181  OMEset *result = new OMEset(*this);
182  *result += item;
183  return (result);
184  }
185 
186  OMEset *operator-(const OMEbaseType &item) const
187  {
188  OMEset *result = new OMEset(*this);
189  *result -= item;
190  return (result);
191  }
192 
193  OMEset *operator|(const OMEbaseType &item) const
194  {
195  // set union
196  OMEset *result = new OMEset(*this);
197  *result |= item;
198  return (result);
199  }
200 
201  OMEset *operator&(const OMEbaseType &item) const
202  {
203  // set intersection
204  OMEset *result = new OMEset(*this);
205  *result &= item;
206  return (result);
207  }
208 
209  OMEbaseType *nextElement(); // iterate
210 
211  void resetIterator(); // set back to beginning
212 
214  {
215  return (data->elementCount());
216  }
217 
218  uint32_t isEmpty() const OME_ALWAYS_INLINE
219  {
220  return (data->isEmpty());
221  }
222 
223  bool elementExists(const OMEbaseType &elem) const OME_ALWAYS_INLINE
224  {
225  return (data->elementExists(elem));
226  }
227 
238  template <typename STREAMTYPE> STREAMTYPE &outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent = 0,
239  uint8_t includeTypePrefix = OME_DEFAULT_COMPLEX_OUTPUT_MODE) const
240  {
241  data->outputOnStream(outputStream, indent, includeTypePrefix);
242  return (outputStream);
243  }
244 }; // end class OMEset
245 
248 template <typename STREAMTYPE> inline STREAMTYPE &operator<<(STREAMTYPE &outputStream, const OMEset &data)
249 {
250  data.outputOnStream(outputStream, 0);
251  return (outputStream);
252 }
253 
256 #endif
257 /* vim: set expandtab shiftwidth=4 tabstop=4: */
OMErefCount.h
OME reference count implementation.
OMEsetStorage::isEmpty
uint32_t isEmpty() const OME_ALWAYS_INLINE
Definition: OMEset.h:53
operator!=
bool operator!=(const OMEtype &lArg, const OMEtype &rArg)
Definition: OMEtype_operators.cpp:5508
OMEset::elementCount
uint32_t elementCount() const OME_ALWAYS_INLINE
Returns the number of elements in the set.
Definition: OMEset.h:213
OME_DELETE_OBJECT
#define OME_DELETE_OBJECT(ptr)
Definition: OMEmanifests.h:159
OMEprofileCounter< uint32_t >
s
const char s[]
Definition: t.cpp:4
OMEset::deepCopy
OMEset * deepCopy() const
Definition: OMEset.h:134
OMEset::elementExists
bool elementExists(const OMEtype &elem) const OME_ALWAYS_INLINE
Returns a Boolean indication if an indicated OMEtype element is present within the set.
Definition: OMEset.h:223
OMEset::operator==
bool operator==(const OMEset &arg) const
Definition: OMEset.h:114
OMEsetStorage::operator==
bool operator==(const OMEsetStorage &arg) const
Definition: OMEset.cpp:55
OMEruntime.h
OMEstring
Implements text and binary string storage.
Definition: OMEstring.h:305
OMEset::OMEset
OMEset(OMEsetStorage *s)
Definition: OMEset.h:70
OMEreferenceToData< OMEsetStorage >::data
OMEsetStorage * data
Definition: OMErefCount.h:82
OMEset::operator=
OMEset & operator=(const OMEset &arg)
Definition: OMEset.h:99
OMEset::operator!=
bool operator!=(const OMEset &arg) const
Definition: OMEset.h:122
OMEset::operator+=
OMEset & operator+=(const OMEtype &item)
Add element as-is into set. If the element is a set, it is added as a single element.
Definition: OMEset.h:141
OMEreferenceCount::unlockMe
void unlockMe()
Definition: OMErefCount.cpp:132
OMEset::operator-=
OMEset & operator-=(const OMEtype &item)
Remove element from set.
Definition: OMEset.h:150
OMEset::OMEset
OMEset(const OMEset &org)
Definition: OMEset.h:86
OMEset.h
OME set implementation.
OMEreferenceToData
Templated type-specific reference to a reference-counted object.
Definition: OMErefCount.h:79
OMEreferenceCount
Base class for reference-counted data.
Definition: OMErefCount.h:31
OMEset::isEmpty
uint32_t isEmpty() const OME_ALWAYS_INLINE
Definition: OMEset.h:218
OMEreferenceToData::totalReferences
int_fast32_t totalReferences() const OME_ALWAYS_INLINE
Get current reference total.
Definition: OMErefCount.h:141
srcID
const char srcID[]
Definition: catSym.c:17
OMEset::iterator
_STD deque< OMEbaseTypeP >::const_iterator * iterator
Definition: OMEset.h:67
OMEset
Implements an ordered list of OMEtype elements.
Definition: OMEset.h:64
OMEsetStorage::operator&=
OMEsetStorage & operator&=(const OMEtype &)
Definition: OMEset.cpp:195
OMEsetStorage::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OME_DEFAULT_COMPLEX_OUTPUT_MODE) const
Definition: OMEoutputOnStream.h:273
_OME_SET_H
#define _OME_SET_H
Definition: OMEset.h:2
OMEsetStorage::elementExists
bool elementExists(const OMEtype &elem) const
Definition: OMEset.cpp:224
OMEtype.h
OME fundamental type implementation.
OMEset::operator|
OMEset * operator|(const OMEtype &item) const
Definition: OMEset.h:193
OMEset::operator&=
OMEset & operator&=(const OMEtype &item)
Set intersection. Returns elements that are in both sets.
Definition: OMEset.h:169
OME_USED
const char srcID[] OME_USED
Definition: tick_time.cpp:24
OMEreferenceCount::addReadOnlyReference
void addReadOnlyReference()
Definition: OMErefCount.cpp:139
OMEsetStorage::operator-=
OMEsetStorage & operator-=(const OMEtype &)
Definition: OMEset.cpp:159
OME_SET
@ OME_SET
Definition: OMEmanifests.h:89
OMEset::operator&
OMEset * operator&(const OMEtype &item) const
Definition: OMEset.h:201
operator<<
STREAMTYPE & operator<<(STREAMTYPE &outputStream, const OMEset &data)
Write an OMEset to an output stream.
Definition: OMEset.h:248
OMEsetStorage::OMEsetStorage
OMEsetStorage()
Definition: OMEset.cpp:19
OMEsetStorage::dataSet
_STD deque< OMEbaseTypeP > dataSet
Definition: OMEset.h:26
OME_ALWAYS_INLINE
#define OME_ALWAYS_INLINE
Tell the compiler to alway inline a function, regardless of optimization level.
Definition: compiler_hints.h:364
OMEbaseTypeP
class OMEtype * OMEbaseTypeP
Definition: OMEset.h:15
OMEreferenceToData::dropReference
void dropReference(C *newData=nullptr) OME_ALWAYS_INLINE
Definition: OMErefCount.h:91
OMEsetStorage::elementCount
uint32_t elementCount() const OME_ALWAYS_INLINE
Definition: OMEset.h:48
OMEreferenceCount::lockMe
void lockMe()
Definition: OMErefCount.cpp:125
OMEset::~OMEset
~OMEset()
Definition: OMEset.h:93
OMEsetStorage::operator|=
OMEsetStorage & operator|=(const OMEtype &)
Definition: OMEset.cpp:178
OMEset::operator+
OMEset * operator+(const OMEtype &item) const
Definition: OMEset.h:179
OMEsetStorage::operator+=
OMEsetStorage & operator+=(const OMEtype &)
Definition: OMEset.cpp:150
OMEsetStorage
Reference-counted maintainer of an ordered list of OMEtype elements. Used internally by OMEset.
Definition: OMEset.h:20
_STD
#define _STD
Definition: OMEmanifests.h:146
OMEset::nextElement
OMEtype * nextElement()
Iterate over a set by retrieving the next element.
Definition: OMEset.cpp:280
OMEdebugInfo.h
OME debug and profiling interfaces.
OMEreferenceToData::getUniqueReference
void getUniqueReference()
Force unique reference to the data, which will trigger duplication if necessary (copy-on-write).
Definition: OMErefCount.h:127
OME_DLL_EXPORT
#define OME_DLL_EXPORT
Definition: compiler_hints.h:464
OMEsetStorage::operator!=
bool operator!=(const OMEsetStorage &arg) const
Definition: OMEset.cpp:102
OMEoid
Public interface to an OME Object Identifier.
Definition: OMEoid.h:196
OMEset::operator|=
OMEset & operator|=(const OMEtype &item)
Add element to set. If new element is a set, each individual element of the set is added.
Definition: OMEset.h:159
OME_DEFAULT_COMPLEX_OUTPUT_MODE
@ OME_DEFAULT_COMPLEX_OUTPUT_MODE
Definition: OMEmanifests.h:116
OMEset::OMEset
OMEset()
Definition: OMEset.h:79
OMEset::operator-
OMEset * operator-(const OMEtype &item) const
Definition: OMEset.h:186
OMEsetStorage::deepCopy
virtual OMEreferenceCount * deepCopy() const override
Definition: OMEset.cpp:35
OMEset::resetIterator
void resetIterator()
Reset the internal iterator to the beginning of the list.
Definition: OMEset.cpp:264
operator==
bool operator==(const OMEtype &lArg, const OMEtype &rArg)
Definition: OMEtype_operators.cpp:33
OMEset::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OME_DEFAULT_COMPLEX_OUTPUT_MODE) const
Output an OMEset to an output stream.
Definition: OMEset.h:238
OMEsetStorage::~OMEsetStorage
~OMEsetStorage()
Definition: OMEset.cpp:23
Generated: Tue Jul 28 2020 16:03:25
Support Information