35 # include <ahFunction.H> 36 # include <ah_stdc++_utils.H> 37 # include <tpl_treapRk.H> 38 # include <tpl_nodePool.H> 79 class Compare = Aleph::less<Key>,
80 template <
class,
class>
class Tree =
Treap_Rk 87 operator () (
const std::pair<Key, Elem> & __x,
88 const std::pair<Key, Elem> & __y)
const noexcept
90 return Compare () (__x.first, __y.first);
97 typedef std::pair<Key, Elem>
Pair;
109 typedef size_t size_type;
119 typedef Tree<Pair, Cmp> Tree_Type;
121 typedef typename Tree_Type::Node Node;
125 mutable Tree_Type tree;
127 Node * search_in_tree (
const Key & k)
129 return tree.search (
Pair(k, Elem()));
142 friend class map<Key, Elem>;
144 typedef typename Tree_Type::Iterator Iterator;
152 if (itor.has_curr () )
153 underflow = overflow =
false;
155 underflow = overflow =
true;
189 if (not itor.has_curr () )
203 if (not itor.has_curr () )
207 iterator (Tree_Type & _tree, Node * node)
208 : itor (_tree, node), underflow (
false), overflow (
false)
230 iterator (Tree_Type & tree) : itor (tree)
236 const Pair & operator * ()
238 return KEY(itor.get_curr());
242 const Pair * operator -> ()
244 return &
KEY(itor.get_curr());
284 itor.reset_to_pos (itor.get_current_position () + n);
292 itor.reset_to_pos (itor.get_current_position () - n);
299 return itor == _itor.itor;
305 return not (itor == _itor.itor);
308 bool verify (
const map & _map)
const 310 return itor.verify ( (Tree_Type*) &_map.tree);
313 bool verify (
const iterator & it)
const 315 return itor.verify (it.itor);
320 map () : node_pool(100) { }
325 tree.getRoot () =
copyRec (c.tree.getRoot () );
344 tree.getRoot () =
copyRec (c.tree.getRoot ());
350 size_t size ()
const {
return COUNT (tree.getRoot () ); }
365 typename Tree_Type::Iterator itor1 (tree), itor2 (c.tree);
367 while (itor1.has_curr() and itor2.has_curr() )
369 if (
KEY (itor1.get_curr() ) !=
KEY (itor2.get_curr() ) )
376 assert(not itor1.has_curr() and not itor2.has_curr() );
385 return not (*
this == c);
392 typename Tree_Type::Iterator itor1 (tree), itor2 (c.tree);
394 while (itor1.has_curr() and itor2.has_curr() )
396 if (
KEY (itor1.get_curr() ) <
KEY (itor2.get_curr() ))
398 else if (
KEY (itor2.get_curr() ) <
KEY (itor1.get_curr() ))
406 if (not itor1.has_curr())
416 return not (*
this == c or *
this < c);
423 return not (*
this > c );
430 return not (*
this < c);
446 if (search_in_tree (key) !=
nullptr)
466 Node * p = search_in_tree (key);
479 search_rank_parent <Node, Cmp> (tree.getRoot(),
Pair(key, Elem()));
490 search_rank_parent <Node, Cmp> (tree.getRoot(),
Pair(key, Elem()));
494 if (
KEY (p).first == key)
537 std::pair<iterator, bool>
insert (
const Pair & key)
541 if (tree.search_or_insert(p) != p)
544 return std::pair<iterator, bool> (
iterator (tree),
false);
547 return std::pair<iterator, bool> (
iterator(tree, p),
true);
565 template <
typename Itor>
612 template <
typename Itor>
632 Node * p = tree.remove (
Pair(key, Elem()));
657 erase (
KEY (pos.itor.get_curr ()).first);
675 Aleph::verify_iterators (beg, end);
676 Aleph::verify_container_and_iterator (*
this, beg);
680 const size_t pos_beg = beg.itor.get_current_position ();
681 const size_t pos_end = end.itor.get_current_position ();
683 Node * removed_tree = tree.remove (pos_beg, pos_end - 1);
704 Proxy (
map * m_ptr,
const Key & _key) : map_ptr (m_ptr), key (_key)
706 node = map_ptr->search_in_tree(key);
713 node = map_ptr->node_pool.allocate(std::make_pair(key, elem));
714 map_ptr->tree.insert(node);
717 KEY(node).second = elem;
727 if (proxy.node ==
nullptr)
728 throw std::domain_error(
"key not found");;
730 if (map_ptr == proxy.map_ptr and key == proxy.key)
735 node = map_ptr->node_pool.allocate(
KEY(proxy.node));
736 map_ptr->tree.insert(node);
739 KEY(node).second =
KEY(proxy.node).second;
744 operator Elem & ()
const 747 throw std::domain_error (
"key not found");;
749 return KEY (node).second;
755 const Proxy operator [] (
const Key & key)
const 757 return Proxy (
this, key);
760 Proxy operator [] (
const Key & key)
762 return Proxy (
this, key);
771 # endif // ALEPH_MAP_H map & operator=(const map &c)
Asigna todo el contenido de c a this.
Definition: Map.H:337
iterator find(const Key &key)
Definition: Map.H:464
iterator begin()
Retorna un iterador posicionado al primer elemento del mapeo.
Definition: Map.H:508
bool operator>(const map &c)
Definition: Map.H:414
bool operator==(const map &c) const
Definition: Map.H:360
iterator erase(const iterator &beg, const iterator &end)
Definition: Map.H:673
void swap(map &c)
Definition: Map.H:502
Definition: tpl_nodePool.H:45
iterator insert(iterator, const Pair &key)
Definition: Map.H:590
iterator()
Constructor vacÃo; no tiene validez si no se asocia un mapeo.
Definition: Map.H:228
void deallocate(Node *p) noexcept
Definition: tpl_nodePool.H:102
map::value_type value_type
El tipo de elemento que maneja el iterador.
Definition: Map.H:216
auto & COUNT(Node *p) noexcept
Definition: tpl_binNodeXt.H:66
Key key_type
El tipo de clave de indización.
Definition: Map.H:112
const map::value_type & const_reference
Tipo generico referencia constante.
Definition: Map.H:107
void erase(iterator pos)
Definition: Map.H:655
map()
Constructor vacÃo.
Definition: Map.H:320
bool operator<(const map &c) const
Definition: Map.H:390
map(const map &c)
Instancia una copia del mapeo c.
Definition: Map.H:323
map::size_type difference_type
El tipo numérico para manejar aritmética.
Definition: Map.H:219
size_t size() const
Retorna la cantidad de elementos que contiene el mapeo.
Definition: Map.H:350
bool operator>=(const map &c)
Definition: Map.H:428
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
map::value_type * pointer
Tipo de dato puntero a elemento actual.
Definition: Map.H:222
size_type count(const Key &key)
Definition: Map.H:444
bool operator<=(const map &c)
Definition: Map.H:421
map(Itor beg, const Itor &end)
Definition: Map.H:566
size_type erase(const Key &key)
Definition: Map.H:630
std::pair< Key, Elem > Pair
Tipo par almacenado en mapeo.
Definition: Map.H:97
bool operator!=(const map &c) const
Definition: Map.H:383
void destroyRec(Node *&root) noexcept
Definition: tpl_binNodeUtils.H:500
Definition: tpl_treapRk.H:1010
map::value_type & reference
Definition: Map.H:104
void clear()
Borra todos los elementos del mapeo.
Definition: Map.H:691
Pair value_type
Tipo a exportar como tipo del contenedor.
Definition: Map.H:100
map::reference reference
Tipo de dato referencia a elemento actual.
Definition: Map.H:225
void insert(Itor beg, const Itor &end)
Definition: Map.H:613
std::pair< iterator, bool > insert(const Pair &key)
Definition: Map.H:537
iterator upper_bound(const Key &key)
Definition: Map.H:487
~map()
Definition: Map.H:331
Node * copyRec(Node *root)
Definition: tpl_binNodeUtils.H:519
bool empty() const
Retorna true si el contenedor esta vacÃo.
Definition: Map.H:353
iterator lower_bound(const Key &key)
Definition: Map.H:476
Node * allocate()
Definition: tpl_nodePool.H:56
Elem mapped_type
El tipo de rango del mapeo.
Definition: Map.H:115
iterator end()
Retorna un iterador posicionado al último elemento del mapeo.
Definition: Map.H:514