Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_dnode.H
1 
2 # ifndef TPL_DNODE_H
3 # define TPL_DNODE_H
4 
5 # include <ahFunction.H>
6 # include <dlink.H>
7 
8 using namespace Aleph;
9 
10 namespace Aleph {
11 
19 template <typename T> class Dnode : public Dlink
20 {
21 private:
22 
23  mutable T data;
24 
25 public:
26 
28  Dnode<T> *& get_next() { return (Dnode<T>*&) next; }
29 
31  Dnode<T> *& get_prev() { return (Dnode<T>*&) prev; }
32 
35 
38 
40  Dnode<T> *& get_first() { return reinterpret_cast<Dnode<T>*&>(next); }
41 
43  Dnode<T> *& get_last() { return reinterpret_cast<Dnode<T>*&> (prev); }
44 
48  {
49  return static_cast<Dnode<T>*>(Dlink::remove_prev());
50  }
51 
55  {
56  return static_cast<Dnode<T>*>(Dlink::remove_next());
57  }
58 
59  Dnode() { /* nothing */ }
60 
62  Dnode(const T & item) : data(item)
63  {
64  // empty
65  }
66 
67  Dnode(T && item)
68  {
69  std::swap(data, item);
70  }
71 
72  Dnode & swap(Dnode & p)
73  {
74  Dlink::swap(p);
75  std::swap(data, p.data);
76  return *this;
77  }
78 
79  Dnode & swap(Dnode * p)
80  {
81  return swap(*p);
82  }
83 
85  Dnode(const Dnode & node) : Dlink(), data(node.data)
86  {
87  /* empty */
88  }
89 
91  Dnode(Dnode && node) : data(std::move(node).data)
92  {
93  /* empty */
94  }
95 
96  Dnode & operator = (const Dnode & p)
97  {
98  if (&p == this)
99  return *this;
100 
101  data = p.data;
102 
103  return *this;
104  }
105 
106  Dnode & operator = (Dnode && p)
107  {
108  std::swap(data, p.data);
109  return *this;
110  }
111 
113  Dnode & operator = (const T & _data)
114  {
115  data = _data;
116  return *this;
117  }
118 
120  Dnode & operator = (T && _data)
121  {
122  data = std::move(_data);
123  return *this;
124  }
126  T & get_data() { return data; }
127 
129  typedef T key_type;
130 
131  T & get_key() { return data; }
132 
134  typedef T dnode_type;
135 
136  static Dnode * data_to_node(T & data)
137  {
138  Dnode * zero = 0;
139  long offset = (long) &(zero->data);
140  unsigned long addr = (unsigned long) (&data);
141  return (Dnode*) (addr - offset);
142  }
143 
148  class Iterator : public Dlink::Iterator
149  {
150  public:
151 
154 
156  typedef Dnode<T>* Item_Type;
157 
158  Iterator() { /* empty */ }
159 
161  Iterator(Dlink * head_ptr) : Dlink::Iterator(head_ptr) { /* empty */ }
162 
164  Iterator(Dlink & head) : Dlink::Iterator(&head) { /* empty */ }
165 
166  // Instancia iterador en lista cuyo nodo cabecera es head_ptr y
167  // coloca el elemento actual en el apuntado por curr_ptr
168  Iterator(Dlink * head_ptr, Dnode * curr_ptr)
169  : Dlink::Iterator(head_ptr, curr_ptr)
170  {
171  // Empty
172  }
173 
176  {
177  Dlink::Iterator::operator = (head);
178  return *this;
179  }
180 
182  {
183  return static_cast<Dnode<T>*>(this->Dlink::Iterator::get_current());
184  }
185 
186  Dnode<T> * get_curr() const
187  {
189  }
190 
193  Dnode * del() { return static_cast<Dnode*>(Dlink::Iterator::del()); }
194  };
195 };
196 
197 }
198 
199 # endif /* TPL_DNODE_H */
200 
Dnode(const Dnode &node)
Constructor copia de nodo. Sólo se copia el dato.
Definition: tpl_dnode.H:85
Dnode< T > * remove_next()
Elimina sucesor a this y retorna su dirección.
Definition: tpl_dnode.H:37
T dnode_type
Exporta tipo del dato que contiene el nodo.
Definition: tpl_dnode.H:134
Dnode< T > * get_curr() const
retorna puntero al nodo actual
Definition: tpl_dnode.H:186
Dnode< T > * remove_first()
Elimina el primer elemento de la lista this y retorna su dirección.
Definition: tpl_dnode.H:54
Dnode< T > *& get_first()
Retorna referencia a puntero del primer nodo de this.
Definition: tpl_dnode.H:40
Dnode< T > *& get_last()
Retorna referencia a puntero del último nodo de this.
Definition: tpl_dnode.H:43
Dnode< T > * remove_last()
Elimina el último elemento de la lista this y retorna su dirección.
Definition: tpl_dnode.H:47
Dnode< T > *& get_next()
Retorna referencia a puntero de nodo siguiente a this.
Definition: tpl_dnode.H:28
Dnode(Dnode &&node)
Constructor copia rvalue de nodo. Sólo se copia el dato.
Definition: tpl_dnode.H:91
Iterator(Dlink &head)
Instancia iterador en lista cuyo nodo cabecera es head_ptr */.
Definition: tpl_dnode.H:164
T key_type
tipo de dato
Definition: tpl_dnode.H:129
Iterator(Dlink *head_ptr)
Instancia iterador en lista cuyo nodo cabecera es head_ptr.
Definition: tpl_dnode.H:161
Dnode< T > *& get_prev()
Retorna referencia a puntero de nodo previo a this.
Definition: tpl_dnode.H:31
Dnode< T > * remove_prev()
Elimina anterior a this y retorna su dirección.
Definition: tpl_dnode.H:34
Dnode * del()
Definition: tpl_dnode.H:193
Definition: tpl_dnode.H:148
Dnode< T > * get_current() const
retorna puntero al nodo actual
Definition: tpl_dnode.H:181
Dnode(const T &item)
Construye nodo con dato _data.
Definition: tpl_dnode.H:62
Iterator & operator=(Dnode *head)
Asigna al iterador la lista apuntada por head */.
Definition: tpl_dnode.H:175
Dnode< T > * Item_Type
Tipo de elemento que contiene.
Definition: tpl_dnode.H:156
T & get_data()
Retorna referencia a dato contenido en el nodo.
Definition: tpl_dnode.H:126
Dnode< T > Set_Type
Tipo de conjunto sobre el cual se itera.
Definition: tpl_dnode.H:153
Nodo perteneciente a lista doblemente enlazada circular.
Definition: tpl_dnode.H:19

Leandro Rabindranath León