Documentation of CSL
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 #pragma once
24 
25 #define IMPLEMENTS_STD_VECTOR_NO_OP_NO_PB(object, variable) \
26  public: \
27 \
28  using iterator = typename std::vector<object>::iterator;\
29  using const_iterator = typename std::vector<object>::const_iterator;\
30  using reverse_iterator \
31  = typename std::vector<object>::reverse_iterator;\
32  using const_reverse_iterator \
33  = typename std::vector<object>::const_reverse_iterator;\
34  \
35  \
36  size_t size() const { \
37  return variable.size(); \
38  } \
39  \
40  bool empty() const { \
41  return begin() == end(); \
42  } \
43  \
44  object const &back() const {\
45  return *(end() - 1);\
46  }\
47  object &back() {\
48  return *(end() - 1);\
49  }\
50  \
51  typename std::vector<object>::const_iterator begin() const { \
52  return variable.begin(); \
53  } \
54  \
55  typename std::vector<object>::const_iterator end() const { \
56  return variable.end(); \
57  } \
58  \
59  typename std::vector<object>::iterator begin() { \
60  return variable.begin(); \
61  } \
62  \
63  typename std::vector<object>::iterator end() { \
64  return variable.end(); \
65  } \
66  \
67  typename std::vector<object>::const_reverse_iterator rbegin() const { \
68  return variable.rbegin(); \
69  } \
70  \
71  typename std::vector<object>::const_reverse_iterator rend() const { \
72  return variable.rend(); \
73  } \
74  \
75  typename std::vector<object>::reverse_iterator rbegin() { \
76  return variable.rbegin(); \
77  } \
78  \
79  typename std::vector<object>::reverse_iterator rend() { \
80  return variable.rend(); \
81  } \
82  void clear() {\
83  variable.clear();\
84  }\
85  typename std::vector<object>::iterator erase(\
86  typename std::vector<object>::iterator iter) {\
87  return variable.erase(iter);\
88  }\
89  typename std::vector<object>::const_iterator erase(\
90  typename std::vector<object>::const_iterator iter) {\
91  return variable.erase(iter);\
92  }\
93  typename std::vector<object>::iterator erase(\
94  typename std::vector<object>::iterator first,\
95  typename std::vector<object>::iterator last) {\
96  return variable.erase(first, last);\
97  }\
98  typename std::vector<object>::const_iterator erase(\
99  typename std::vector<object>::const_iterator first,\
100  typename std::vector<object>::const_iterator last) {\
101  return variable.erase(first, last);\
102  }\
103  typename std::vector<object>::const_iterator insert(\
104  typename std::vector<object>::const_iterator pos,\
105  const object& value) {\
106  return variable.insert(pos, value);\
107  }\
108  typename std::vector<object>::const_iterator insert(\
109  typename std::vector<object>::const_iterator pos,\
110  object&& value) {\
111  return variable.insert(pos, value);\
112  }\
113  void insert(typename std::vector<object>::iterator pos, \
114  size_t count,\
115  const object& value) {\
116  variable.insert(pos, count, value);\
117  }\
118  typename std::vector<object>::iterator insert(\
119  typename std::vector<object>::const_iterator pos, \
120  size_t count,\
121  const object& value) {\
122  return variable.insert(pos, count, value);\
123  }\
124  template<class InputIt>\
125  void insert(typename std::vector<object>::iterator pos,\
126  InputIt first,\
127  InputIt last) {\
128  variable.insert(pos, first, last);\
129  }\
130  template<class InputIt>\
131  typename std::vector<object>::iterator insert(\
132  typename std::vector<object>::const_iterator pos,\
133  InputIt first,\
134  InputIt last) {\
135  return variable.insert(pos, first, last);\
136  }\
137  typename std::vector<object>::iterator insert(\
138  typename std::vector<object>::const_iterator pos,\
139  std::initializer_list<object> ilist) {\
140  return variable.insert(pos, ilist);\
141  }\
142 
143 #define IMPLEMENTS_STD_VECTOR_NO_OP(object, variable)\
144  IMPLEMENTS_STD_VECTOR_NO_OP_NO_PB(object, variable)\
145  void push_back(const object& newElement) { \
146  variable.push_back(newElement); \
147  } \
148  \
149  void push_back(object&& newElement) { \
150  variable.push_back(newElement); \
151  } \
152 
153 #define IMPLEMENTS_STD_VECTOR_NO_PB(object, variable) \
154  IMPLEMENTS_STD_VECTOR_NO_OP_NO_PB(object, variable)\
155  \
156  object operator[](size_t i) const { \
157  return variable[i]; \
158  } \
159  \
160  object& operator[](size_t i) { \
161  return variable[i]; \
162  } \
163 
164 #define IMPLEMENTS_STD_VECTOR(object, variable) \
165  IMPLEMENTS_STD_VECTOR_NO_OP(object, variable)\
166  \
167  object operator[](size_t i) const { \
168  return variable[i]; \
169  } \
170  \
171  object& operator[](size_t i) { \
172  return variable[i]; \
173  }
174 
175