Design Patterns
list.h
Go to the documentation of this file.
1 // Based on "Design Patterns: Elements of Reusable Object-Oriented Software"
2 // book by Erich Gamma, John Vlissides, Ralph Johnson, and Richard Helm
3 //
4 // Created by Bartosz Rachwal. The National Institute of Advanced Industrial Science and Technology, Japan.
5 
6 #ifndef OPERATIONAL_ITERATOR_LIST_H_
7 #define OPERATIONAL_ITERATOR_LIST_H_
8 
9 #include "list_iterator.h"
10 #include "list_interface.h"
11 
12 namespace operational
13 {
14 namespace iterator
15 {
16 template<class Item>
17 class List : public ListInterface<Item>
18 {
19  public:
20  List();
21  explicit List(long size);
22  List(List& list);
23  virtual ~List();
24 
25  List &operator=(const List& list);
26 
27  virtual ListIterator<Item> *CreateIterator() const;
28 
29  long Count() const override;
30 
31  Item &Get(long index) const override;
32  Item &First() const override;
33  Item &Last() const override;
34 
35  bool Includes(const Item& anItem) const override;
36 
37  void Append(const Item& anItem) override;
38  void Prepend(const Item& anItem) override;
39 
40  void Remove(const Item& anItem) override;
41  void RemoveAt(long index) override;
42  void RemoveLast() override;
43  void RemoveFirst() override;
44  void RemoveAll() override;
45 
46  Item &Top() const override;
47 
48  void Push(const Item& anItem) override;
49 
50  Item &Pop() override;
51 
52  private:
53  long size_;
54  int count_;
55  Item* items_;
56 };
57 
58 template<class Item>
59 List<Item>::List() : List(100) { }
60 
61 template<class Item>
62 List<Item>::List(long size) : size_(size), count_(0)
63 {
64  items_ = new Item[size_];
65 }
66 
67 template<class Item>
68 List<Item>::List(List& list) : size_(list.size_), count_(list.count_), items_(list.items_) { }
69 
70 template<class Item>
72 {
73  delete items_;
74 }
75 
76 template<class Item>
78 {
79  size_ = list.size_;
80  count_ = list.count_;
81  items_ = list.items_;
82  return this;
83 }
84 
85 template<class Item>
87 {
88  return new ListIterator<Item>(this);
89 }
90 
91 template<class Item>
92 long List<Item>::Count() const
93 {
94  return count_;
95 }
96 
97 template<class Item>
98 Item &List<Item>::Get(long index) const
99 {
100  if (count_ <= size_)
101  return items_[index];
102  throw "RangeError";
103 }
104 
105 template<class Item>
106 Item &List<Item>::First() const
107 {
108  return Get(0);
109 }
110 
111 template<class Item>
112 Item &List<Item>::Last() const
113 {
114  return Get(Count() - 1);
115 }
116 
117 template<class Item>
118 bool List<Item>::Includes(const Item& item) const
119 {
120  for (long i = 0; i < Count(); i++)
121  {
122  if (items_[i] == item)
123  {
124  return true;
125  }
126  }
127  return false;
128 }
129 
130 template<class Item>
131 void List<Item>::Append(const Item& item)
132 {
133  if (count_ <= size_)
134  {
135  items_[count_] = item;
136  count_++;
137  }
138 }
139 
140 template<class Item>
141 void List<Item>::Prepend(const Item& item)
142 {
143  if (count_ <= size_)
144  {
145  for (long i = count_ - 1; i >= 0; i--)
146  items_[i + 1] = items_[i];
147  items_[0] = item;
148  count_++;
149  }
150 }
151 
152 template<class Item>
153 void List<Item>::Remove(const Item& item)
154 {
155  for (long i = 0; i < Count(); i++)
156  {
157  if (items_[i] == item)
158  {
159  RemoveAt(i);
160  }
161  }
162 }
163 
164 template<class Item>
165 void List<Item>::RemoveAt(long index)
166 {
167  if (index < 0 || index >= Count())
168  throw "RangeException";
169 
170  for (auto i = index; i < Count() - 1; i++)
171  items_[i] = items_[i + 1];
172  count_--;
173 }
174 
175 template<class Item>
177 {
178  RemoveAt(Count() - 1);
179 }
180 
181 template<class Item>
183 {
184  RemoveAt(0);
185 }
186 
187 template<class Item>
189 {
190  count_ = 0;
191 }
192 
193 template<class Item>
194 Item &List<Item>::Top() const
195 {
196  return Last();
197 }
198 
199 template<class Item>
200 void List<Item>::Push(const Item& item)
201 {
202  Append(item);
203 }
204 
205 template<class Item>
207 {
208  Item& top = Last();
209  RemoveLast();
210  return top;
211 }
212 }
213 }
214 
215 #endif
216 
virtual ~List()
Definition: list.h:71
void Push(const Item &anItem) override
Definition: list.h:200
List & operator=(const List &list)
Definition: list.h:77
void RemoveAll() override
Definition: list.h:188
Definition: application.cc:10
Item & Pop() override
Definition: list.h:206
List()
Definition: list.h:59
Definition: list.h:17
Definition: list_interface.h:14
void Remove(const Item &anItem) override
Definition: list.h:153
virtual ListIterator< Item > * CreateIterator() const
Definition: list.h:86
void RemoveFirst() override
Definition: list.h:182
Item & First() const override
Definition: list.h:106
Item & Top() const override
Definition: list.h:194
Item & Last() const override
Definition: list.h:112
long Count() const override
Definition: list.h:92
void RemoveLast() override
Definition: list.h:176
void Prepend(const Item &anItem) override
Definition: list.h:141
Definition: list_iterator.h:17
void RemoveAt(long index) override
Definition: list.h:165
Item & Get(long index) const override
Definition: list.h:98
void Append(const Item &anItem) override
Definition: list.h:131
bool Includes(const Item &anItem) const override
Definition: list.h:118