Dynalib Utils
DynaLinkedList.h
Go to the documentation of this file.
1 
12 #ifndef DYNALINKEDLIST_H
13 #define DYNALINKEDLIST_H
14 
15 #include <typeinfo>
16 #include <iostream>
17 #include "TypeDefs.h"
18 #include "Exception.h"
19 #include "IComparable.h"
20 #include "ICopyable.h"
21 
22 #define INVALID_INDEX -1
23 
24 #define MAKE_LINKEDLISTTYPE_DEF(C, T) \
25  typedef LinkedEntry<C> T##LinkedEntry; \
26  typedef DynaLinkedList<C> T##LinkedList
27 
28 template <class T> class DynaLinkedList;
29 template <class T> class LinkedIter;
30 template <class T> class LinkedEntryIter;
31 
32 template <class T> class LinkedEntry : IComparable< LinkedEntry<T> >, ICopyable< LinkedEntry<T> > {
33  DynaLinkedList<T>* _owner;
34  LinkedEntry<T>* _prev;
35  LinkedEntry<T>* _next;
36  bool _ownsObject;
37  T* _object;
38 public:
39  explicit LinkedEntry(T* object, bool ownsObject);
40  virtual ~LinkedEntry();
41  LinkedEntry(const LinkedEntry<T>& other);
42  LinkedEntry<T>* copy() override;
43 
47  bool isOwnsObject();
48  T* getObject() const;
52  LinkedEntry<T>* setObject(T* object);
53 
54  bool operator== (const LinkedEntry<T> &other) const override {
55  return _object == other.getObject();
56  }
57 
58 };
59 
60 template <class T> class DynaLinkedList : public ICopyable< DynaLinkedList<T> >{
61  friend class LinkedIter<T>;
62  friend class LinkedEntryIter<T>;
63 
64  LinkedEntry<T>* _first;
65  LinkedEntry<T>* _last;
66  bool _ownsMembers;
67  uint _entryCount;
68 
69 public:
71  virtual ~DynaLinkedList();
72  DynaLinkedList(const DynaLinkedList<T>& other);
73  DynaLinkedList<T>* copy() override;
74 
75  void clear();
76  int size();
77  inline bool isEmpty() { return _entryCount == 0; }
78  LinkedEntry<T>* getFirst() const;
79  LinkedEntry<T>* getLast() const;
80  bool isFirst(LinkedEntry<T>* entry);
81  bool isLast(LinkedEntry<T>* entry);
82  bool isOwnsMembers();
83  void setOwnsMembers(bool ownsMembers);
84  LinkedEntry<T>* get(int index);
85  uint getCount();
86  uint count();
87  int indexOfEntry(LinkedEntry<T>* entry);
88  LinkedEntry<T>* findEntry(T* object);
89  int indexOf(T* object);
90  T* find(T* object);
91  LinkedEntry<T>* insertEntry(LinkedEntry<T>* entry, LinkedEntry<T>* destLink, bool after);
92  LinkedEntry<T>* insertEntry(T* object, LinkedEntry<T>* destLink, bool after);
93  LinkedEntry<T>* appendEntry(LinkedEntry<T>* entry);
94  LinkedEntry<T>* appendEntry(T* object);
95  LinkedEntry<T>* pushEntry(LinkedEntry<T>* entry);
96  LinkedEntry<T>* pushEntry(T* object);
97  LinkedEntry<T>* removeEntry(LinkedEntry<T>* entry);
98  bool deleteEntry(LinkedEntry<T>* entry);
99  LinkedEntry<T>* popEntry();
100  LinkedEntry<T>* popLastEntry();
101 
102  bool move(LinkedEntry<T>* entry, LinkedEntry<T>* destEntry, bool after);
103  bool moveToFirst(LinkedEntry<T>* entry);
104  bool moveToLast(LinkedEntry<T>* entry);
105  DynaLinkedList<T>* splitList(LinkedEntry<T>* atEntry);
106  DynaLinkedList<T>* appendList(DynaLinkedList<T>* list);
107 
108  T* insert(T* object, LinkedEntry<T>* destLink, bool after);
109  T* append(T* object);
110  T* push(T* object);
111  T* remove(LinkedEntry<T>* entry);
112  T* pop();
113  T* popLast();
115  LinkedIter<T> end();
116 };
117 
118 template <class T> class LinkedIter {
119  LinkedEntry<T>* _current;
120  DynaLinkedList<T>* _list;
121 
122 public:
123  explicit LinkedIter(DynaLinkedList<T>* list);
124  explicit LinkedIter(DynaLinkedList<T>* list, LinkedEntry<T>* start);
125 
126  bool hasNext();
127  bool hasPrevious();
128  T* next();
129  T* previous();
130  void remove();
131  bool operator== (const LinkedIter<T>& other) const;
132  bool operator!= (const LinkedIter<T>& other) const;
133  T* operator* () const;
134  const LinkedIter<T>& operator++ ();
135  const LinkedIter<T>& operator-- ();
136  LinkedIter<T> begin();
137  LinkedIter<T> end();
138 };
139 
140 template <class T> class LinkedEntryIter {
141  LinkedEntry<T>* _current;
142  DynaLinkedList<T>* _list;
143 
144 public:
145  explicit LinkedEntryIter(DynaLinkedList<T>* list);
146  explicit LinkedEntryIter(DynaLinkedList<T>* list, LinkedEntry<T>* start);
147 
148  bool hasNext();
149  bool hasPrevious();
150  LinkedEntry<T>* next();
151  LinkedEntry<T>* previous();
152  void remove();
153  bool operator== (const LinkedEntryIter<T>& other) const;
154  bool operator!= (const LinkedEntryIter<T>& other) const;
155  LinkedEntry<T>* operator* () const;
156  const LinkedEntryIter<T>& operator++ ();
157  const LinkedEntryIter<T>& operator-- ();
158  LinkedEntryIter<T> begin();
159  LinkedEntryIter<T> end();
160 };
161 
162 #endif //DYNALINKEDLIST_H
T * getObject() const
Definition: DynaLinkedListImpl.h:58
bool operator==(const LinkedEntry< T > &other) const override
Definition: DynaLinkedList.h:54
LinkedEntry(T *object, bool ownsObject)
Definition: DynaLinkedListImpl.h:19
LinkedEntryIter< T > end()
Definition: DynaLinkedListImpl.h:611
LinkedEntry< T > * setOwner(DynaLinkedList< T > *owner)
Definition: DynaLinkedListImpl.h:62
Definition: DynaLinkedList.h:29
Definition: DynaLinkedList.h:32
virtual ~LinkedEntry()
Definition: DynaLinkedListImpl.h:22
bool isOwnsObject()
Definition: DynaLinkedListImpl.h:54
LinkedEntryIter< T > begin()
Definition: DynaLinkedListImpl.h:607
LinkedEntry< T > * copy() override
Definition: DynaLinkedListImpl.h:37
LinkedEntry< T > * setObject(T *object)
Definition: DynaLinkedListImpl.h:77
LinkedEntry< T > * setPrevious(LinkedEntry< T > *previous)
Definition: DynaLinkedListImpl.h:72
Definition: DynaLinkedList.h:28
Definition: DynaLinkedList.h:30
LinkedEntry< T > * getNext()
Definition: DynaLinkedListImpl.h:50
CONSTCD11 bool operator!=(const day &x, const day &y) NOEXCEPT
Definition: date.h:1282
LinkedEntry< T > * getPrevious()
Definition: DynaLinkedListImpl.h:46
Definition: IComparable.h:8
DynaLinkedList< T > * getOwner()
Definition: DynaLinkedListImpl.h:42
Definition: ICopyable.h:8
bool isEmpty()
Definition: DynaLinkedList.h:77
LinkedEntry< T > * setNext(LinkedEntry< T > *next)
Definition: DynaLinkedListImpl.h:67