src/hugo/array_map.h
changeset 897 ef09eee53b09
parent 891 74589d20dbc3
child 901 69a8e672acb1
     1.1 --- a/src/hugo/array_map.h	Wed Sep 22 07:32:57 2004 +0000
     1.2 +++ b/src/hugo/array_map.h	Wed Sep 22 08:04:31 2004 +0000
     1.3 @@ -29,6 +29,8 @@
     1.4  
     1.5    template <typename MapRegistry, typename Value> 
     1.6    class ArrayMap : public MapRegistry::MapBase {
     1.7 +
     1.8 +    template <typename MR, typename V> friend class ArrayMap;
     1.9  		
    1.10    public:
    1.11  		
    1.12 @@ -63,10 +65,6 @@
    1.13      typedef std::allocator<Value> Allocator;
    1.14  
    1.15  	
    1.16 -    /** Default constructor for the map.
    1.17 -     */
    1.18 -    ArrayMap() : capacity(0), values(0) {}
    1.19 -			
    1.20      /** Graph and Registry initialized map constructor.
    1.21       */
    1.22      ArrayMap(const Graph& g, MapRegistry& r) : MapBase(g, r) {
    1.23 @@ -118,18 +116,19 @@
    1.24       */
    1.25      ArrayMap& operator=(const ArrayMap& copy) {
    1.26        if (&copy == this) return *this;
    1.27 +      
    1.28 +      if (MapBase::getGraph() != copy.getGraph()) {
    1.29 +	if (capacity != 0) {
    1.30 +	  MapBase::destroy();
    1.31 +	  allocator.deallocate(values, capacity);
    1.32 +	}
    1.33  
    1.34 -      if (capacity != 0) {
    1.35 -	MapBase::destroy();
    1.36 -	allocator.deallocate(values, capacity);
    1.37 +	MapBase::operator=(copy);
    1.38 +	capacity = copy.capacity;
    1.39 +	if (capacity == 0) return *this;
    1.40 +	values = allocator.allocate(capacity);      
    1.41        }
    1.42  
    1.43 -      MapBase::operator=(copy);
    1.44 -
    1.45 -      capacity = copy.capacity;
    1.46 -      if (capacity == 0) return *this;
    1.47 -      values = allocator.allocate(capacity);
    1.48 -
    1.49        for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
    1.50  	int id = KeyInfo<Graph, KeyIt>::id(*MapBase::getGraph(), it);
    1.51  	allocator.construct(&(values[id]), copy.values[id]);
    1.52 @@ -142,17 +141,20 @@
    1.53       */
    1.54      template <typename TT>
    1.55      ArrayMap& operator=(const ArrayMap<MapRegistry, TT>& copy) {
    1.56 -      if (capacity != 0) {
    1.57 -	MapBase::destroy();
    1.58 -	allocator.deallocate(values, capacity);
    1.59 +
    1.60 +      if (MapBase::getGraph() != copy.getGraph()) {
    1.61 +	if (capacity != 0) {
    1.62 +	  MapBase::destroy();
    1.63 +	  allocator.deallocate(values, capacity);
    1.64 +	}
    1.65 +
    1.66 +	MapBase::operator=(copy);
    1.67 +
    1.68 +	capacity = copy.capacity;
    1.69 +	if (capacity == 0) return *this;
    1.70 +	values = allocator.allocate(capacity);
    1.71        }
    1.72  
    1.73 -      MapBase::operator=(copy);
    1.74 -
    1.75 -      capacity = copy.capacity;
    1.76 -      if (capacity == 0) return *this;
    1.77 -      values = allocator.allocate(capacity);
    1.78 -
    1.79        for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
    1.80  	int id = KeyInfo<Graph, KeyIt>::id(*MapBase::getGraph(), it);
    1.81  	allocator.construct(&(values[id]), copy.values[id]);