Documentation of MARTY
A Modern ARtificial Theoretical phYsicist
std_vector_implementation.h
Go to the documentation of this file.
1 // This file is part of MARTY.
2 //
3 // MARTY is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // MARTY is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with MARTY. If not, see <https://www.gnu.org/licenses/>.
15 
23 #ifndef IMPLEMENTS_STD_VECTOR
24 #define IMPLEMENTS_STD_VECTOR_NO_OP_NO_PB(object, variable) \
25  public: \
26 \
27  using iterator = typename std::vector<object>::iterator;\
28  using const_iterator = typename std::vector<object>::const_iterator;\
29  using reverse_iterator \
30  = typename std::vector<object>::reverse_iterator;\
31  using const_reverse_iterator \
32  = typename std::vector<object>::const_reverse_iterator;\
33  \
34  \
35  size_t size() const { \
36  return variable.size(); \
37  } \
38  \
39  bool empty() const { \
40  return begin() == end(); \
41  } \
42  \
43  object const &back() const {\
44  return *(end() - 1);\
45  }\
46  object &back() {\
47  return *(end() - 1);\
48  }\
49  \
50  typename std::vector<object>::const_iterator begin() const { \
51  return variable.begin(); \
52  } \
53  \
54  typename std::vector<object>::const_iterator end() const { \
55  return variable.end(); \
56  } \
57  \
58  typename std::vector<object>::iterator begin() { \
59  return variable.begin(); \
60  } \
61  \
62  typename std::vector<object>::iterator end() { \
63  return variable.end(); \
64  } \
65  \
66  typename std::vector<object>::const_reverse_iterator rbegin() const { \
67  return variable.rbegin(); \
68  } \
69  \
70  typename std::vector<object>::const_reverse_iterator rend() const { \
71  return variable.rend(); \
72  } \
73  \
74  typename std::vector<object>::reverse_iterator rbegin() { \
75  return variable.rbegin(); \
76  } \
77  \
78  typename std::vector<object>::reverse_iterator rend() { \
79  return variable.rend(); \
80  } \
81  void clear() {\
82  variable.clear();\
83  }\
84  typename std::vector<object>::iterator erase(\
85  typename std::vector<object>::iterator iter) {\
86  return variable.erase(iter);\
87  }\
88  typename std::vector<object>::const_iterator erase(\
89  typename std::vector<object>::const_iterator iter) {\
90  return variable.erase(iter);\
91  }\
92  typename std::vector<object>::iterator erase(\
93  typename std::vector<object>::iterator first,\
94  typename std::vector<object>::iterator last) {\
95  return variable.erase(first, last);\
96  }\
97  typename std::vector<object>::const_iterator erase(\
98  typename std::vector<object>::const_iterator first,\
99  typename std::vector<object>::const_iterator last) {\
100  return variable.erase(first, last);\
101  }\
102  typename std::vector<object>::const_iterator insert(\
103  typename std::vector<object>::const_iterator pos,\
104  const object& value) {\
105  return variable.insert(pos, value);\
106  }\
107  typename std::vector<object>::const_iterator insert(\
108  typename std::vector<object>::const_iterator pos,\
109  object&& value) {\
110  return variable.insert(pos, value);\
111  }\
112  void insert(typename std::vector<object>::iterator pos, \
113  size_t count,\
114  const object& value) {\
115  variable.insert(pos, count, value);\
116  }\
117  typename std::vector<object>::iterator insert(\
118  typename std::vector<object>::const_iterator pos, \
119  size_t count,\
120  const object& value) {\
121  return variable.insert(pos, count, value);\
122  }\
123  template<class InputIt>\
124  void insert(typename std::vector<object>::iterator pos,\
125  InputIt first,\
126  InputIt last) {\
127  variable.insert(pos, first, last);\
128  }\
129  template<class InputIt>\
130  typename std::vector<object>::iterator insert(\
131  typename std::vector<object>::const_iterator pos,\
132  InputIt first,\
133  InputIt last) {\
134  return variable.insert(pos, first, last);\
135  }\
136  typename std::vector<object>::iterator insert(\
137  typename std::vector<object>::const_iterator pos,\
138  std::initializer_list<object> ilist) {\
139  return variable.insert(pos, ilist);\
140  }\
141 
142 #define IMPLEMENTS_STD_VECTOR_NO_OP(object, variable)\
143  IMPLEMENTS_STD_VECTOR_NO_OP_NO_PB(object, variable)\
144  void push_back(const object& newElement) { \
145  variable.push_back(newElement); \
146  } \
147  \
148  void push_back(object&& newElement) { \
149  variable.push_back(newElement); \
150  } \
151 
152 #define IMPLEMENTS_STD_VECTOR_NO_PB(object, variable) \
153  IMPLEMENTS_STD_VECTOR_NO_OP_NO_PB(object, variable)\
154  \
155  object operator[](size_t i) const { \
156  return variable[i]; \
157  } \
158  \
159  object& operator[](size_t i) { \
160  return variable[i]; \
161  } \
162 
163 #define IMPLEMENTS_STD_VECTOR(object, variable) \
164  IMPLEMENTS_STD_VECTOR_NO_OP(object, variable)\
165  \
166  object operator[](size_t i) const { \
167  return variable[i]; \
168  } \
169  \
170  object& operator[](size_t i) { \
171  return variable[i]; \
172  } \
173 
174 #endif