35 std::swap(prev, l.prev);
36 std::swap(next, l.next);
41 Dlink() : prev(
this), next(
this) { }
65 throw std::invalid_argument (
"left list must be empty");
100 link->next->prev =
this;
101 link->prev->next =
this;
120 std::swap(prev->next, link->prev->next);
121 std::swap(next->prev, link->next->prev);
122 std::swap(prev, link->prev);
123 std::swap(next, link->next);
127 bool is_empty()
const {
return this == next and
this == prev; }
142 I((
this != NULL) and (next != NULL) and (prev != NULL));
168 I((
this != NULL) and (next != NULL) and (prev != NULL));
181 I((
this != NULL) and (next != NULL) and (prev != NULL));
191 I((
this != NULL) and (next != NULL) and (prev != NULL));
215 head->prev->next = next;
216 head->next->prev =
this;
217 next->prev = head->prev;
236 head->next->prev = prev;
237 head->prev->next =
this;
238 prev->next = head->next;
266 prev->next = head->next;
267 head->next->prev = prev;
269 head->prev->next =
this;
280 I((
this != NULL) and (next != NULL) and (prev != NULL));
298 I((
this != NULL) and (next != NULL) and (prev != NULL));
302 Dlink* retValue = prev;
310 I((
this != NULL) and (next != NULL) and (prev != NULL));
314 Dlink* retValue = next;
409 if (link == this->prev)
416 if (link == this->next)
423 list.prev = this->prev;
425 this->prev = link->prev;
426 link->prev->next =
this;
428 list.prev->next = &list;
441 mutable Dlink * head;
442 mutable Dlink * curr;
486 : head(head_ptr), curr(curr_ptr)
496 I(curr != NULL and head != NULL);
503 I(curr != NULL and head != NULL);
519 I(curr != NULL and head != NULL);
556 I(curr != NULL and head != NULL);
566 I(curr != NULL and head != NULL);
569 throw std::overflow_error(
"Not element in list");
584 void prev() throw(std::exception, std::underflow_error)
587 throw std::underflow_error(
"Not previous element in list");
593 void next() throw(std::exception, std::overflow_error)
596 throw std::overflow_error(
"Not next element in list");
614 I(curr != NULL and head != NULL);
623 bool verify(
Dlink * l)
const {
return head == l; }
625 bool verify(
const Iterator & it)
const {
return head == it.head; }
642 for (; itor.has_current(); itor.next())
644 node = itor.get_current();
653 for (itor.reset_last(); itor.has_current(); itor.prev())
655 node = itor.get_current();
695 # define DLINK_TO_TYPE(type_name, link_name) \
696 inline static type_name * dlink_to_##type_name(Dlink * link) \
698 type_name * ptr_zero = 0; \
699 size_t offset_link = reinterpret_cast<size_t>(&(ptr_zero->link_name));\
700 char * address_type = reinterpret_cast<char*>(link) - offset_link; \
701 return reinterpret_cast<type_name *>(address_type); \
741 # define LINKNAME_TO_TYPE(type_name, link_name) \
742 inline static type_name * link_name##_to_##type_name(Dlink * link) \
744 type_name * ptr_zero = 0; \
745 size_t offset_link = reinterpret_cast<size_t>(&(ptr_zero->link_name));\
746 char * address_type = reinterpret_cast<char*>(link) - offset_link; \
747 return reinterpret_cast<type_name *>(address_type); \
779 # define DLINK_TO_BASE(type_name, link_name) \
780 inline static type_name * dlink_to_base(Dlink * link) \
782 type_name * ptr_zero = 0; \
783 size_t offset_link = reinterpret_cast<size_t>(&(ptr_zero->link_name)); \
784 char * address_type = reinterpret_cast<char*>(link) - offset_link; \
785 return reinterpret_cast<type_name *>(address_type); \
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Definition: ahAlgo.H:127
bool is_unitarian() const
retorna true si this tiene exactamente un elemento
Definition: dlink.H:130
void reset(Dlink *new_head)
Cambia la lista de iteración a la apuntada por new_head.
Definition: dlink.H:547
bool is_in_first() const
Retorna true si iterador está sobre primer elemento.
Definition: dlink.H:578
bool operator!=(const Iterator &it) const
retorna true si iteradores tienen estados diferentes.
Definition: dlink.H:605
Dlink * remove_next()
Elimina el sucesor de this.
Definition: dlink.H:308
bool is_unitarian_or_empty() const
retorna true si this tiene uno o ningún elemento
Definition: dlink.H:133
Dlink * remove_first()
Elimina el primer elemento de this.
Definition: dlink.H:325
Iterador sobre enlaces.
Definition: dlink.H:437
Dlink & operator=(const Dlink &l)
Definition: dlink.H:59
Dlink *& get_first()
Retorna el enlace del primer elemento de this.
Definition: dlink.H:196
Iterator(Dlink &_head)
Instancia un iterador sobre lista con nodo cabecera head.
Definition: dlink.H:469
Dlink * remove_prev()
Definition: dlink.H:296
size_t reverse_list()
Definition: dlink.H:340
void swap(Dlink *link)
Definition: dlink.H:93
Dlink *& get_next()
Retorna enlace después de this.
Definition: dlink.H:179
Iterator(Dlink *head_ptr, Dlink *curr_ptr)
Instancia un iterador sobre lista con nodo cabecera apuntado por head_ptr a partir del nodo apuntado ...
Definition: dlink.H:485
Dlink *& get_last()
Retorna el enlace del último elelemto de this.
Definition: dlink.H:199
Dlink Set_Type
Tipo de conjunto sobre el cual se itera.
Definition: dlink.H:447
Dlink *& get_prev()
Retorna enlace antes de this.
Definition: dlink.H:189
bool has_current() const
Retorna true si iterador aún tiene elemento actual.
Definition: dlink.H:554
Dlink cut_list(Dlink *link)
Corta la lista this por el enlace link y pasa todos los elementos a la lista vacía list...
Definition: dlink.H:404
Dlink * pop()
Elimina el primer elemento de this (como si fuese pila)
Definition: dlink.H:330
void append_list(Dlink *head)
Definition: dlink.H:231
Dlink(const Dlink &)
Constructor copia reinicia (no copia)
Definition: dlink.H:44
Iterator(Dlink *head_ptr)
Instancia un iterador sobre lista. head_ptr es el puntero a nodo cabecera.
Definition: dlink.H:460
void reset(Dlink *new_head, Dlink *new_curr)
Cambia el iterador a lista con nodo cabecera new_head y le coloca nodo actual el apuntado por new_cur...
Definition: dlink.H:533
size_t split_list(Dlink &l, Dlink &r)
Definition: dlink.H:372
void reset_first()
Reinicia iterador a primer nodo de la lista.
Definition: dlink.H:494
bool operator==(const Iterator &it) const
Retorna true si iteradores están sobre el mismo elemento.
Definition: dlink.H:602
Dlink * top()
retorna el primer nodo (como si fuera pila)
Definition: dlink.H:186
void erase()
Elimina this de su contexto en una lista.
Definition: dlink.H:288
void prev()
Retrocede iterador en una posición.
Definition: dlink.H:584
Dlink * Item_Type
Tipo de elemento que contiene el conjunto.
Definition: dlink.H:450
void append(Dlink *node)
Definition: dlink.H:166
void reset_last()
Reinicia iterador a último nodo de la lista.
Definition: dlink.H:501
void insert_list(Dlink *head)
Definition: dlink.H:210
void set(Dlink *new_curr)
Definition: dlink.H:517
void concat_list(Dlink *head)
Definition: dlink.H:252
void remove_all_and_delete()
Elimina y libera memoria todos los nodos de this.
Definition: dlink.H:632
Dlink * get_current() const
Retorna dirección de nodo actual.
Definition: dlink.H:564
Dlink * remove_last()
Elimina el último elemento de this.
Definition: dlink.H:320
bool is_empty() const
retorna true si this está vacía
Definition: dlink.H:127
void push(Dlink *node)
Definition: dlink.H:157
void reset()
Reinicia dlink (equivalente a que se vacíe la lista)
Definition: dlink.H:77
void init()
inicializa dlink. A usarse cuandos e use malloc
Definition: dlink.H:83
Iterator()
Constructor por omisión.
Definition: dlink.H:492
void del()
Elimina this de su contexto en una lista.
Definition: dlink.H:278
void insert(Dlink *node)
Definition: dlink.H:140
void next()
Avanza iterador en una posición.
Definition: dlink.H:593
bool is_in_last() const
Retorna true si iterador está sobre último elemento.
Definition: dlink.H:581
Dlink * del()
Definition: dlink.H:612