Documentation of MARTY
A Modern ARtificial Theoretical phYsicist
doubleVector.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 DOUBLE_VECTOR_H_INCLUDED
24 #define DOUBLE_VECTOR_H_INCLUDED
25 
26 #include <vector>
27 #include <iostream>
28 
29 namespace mty {
30 
31 template<typename Type>
33 template<typename Type, class double_vector_type>
35 
36 template<typename Type, class double_vector_type>
38  friend class double_vector<Type>;
39  friend class double_vector_iterator<Type, double_vector_type>;
40 public:
41 
42  using iterator = typename std::vector<Type>::iterator;
43  using const_iterator = typename std::vector<Type>::const_iterator;
44 
46  double_vector_type t_data,
47  size_t t_pos)
48  :data(t_data),
49  pos(t_pos-1)
50  {}
51 
54  &operator=(double_vector_single_view const & other)
55  {
56  size_t min = std::min(size(), other.size());
57  for (size_t i = 0; i != min; ++i)
58  (*this)[i] = other[i];
59  if (size() == min) {
60  for (size_t i = min; i != other.size(); ++i)
61  push_back(other[i]);
62  }
63  else {
64  for (size_t i = min; i != size(); ++i)
65  erase(begin() + min);
66  }
67 
68  return *this;
69  }
70 
71  void empty() const { return size() == 0; }
72  size_t size() const { return data->getCut(pos+1) - data->getCut(pos); }
73 
74  void push_back(Type const &el);
75 
76  void erase(const_iterator pos);
77 
78  iterator begin() {
79  return data->vecBegin() + data->getCut(pos);
80  }
81  iterator end() {
82  return data->vecBegin() + data->getCut(1+pos);
83  }
84 
85  const_iterator begin() const {
86  return data->vecBegin() + data->getCut(pos);
87  }
88 
89  const_iterator end() const{
90  return data->vecBegin() + data->getCut(1+pos);
91  }
92 
93  Type &operator[](size_t i);
94  Type const &operator[](size_t i) const;
95 
96 private:
97  double_vector_type data;
98  size_t pos;
99 };
100 
101 template<typename Type, class double_vector_type>
103 
104 public:
105 
107  double_vector_type t_data
108  )
109  :double_vector_iterator(t_data, 0)
110  {}
111 
113  double_vector_type t_data,
114  size_t pos
115  )
116  :data(t_data),
117  current(t_data, pos)
118  {}
119 
122  )
123  :data(other.data),
124  current(other.data, other.current.pos + 1)
125  {}
126 
127  double_vector_iterator &operator=(
129  ) {
130  data = other.data;
131  current.pos = other.current.pos;
132  return *this;
133  }
134 
135  bool operator==(double_vector_iterator const &other) const {
136  return data == other.data
137  and current.pos == other.current.pos;
138  }
139  bool operator!=(double_vector_iterator const &other) const {
140  return !(*this == other);
141  }
142 
144  & operator*() { return current; }
146  operator*() const { return current; }
148  *operator->() { return &current; }
150  const *operator->() const { return &current; }
151 
152  double_vector_iterator &operator++() {
153  ++current.pos;
154  return *this;
155  }
156  double_vector_iterator operator++(int) {
157  auto copy = *this;
158  ++*this;
159  return copy;
160  }
161 
162  double_vector_iterator &operator--() {
163  --current.pos;
164  return *this;
165  }
166  double_vector_iterator operator--(int) {
167  auto copy = *this;
168  --*this;
169  return copy;
170  }
171 
172  size_t operator-(
174  ) const
175  {
176  return current.pos - other.current.pos;
177  }
179  size_t diff
180  ) const
181  {
182  auto copy(*this);
183  copy.current.pos += diff;
184  return copy;
185  }
187  size_t diff
188  ) const
189  {
190  auto copy(*this);
191  copy.current.pos -= diff;
192  return copy;
193  }
194 private:
195  double_vector_type data;
197 };
198 
199 template<typename Type>
200 class double_vector {
201  friend class double_vector_single_view<Type, double_vector<Type>*>;
202  friend class double_vector_single_view<Type, double_vector<Type> const*>;
203 public:
204 
205  using iterator
207  using const_iterator
209 
210  double_vector(std::vector<Type> const &init)
211  :data(init),
212  cut(init.size())
213  {}
214  double_vector(std::initializer_list<Type> init)
215  :data(init),
216  cut(init.size())
217  {}
218  double_vector() = default;
219  double_vector(double_vector const &other) = default;
220  double_vector(double_vector &&other) = default;
221  double_vector &operator=(double_vector const &other) = default;
222  double_vector &operator=(double_vector &&other) = default;
223  ~double_vector() = default;
224 
225  bool empty() const {
226  return size() == 0;
227  }
228  size_t size() const {
229  return cut.size();
230  }
231 
232  Type &getElement(size_t i) { return data[i]; }
233  Type const &getElement(size_t i) const { return data[i]; }
234 
235  size_t getCut(size_t i) const {
236  return (i == size_t(-1)) ? 0 : cut[i];
237  }
238 
239  std::vector<Type> const &getData() const { return data; }
240  std::vector<size_t> const &getCuts() const { return cut; }
241 
242  void push_back(std::vector<Type> const &row);
243  void push_back(std::vector<Type> &&row);
244 
245  iterator begin() {
246  return iterator(this);
247  }
248 
249  iterator end() {
250  return iterator(this, cut.size());
251  }
252 
253  const_iterator begin() const {
254  return const_iterator(this);
255  }
256 
257  const_iterator end() const {
258  return const_iterator(this, cut.size());
259  }
260 
262  operator[](size_t i);
264  operator[](size_t i) const;
265 
266 private:
267 
268  typename std::vector<Type>::iterator vecBegin() {
269  return data.begin();
270  }
271  typename std::vector<Type>::const_iterator vecBegin() const {
272  return data.begin();
273  }
274  typename std::vector<Type>::iterator vecEnd() {
275  return data.end();
276  }
277  typename std::vector<Type>::const_iterator vecEnd() const {
278  return data.end();
279  }
280 
281  void push_row(
282  size_t pos,
283  Type const &el
284  );
285 
286  void eraseEl(
287  size_t pos,
288  size_t pos_j
289  );
290 
291 private:
292 
293  std::vector<Type> data;
294  std::vector<size_t> cut;
295 };
296 
297 template<typename Type, class double_vector_type>
298 void
300 push_back(Type const &el)
301 {
302  data->push_row(pos, el);
303 }
304 
305 template<typename Type, class double_vector_type>
306 void
308 erase(const_iterator i)
309 {
310  data->eraseEl(data->getCut(pos), i-begin());
311 }
312 
313 template<typename Type, class double_vector_type>
314 Type &
316 operator[](size_t i)
317 {
318  return data->getElement(data->getCut(pos) + i);
319 }
320 
321 template<typename Type, class double_vector_type>
322 Type const &
324 operator[](size_t i) const
325 {
326  return data->getElement(data->getCut(pos) + i);
327 }
328 
329 template<typename Type>
330 void double_vector<Type>::push_back(std::vector<Type> const &row)
331 {
332  if (cut.empty())
333  cut.push_back(row.size());
334  else
335  cut.push_back(cut.back() + row.size());
336  data.insert(
337  data.end(),
338  row.begin(),
339  row.end()
340  );
341 }
342 
343 template<typename Type>
344 void double_vector<Type>::push_back(std::vector<Type> &&row)
345 {
346  if (cut.empty())
347  cut.push_back(row.size());
348  else
349  cut.push_back(cut.back() + row.size());
350  data.insert(
351  data.end(),
352  std::make_move_iterator(row.begin()),
353  std::make_move_iterator(row.end())
354  );
355 }
356 
357 template<typename Type>
359  size_t pos,
360  size_t pos_j
361  )
362 {
363  data.erase(data.begin() + pos + pos_j);
364  for (size_t i = pos+1; i < cut.size(); ++i)
365  --cut[i];
366 }
367 
368 template<typename Type>
370  size_t pos,
371  Type const &el
372  )
373 {
374  size_t insertPos = getCut(pos+1);
375  data.insert(data.begin() + insertPos, el);
376  for (size_t i = pos+1; i < cut.size(); ++i)
377  ++cut[i];
378 }
379 
380 template<typename Type>
383 {
385  this,
386  i
387  );
388 }
389 
390 template<typename Type>
392  double_vector<Type>::operator[](size_t i) const
393 {
395  this,
396  i
397  );
398 }
399 
400 } // End of namespace mty
401 
402 #endif
Type
Namespace of MARTY.
Definition: 2HDM.h:31
Expr operator+(const Expr &a, const Expr &b)
Expr operator-(const Expr &a, const Expr &b)
Definition: doubleVector.h:32
Expr operator*(const Expr &a, const Expr &b)
Definition: doubleVector.h:37
bool operator==(const Expr &a, const Expr &b)
Definition: doubleVector.h:34
bool operator!=(const Expr &a, const Expr &b)