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.notifier(Item())); |
82 Parent::attach(graph.notifier(Item())); |
83 allocate_memory(); |
83 allocate_memory(); |
84 Notifier* notifier = Parent::notifier(); |
84 Notifier* nf = Parent::notifier(); |
85 Item it; |
85 Item it; |
86 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
86 for (nf->first(it); it != INVALID; nf->next(it)) { |
87 int id = notifier->id(it);; |
87 int id = nf->id(it);; |
88 allocator.construct(&(values[id]), Value()); |
88 allocator.construct(&(values[id]), Value()); |
89 } |
89 } |
90 } |
90 } |
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.notifier(Item())); |
96 Parent::attach(graph.notifier(Item())); |
97 allocate_memory(); |
97 allocate_memory(); |
98 Notifier* notifier = Parent::notifier(); |
98 Notifier* nf = Parent::notifier(); |
99 Item it; |
99 Item it; |
100 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
100 for (nf->first(it); it != INVALID; nf->next(it)) { |
101 int id = notifier->id(it);; |
101 int id = nf->id(it);; |
102 allocator.construct(&(values[id]), value); |
102 allocator.construct(&(values[id]), value); |
103 } |
103 } |
104 } |
104 } |
105 |
105 |
106 /// \brief Constructor to copy a map of the same map type. |
106 /// \brief Constructor to copy a map of the same map type. |
111 attach(*copy.notifier()); |
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::notifier(); |
116 Notifier* nf = Parent::notifier(); |
117 Item it; |
117 Item it; |
118 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
118 for (nf->first(it); it != INVALID; nf->next(it)) { |
119 int id = notifier->id(it);; |
119 int id = nf->id(it);; |
120 allocator.construct(&(values[id]), copy.values[id]); |
120 allocator.construct(&(values[id]), copy.values[id]); |
121 } |
121 } |
122 } |
122 } |
123 |
123 |
124 /// \brief Assign operator. |
124 /// \brief Assign operator. |
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::notifier(); |
145 const typename Parent::Notifier* nf = Parent::notifier(); |
146 Item it; |
146 Item it; |
147 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
147 for (nf->first(it); it != INVALID; nf->next(it)) { |
148 set(it, cmap[it]); |
148 set(it, cmap[it]); |
149 } |
149 } |
150 return *this; |
150 return *this; |
151 } |
151 } |
152 |
152 |
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::notifier(); |
204 Notifier* nf = Parent::notifier(); |
205 int id = notifier->id(key); |
205 int id = nf->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; |
210 } |
210 } |
211 Value* new_values = allocator.allocate(new_capacity); |
211 Value* new_values = allocator.allocate(new_capacity); |
212 Item it; |
212 Item it; |
213 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
213 for (nf->first(it); it != INVALID; nf->next(it)) { |
214 int jd = notifier->id(it);; |
214 int jd = nf->id(it);; |
215 if (id != jd) { |
215 if (id != jd) { |
216 allocator.construct(&(new_values[jd]), values[jd]); |
216 allocator.construct(&(new_values[jd]), values[jd]); |
217 allocator.destroy(&(values[jd])); |
217 allocator.destroy(&(values[jd])); |
218 } |
218 } |
219 } |
219 } |
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::notifier(); |
232 Notifier* nf = 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 = nf->id(keys[i]); |
236 if (id > max_id) { |
236 if (id > max_id) { |
237 max_id = id; |
237 max_id = id; |
238 } |
238 } |
239 } |
239 } |
240 if (max_id >= capacity) { |
240 if (max_id >= capacity) { |
242 while (new_capacity <= max_id) { |
242 while (new_capacity <= max_id) { |
243 new_capacity <<= 1; |
243 new_capacity <<= 1; |
244 } |
244 } |
245 Value* new_values = allocator.allocate(new_capacity); |
245 Value* new_values = allocator.allocate(new_capacity); |
246 Item it; |
246 Item it; |
247 for (notifier->first(it); it != INVALID; notifier->next(it)) { |
247 for (nf->first(it); it != INVALID; nf->next(it)) { |
248 int id = notifier->id(it); |
248 int id = nf->id(it); |
249 bool found = false; |
249 bool found = false; |
250 for (int i = 0; i < (int)keys.size(); ++i) { |
250 for (int i = 0; i < int(keys.size()); ++i) { |
251 int jd = notifier->id(keys[i]); |
251 int jd = nf->id(keys[i]); |
252 if (id == jd) { |
252 if (id == jd) { |
253 found = true; |
253 found = true; |
254 break; |
254 break; |
255 } |
255 } |
256 } |
256 } |
260 } |
260 } |
261 if (capacity != 0) allocator.deallocate(values, capacity); |
261 if (capacity != 0) allocator.deallocate(values, capacity); |
262 values = new_values; |
262 values = new_values; |
263 capacity = new_capacity; |
263 capacity = new_capacity; |
264 } |
264 } |
265 for (int i = 0; i < (int)keys.size(); ++i) { |
265 for (int i = 0; i < int(keys.size()); ++i) { |
266 int id = notifier->id(keys[i]); |
266 int id = nf->id(keys[i]); |
267 allocator.construct(&(values[id]), Value()); |
267 allocator.construct(&(values[id]), Value()); |
268 } |
268 } |
269 } |
269 } |
270 |
270 |
271 /// \brief Erase a key from the map. |
271 /// \brief Erase a key from the map. |
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::notifier()->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::notifier(); |
296 Notifier* nf = 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 (nf->first(it); it != INVALID; nf->next(it)) { |
300 int id = notifier->id(it);; |
300 int id = nf->id(it);; |
301 allocator.construct(&(values[id]), Value()); |
301 allocator.construct(&(values[id]), Value()); |
302 } |
302 } |
303 } |
303 } |
304 |
304 |
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::notifier(); |
310 Notifier* nf = 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 (nf->first(it); it != INVALID; nf->next(it)) { |
314 int id = notifier->id(it); |
314 int id = nf->id(it); |
315 allocator.destroy(&(values[id])); |
315 allocator.destroy(&(values[id])); |
316 } |
316 } |
317 allocator.deallocate(values, capacity); |
317 allocator.deallocate(values, capacity); |
318 capacity = 0; |
318 capacity = 0; |
319 } |
319 } |