lemon/bits/array_map.h
changeset 2386 81b47fc5c444
parent 2384 805c5a2a36dd
child 2391 14a343be7a5a
equal deleted inserted replaced
18:4694069a393f 19:d9a8839d34ee
    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       }