Elm  1.0
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Map.h
1 /*
2  * avl::Map class interface
3  *
4  * This file is part of OTAWA
5  * Copyright (c) 2011, IRIT UPS.
6  *
7  * OTAWA is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * OTAWA is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with OTAWA; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #ifndef ELM_AVL_MAP_CPP_
22 #define ELM_AVL_MAP_CPP_
23 
24 #include <elm/util/Option.h>
25 #include <elm/avl/GenTree.h>
26 
27 namespace elm { namespace avl {
28 
29 // Map class
30 template <class K, class T, class C = Comparator<K> >
31 class Map {
34  typedef typename ti<K>::in_t key_t;
35  typedef typename ti<T>::in_t val_t;
36  typedef typename ti<T>::out_t out_t;
37 public:
38 
39  // Map concept
40  inline Option<T> get(key_t key) const
41  { const pair_t *p = tree.get(key); if(!p) return none; else return some(ti<T>::get(p->snd)); }
42  inline val_t get(key_t key, val_t def) const
43  { const pair_t *p = tree.get(key); if(!p) return def; else return ti<T>::get(p->snd); }
44  inline bool hasKey (key_t key) const
45  { const pair_t *p = tree.get(key); return p; }
46  inline int count(void) const { return tree.count(); }
47  inline bool isEmpty(void) const { return tree.isEmpty(); }
48  inline bool equals(const Map<K, T, C>& map) const { return tree.equals(map.tree); }
49  inline bool operator==(const Map<K, T, C>& map) const { return equals(map); }
50  inline bool operator!=(const Map<K, T, C>& map) const { return !equals(map); }
51 
52  // KeyIterator class
53  class KeyIterator: public PreIterator<KeyIterator, K> {
54  public:
55  inline KeyIterator(const Map<K, T, C>& map): it(map.tree) { }
56  inline KeyIterator(const KeyIterator& iter): it(iter.it) { }
57  inline KeyIterator& operator=(const KeyIterator& iter) { it = iter; return *this; }
58  inline bool ended(void) const { return it.ended(); }
59  inline void next(void) { it.next(); }
60  inline key_t item(void) const { return it.item().fst; }
61  private:
62  typename tree_t::Iterator it;
63  };
64 
65  // PairIterator class
66  class PairIterator: public tree_t::Iterator {
67  public:
68  inline PairIterator(const Map<K, T, C>& map): tree_t::Iterator(map.tree) { }
69  inline PairIterator(const PairIterator& iter): tree_t::Iterator(iter) { }
70  inline PairIterator& operator=(const PairIterator& iter) { tree_t::Iterator::operand=(iter) ; return *this; }
71  };
72 
73  // MutableIterator class
74  class MutableIterator: public PairIterator {
75  public:
76  inline MutableIterator(Map<K, T, C>& map): PairIterator(map) { }
77  inline MutableIterator(const MutableIterator& iter): PairIterator(iter) { }
78  inline MutableIterator& operator=(const MutableIterator& iter) { PairIterator::operator=(iter); return *this; }
79  inline void set(const T& value) { PairIterator::data().snd = value; }
80  };
81 
82  // Iterator class
83  /*class Iterator: public PairIterator {
84  public:
85  inline Iterator(const Map<K, T, C>& map): PairIterator(map) { }
86  inline Iterator(const Iterator& iter): PairIterator(iter) { }
87  inline typename ti<T>::val_t item(void) const { return ti<T>::get(PairIterator::item().snd); }
88  };*/
89 
90 
91  // KeyIterator class
92  class Iterator: public PreIterator<Iterator, T> {
93  public:
94  inline Iterator(const Map<K, T, C>& map): it(map.tree) { }
95  inline Iterator(const Iterator& iter): it(iter.it) { }
96  inline Iterator& operator=(const Iterator& iter) { it = iter; return *this; }
97  inline bool ended(void) const { return it.ended(); }
98  inline void next(void) { it.next(); }
99  inline val_t item(void) const { return it.item().snd; }
100  private:
101  typename tree_t::Iterator it;
102  };
103 
104 
105  // MutableMap concept
106  inline Option<T> get(key_t key)
107  { pair_t *p = tree.get(key); if(!p) return none; else return some(ti<T>::get(p->snd)); }
108  inline T & get(const K &key, T& def)
109  { const pair_t *p = tree.get(key); if(!p) return def; else return one(p->snd); }
110  inline void put(const K &key, const T &value) { tree.set(pair_t(key, value)); }
111  inline void remove(const K &key) { tree.remove(key); }
112  inline void remove(const PairIterator &iter) { tree.remove(iter.item().fst); }
113  inline void clear(void) { tree.clear(); }
114  inline void copy(const Map<K, T, C>& map) { tree.copy(map.tree); }
115  inline Map<K, T, C>& operator=(const Map<K, T, C>& map) { copy(map); return *this; }
116 
117 private:
118  tree_t tree;
119 };
120 
121 } } // elm::genstruct
122 
123 #endif /* ELM_GENSTRUCT_AVLMAP_CPP_ */
Definition: Map.h:53
Map< K, T, C > & operator=(const Map< K, T, C > &map)
Definition: Map.h:115
MutableIterator(Map< K, T, C > &map)
Definition: Map.h:76
void clear(void)
Definition: GenTree.h:148
Definition: PreIterator.h:29
bool hasKey(key_t key) const
Definition: Map.h:44
val_t item(void) const
Definition: Map.h:99
Option< T > some(T val)
Definition: Option.h:49
T embed_t
Definition: type_info.h:43
bool ended(void) const
Definition: Map.h:58
int count(void) const
Definition: GenTree.h:103
Definition: Map.h:92
static const T & get(const T &v)
Definition: type_info.h:49
void remove(const typename K::key_t &item)
Definition: GenTree.h:231
void clear(void)
Definition: Map.h:113
T in_t
Definition: type_info.h:44
Iterator(const Iterator &iter)
Definition: Map.h:95
void copy(const GenTree< T, K, C > &tree)
Definition: GenTree.h:163
bool ended(void) const
Definition: Map.h:97
T & out_t
Definition: type_info.h:45
value_t value(CString name, int value)
Definition: rtti.h:40
bool operator!=(const Map< K, T, C > &map) const
Definition: Map.h:50
KeyIterator(const KeyIterator &iter)
Definition: Map.h:56
PairIterator(const PairIterator &iter)
Definition: Map.h:69
Definition: Option.h:22
void next(void)
Definition: Map.h:98
PairIterator(const Map< K, T, C > &map)
Definition: Map.h:68
void put(const K &key, const T &value)
Definition: Map.h:110
MutableIterator(const MutableIterator &iter)
Definition: Map.h:77
Definition: Map.h:66
void copy(const Map< K, T, C > &map)
Definition: Map.h:114
bool equals(const Map< K, T, C > &map) const
Definition: Map.h:48
key_t item(void) const
Definition: Map.h:60
void set(const T &value)
Definition: Map.h:79
T * get(const typename K::key_t &key)
Definition: GenTree.h:97
bool isEmpty(void) const
Definition: GenTree.h:105
PairIterator & operator=(const PairIterator &iter)
Definition: Map.h:70
T2 snd
Definition: Pair.h:19
int count(void) const
Definition: Map.h:46
void set(const T &item)
Definition: GenTree.h:203
bool equals(const GenTree< T, K, C > &tree) const
Definition: GenTree.h:261
void next(void)
Definition: Map.h:59
T & data(void)
Definition: GenTree.h:132
Definition: Map.h:74
KeyIterator & operator=(const KeyIterator &iter)
Definition: Map.h:57
MutableIterator & operator=(const MutableIterator &iter)
Definition: Map.h:78
Iterator & operator=(const Iterator &iter)
Definition: Map.h:96
Definition: Pair.h:16
Iterator(const Map< K, T, C > &map)
Definition: Map.h:94
Definition: GenTree.h:54
const OptionalNone none
Definition: util_Option.cpp:134
KeyIterator(const Map< K, T, C > &map)
Definition: Map.h:55
Definition: Map.h:31
Definition: type_info.h:230
bool operator==(const Map< K, T, C > &map) const
Definition: Map.h:49
bool isEmpty(void) const
Definition: Map.h:47