# HG changeset patch # User deba # Date 1089839770 0 # Node ID 4207f82a1778db1b2fd0b37698c4ccc3eb4225d8 # Parent c03e073b8394a2830da7602fc5b5cb7750bef2eb diff -r c03e073b8394 -r 4207f82a1778 src/work/deba/array_map_factory.h --- a/src/work/deba/array_map_factory.h Wed Jul 14 10:06:27 2004 +0000 +++ b/src/work/deba/array_map_factory.h Wed Jul 14 21:16:10 2004 +0000 @@ -19,108 +19,328 @@ typedef typename MapRegistry::MapBase MapBase; - template > - class Map : public MapBase { + template > class Map : public MapBase { - public: + public: - typedef V Value; - typedef A Allocator; + typedef V Value; + typedef A Allocator; - Map() : values(0), capacity(0) {} + Map() : values(0), capacity(0) {} - Map(Graph& g, MapRegistry& r) : MapBase(g, r) { - int max_id = -1; - for (KeyIt it(*graph); graph->valid(it); graph->next(it)) { - int id = graph->id(it); - if (id > max_id) { - max_id = id; - } - } - if (max_id == -1) { - capacity = 0; - values = 0; - return; - } - capacity = 1; - while (capacity <= max_id) { - capacity <<= 1; - } - values = allocator.allocate(capacity); - for (KeyIt it(*graph); graph->valid(it); graph->next(it)) { - int id = graph->id(it); - allocator.construct(&(values[id]), Value()); - } + Map(const Graph& g, MapRegistry& r) : MapBase(g, r) { + int max_id = -1; + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + int id = getGraph()->id(it); + if (id > max_id) { + max_id = id; + } } + if (max_id == -1) { + capacity = 0; + values = 0; + return; + } + capacity = 1; + while (capacity <= max_id) { + capacity <<= 1; + } + values = allocator.allocate(capacity); + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + int id = getGraph()->id(it); + allocator.construct(&(values[id]), Value()); + } + } - Map(const Map& copy) : MapBase(*copy.graph, *copy.registry) { - capacity = copy.capacity; - values = allocator.allocate(capacity); - for (KeyIt it(*graph); graph->valid(it); graph->next(it)) { - int id = graph->id(it); - allocator.construct(&(values[id]), copy.values[id]); + Map(const Graph& g, MapRegistry& r, const Value& v) : MapBase(g, r) { + int max_id = -1; + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + int id = getGraph()->id(it); + if (id > max_id) { + max_id = id; + } + } + if (max_id == -1) { + capacity = 0; + values = 0; + return; + } + capacity = 1; + while (capacity <= max_id) { + capacity <<= 1; + } + values = allocator.allocate(capacity); + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + int id = getGraph()->id(it); + allocator.construct(&(values[id]), v); + } + } + + Map(const Map& copy) : MapBase(*copy.graph, *copy.registry) { + capacity = copy.capacity; + if (capacity == 0) return; + values = allocator.allocate(capacity); + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + int id = getGraph()->id(it); + allocator.construct(&(values[id]), copy.values[id]); + } + } + + template Map(const CMap& copy) : MapBase(copy) { + if (getGraph()) { + init(); + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + set(it, copy[it]); } } - - virtual ~Map() { + } + + Map& operator=(const Map& copy) { + if (© == this) return; + if (capacity != 0) { destroy(); allocator.deallocate(values, capacity); } + capacity = copy.capacity; + if (capacity == 0) return; + values = allocator.allocate(capacity); + for (KeyIt it(getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + int id = getGraph()->id(it); + allocator.construct(&(values[id]), copy.values[id]); + } + } + + template Map& operator=(const CMap& copy) { + if (getGraph()) { + destroy(); + } + this->MapBase::operator=(copy); + if (getGraph()) { + init(); + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + set(it, copy[it]); + } + } + } + + + + virtual ~Map() { + if (capacity != 0) { + destroy(); + allocator.deallocate(values, capacity); + } + } - Value& operator[](const Key& key) { - int id = graph->id(key); - return values[id]; - } + Value& operator[](const Key& key) { + int id = getGraph()->id(key); + return values[id]; + } - const Value& operator[](const Key& key) const { - int id = graph->id(key); - return values[id]; + const Value& operator[](const Key& key) const { + int id = getGraph()->id(key); + return values[id]; + } + + const Value& get(const Key& key) const { + int id = getGraph()->id(key); + return values[id]; + } + + void set(const Key& key, const Value& val) { + int id = getGraph()->id(key); + values[id] = val; + } + + void add(const Key& key) { + int id = getGraph()->id(key); + if (id >= capacity) { + int new_capacity = (capacity == 0 ? 1 : capacity); + while (new_capacity <= id) { + new_capacity <<= 1; + } + Value* new_values = allocator.allocate(new_capacity);; + for (KeyIt it(*getGraph()); getGraph()->valid(it); getGraph()->next(it)) { + int jd = getGraph()->id(it); + if (id != jd) { + allocator.construct(&(new_values[jd]), values[jd]); + allocator.destroy(&(values[jd])); + } + } + if (capacity != 0) allocator.deallocate(values, capacity); + values = new_values; + capacity = new_capacity; + } + allocator.construct(&(values[id]), Value()); + } + + void erase(const Key& key) { + int id = getGraph()->id(key); + allocator.destroy(&(values[id])); + } + + /** Compatible iterator with the stl maps' iterators. + * It iterates on pairs of a key and a value. + */ + class iterator { + friend class Map; + friend class const_iterator; + private: + + /** Private constructor to initalize the the iterators returned + * by the begin() and end(). + */ + iterator (Map& pmap, const KeyIt& pit) : map(&pmap), it(pit) {} + + public: + + /** Default constructor. + */ + iterator() {} + + /** Dereference operator for map. + */ + std::pair operator*() { + return std::pair(it, (*map)[it]); + } + + /** Arrow operator for map. + */ + std::pair* operator->() { + static std::pair tmp = operator*(); + return &tmp; + } + + /** The pre increment operator of the map. + */ + iterator& operator++() { + map->getGraph()->next(it); + return *this; + } + + /** The post increment operator of the map. + */ + iterator operator++(int) { + iterator tmp(it); + map.getGraph()->next(it); + return tmp; + } + + /** The equality operator of the map. + */ + bool operator==(const_iterator p_it) { + return p_it.it == it; } - const Value& get(const Key& key) const { - int id = graph->id(key); - return values[id]; - } - - void set(const Key& key, const Value& val) { - int id = graph->id(key); - values[id] = val; - } - - void add(const Key& key) { - int id = graph->id(key); - if (id >= capacity) { - int new_capacity = (capacity == 0 ? 1 : capacity); - while (new_capacity <= id) { - new_capacity <<= 1; - } - Value* new_values = allocator.allocate(new_capacity);; - for (KeyIt it(*graph); graph->valid(it); graph->next(it)) { - int jd = graph->id(it); - if (id != jd) { - allocator.construct(&(new_values[jd]), values[jd]); - allocator.destroy(&(values[jd])); - } - } - if (capacity != 0) allocator.deallocate(values, capacity); - values = new_values; - capacity = new_capacity; - } - allocator.construct(&(values[id]), Value()); - } - - void erase(const Key& key) { - int id = graph->id(key); - allocator.destroy(&(values[id])); + /** The not-equality operator of the map. + */ + bool operator!=(const_iterator p_it) { + return !(*this == p_it); } private: - int capacity; - Value* values; - Allocator allocator; - }; + Map* map; + KeyIt it; + }; + + /** Returns the begin iterator of the map. + */ + iterator begin() { + return iterator(*this, KeyIt(*getGraph())); + } + + /** Returns the end iterator of the map. + */ + iterator end() { + return iterator(*this, INVALID); + } + + class const_iterator { + friend class Map; + friend class iterator; + private: + + /** Private constructor to initalize the the iterators returned + * by the begin() and end(). + */ + const_iterator (Map& pmap, const KeyIt& pit) : map(&pmap), it(pit) {} + + public: + + /** Default constructor. + */ + const_iterator() {} + + /** Constructor to convert iterator to const_iterator. + */ + const_iterator(iterator p_it) { + it = p_it.it; + } + + /** Dereference operator for map. + */ + std::pair operator*() const { + return std::pair(it, (*map)[it]); + } + + /** Arrow operator for map. + */ + std::pair* operator->() const { + static std::pair tmp = operator*(); + return &tmp; + } + + /** The pre increment operator of the map. + */ + const_iterator& operator++() { + map->getGraph()->next(it); + return *this; + } + + /** The post increment operator of the map. + */ + const_iterator operator++(int) { + const_iterator tmp(it); + map->getGraph()->next(it); + return tmp; + } + + /** The equality operator of the map. + */ + bool operator==(const_iterator p_it) { + return p_it.it == it; + } + + /** The not-equality operator of the map. + */ + bool operator!=(const_iterator p_it) { + return !(*this == p_it); + } + + private: + const Map* map; + KeyIt it; + }; + + /** Returns the begin const_iterator of the map. + */ + const_iterator begin() const { + return const_iterator(*this, KeyIt(*getGraph())); + } + + /** Returns the end const_iterator of the map. + */ + const_iterator end() const { + return const_iterator(*this, INVALID); + } + + private: + int capacity; + Value* values; + Allocator allocator; + }; }; } diff -r c03e073b8394 -r 4207f82a1778 src/work/deba/extended_pair.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/deba/extended_pair.h Wed Jul 14 21:16:10 2004 +0000 @@ -0,0 +1,15 @@ +#ifndef EXTENDED_PAIR_H +#define EXTENDED_PAIR_H + +template +struct extended_pair { + typedef T1 first_type; + typedef T2 second_type; + + extended_pair(A1 f, A2 s) : first(f), second(s) {} + + T1 first; + T2 second; +}; + +#endif diff -r c03e073b8394 -r 4207f82a1778 src/work/deba/list_graph.h --- a/src/work/deba/list_graph.h Wed Jul 14 10:06:27 2004 +0000 +++ b/src/work/deba/list_graph.h Wed Jul 14 21:16:10 2004 +0000 @@ -77,7 +77,6 @@ CREATE_MAP_REGISTRIES; CREATE_MAPS(VectorMapFactory); - public: ListGraph() : nodes(), first_node(-1), diff -r c03e073b8394 -r 4207f82a1778 src/work/deba/main.cpp --- a/src/work/deba/main.cpp Wed Jul 14 10:06:27 2004 +0000 +++ b/src/work/deba/main.cpp Wed Jul 14 21:16:10 2004 +0000 @@ -23,6 +23,7 @@ for (pit = map.begin(); pit != map.end(); ++pit) { cout << g.id(pit->first) << ' ' << pit->second << endl; } + /* ListGraph::NodeMap ot_map = map; for (ListGraph::NodeIt it(g); g.valid(it); g.next(it)) { ot_map[it] *= 2.1; @@ -32,7 +33,7 @@ for (ListGraph::NodeIt it(g); g.valid(it); g.next(it)) { ot_map[it] *= 3.1; cout << ot_map[it] << endl; - } + }*/ return 0; } diff -r c03e073b8394 -r 4207f82a1778 src/work/deba/vector_map_factory.h --- a/src/work/deba/vector_map_factory.h Wed Jul 14 10:06:27 2004 +0000 +++ b/src/work/deba/vector_map_factory.h Wed Jul 14 21:16:10 2004 +0000 @@ -4,6 +4,8 @@ #include #include +#include "extended_pair.h" + namespace hugo { /** The VectorMapFactory template class is a factory class @@ -155,11 +157,21 @@ return std::pair(it, (*map)[it]); } + + class Pointer { + friend class iterator; + private: + typedef extended_pair Pair; + Pair data; + Pointer(const Key& key, Value& val) : data(key, val) {} + public: + Pair* operator->() {return &data;} + }; + /** Arrow operator for map. */ - std::pair* operator->() { - static std::pair tmp = operator*(); - return &tmp; + Pointer operator->() { + return Pointer(it, ((*map)[it])); } /** The pre increment operator of the map. @@ -188,6 +200,7 @@ bool operator!=(const_iterator p_it) { return !(*this == p_it); } + private: Map* map; @@ -234,11 +247,19 @@ return std::pair(it, (*map)[it]); } + class Pointer { + friend class const_iterator; + private: + typedef extended_pair Pair; + Pair data; + Pointer(const Key& key, const Value& val) : data(key, val) {} + public: + Pair* operator->() {return &data;} + }; /** Arrow operator for map. */ - std::pair* operator->() const { - static std::pair tmp = operator*(); - return &tmp; + Pointer operator->() const { + return Pointer(it, (*map)[it]); } /** The pre increment operator of the map. @@ -268,6 +289,7 @@ return !(*this == p_it); } + private: const Map* map; KeyIt it;