Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
Map.H
1 
2 # ifndef ALEPH_MAP_H
3 # define ALEPH_MAP_H
4 /*
5  Aleph implementation of map C++ standard container
6 */
7 
8 # include <stdlib.h>
9 # include <ahFunction.H>
10 # include <ah_stdc++_utils.H>
11 # include <tpl_treapRk.H>
12 # include <tpl_nodePool.H>
13 
14 
15 namespace Aleph
16 {
17 
18 
51  template <class Key,
52  class Elem,
53  class Compare = Aleph::less<Key>,
54  template <class, class> class Tree = Treap_Rk
55  >
56 class map
57 {
58 
59  struct Cmp
60  {
61  bool
62  operator () (const std::pair<Key, Elem> & __x,
63  const std::pair<Key, Elem> & __y) const
64  {
65  return Compare () (__x.first, __y.first);
66  }
67  };
68 
69 public:
70 
72  typedef std::pair<Key, Elem> Pair;
73 
75  typedef Pair value_type;
76 
79  typedef typename map::value_type & reference;
80 
82  typedef const typename map::value_type & const_reference;
83 
84  typedef size_t size_type;
85 
87  typedef Key key_type;
88 
90  typedef Elem mapped_type;
91 
92 private:
93 
94  typedef Tree<Pair, Cmp> Tree_Type;
95 
96  typedef typename Tree_Type::Node Node;
97 
98  Node_Pool<Node> node_pool;
99 
100  mutable Tree_Type tree;
101 
102  Node * search_in_tree (const Key & k)
103  {
104  return tree.search (Pair(k, Elem()));
105  }
106 
107 public:
108 
113  class iterator
114  {
115  private:
116 
117  friend class map<Key, Elem>;
118 
119  typedef typename Tree_Type::Iterator Iterator;
120 
121  Iterator itor;
122  bool underflow;
123  bool overflow;
124 
125  void init_flags ()
126  {
127  if (itor.has_current () )
128  underflow = overflow = false;
129  else
130  underflow = overflow = true;
131  }
132 
133  void goto_begin ()
134  {
135  itor.reset_first ();
136  init_flags ();
137  }
138 
139  void goto_last ()
140  {
141  itor.reset_last ();
142  init_flags ();
143  }
144 
145  void goto_end ()
146  {
147  itor.reset_last ();
148  init_flags ();
149  if (not overflow)
150  itor.next ();
151  overflow = true;
152  }
153 
154  void forward ()
155  {
156  if (underflow)
157  {
158  goto_begin ();
159  return;
160  }
161 
162  itor.next ();
163 
164  if (not itor.has_current () )
165  overflow = true;
166  }
167 
168  void backward ()
169  {
170  if (overflow)
171  {
172  goto_last ();
173  return;
174  }
175 
176  itor.prev ();
177 
178  if (not itor.has_current () )
179  underflow = true;
180  }
181 
182  iterator (Tree_Type & _tree, Node * node)
183  : itor (_tree, node), underflow (false), overflow (false)
184  {
185  /* empty */
186  }
187 
188  public:
189 
191  typedef typename map::value_type value_type;
192 
194  typedef typename map::size_type difference_type;
195 
197  typedef typename map::value_type * pointer;
198 
200  typedef typename map::reference reference;
201 
203  iterator () { /* empty */ }
204 
205  iterator (Tree_Type & tree) : itor (tree)
206  {
207  init_flags ();
208  }
209 
211  const Pair & operator * ()
212  {
213  return KEY(itor.get_current());
214  }
215 
217  const Pair * operator -> ()
218  {
219  return &KEY(itor.get_current());
220  }
221 
225  {
226  forward ();
227  return *this;
228  }
229 
232  {
233  iterator ret_val = *this;
234  forward ();
235  return ret_val;
236  }
237 
241  {
242  backward ();
243  return *this;
244  }
245 
248  {
249  iterator ret_val = *this;
250  backward ();
251  return ret_val;
252  }
253 
256  iterator operator += (const size_type & n)
257  {
258  itor.reset_to_pos (itor.get_current_position () + n);
259  return *this;
260  }
261 
264  iterator operator -= (const size_type & n)
265  {
266  itor.reset_to_pos (itor.get_current_position () - n);
267  return *this;
268  }
269 
271  bool operator == (const iterator & _itor) const
272  {
273  return itor == _itor.itor;
274  }
275 
277  bool operator != (const iterator & _itor) const
278  {
279  return not (itor == _itor.itor);
280  }
281 
282  bool verify (const map & _map) const
283  {
284  return itor.verify ( (Tree_Type*) &_map.tree);
285  }
286 
287  bool verify (const iterator & it) const
288  {
289  return itor.verify (it.itor);
290  }
291  };
292 
294  map () : node_pool(100) { /* empty */ }
295 
297  map (const map & c) : node_pool(100)
298  {
299  tree.getRoot () = copyRec (c.tree.getRoot () );
300  }
301 
302 
305  ~map ()
306  {
307  destroyRec (tree.getRoot () );
308  }
309 
311  map & operator = (const map& c)
312  {
313  if (this == &c)
314  return *this;
315 
316  destroyRec (tree.getRoot ());
317 
318  tree.getRoot () = copyRec (c.tree.getRoot ());
319 
320  return *this;
321  }
322 
324  size_t size () const { return COUNT (tree.getRoot () ); }
325 
327  bool empty () const
328  {
329  return size() == 0;
330  }
331 
334  bool operator == (const map & c) const
335  {
336  if (size () != c.size () )
337  return false;
338 
339  typename Tree_Type::Iterator itor1 (tree), itor2 (c.tree);
340 
341  while (itor1.has_current () and itor2.has_current () )
342  {
343  if (KEY (itor1.get_current () ) != KEY (itor2.get_current () ) )
344  return false;
345 
346  itor1.next ();
347  itor2.next ();
348  }
349 
350  I (not itor1.has_current () and not itor2.has_current () );
351 
352  return true;
353  }
354 
357  bool operator != (const map & c) const
358  {
359  return not *this == c;
360  }
361 
364  bool operator < (const map & c) const
365  {
366  typename Tree_Type::Iterator itor1 (tree), itor2 (c.tree);
367 
368  while (itor1.has_current () and itor2.has_current () )
369  {
370  if (KEY (itor1.get_current () ) < KEY (itor2.get_current () ))
371  return true;
372  else if (KEY (itor2.get_current () ) < KEY (itor1.get_current () ))
373  return false;
374 
375  // En este caso las claves sons iguales
376  itor1.next ();
377  itor2.next ();
378  }
379 
380  if (not itor1.has_current ())
381  return true;
382 
383  return false;
384  }
385 
388  bool operator > (const map & c)
389  {
390  return not (*this == c or *this < c);
391  }
392 
395  bool operator <= (const map & c)
396  {
397  return not (*this > c );
398  }
399 
402  bool operator >= (const map & c)
403  {
404  return not (*this < c);
405  }
406 
418  size_type count (const Key & key)
419  {
420  if (search_in_tree (key) != NULL)
421  return 1;
422 
423  return 0;
424  }
425 
438  iterator find (const Key & key)
439  {
440  Node * p = search_in_tree (key);
441 
442  if (p == NULL)
443  return end ();
444 
445  return iterator (tree, p);
446  }
450  iterator lower_bound (const Key & key)
451  {
452  Node * p =
453  search_rank_parent <Node, Cmp> (tree.getRoot(), Pair(key, Elem()));
454 
455  return iterator(tree, p);
456  }
457 
461  iterator upper_bound (const Key & key)
462  {
463  Node * p =
464  search_rank_parent <Node, Cmp> (tree.getRoot(), Pair(key, Elem()));
465 
466  iterator upper(tree, p);
467 
468  if (KEY (p).first == key)
469  upper.itor.next();
470 
471  return upper;
472  }
473 
476  void swap (map & c)
477  {
478  tree.swap (c.tree);
479  }
480 
483  {
484  return iterator (tree);
485  }
486 
489  {
490  iterator last (tree);
491  last.goto_end ();
492 
493  return last;
494  }
495 
511  std::pair<iterator, bool> insert (const Pair & key)
512  {
513  Node * p = node_pool.allocate(key);
514 
515  if (tree.search_or_insert(p) != p)
516  {
517  node_pool.deallocate(p);
518  return std::pair<iterator, bool> (iterator (tree), false);
519  }
520 
521  return std::pair<iterator, bool> (iterator(tree, p), true);
522  }
523 
539  template <typename Itor>
540  map (Itor beg, const Itor & end) : map()
541  {
542  while (beg != end)
543  insert(*beg++);
544  }
545 
564  iterator insert (iterator /* pos */, const Pair& key)
565  {
566  return insert(key);
567  }
568 
586  template <typename Itor>
587  void insert (Itor beg, const Itor & end)
588  {
589  while (beg != end)
590  insert (*beg++);
591  }
592 
604  size_type erase (const Key & key)
605  {
606  Node * p = tree.remove (Pair(key, Elem()));
607 
608  if (p == NULL)
609  return 0;
610 
611  node_pool.deallocate(p);
612 
613  return 1;
614  }
615 
629  void erase (iterator pos)
630  {
631  erase (KEY (pos.itor.get_current ()).first);
632  }
633 
647  iterator erase (const iterator & beg, const iterator & end)
648  {
649  Aleph::verify_iterators (beg, end);
650  Aleph::verify_container_and_iterator (*this, beg);
651 
652  iterator ret_val = end;
653 
654  const size_t pos_beg = beg.itor.get_current_position ();
655  const size_t pos_end = end.itor.get_current_position ();
656 
657  Node * removed_tree = tree.remove (pos_beg, pos_end - 1);
658 
659  destroyRec (removed_tree);
660 
661  return ret_val;
662  }
663 
665  void clear ()
666  {
667  destroyRec (tree.getRoot());
668  }
669 
670 private:
671 
672  struct Proxy
673  {
674  map * map_ptr;
675  Node * node;
676  Key key;
677 
678  Proxy (map * m_ptr, const Key & _key) : map_ptr (m_ptr), key (_key)
679  {
680  node = map_ptr->search_in_tree(key);
681  }
682 
683  Proxy & operator = (const Elem & elem)
684  {
685  if (node == NULL)
686  {
687  node = map_ptr->node_pool.allocate(std::make_pair(key, elem));
688  map_ptr->tree.insert(node);
689  }
690  else
691  KEY(node).second = elem;
692 
693  return *this;
694  }
695 
696  Proxy & operator = (const Proxy & proxy)
697  {
698  if (this == &proxy)
699  return *this;
700 
701  if (proxy.node == NULL)
702  throw std::domain_error("key not found");;
703 
704  if (map_ptr == proxy.map_ptr and key == proxy.key)
705  return *this; // They are the same
706 
707  if (node == NULL)
708  {
709  node = map_ptr->node_pool.allocate(KEY(proxy.node));
710  map_ptr->tree.insert(node);
711  }
712  else
713  KEY(node).second = KEY(proxy.node).second;
714 
715  return *this;
716  }
717 
718  operator Elem & () const
719  {
720  if (node == NULL)
721  throw std::domain_error ("key not found");;
722 
723  return KEY (node).second;
724  }
725  };
726 
727 public:
728 
729  const Proxy operator [] (const Key & key) const
730  Exception_Prototypes (std::domain_error)
731  {
732  return Proxy (this, key);
733  }
734 
735  Proxy operator [] (const Key & key)
736  Exception_Prototypes (std::domain_error)
737  {
738  return Proxy (this, key);
739  }
740 };
741 
742 
743 
744 } // end namespace Aleph
745 
746 
747 # endif // ALEPH_MAP_H
bool empty() const
Retorna true si el contenedor esta vacío.
Definition: Map.H:327
map & operator=(const map &c)
Asigna todo el contenido de c a this.
Definition: Map.H:311
iterator find(const Key &key)
Definition: Map.H:438
iterator begin()
Retorna un iterador posicionado al primer elemento del mapeo.
Definition: Map.H:482
bool operator>(const map &c)
Definition: Map.H:388
iterator erase(const iterator &beg, const iterator &end)
Definition: Map.H:647
Definition: tpl_treapRk.H:902
void swap(map &c)
Definition: Map.H:476
Definition: tpl_nodePool.H:19
size_t size() const
Retorna la cantidad de elementos que contiene el mapeo.
Definition: Map.H:324
iterator insert(iterator, const Pair &key)
Definition: Map.H:564
iterator()
Constructor vacío; no tiene validez si no se asocia un mapeo.
Definition: Map.H:203
Definition: ahFunction.H:145
map::value_type value_type
El tipo de elemento que maneja el iterador.
Definition: Map.H:191
const Pair * operator->()
"Dereferencia" un puntero al elemento actual.
Definition: Map.H:217
Key key_type
El tipo de clave de indización.
Definition: Map.H:87
#define COUNT(p)
Definition: tpl_binNodeXt.H:34
const map::value_type & const_reference
Tipo generico referencia constante.
Definition: Map.H:82
void erase(iterator pos)
Definition: Map.H:629
map()
Constructor vacío.
Definition: Map.H:294
map(const map &c)
Instancia una copia del mapeo c.
Definition: Map.H:297
map::size_type difference_type
El tipo numérico para manejar aritmética.
Definition: Map.H:194
iterator operator-=(const size_type &n)
Definition: Map.H:264
bool operator==(const iterator &_itor) const
Retorna true si los iterador tienen el mismo estado.
Definition: Map.H:271
iterator operator+=(const size_type &n)
Definition: Map.H:256
bool operator>=(const map &c)
Definition: Map.H:402
const Pair & operator*()
Proporciona una referencia al elemento actual.
Definition: Map.H:211
map::value_type * pointer
Tipo de dato puntero a elemento actual.
Definition: Map.H:197
bool operator==(const map &c) const
Definition: Map.H:334
size_type count(const Key &key)
Definition: Map.H:418
bool operator<=(const map &c)
Definition: Map.H:395
bool operator!=(const iterator &_itor) const
Retorna true si los iterador tienen estados distintos.
Definition: Map.H:277
map(Itor beg, const Itor &end)
Definition: Map.H:540
size_type erase(const Key &key)
Definition: Map.H:604
Definition: Map.H:113
std::pair< Key, Elem > Pair
Tipo par almacenado en mapeo.
Definition: Map.H:72
void destroyRec(Node *&root)
Definition: tpl_binNodeUtils.H:798
iterator operator--()
Definition: Map.H:240
map::value_type & reference
Definition: Map.H:79
void clear()
Borra todos los elementos del mapeo.
Definition: Map.H:665
Pair value_type
Tipo a exportar como tipo del contenedor.
Definition: Map.H:75
map::reference reference
Tipo de dato referencia a elemento actual.
Definition: Map.H:200
Node * copyRec(Node *src_root)
Definition: tpl_binNodeUtils.H:821
void insert(Itor beg, const Itor &end)
Definition: Map.H:587
std::pair< iterator, bool > insert(const Pair &key)
Definition: Map.H:511
bool operator<(const map &c) const
Definition: Map.H:364
iterator upper_bound(const Key &key)
Definition: Map.H:461
~map()
Definition: Map.H:305
#define KEY(p)
Definition: tpl_binNode.H:206
Definition: Map.H:56
iterator lower_bound(const Key &key)
Definition: Map.H:450
iterator operator++()
Definition: Map.H:224
Elem mapped_type
El tipo de rango del mapeo.
Definition: Map.H:90
iterator end()
Retorna un iterador posicionado al último elemento del mapeo.
Definition: Map.H:488
bool operator!=(const map &c) const
Definition: Map.H:357

Leandro Rabindranath León