20 #ifndef _TLPMUTABLECONTAINER_ 21 #define _TLPMUTABLECONTAINER_ 29 #include <tulip/tulipconf.h> 30 #include <tulip/tuliphash.h> 31 #include <tulip/StoredType.h> 32 #include <tulip/DataSet.h> 33 #include <tulip/Iterator.h> 42 class IteratorValue:
public Iterator<unsigned int> {
45 virtual ~IteratorValue() {}
46 virtual unsigned int nextValue(DataMem&) = 0;
50 template <
typename TYPE>
51 class MutableContainer {
52 friend class MutableContainerTest;
53 friend class GraphUpdatesRecorder;
61 void setDefault(
typename StoredType<TYPE>::ReturnedConstValue value);
65 void setAll(
typename StoredType<TYPE>::ReturnedConstValue value);
69 void set(
const unsigned int i,
70 typename StoredType<TYPE>::ReturnedConstValue value);
74 void add(
const unsigned int i, TYPE val);
78 typename StoredType<TYPE>::ReturnedConstValue
get(
const unsigned int i)
const;
82 typename StoredType<TYPE>::ReturnedValue
get(
const unsigned int i,
bool& isNotDefault)
const;
86 typename StoredType<TYPE>::ReturnedValue getDefault()
const;
90 bool hasNonDefaultValue(
const unsigned int i)
const;
97 Iterator<unsigned int>* findAll(
typename StoredType<TYPE>::ReturnedConstValue value,
bool equal =
true)
const;
101 unsigned int numberOfNonDefaultValues()
const;
103 MutableContainer(
const MutableContainer<TYPE> &) {}
104 void operator=(
const MutableContainer<TYPE> &) {}
105 typename StoredType<TYPE>::ReturnedConstValue operator[](
const unsigned int i)
const;
108 void compress(
unsigned int min,
unsigned int max,
unsigned int nbElements);
109 inline void vectset(
const unsigned int i,
typename StoredType<TYPE>::Value value);
110 IteratorValue* findAllValues(
typename StoredType<TYPE>::ReturnedConstValue value,
bool equal =
true)
const;
112 std::deque<typename StoredType<TYPE>::Value> *vData;
113 TLP_HASH_MAP<unsigned int, typename StoredType<TYPE>::Value> *hData;
114 unsigned int minIndex,maxIndex;
115 typename StoredType<TYPE>::Value defaultValue;
116 enum State { VECT=0, HASH=1 };
118 unsigned int elementInserted;
127 template <
typename TYPE>
128 class IteratorVect :
public tlp::IteratorValue {
130 IteratorVect(
const TYPE &value,
bool equal, std::deque<
typename StoredType<TYPE>::Value> *vData,
unsigned int minIndex):
136 while (it!=(*vData).end() &&
137 StoredType<TYPE>::equal((*it), _value) != _equal) {
143 return (_pos<UINT_MAX && it!=(*vData).end());
145 unsigned int next() {
146 unsigned int tmp = _pos;
152 while (it!=(*vData).end() &&
153 StoredType<TYPE>::equal((*it), _value) != _equal);
157 unsigned int nextValue(DataMem& val) {
158 ((TypedValueContainer<TYPE>&) val).value = StoredType<TYPE>::get(*it);
159 unsigned int pos = _pos;
165 while (it!=(*vData).end() &&
166 StoredType<TYPE>::equal((*it), _value) != _equal);
174 std::deque<typename StoredType<TYPE>::Value> *vData;
175 typename std::deque<typename StoredType<TYPE>::Value>::const_iterator it;
180 template <
typename TYPE>
181 class IteratorHash :
public IteratorValue {
183 IteratorHash(
const TYPE &value,
bool equal, TLP_HASH_MAP<
unsigned int,
typename StoredType<TYPE>::Value> *hData):
189 while (it!=(*hData).end() &&
190 StoredType<TYPE>::equal((*it).second,_value) != _equal)
194 return (it!=(*hData).end());
196 unsigned int next() {
197 unsigned int tmp = (*it).first;
202 while (it!=(*hData).end() &&
203 StoredType<TYPE>::equal((*it).second,_value) != _equal);
207 unsigned int nextValue(DataMem& val) {
208 ((TypedValueContainer<TYPE>&) val).value =
209 StoredType<TYPE>::get((*it).second);
210 unsigned int pos = (*it).first;
215 while (it!=(*hData).end() &&
216 StoredType<TYPE>::equal((*it).second,_value) != _equal);
223 TLP_HASH_MAP<unsigned int, typename StoredType<TYPE>::Value> *hData;
224 typename TLP_HASH_MAP<unsigned int, typename StoredType<TYPE>::Value>::const_iterator it;
231 #include "cxx/MutableContainer.cxx"
Interface for Tulip iterators. Allows basic iteration operations only.