77 |
77 |
78 /// \brief Graph initialized map constructor. |
78 /// \brief Graph initialized map constructor. |
79 /// |
79 /// |
80 /// Graph initialized map constructor. |
80 /// Graph initialized map constructor. |
81 explicit ArrayMap(const Graph& graph) { |
81 explicit ArrayMap(const Graph& graph) { |
82 Parent::attach(graph.getNotifier(Item())); |
82 Parent::attach(graph.notifier(Item())); |
83 allocate_memory(); |
83 allocate_memory(); |
84 Notifier* notifier = Parent::getNotifier(); |
84 Notifier* notifier = Parent::notifier(); |
85 Item it; |
85 Item it; |
86 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
86 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
87 int id = notifier->id(it);; |
87 int id = notifier->id(it);; |
88 allocator.construct(&(values[id]), Value()); |
88 allocator.construct(&(values[id]), Value()); |
89 } |
89 } |
91 |
91 |
92 /// \brief Constructor to use default value to initialize the map. |
92 /// \brief Constructor to use default value to initialize the map. |
93 /// |
93 /// |
94 /// It constructs a map and initialize all of the the map. |
94 /// It constructs a map and initialize all of the the map. |
95 ArrayMap(const Graph& graph, const Value& value) { |
95 ArrayMap(const Graph& graph, const Value& value) { |
96 Parent::attach(graph.getNotifier(Item())); |
96 Parent::attach(graph.notifier(Item())); |
97 allocate_memory(); |
97 allocate_memory(); |
98 Notifier* notifier = Parent::getNotifier(); |
98 Notifier* notifier = Parent::notifier(); |
99 Item it; |
99 Item it; |
100 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
100 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
101 int id = notifier->id(it);; |
101 int id = notifier->id(it);; |
102 allocator.construct(&(values[id]), value); |
102 allocator.construct(&(values[id]), value); |
103 } |
103 } |
106 /// \brief Constructor to copy a map of the same map type. |
106 /// \brief Constructor to copy a map of the same map type. |
107 /// |
107 /// |
108 /// Constructor to copy a map of the same map type. |
108 /// Constructor to copy a map of the same map type. |
109 ArrayMap(const ArrayMap& copy) : Parent() { |
109 ArrayMap(const ArrayMap& copy) : Parent() { |
110 if (copy.attached()) { |
110 if (copy.attached()) { |
111 attach(*copy.getNotifier()); |
111 attach(*copy.notifier()); |
112 } |
112 } |
113 capacity = copy.capacity; |
113 capacity = copy.capacity; |
114 if (capacity == 0) return; |
114 if (capacity == 0) return; |
115 values = allocator.allocate(capacity); |
115 values = allocator.allocate(capacity); |
116 Notifier* notifier = Parent::getNotifier(); |
116 Notifier* notifier = Parent::notifier(); |
117 Item it; |
117 Item it; |
118 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
118 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
119 int id = notifier->id(it);; |
119 int id = notifier->id(it);; |
120 allocator.construct(&(values[id]), copy.values[id]); |
120 allocator.construct(&(values[id]), copy.values[id]); |
121 } |
121 } |
140 /// the NodeMap. In this case the value for each item |
140 /// the NodeMap. In this case the value for each item |
141 /// is assigned by the value of the given ReadMap. |
141 /// is assigned by the value of the given ReadMap. |
142 template <typename CMap> |
142 template <typename CMap> |
143 ArrayMap& operator=(const CMap& cmap) { |
143 ArrayMap& operator=(const CMap& cmap) { |
144 checkConcept<concepts::ReadMap<Key, _Value>, CMap>(); |
144 checkConcept<concepts::ReadMap<Key, _Value>, CMap>(); |
145 const typename Parent::Notifier* notifier = Parent::getNotifier(); |
145 const typename Parent::Notifier* notifier = Parent::notifier(); |
146 Item it; |
146 Item it; |
147 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
147 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
148 set(it, cmap[it]); |
148 set(it, cmap[it]); |
149 } |
149 } |
150 return *this; |
150 return *this; |
171 /// \brief The subscript operator. |
171 /// \brief The subscript operator. |
172 /// |
172 /// |
173 /// The subscript operator. The map can be subscripted by the |
173 /// The subscript operator. The map can be subscripted by the |
174 /// actual keys of the graph. |
174 /// actual keys of the graph. |
175 Value& operator[](const Key& key) { |
175 Value& operator[](const Key& key) { |
176 int id = Parent::getNotifier()->id(key); |
176 int id = Parent::notifier()->id(key); |
177 return values[id]; |
177 return values[id]; |
178 } |
178 } |
179 |
179 |
180 /// \brief The const subscript operator. |
180 /// \brief The const subscript operator. |
181 /// |
181 /// |
182 /// The const subscript operator. The map can be subscripted by the |
182 /// The const subscript operator. The map can be subscripted by the |
183 /// actual keys of the graph. |
183 /// actual keys of the graph. |
184 const Value& operator[](const Key& key) const { |
184 const Value& operator[](const Key& key) const { |
185 int id = Parent::getNotifier()->id(key); |
185 int id = Parent::notifier()->id(key); |
186 return values[id]; |
186 return values[id]; |
187 } |
187 } |
188 |
188 |
189 /// \brief Setter function of the map. |
189 /// \brief Setter function of the map. |
190 /// |
190 /// |
199 /// \brief Adds a new key to the map. |
199 /// \brief Adds a new key to the map. |
200 /// |
200 /// |
201 /// It adds a new key to the map. It called by the observer notifier |
201 /// It adds a new key to the map. It called by the observer notifier |
202 /// and it overrides the add() member function of the observer base. |
202 /// and it overrides the add() member function of the observer base. |
203 virtual void add(const Key& key) { |
203 virtual void add(const Key& key) { |
204 Notifier* notifier = Parent::getNotifier(); |
204 Notifier* notifier = Parent::notifier(); |
205 int id = notifier->id(key); |
205 int id = notifier->id(key); |
206 if (id >= capacity) { |
206 if (id >= capacity) { |
207 int new_capacity = (capacity == 0 ? 1 : capacity); |
207 int new_capacity = (capacity == 0 ? 1 : capacity); |
208 while (new_capacity <= id) { |
208 while (new_capacity <= id) { |
209 new_capacity <<= 1; |
209 new_capacity <<= 1; |
227 /// \brief Adds more new keys to the map. |
227 /// \brief Adds more new keys to the map. |
228 /// |
228 /// |
229 /// It adds more new keys to the map. It called by the observer notifier |
229 /// It adds more new keys to the map. It called by the observer notifier |
230 /// and it overrides the add() member function of the observer base. |
230 /// and it overrides the add() member function of the observer base. |
231 virtual void add(const std::vector<Key>& keys) { |
231 virtual void add(const std::vector<Key>& keys) { |
232 Notifier* notifier = Parent::getNotifier(); |
232 Notifier* notifier = Parent::notifier(); |
233 int max_id = -1; |
233 int max_id = -1; |
234 for (int i = 0; i < (int)keys.size(); ++i) { |
234 for (int i = 0; i < (int)keys.size(); ++i) { |
235 int id = notifier->id(keys[i]); |
235 int id = notifier->id(keys[i]); |
236 if (id > max_id) { |
236 if (id > max_id) { |
237 max_id = id; |
237 max_id = id; |
271 /// \brief Erase a key from the map. |
271 /// \brief Erase a key from the map. |
272 /// |
272 /// |
273 /// Erase a key from the map. It called by the observer notifier |
273 /// Erase a key from the map. It called by the observer notifier |
274 /// and it overrides the erase() member function of the observer base. |
274 /// and it overrides the erase() member function of the observer base. |
275 virtual void erase(const Key& key) { |
275 virtual void erase(const Key& key) { |
276 int id = Parent::getNotifier()->id(key); |
276 int id = Parent::notifier()->id(key); |
277 allocator.destroy(&(values[id])); |
277 allocator.destroy(&(values[id])); |
278 } |
278 } |
279 |
279 |
280 /// \brief Erase more keys from the map. |
280 /// \brief Erase more keys from the map. |
281 /// |
281 /// |
282 /// Erase more keys from the map. It called by the observer notifier |
282 /// Erase more keys from the map. It called by the observer notifier |
283 /// and it overrides the erase() member function of the observer base. |
283 /// and it overrides the erase() member function of the observer base. |
284 virtual void erase(const std::vector<Key>& keys) { |
284 virtual void erase(const std::vector<Key>& keys) { |
285 for (int i = 0; i < (int)keys.size(); ++i) { |
285 for (int i = 0; i < (int)keys.size(); ++i) { |
286 int id = Parent::getNotifier()->id(keys[i]); |
286 int id = Parent::notifier()->id(keys[i]); |
287 allocator.destroy(&(values[id])); |
287 allocator.destroy(&(values[id])); |
288 } |
288 } |
289 } |
289 } |
290 |
290 |
291 /// \brief Buildes the map. |
291 /// \brief Buildes the map. |
292 /// |
292 /// |
293 /// It buildes the map. It called by the observer notifier |
293 /// It buildes the map. It called by the observer notifier |
294 /// and it overrides the build() member function of the observer base. |
294 /// and it overrides the build() member function of the observer base. |
295 virtual void build() { |
295 virtual void build() { |
296 Notifier* notifier = Parent::getNotifier(); |
296 Notifier* notifier = Parent::notifier(); |
297 allocate_memory(); |
297 allocate_memory(); |
298 Item it; |
298 Item it; |
299 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
299 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
300 int id = notifier->id(it);; |
300 int id = notifier->id(it);; |
301 allocator.construct(&(values[id]), Value()); |
301 allocator.construct(&(values[id]), Value()); |
305 /// \brief Clear the map. |
305 /// \brief Clear the map. |
306 /// |
306 /// |
307 /// It erase all items from the map. It called by the observer notifier |
307 /// It erase all items from the map. It called by the observer notifier |
308 /// and it overrides the clear() member function of the observer base. |
308 /// and it overrides the clear() member function of the observer base. |
309 virtual void clear() { |
309 virtual void clear() { |
310 Notifier* notifier = Parent::getNotifier(); |
310 Notifier* notifier = Parent::notifier(); |
311 if (capacity != 0) { |
311 if (capacity != 0) { |
312 Item it; |
312 Item it; |
313 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
313 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
314 int id = notifier->id(it); |
314 int id = notifier->id(it); |
315 allocator.destroy(&(values[id])); |
315 allocator.destroy(&(values[id])); |