lemon/bits/array_map.h
changeset 2384 805c5a2a36dd
parent 2260 4274224f8a7d
child 2386 81b47fc5c444
equal deleted inserted replaced
17:23f1fa463a4d 18:4694069a393f
    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]));
   320     }
   320     }
   321 
   321 
   322   private:
   322   private:
   323       
   323       
   324     void allocate_memory() {
   324     void allocate_memory() {
   325       int max_id = Parent::getNotifier()->maxId();
   325       int max_id = Parent::notifier()->maxId();
   326       if (max_id == -1) {
   326       if (max_id == -1) {
   327 	capacity = 0;
   327 	capacity = 0;
   328 	values = 0;
   328 	values = 0;
   329 	return;
   329 	return;
   330       }
   330       }