35 # include <ah_stdc++_utils.H> 36 # include <tpl_sort_utils.H> 71 mutable size_type num_elem;
73 mutable bool num_elem_is_updated;
75 void reset_num_elem(
const size_type & num = 0)
78 num_elem_is_updated =
true;
81 void update_num_elem()
83 assert(not num_elem_is_updated);
85 size_type counter = 0;
91 num_elem_is_updated =
true;
103 friend class list<T>;
115 underflow = overflow =
false;
117 underflow = overflow =
true;
201 return & itor.
get_curr()->get_data();
241 for (
int i = 0; i < n; ++i)
250 for (
int i = 0; i < n; ++i)
259 return itor == __itor.itor;
265 return itor != __itor.itor;
273 bool verify(
const iterator & it)
const 275 return itor.
verify(it.itor);
281 void copy(
const list& _list)
284 assert(num_elem == 0);
289 Node * node =
new Node(it.get_curr_ne()->get_data());
299 list() : num_elem(0), num_elem_is_updated(true) { }
302 list(
const list & c) : num_elem(0), num_elem_is_updated(true)
309 list(
const size_type & num) : num_elem(0), num_elem_is_updated(true)
311 for (; num_elem < num; ++num_elem)
326 list(
const size_type & num,
const T & value)
327 : num_elem(0), num_elem_is_updated(true)
329 for (; num_elem < num; ++num_elem)
330 dlist.
append(
new Node(value));
347 template <
class Itor>
349 : num_elem(0), num_elem_is_updated(true)
351 Aleph::verify_iterators(beg, end);
355 dlist.
append(
new Node(*beg++));
368 if (not num_elem_is_updated)
387 if (num_elem_is_updated and c.num_elem_is_updated)
388 if (num_elem != c.num_elem)
393 while (it_l.has_curr() and it_r.
has_curr())
395 if (it_l.get_curr_ne()->get_data() != it_r.
get_curr_ne()->get_data())
402 if (it_l.is_empty() and it_r.is_empty())
412 return not (*
this == c);
429 else if (it_r.
get_curr()->get_data() <
437 return it_l.is_empty();
451 return not (c > *
this );
458 return not (*
this < c);
481 void assign(
const size_type & num,
const T & value)
485 for (
int n = 0; n < num; ++n)
499 template <
typename Itor>
502 Aleph::verify_iterators(beg, end);
515 std::swap(num_elem, c.num_elem);
516 std::swap(num_elem_is_updated, c.num_elem_is_updated);
522 return dlist.
get_next()->get_data();
528 return dlist.
get_prev()->get_data();
553 Aleph::verify_container_and_iterator(*
this, pos);
555 Node * new_node =
new Node(value);
557 Node * current_node = pos.itor.
get_curr();
559 current_node->
append(new_node);
561 pos.itor.
set(new_node);
572 Aleph::verify_container_and_iterator(*
this, pos);
578 for (
int i = 0; i < num; ++i)
579 new_list.
append (
new Node(value));
581 Node * current_node = pos.itor.
get_curr();
594 template <
class Itor>
597 Aleph::verify_container_and_iterator(*
this, pos);
598 Aleph::verify_iterators(beg, end);
605 new_list.
append(
new Node(*beg++));
609 Node * current_node = pos.itor.
get_curr();
622 dlist.
insert(
new Node(value));
626 void push_back(
const T & value)
628 dlist.
append(
new Node(value));
633 void remove(
const T & value)
636 if (it.get_curr_ne()->get_data() == value)
648 Aleph::verify_container_and_iterator(*
this, pos);
650 delete pos.itor.
del();
661 Aleph::verify_container_and_iterator(*
this, beg);
662 Aleph::verify_iterators(beg, end);
666 delete beg.itor.
del();
712 void resize(size_type num,
const T & t = T())
719 while (num_elem > num)
730 insert(itor, num - num_elem, t);
741 it1.next_ne(), ++num_elem)
746 if (op(it1.get_curr_ne()->get_data(), it2.
get_curr_ne()->get_data()))
756 unique(Aleph::equal_to<T>());
773 Aleph::verify_container_and_iterator(*
this, pos);
775 pos.itor.
get_curr()->insert_list(&l.dlist);
777 num_elem_is_updated = l.num_elem_is_updated;
778 num_elem += l.num_elem;
782 assert(l.dlist.is_empty());
800 Aleph::verify_container_and_iterator(*
this, pos);
801 Aleph::verify_container_and_iterator(src_list, src_pos);
813 Aleph::verify_container_and_iterator(*
this, pos);
814 Aleph::verify_container_and_iterator(src_list, src_beg);
815 Aleph::verify_iterators(src_beg, src_end);
817 Dlink list_to_insert;
818 src_list.dlist.cut_list(src_beg.itor.
get_curr(), &list_to_insert);
820 Dlink remaining_list;
823 pos.itor.
get_curr()->insert_list(&list_to_insert);
824 num_elem_is_updated =
false;
826 src_list.dlist.concat_list(&remaining_list);
827 src_list.num_elem_is_updated =
false;
834 quicksort<T, Cmp>(dlist);
840 sort(Aleph::less<T>());
849 Aleph::merge_lists<T, Cmp>(dlist, l.dlist, result);
853 num_elem += l.num_elem;
857 assert(l.dlist.is_empty());
863 merge(l, Aleph::less<T>());
874 template <
typename T>
891 # endif // ALEPH_LIST_H void merge(list &l)
Mezcla dos listas ordenadas.
Definition: List.H:861
bool operator==(const iterator &__itor)
Retorna true si los iteradores son iguales.
Definition: List.H:257
T & operator*()
Proporciona una referencia al elemento actual de iterador.
Definition: List.H:193
bool has_curr() const noexcept
Return true if the iterator has current item.
Definition: dlink.H:658
void next_ne() noexcept
Definition: dlink.H:715
void reset_last() noexcept
Reset the iterator to the last item of list.
Definition: dlink.H:645
Dnode & swap(Dnode &p) noexcept(noexcept(std::swap(data, p.data)))
Swap this with p
Definition: tpl_dnode.H:136
size_type size()
Retorna la cantidad de elementos que tiene la lista.
Definition: List.H:366
list(const size_type &num)
Definition: List.H:309
const list::value_type & const_reference
Tipo referencia constante a elemento dentro de la lista.
Definition: List.H:64
list::value_type & reference
Tipo referencia a elemento dentro de la lista.
Definition: List.H:61
void pop_back()
Elimina de la lista el último elemento.
Definition: List.H:681
void reverse()
Invierte la lista.
Definition: List.H:867
void push_front(const T &value)
Inserta al principio de la lista el valor value.
Definition: List.H:620
reference back() const
Retorna una referencia al último elemento de la lista.
Definition: List.H:526
T value_type
El tipo de dato que maneja la lista.
Definition: List.H:58
list::value_type * pointer
Tipo puntero a elemento dentro de la lista.
Definition: List.H:184
iterator begin() const
Definition: List.H:533
void swap(list &c)
Definition: List.H:512
size_t size_type
Tipo numérico para el tamaño de la lista.
Definition: List.H:67
Dlink cut_list(Dlink *link) noexcept
Definition: dlink.H:556
void splice(iterator pos, list &l)
Definition: List.H:771
bool empty() const
Retorna true si la lista está vacÃa.
Definition: List.H:375
list(const list &c)
Instancia una lista copia de c.
Definition: List.H:302
T * operator->()
Dereferencia el elemento actual del iterador.
Definition: List.H:199
void merge(list &l, const Cmp &)
Mezcla dos listas ordenadas según criterio de comparación Cmp.
Definition: List.H:845
Dnode< T > * get_curr_ne() const noexcept
Return the current link guaranteeing no exception. Be careful.
Definition: tpl_dnode.H:221
Dnode< T > *& get_next() const noexcept
Return the next node to this
Definition: tpl_dnode.H:53
list & operator=(const list &c)
Definition: List.H:463
iterator operator--()
Definition: List.H:223
bool operator<=(const list &c) const
Definition: List.H:449
reference front() const
Retorna una referencia al primer elemento de la lista.
Definition: List.H:520
bool operator!=(const iterator &__itor)
Retorna true si los iteradores son distintos.
Definition: List.H:263
list()
Instancia una lista vacÃa.
Definition: List.H:299
bool operator>(const list &c) const
Definition: List.H:442
bool operator<(const list &c) const
Definition: List.H:417
iterator operator+=(const size_type &n)
Avanza el iterador n posiciones.
Definition: List.H:239
bool verify(Dlink *l) const
Return true if the iterator is on the list pointed by l
Definition: dlink.H:764
Dnode< T > * remove_prev() noexcept
Remove the previous node to this; return its address.
Definition: tpl_dnode.H:59
iterator operator++()
Definition: List.H:206
void insert(Dlink *node) noexcept
Definition: dlink.H:205
void set(Dlink *new_curr) noexcept
Definition: dlink.H:629
Dnode< T > *& get_prev() const noexcept
Return the previous node to this
Definition: tpl_dnode.H:56
list::value_type value_type
Tipo de dato que almacena lista.
Definition: List.H:177
list::reference reference
Tipo referencia a elemento dentro de la lista.
Definition: List.H:187
void unique(const Op &op)
Definition: List.H:736
void unique()
Elimina de la lista todos los elementos duplicados consecutivos.
Definition: List.H:754
void sort()
Ordena la lista.
Definition: List.H:838
bool is_empty() const noexcept
Return true if this (as header node) is empty.
Definition: dlink.H:192
Dnode< T > * remove_next() noexcept
Remove the next node to this; return its address.
Definition: tpl_dnode.H:62
Dnode< T > * get_curr() const
Definition: tpl_dnode.H:231
Dnode * del()
Definition: tpl_dnode.H:244
void splice(iterator pos, list &src_list, iterator src_pos)
Definition: List.H:798
void prev()
Definition: dlink.H:706
Definition: tpl_dnode.H:206
void assign(Itor beg, const Itor &end)
Definition: List.H:500
iterator end() const
Definition: List.H:540
void remove_all_and_delete() noexcept
Definition: dlink.H:781
iterator erase(iterator beg, const iterator &end)
Definition: List.H:659
void insert_list(Dlink *head) noexcept
Definition: dlink.H:307
void append(Dlink *node) noexcept
Definition: dlink.H:228
iterator operator-=(const size_type &n)
Retrocede el iterador n posiciones.
Definition: List.H:248
void sort(const Cmp &)
Ordena la lista según criterio de comparación Cmp.
Definition: List.H:832
void insert(iterator pos, const size_type &num, const T &value)
Definition: List.H:570
int difference_type
Definition: List.H:181
iterator insert(const iterator &pos, const T &value)
Definition: List.H:551
bool operator>=(const list &c) const
Definition: List.H:456
void resize(size_type num, const T &t=T())
Definition: List.H:712
size_t reverse_list() noexcept
Definition: dlink.H:483
void insert(iterator pos, Itor beg, const Itor &end)
Definition: List.H:595
list(Itor beg, const Itor &end)
Definition: List.H:348
void splice(iterator pos, list &src_list, iterator src_beg, const iterator &src_end)
Definition: List.H:810
void pop_front()
Elimina de la lista el primer elemento.
Definition: List.H:674
void reset_first() noexcept
Reset the iterator to the first item of list.
Definition: dlink.H:638
iterator erase(iterator pos)
Elimina el elemento posicionado por el iterador pos.
Definition: List.H:646
void assign(const size_type &num, const T &value)
Definition: List.H:481
void next()
Definition: dlink.H:721
list(const size_type &num, const T &value)
Definition: List.H:326
iterator()
Instancia un iterador vacÃo (no asociado a una lista).
Definition: List.H:190
void clear()
Elimina todos los elementos de la lista.
Definition: List.H:688