9 # include <ah_stdc++_utils.H>
10 # include <tpl_sort_utils.H>
47 mutable bool num_elem_is_updated;
49 void reset_num_elem(
const size_type & num = 0)
52 num_elem_is_updated =
true;
55 void update_num_elem()
57 I(not num_elem_is_updated);
59 size_type counter = 0;
65 num_elem_is_updated =
true;
89 underflow = overflow =
false;
91 underflow = overflow =
true;
215 for (
int i = 0; i < n; ++i)
224 for (
int i = 0; i < n; ++i)
233 return itor == __itor.itor;
239 return itor != __itor.itor;
244 return itor.verify((
Dlink*)(&list.dlist));
247 bool verify(
const iterator & it)
const
249 return itor.verify(it.itor);
255 void copy(
const list& _list)
263 Node * node =
new Node(it.get_current()->get_data());
273 list() : num_elem(0), num_elem_is_updated(true) { }
276 list(
const list & c) : num_elem(0), num_elem_is_updated(true)
285 for (; num_elem < num; ++num_elem)
286 dlist.append(
new Node);
301 : num_elem(0), num_elem_is_updated(true)
303 for (; num_elem < num; ++num_elem)
304 dlist.append(
new Node(value));
321 template <
class Itor>
323 : num_elem(0), num_elem_is_updated(true)
325 Aleph::verify_iterators(beg, end);
329 dlist.append(
new Node(*beg++));
342 if (not num_elem_is_updated)
351 return dlist.is_empty();
361 if (num_elem_is_updated and c.num_elem_is_updated)
362 if (num_elem != c.num_elem)
369 if (it_l.get_current()->get_data() != it_r.
get_current()->get_data())
376 if (it_l.is_empty() and it_r.is_empty())
386 return not (*
this == c);
411 return it_l.is_empty();
425 return not (c > *
this );
432 return not (*
this < c);
459 for (
int n = 0; n < num; ++n)
473 template <
typename Itor>
476 Aleph::verify_iterators(beg, end);
488 dlist.swap(&c.dlist);
489 std::swap(num_elem, c.num_elem);
490 std::swap(num_elem_is_updated, c.num_elem_is_updated);
496 return dlist.get_next()->get_data();
502 return dlist.get_prev()->get_data();
527 Aleph::verify_container_and_iterator(*
this, pos);
533 current_node->
append(new_node);
535 pos.itor.
set(new_node);
546 Aleph::verify_container_and_iterator(*
this, pos);
552 for (
int i = 0; i < num; ++i)
568 template <
class Itor>
571 Aleph::verify_container_and_iterator(*
this, pos);
572 Aleph::verify_iterators(beg, end);
596 dlist.insert(
new Node(value));
600 void push_back(
const T & value)
602 dlist.append(
new Node(value));
607 void remove(
const T & value)
610 if (it.get_current()->get_data() == value)
622 Aleph::verify_container_and_iterator(*
this, pos);
624 delete pos.itor.
del();
635 Aleph::verify_container_and_iterator(*
this, beg);
636 Aleph::verify_iterators(beg, end);
640 delete beg.itor.
del();
650 delete dlist.remove_next();
657 delete dlist.remove_prev();
664 dlist.remove_all_and_delete();
693 while (num_elem > num)
695 delete dlist.remove_prev();
704 insert(itor, num - num_elem, t);
715 it1.next(), ++num_elem)
720 if (op(it1.get_current()->get_data(), it2.
get_current()->get_data()))
747 Aleph::verify_container_and_iterator(*
this, pos);
751 num_elem_is_updated = l.num_elem_is_updated;
752 num_elem += l.num_elem;
756 I(l.dlist.is_empty());
774 Aleph::verify_container_and_iterator(*
this, pos);
775 Aleph::verify_container_and_iterator(src_list, src_pos);
787 Aleph::verify_container_and_iterator(*
this, pos);
788 Aleph::verify_container_and_iterator(src_list, src_beg);
789 Aleph::verify_iterators(src_beg, src_end);
791 Dlink list_to_insert;
792 src_list.dlist.cut_list(src_beg.itor.
get_current(), &list_to_insert);
794 Dlink remaining_list;
797 pos.itor.
get_current()->insert_list(&list_to_insert);
798 num_elem_is_updated =
false;
800 src_list.dlist.concat_list(&remaining_list);
801 src_list.num_elem_is_updated =
false;
808 quicksort<T, Cmp>(dlist);
823 Aleph::merge_lists<T, Cmp>(dlist, l.dlist, result);
827 num_elem += l.num_elem;
831 I(l.dlist.is_empty());
843 reset_num_elem(dlist.reverse_list());
848 template <
typename T>
865 # endif // ALEPH_LIST_H
void merge(list &l)
Mezcla dos listas ordenadas.
Definition: List.H:835
bool operator==(const iterator &__itor)
Retorna true si los iteradores son iguales.
Definition: List.H:231
T & operator*()
Proporciona una referencia al elemento actual de iterador.
Definition: List.H:167
bool operator==(const list &c) const
Definition: List.H:356
Definition: ahFunction.H:145
reference back() const
Retorna una referencia al último elemento de la lista.
Definition: List.H:500
size_type size()
Retorna la cantidad de elementos que tiene la lista.
Definition: List.H:340
reference front() const
Retorna una referencia al primer elemento de la lista.
Definition: List.H:494
list(const size_type &num)
Definition: List.H:283
const list::value_type & const_reference
Tipo referencia constante a elemento dentro de la lista.
Definition: List.H:38
list::value_type & reference
Tipo referencia a elemento dentro de la lista.
Definition: List.H:35
void pop_back()
Elimina de la lista el último elemento.
Definition: List.H:655
bool operator>(const list &c) const
Definition: List.H:416
void reverse()
Invierte la lista.
Definition: List.H:841
void push_front(const T &value)
Inserta al principio de la lista el valor value.
Definition: List.H:594
T value_type
El tipo de dato que maneja la lista.
Definition: List.H:32
list::value_type * pointer
Tipo puntero a elemento dentro de la lista.
Definition: List.H:158
void swap(list &c)
Definition: List.H:486
size_t size_type
Tipo numérico para el tamaño de la lista.
Definition: List.H:41
void splice(iterator pos, list &l)
Definition: List.H:745
bool operator>=(const list &c) const
Definition: List.H:430
list(const list &c)
Instancia una lista copia de c.
Definition: List.H:276
T * operator->()
Dereferencia el elemento actual del iterador.
Definition: List.H:173
void merge(list &l, const Cmp &)
Mezcla dos listas ordenadas según criterio de comparación Cmp.
Definition: List.H:819
list & operator=(const list &c)
Definition: List.H:437
iterator begin() const
Definition: List.H:507
iterator operator--()
Definition: List.H:197
bool operator<(const list &c) const
Definition: List.H:391
bool operator!=(const iterator &__itor)
Retorna true si los iteradores son distintos.
Definition: List.H:237
list()
Instancia una lista vacía.
Definition: List.H:273
bool operator<=(const list &c) const
Definition: List.H:423
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
iterator operator+=(const size_type &n)
Avanza el iterador n posiciones.
Definition: List.H:213
bool operator!=(const list &c) const
Definition: List.H:384
iterator operator++()
Definition: List.H:180
list::value_type value_type
Tipo de dato que almacena lista.
Definition: List.H:151
list::reference reference
Tipo referencia a elemento dentro de la lista.
Definition: List.H:161
void unique(const Op &op)
Definition: List.H:710
void unique()
Elimina de la lista todos los elementos duplicados consecutivos.
Definition: List.H:728
void sort()
Ordena la lista.
Definition: List.H:812
void reset_first()
Reinicia iterador a primer nodo de la lista.
Definition: dlink.H:494
Dnode * del()
Definition: tpl_dnode.H:193
void splice(iterator pos, list &src_list, iterator src_pos)
Definition: List.H:772
void prev()
Retrocede iterador en una posición.
Definition: dlink.H:584
Definition: tpl_dnode.H:148
void assign(Itor beg, const Itor &end)
Definition: List.H:474
iterator erase(iterator beg, const iterator &end)
Definition: List.H:633
Dnode< T > * get_current() const
retorna puntero al nodo actual
Definition: tpl_dnode.H:181
iterator operator-=(const size_type &n)
Retrocede el iterador n posiciones.
Definition: List.H:222
void sort(const Cmp &)
Ordena la lista según criterio de comparación Cmp.
Definition: List.H:806
void insert(iterator pos, const size_type &num, const T &value)
Definition: List.H:544
int difference_type
Definition: List.H:155
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
iterator insert(const iterator &pos, const T &value)
Definition: List.H:525
void set(Dlink *new_curr)
Definition: dlink.H:517
void remove_all_and_delete()
Elimina y libera memoria todos los nodos de this.
Definition: dlink.H:632
void resize(size_type num, const T &t=T())
Definition: List.H:686
void insert(iterator pos, Itor beg, const Itor &end)
Definition: List.H:569
list(Itor beg, const Itor &end)
Definition: List.H:322
Definition: ahFunction.H:115
void splice(iterator pos, list &src_list, iterator src_beg, const iterator &src_end)
Definition: List.H:784
bool empty() const
Retorna true si la lista está vacía.
Definition: List.H:349
void pop_front()
Elimina de la lista el primer elemento.
Definition: List.H:648
iterator erase(iterator pos)
Elimina el elemento posicionado por el iterador pos.
Definition: List.H:620
void assign(const size_type &num, const T &value)
Definition: List.H:455
void next()
Avanza iterador en una posición.
Definition: dlink.H:593
iterator end() const
Definition: List.H:514
list(const size_type &num, const T &value)
Definition: List.H:300
iterator()
Instancia un iterador vacío (no asociado a una lista).
Definition: List.H:164
void clear()
Elimina todos los elementos de la lista.
Definition: List.H:662
Nodo perteneciente a lista doblemente enlazada circular.
Definition: tpl_dnode.H:19