Aleph-w  1.9
General library for algorithms and data structures
htlist.H
1 
2 /* Aleph-w
3 
4  / \ | | ___ _ __ | |__ __ __
5  / _ \ | |/ _ \ '_ \| '_ \ ____\ \ /\ / / Data structures & Algorithms
6  / ___ \| | __/ |_) | | | |_____\ V V / version 1.9b
7  /_/ \_\_|\___| .__/|_| |_| \_/\_/ https://github.com/lrleon/Aleph-w
8  |_|
9 
10  This file is part of Aleph-w library
11 
12  Copyright (c) 2002-2018 Leandro Rabindranath Leon & Alejandro Mujica
13 
14  This program is free software: you can redistribute it and/or modify
15  it under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  This program is distributed in the hope that it will be useful, but
20  WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  General Public License for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27 # ifndef HTLIST_H
28 # define HTLIST_H
29 
30 # include <type_traits>
31 # include <cassert>
32 # include <stdexcept>
33 # include <utility>
34 # include <ahFunction.H>
35 # include <ahFunctional.H>
36 # include <ah-args-ctor.H>
37 # include <ah-iterator.H>
38 
39 # define NEXT(p) (p->get_next())
40 
41 using namespace Aleph;
42 
43 namespace Aleph {
44 
45 template <typename T> class Snodenc; // forward declaration
46 
59 class Slinknc
60 {
61  Slinknc * next = nullptr;
62 
63 public:
64 
66  bool is_empty() const noexcept { return next == nullptr; }
67 
71  Slinknc() noexcept : next(nullptr) { /* empty */ }
72 
77  Slinknc(const Slinknc &) noexcept : next(nullptr) { /* empty */ }
78 
82  void reset() noexcept
83  {
84  next = nullptr;
85  }
86 
90  Slinknc & operator = (const Slinknc & ) noexcept
91  {
92  next = nullptr;
93  return *this;
94  }
95 
97  Slinknc *& get_next() noexcept
98  {
99  return next;
100  }
101 
103 
117  void insert(Slinknc * p) noexcept
118  {
119  assert(p != nullptr);
120  p->next = next;
121  next = p;
122  }
123 
135  Slinknc * remove_next() noexcept
136  {
137  Slinknc * ret_val = next;
138  next = ret_val->next;
139  ret_val->reset();
140  return ret_val;
141  }
142 
148  template <typename T> inline
149  Snodenc<T> * to_snodenc() noexcept;
150 
151  template <typename T> inline T & to_data() noexcept;
152 
153  template <typename T> inline
154  const Snodenc<T> * to_snodenc() const noexcept;
155 
156  template <typename T> inline const T & to_data() const noexcept;
157 
169  class Iterator
170  {
171  Slinknc * head;
172  Slinknc * curr;
173 
174  void init()
175  {
176  curr = head->is_empty() ? nullptr : head->next;
177  }
178 
179  public:
180 
181  Iterator() noexcept : head(nullptr), curr(nullptr)
182  {
183  // Empty
184  }
189  Iterator(Slinknc & list) noexcept : head(&list)
190  {
191  init();
192  }
193 
205  Iterator(Slinknc * _head, Slinknc * _curr) noexcept
206  : head(_head), curr(_curr)
207  {
208  // Empty
209  }
210 
217  bool has_curr() const noexcept
218  {
219  return curr != nullptr;
220  }
221 
231  Slinknc * get_curr() const
232  {
233  if (not has_curr())
234  throw std::overflow_error("Iterator is at the end of the list");
235  return curr;
236  }
237 
239  Slinknc * get_curr_ne() const noexcept { return curr; }
240 
243  void next_ne() noexcept { curr = curr->next; }
244 
254  void next()
255  {
256  if (not has_curr())
257  throw std::overflow_error("Iterator is at the end of the list");
258  curr = curr->next;
259  }
260 
264  void reset_first() noexcept
265  {
266  init();
267  }
268  };
269 };
271 
284  template <typename T>
285 class Snodenc : public Slinknc
286 {
287  T data;
288 
289 public:
290 
294  T & get_data() noexcept { return data; }
295 
299  const T & get_data() const noexcept { return data; }
300 
301  Snodenc() noexcept(std::is_nothrow_constructible<T>::value)
302  {
303  static_assert(std::is_default_constructible<T>::value,
304  "No default constructor for T");
305  }
306 
310  Snodenc(const T & item) noexcept(noexcept(T(item))) : data(item)
311  {
312  static_assert(std::is_copy_constructible<T>::value,
313  "No copy constructor for T");
314  }
315 
319  Snodenc(T && item) noexcept(noexcept(std::swap(data, item)))
320  : data(std::forward<T>(item))
321  {
322  static_assert(std::is_move_constructible<T>::value,
323  "No move constructor for T");
324  }
325 
343  Snodenc * remove_next() noexcept
344  {
345  return (Snodenc*) Slinknc::remove_next();
346  }
347 
351  Snodenc *& get_next() noexcept { return (Snodenc*&) Slinknc::get_next(); }
352 
354  Snodenc * remove_first() noexcept{ return Snodenc::remove_next(); }
373  Snodenc *& get_first() const noexcept { return Snodenc::get_next(); }
374 };
376  template <typename T> inline
378 {
379  return static_cast<Snodenc<T>*>(this);
380 }
381 
382  template <typename T> inline
383 const Snodenc<T> * Slinknc::to_snodenc() const noexcept
384 {
385  return static_cast<const Snodenc<T>*>(this);
386 }
387 
388 template <typename T> T & Slinknc::to_data() noexcept
389 {
390  return this->to_snodenc<T>()->get_data();
391 }
392 
393 template <typename T> const T & Slinknc::to_data() const noexcept
394 {
395  return this->to_snodenc<T>()->get_data();
396 }
397 
449 class HTList
450 {
451  Slinknc * head;
452  Slinknc * tail;
453 
454 public:
455 
457  HTList() noexcept : head(nullptr), tail(nullptr) { /* empty */ }
458 
459  void reset()
460  {
461  head = tail = nullptr;
462  }
463 
466  bool is_empty() const noexcept { return head == nullptr; }
467 
471  bool is_unitarian() const noexcept
472  {
473  return head != nullptr and head == tail;
474  }
475 
478  bool is_unitarian_or_empty() const noexcept { return head == tail; }
479 
482  Slinknc * get_head() const noexcept { return head; }
483 
486  Slinknc * get_tail() const noexcept { return tail; }
487 
490  Slinknc * get_first() const noexcept { return get_head(); }
491 
493  Slinknc * get_last() const noexcept { return get_tail(); }
494 
497 
514  HTList & swap(HTList & l) noexcept
515  {
516  std::swap(head, l.head);
517  std::swap(tail, l.tail);
518  return *this;
519  }
520 
523 
531  void insert(Slinknc * link) noexcept
532  {
533  assert(NEXT(link) == nullptr);
534 
535  if (head == nullptr)
536  {
537  assert(tail == nullptr);
538  head = tail = link;
539  return;
540  }
541 
542  NEXT(link) = head;
543  head = link;
544  }
545 
548 
556  void append(Slinknc * link) noexcept
557  {
558  assert(link != nullptr and NEXT(link) == nullptr);
559 
560  if (head == nullptr)
561  {
562  assert(tail == nullptr);
563  head = tail = link;
564  return;
565  }
566 
567  NEXT(tail) = link;
568  tail = link;
569  }
570 
573 
581  void append(HTList & l) noexcept
582  {
583  if (l.is_empty())
584  return;
585 
586  if (this->is_empty())
587  {
588  this->swap(l);
589  return;
590  }
591 
592  NEXT(tail) = l.head;
593  tail = l.tail;
594  l.head = l.tail = nullptr;
595  }
596 
599  void put(Slinknc * link) noexcept { append(link); }
603  void concat(HTList & l) noexcept { append(l); }
604 
606  void concat_list(HTList & l) noexcept { append(l); }
611 
621  void insert(HTList & l) noexcept
622  {
623  l.append(*this);
624  this->swap(l);
625  }
626 
680  void insert(Slinknc * link, HTList & list) noexcept
681  {
682  NEXT(link) = list.head;
683  tail = list.tail;
684  list.head = list.tail = nullptr;
685  }
686 
690  Slinknc * remove_head_ne() noexcept
691  {
692  Slinknc * ret_val = head;
693  if (head == tail)
694  head = tail = nullptr;
695  else
696  {
697  head = NEXT(head);
698  if (head == nullptr)
699  tail = nullptr;
700  }
702  ret_val->reset();
703 
704  return ret_val;
705  }
706 
708  {
709  if (is_empty())
710  throw std::underflow_error("HTList is empty");
711  return remove_head_ne();
712  }
713 
731  Slinknc * remove_first_ne() noexcept { return remove_head_ne(); }
732 
733  Slinknc * remove_first() { return remove_head(); }
734 
762  bool remove(Slinknc * link)
763  {
764  if (is_empty())
765  throw std::underflow_error("Removing from a empty list");
766 
767  if (link == head)
768  {
769  head = NEXT(head);
770  link->reset();
771  return true;
772  }
773 
774  for (Slinknc * prev = head, * p = NEXT(head); p != nullptr;
775  prev = p, p = NEXT(p))
776  if (p == link)
777  {
778  NEXT(prev) = NEXT(p);
779  if (link == tail)
780  tail = prev;
781  link->reset();
782  return true;
783  }
784 
785  return false;
786  }
787 
790  void push(Slinknc * link) noexcept { insert(link); }
791 
814  Slinknc * pop()
815  {
816  if (is_empty())
817  throw std::underflow_error("HTList as stack is empty");
818  return remove_head();
819  }
820 
821  Slinknc * top()
822  {
823  if (is_empty())
824  throw std::underflow_error("HTList as stack is empty");
825  return get_first();
826  }
827 
831 
858  size_t split_list(HTList & l, HTList & r) noexcept
859  {
860  assert(l.is_empty() and r.is_empty()); // l y r deben estar vacías
861 
862  if (is_empty())
863  return 0;
864 
865  if (is_unitarian())
866  {
867  swap(l);
868  return 1;
869  }
870 
871  size_t count = 0;
872  Slinknc * p = head;
873  Slinknc * q = head;
874  while (q != tail and q != nullptr)
875  {
876  q = NEXT(q); ++count;
877  if (q == tail or q == nullptr)
878  break;
879 
880  p = NEXT(p);
881  q = NEXT(q); ++count;
882  }
883 
884  l.head = head;
885  l.tail = p;
886 
887  r.head = NEXT(p);
888  r.tail = tail;
889 
890  head = tail = nullptr;
891 
892  return count;
893  }
894 
895  size_t split_list_ne(HTList & l, HTList & r) noexcept
896  {
897  return split_list(l, r);
898  }
899 
901  size_t split(HTList & l, HTList & r) noexcept
902  {
903  return split_list(l, r);
904  }
905 
909  size_t reverse() noexcept
910  {
911  HTList tmp;
912 
913  size_t count = 0;
914  while (not is_empty())
915  {
916  tmp.insert(remove_first_ne());
917  ++count;
918  }
919 
920  swap(tmp);
921 
922  return count;
923  }
926  size_t reverse_list() noexcept
927  {
928  return reverse();
929  }
930 
935 
949  void cut(Slinknc * link, HTList & list) noexcept
950  {
951  assert(list.is_empty());
952 
953  list.head = NEXT(link);
954  list.tail = tail;
955 
956  tail = link;
957  NEXT(link) = nullptr;
958  }
959 
961  void cut_list(Slinknc * link, HTList & list) noexcept { cut(link, list); }
962 
989  void remove_all_and_delete() noexcept
990  {
991  while (not is_empty())
992  delete remove_head_ne();
993  }
994 
1006  class Iterator
1007  {
1008  HTList * lptr = nullptr;
1009  Slinknc * curr = nullptr;
1010  Slinknc * prev = nullptr;
1011 
1012  long pos = 0;
1013 
1014  public:
1015 
1019  Iterator(const HTList & list) noexcept
1020  : lptr(& (HTList&) list), curr(lptr->head), prev(curr)
1021  { /* empty */ }
1022 
1025  void reset() noexcept
1026  {
1027  prev = curr = lptr->head;
1028  pos = 0;
1029  }
1030 
1033  long get_pos() const noexcept { return pos; }
1034 
1036  void reset_first() noexcept { reset(); }
1037 
1039  void reset_last()
1040  {
1041  reset();
1042  if (lptr->is_empty())
1043  return;
1044 
1045  while (NEXT(curr))
1046  {
1047  prev = curr;
1048  curr = NEXT(curr);
1049  ++pos;
1050  }
1051  }
1052 
1055  void end() noexcept
1056  {
1057  curr = nullptr;
1058  }
1059 
1061  Iterator & operator = (const Iterator & it) noexcept
1062  {
1063  lptr = it.lptr;
1064  curr = it.curr;
1065  prev = it.prev;
1066  return *this;
1067  }
1068 
1071  bool has_curr() const noexcept { return curr != nullptr; }
1072 
1073  bool is_last() const noexcept
1074  {
1075  return lptr->is_empty() ? false : curr == lptr->tail;
1076  }
1077 
1079  bool is_in_first() const noexcept
1080  {
1081  return lptr->is_empty() ? false : curr == lptr->head;
1082  }
1083 
1085  bool is_in_last() const noexcept { return is_last(); }
1086 
1098  Slinknc * get_curr() const
1099  {
1100  if (curr == nullptr)
1101  throw std::overflow_error("Iterator overflow");
1102 
1103  return curr;
1104  }
1105 
1107  Slinknc * get_curr_ne() const noexcept { return curr; }
1108 
1111  void next_ne() noexcept
1112  {
1113  if (curr == lptr->head) // on the first item?
1114  {
1115  assert(prev == lptr->head);
1116  curr = NEXT(curr);
1117  }
1118  else if (curr == lptr->tail) // on the last item?
1119  {
1120  assert(NEXT(prev) == curr);
1121  curr = nullptr;
1122  }
1123  else
1124  {
1125  assert(NEXT(prev) == curr);
1126  prev = curr;
1127  curr = NEXT(curr);
1128  assert(NEXT(prev) == curr);
1129  }
1130  pos++;
1131  }
1132 
1143  void next()
1144  {
1145  if (not has_curr())
1146  throw std::overflow_error("Iterator overflow");
1147  next_ne();
1148  }
1149 
1150  Slinknc * del_ne() noexcept
1151  {
1152  Slinknc * ret_val = nullptr;
1153  if (curr == lptr->head) // first item removal
1154  {
1155  ret_val = lptr->remove_first();
1156  prev = curr = lptr->head;
1157  }
1158  else if (curr == lptr->tail) // last item removal
1159  {
1160  assert(NEXT(prev) == curr);
1161  ret_val = curr;
1162  NEXT(prev) = NEXT(curr);
1163  lptr->tail = prev;
1164  curr = nullptr; // put in overflow
1165  }
1166  else
1167  {
1168  assert(NEXT(prev) == curr);
1169  ret_val = curr;
1170  NEXT(prev) = NEXT(curr);
1171  curr = NEXT(curr);
1172  }
1173 
1174  ret_val->reset();
1175  return ret_val;
1176  }
1177 
1198  {
1199  if (not has_curr())
1200  throw std::overflow_error("Iterator overflow");
1201 
1202  return del_ne();
1203  }
1204  };
1205 
1240  size_t size() const noexcept
1241  {
1242  size_t count = 0;
1243  for (Iterator it(*this); it.has_curr(); it.next_ne())
1244  ++count;
1245 
1246  return count;
1247  }
1248 
1280  void rotate_left(size_t n)
1281  {
1282  if (is_empty())
1283  if (n == 0)
1284  return;
1285  else
1286  throw std::domain_error("List is empty");
1287 
1288  for (size_t i = 0; i < n; ++i)
1289  append(remove_first());
1290  }
1291 };
1292 
1293 # include <ah-dry.H>
1294 
1316  template <typename T = int>
1317 class DynList : public HTList,
1318  public GenericTraverse<DynList<T>>,
1319  public LocateFunctions<DynList<T>, T>,
1320  public SpecialCtors<DynList<T>, T>,
1321  public FunctionalMethods<DynList<T>, T>,
1322  public GenericItems<DynList<T>, T>,
1323  public StlAlephIterator<DynList<T>>
1324 {
1325  using CtorBase = SpecialCtors<DynList<T>, T>;
1326 
1327  using CtorBase::CtorBase;
1328 
1329  public:
1330 
1332  using Item_Type = T;
1333 
1335  using Key_Type = T;
1336 
1346  DynList & swap(DynList & l) noexcept
1347  {
1348  return (DynList&) HTList::swap(l);
1349  }
1352  DynList() noexcept(std::is_nothrow_constructible<T>::value) { /* empty */ }
1353 
1357  DynList(const DynList & l) : HTList(), CtorBase(l) {}
1358 
1359 private:
1360 
1361  T & __insert(Snodenc<T> * p) noexcept
1362  {
1363  static_assert(std::is_copy_constructible<T>::value or
1364  std::is_move_constructible<T>::value,
1365  "No copy assign for T");
1366  HTList::insert(p);
1367  return p->get_data();
1368  }
1370  T & __append(Snodenc<T> * p) noexcept
1371  {
1372  static_assert(std::is_copy_constructible<T>::value or
1373  std::is_move_constructible<T>::value,
1374  "No copy assign for T");
1375  HTList::append(p);
1376  return p->get_data();
1377  }
1378 
1379 public:
1400  T & insert(const T & item)
1401  {
1402  return __insert(new Snodenc<T> (item));
1403  }
1404 
1426  T & insert(T && item)
1427  {
1428  return __insert(new Snodenc<T> (std::forward<T>(item)));
1429  }
1430 
1432  T & push(const T & item)
1433  {
1434  return insert(item);
1435  }
1436 
1438  T & push(T && item) { return insert(std::forward<T>(item)); }
1439 
1441  T & put(const T & item) noexcept(noexcept(T(item)))
1442  {
1443  return push(item);
1444  }
1445 
1447  T & put(T && item) noexcept(noexcept(std::forward<T>(item)))
1448  {
1449  return push(std::forward<T>(item));
1450  }
1451 
1471  T & append(const T & item)
1472  {
1473  return __append(new Snodenc<T> (item));
1474  }
1475 
1495  T & append(T && item)
1496  {
1497  return __append(new Snodenc<T> (std::forward<T>(item)));
1498  }
1499 
1505  T remove_ne() noexcept
1506  {
1507  Slinknc * l = this->HTList::remove_head_ne();
1508  Snodenc<T> * p = static_cast<Snodenc<T>*> (l);
1509  T ret_val = std::move(p->get_data());
1510  delete p;
1511 
1512  return ret_val;
1513  }
1514 
1520  T remove()
1521  {
1522  Slinknc * l = this->HTList::remove_head();
1523  Snodenc<T> * p = static_cast<Snodenc<T>*> (l);
1524  T ret_val = std::move(p->get_data());
1525  delete p;
1526 
1527  return ret_val;
1528  }
1529 
1531  T remove_first_ne() noexcept
1532  {
1533  return remove_ne();
1534  }
1535 
1538  {
1539  return remove();
1540  }
1541 
1543  T pop() { return remove_first(); }
1544 
1546  T get() { return remove(); }
1547 
1552  T & get_last_ne() const noexcept
1553  {
1554  Snodenc<T> * p = static_cast<Snodenc<T>*> (this->HTList::get_last());
1555  return p->get_data();
1556  }
1557 
1562  T & get_first_ne() const noexcept
1563  {
1564  return static_cast<Snodenc<T>*>(this->HTList::get_first())->get_data();
1565  }
1566 
1572  T & get_last() const
1573  {
1574  if (is_empty())
1575  throw std::underflow_error("List is empty");
1576  return get_last_ne();
1577  }
1578 
1584  T & get_first() const
1585  {
1586  if (is_empty())
1587  throw std::underflow_error("List is empty");
1588  return get_first_ne();
1589  }
1590 
1592  T & top() const
1593  {
1594  return get_first();
1595  }
1596 
1598  void empty() noexcept
1599  {
1600  if (is_empty())
1601  return;
1602 
1603  // a very fast deletion
1604  Snodenc<T> * last = static_cast<Snodenc<T>*> (this->HTList::get_last());
1605  Snodenc<T> * p = static_cast<Snodenc<T>*> (this->HTList::get_first());
1606  while (p != last)
1607  {
1608  Snodenc<T> * q = p;
1609  p = p->get_next();
1610  delete q;
1611  }
1612  delete p;
1613  reset();
1614  }
1615 
1616  ~DynList() { empty(); }
1617 
1623  {
1624  public:
1625 
1626  using Item_Type = T;
1627 
1629 
1630  using Set_Type = DynList;
1631 
1632  Iterator() noexcept { /* empty */ }
1633 
1635  Iterator(const DynList & list) noexcept
1636  : HTList::Iterator(list) { /* empty */ }
1637 
1639  T & get_curr_ne() const noexcept
1640  {
1641  return ((Snodenc<T>*) (HTList::Iterator::get_curr_ne()))->get_data();
1642  }
1643 
1649  T & get_curr() const
1650  {
1651  return ((Snodenc<T>*) (HTList::Iterator::get_curr()))->get_data();
1652  }
1653 
1663  T del()
1664  {
1665  Snodenc<T> * p = (Snodenc<T> *) this->HTList::Iterator::del();
1666  T ret_val = std::move(p->get_data());
1667  delete p;
1668  return ret_val;
1669  }
1670  };
1671 
1672  DynList & reverse() noexcept
1673  {
1674  reverse_list();
1675  return *this;
1676  }
1677 
1678  DynList & rev() noexcept { return reverse(); }
1679 
1683  {
1684  DynList ret;
1685  for (auto it = this->get_it(); it.has_curr(); it.next())
1686  ret.insert(it.get_curr());
1687 
1688  return ret;
1689  }
1690 
1691  DynList rev() const { return reverse(); }
1692 
1693  template <class Equal = std::equal_to<T>>
1694  T remove_ne(Equal eq) noexcept
1695  {
1696  for (Iterator it(*this); true; it.next_ne())
1697  {
1698  const T & item = it.get_curr_ne();
1699  if (not eq(item))
1700  continue;
1701  T ret = item; // performs a copy
1702  it.del_ne();
1703  return ret;
1704  }
1705  }
1706 
1730  template <class Equal = std::equal_to<T>> T remove(Equal eq)
1731  {
1732  for (Iterator it(*this); it.has_curr(); it.next_ne())
1733  {
1734  const T & item = it.get_curr_ne();
1735  if (eq(item))
1736  {
1737  T ret = item; // performs a copy
1738  it.del();
1739  return ret;
1740  }
1741  }
1742 
1743  throw std::domain_error("DynList::remove(Equal &): item not found");
1744  }
1745 
1760  DynList(DynList && l) noexcept
1761  {
1762  swap(l);
1763  }
1764 
1776  {
1777  if (&l == this)
1778  return *this;
1779 
1780  empty();
1781 
1782  for (typename DynList::Iterator it(l); it.has_curr(); it.next_ne())
1783  append(it.get_curr_ne());
1784 
1785  return *this;
1786  }
1787 
1802  DynList & operator = (DynList && l) noexcept
1803  {
1804  return (DynList&) this->swap(l);
1805  }
1806 
1821  DynList & append(DynList && list) noexcept
1822  {
1824  return *this;
1825  }
1826 
1841  DynList & insert(DynList && list) noexcept
1842  {
1844  return *this;
1845  }
1846 
1855  DynList & append(const DynList & list) noexcept(noexcept(DynList(list)))
1856  {
1857  DynList copy = list;
1858  HTList::append(copy);
1859  return *this;
1860  }
1861 
1870  DynList & insert(const DynList & list) noexcept(noexcept(DynList(list)))
1871  {
1872  DynList tmp = list;
1873  HTList::insert(tmp);
1874  return *this;
1875  }
1876 
1879  T & get(const size_t & i)
1880  {
1881  Iterator it(*this);
1882 
1883  for (size_t __i = 0 ; it.has_curr() and __i < i; it.next_ne(), ++__i);
1884 
1885  return it.get_curr_ne();
1886  }
1887 
1889  T & operator [] (const size_t & i)
1890  {
1891  return get(i);
1892  }
1893 };
1894 
1895 template <class Container>
1896 inline DynList<typename Container::Item_Type> to_dynlist(const Container & c)
1897 {
1898  return c.template maps<typename Container::Item_Type>([] (const auto & d)
1899  {
1900  return d;
1901  });
1902 }
1903 
1904  template <typename T> inline
1905 DynList<T> get_unitarian_DynList(const T & item)
1906 {
1907  DynList<T> ret;
1908  ret.append(item);
1909  return ret;
1910 }
1911 
1912  template <typename T> inline
1913 DynList<T> unitarian_DynList(const T & item)
1914 {
1915  return DynList<T>({item});
1916 }
1917 
1918 # undef NEXT
1919 
1920 } // end namespace Aleph
1921 
1922 
1923 # endif // HTLIST_H
Slinknc() noexcept
Definition: htlist.H:71
void next_ne() noexcept
Definition: htlist.H:1111
Definition: htlist.H:450
Definition: htlist.H:1290
Snodenc< T > * to_snodenc() noexcept
Definition: htlist.H:377
size_t size() const noexcept
Definition: htlist.H:1240
T & top() const
Definition: htlist.H:1592
Definition: htlist.H:45
T remove_first()
Definition: htlist.H:1537
Snodenc *& get_next() noexcept
Definition: htlist.H:351
Snodenc(const T &item) noexcept(noexcept(T(item)))
Definition: htlist.H:310
Definition: htlist.H:133
void empty() noexcept
empty the list
Definition: htlist.H:1598
void insert(Slinknc *p) noexcept
Insert p after this
Definition: htlist.H:117
Snodenc(T &&item) noexcept(noexcept(std::swap(data, item)))
Definition: htlist.H:319
void cut_list(Slinknc *link, HTList &list) noexcept
Definition: htlist.H:961
Slinknc * get_curr_ne() const noexcept
Return the current link guaranteeing no exception. Be careful.
Definition: htlist.H:239
bool has_curr() const noexcept
Definition: htlist.H:217
void append(Slinknc *link) noexcept
Definition: htlist.H:556
Slinknc * get_head() const noexcept
Definition: htlist.H:482
void next()
Definition: htlist.H:1143
DynList reverse() const
Definition: htlist.H:1682
Slinknc(const Slinknc &) noexcept
Definition: htlist.H:77
T & get_first() const
Definition: htlist.H:1584
Iterator(Slinknc *_head, Slinknc *_curr) noexcept
Definition: htlist.H:205
DynList & append(const DynList &list) noexcept(noexcept(DynList(list)))
Definition: htlist.H:1855
T & get_curr_ne() const noexcept
Return the current link guaranteeing no exception. Be careful.
Definition: htlist.H:1639
T & insert(T &&item)
Definition: htlist.H:1426
void insert(Slinknc *link, HTList &list) noexcept
Definition: htlist.H:680
size_t reverse_list() noexcept
Definition: htlist.H:926
Slinknc * get_tail() const noexcept
Definition: htlist.H:486
Iterator(const DynList &list) noexcept
Initiliaze an iterator on the first item of list
Definition: htlist.H:1635
T & push(const T &item)
Definition: htlist.H:1432
bool is_empty() const noexcept
Definition: htlist.H:466
T remove_first_ne() noexcept
Definition: htlist.H:1531
bool has_curr() const noexcept
Definition: htlist.H:1071
Iterator() noexcept
The type of container.
Definition: htlist.H:1632
void concat(HTList &l) noexcept
Definition: htlist.H:603
void reset_first() noexcept
Definition: htlist.H:1036
Definition: point.H:124
T & put(T &&item) noexcept(noexcept(std::forward< T >(item)))
Definition: htlist.H:1447
void push(Slinknc *link) noexcept
Definition: htlist.H:790
T del()
Definition: htlist.H:1663
Snodenc *& get_first() const noexcept
Definition: htlist.H:373
Definition: htlist.H:45
Slinknc & operator=(const Slinknc &) noexcept
Definition: htlist.H:90
Snodenc * remove_next() noexcept
Definition: htlist.H:343
bool is_unitarian_or_empty() const noexcept
Definition: htlist.H:478
void remove_all_and_delete() noexcept
Definition: htlist.H:989
void rotate_left(size_t n)
Definition: htlist.H:1280
Slinknc *& get_next() noexcept
getter
Definition: htlist.H:97
Slinknc * get_curr() const
Definition: htlist.H:231
T & insert(const T &item)
Definition: htlist.H:1400
T remove_ne() noexcept
Definition: htlist.H:1505
T & push(T &&item)
Definition: htlist.H:1438
Snodenc * remove_first() noexcept
Definition: htlist.H:354
void end() noexcept
Definition: htlist.H:1055
T & get_first_ne() const noexcept
Definition: htlist.H:1562
bool is_empty() const noexcept
Return true if this is empty.
Definition: htlist.H:66
Definition: htlist.H:449
Iterator(Slinknc &list) noexcept
Definition: htlist.H:189
Definition: htlist.H:59
Slinknc * remove_head_ne() noexcept
Definition: htlist.H:690
Definition: ah-comb.H:35
DynList & append(DynList &&list) noexcept
Definition: htlist.H:1821
void concat_list(HTList &l) noexcept
Definition: htlist.H:606
Slinknc * get_curr() const
Definition: htlist.H:1098
Slinknc * del()
Definition: htlist.H:1197
void put(Slinknc *link) noexcept
Definition: htlist.H:599
void append(HTList &l) noexcept
Definition: htlist.H:581
T & put(const T &item) noexcept(noexcept(T(item)))
Definition: htlist.H:1441
DynList(const DynList &l)
Definition: htlist.H:1357
Slinknc * remove_next() noexcept
Definition: htlist.H:135
void reset_last()
It has O(n) of performance.
Definition: htlist.H:1039
size_t split(HTList &l, HTList &r) noexcept
Definition: htlist.H:901
bool is_in_first() const noexcept
Return true if the iterator is positioned on the first item.
Definition: htlist.H:1079
Slinknc * get_last() const noexcept
Return the last item of the list (nullptr if the list is empty)
Definition: htlist.H:493
Slinknc * get_curr_ne() const noexcept
Return the current link guaranteeing no exception. Be careful.
Definition: htlist.H:1107
void insert(HTList &l) noexcept
Definition: htlist.H:621
void cut(Slinknc *link, HTList &list) noexcept
It makes reference to is_empty(). Referenced by cut_list().
Definition: htlist.H:949
T & get_curr() const
Definition: htlist.H:1649
DynList & insert(DynList &&list) noexcept
Definition: htlist.H:1841
void next_ne() noexcept
Definition: htlist.H:243
T pop()
Definition: htlist.H:1543
const T & get_data() const noexcept
Definition: htlist.H:299
HTList & swap(HTList &l) noexcept
Swap in constant time (very fast) &#39;this&#39; elements with &#39;l&#39; list elements Referenced by append()...
Definition: htlist.H:514
Iterator(const HTList &list) noexcept
Definition: htlist.H:1019
long get_pos() const noexcept
Definition: htlist.H:1033
Slinknc * get_first() const noexcept
Definition: htlist.H:490
DynList() noexcept(std::is_nothrow_constructible< T >::value)
Initialize an empty list.
Definition: htlist.H:1352
size_t reverse() noexcept
Definition: htlist.H:909
size_t split_list(HTList &l, HTList &r) noexcept
Definition: htlist.H:858
Slinknc * remove_head()
Definition: htlist.H:707
DynList & swap(DynList &l) noexcept
Definition: htlist.H:1346
HTList() noexcept
Initialize an empty list.
Definition: htlist.H:457
void reset() noexcept
Definition: htlist.H:82
Definition: htlist.H:1622
DynList & insert(const DynList &list) noexcept(noexcept(DynList(list)))
Definition: htlist.H:1870
Definition: ahDry.H:41
Definition: htlist.H:1006
void reset_first() noexcept
Definition: htlist.H:264
T & get_data() noexcept
Definition: htlist.H:294
T & append(const T &item)
Definition: htlist.H:1471
void next()
Definition: htlist.H:254
void reset() noexcept
Definition: htlist.H:1025
Definition: htlist.H:406
Definition: List.H:49
bool is_unitarian() const noexcept
Definition: htlist.H:471
T & get_last_ne() const noexcept
Definition: htlist.H:1552
void insert(Slinknc *link) noexcept
Definition: htlist.H:531
T & append(T &&item)
Definition: htlist.H:1495
Definition: htlist.H:169
DynList(DynList &&l) noexcept
Definition: htlist.H:1760
T & get_last() const
Definition: htlist.H:1572

Leandro Rabindranath León