Program listing for file kernel/src/utils/SiconosAlgebra/SiconosVectorIterator.hpp

Program listing for file kernel/src/utils/SiconosAlgebra/SiconosVectorIterator.hpp#

 1#ifndef __SiconosVectorIterator__
 2#define __SiconosVectorIterator__
 3
 4#include <iterator>
 5
 6template <typename V, typename T, typename TRef>
 7struct SiconosVectorIteratorTypeTpl {
 8  using iterator_category = std::forward_iterator_tag;
 9  using value_type = T;
10  using difference_type = T;
11  using pointer = T*;
12  using reference = T&;
13
14  V* v{nullptr};
15  size_t p{0};
16  SiconosVectorIteratorTypeTpl() = default;
17  SiconosVectorIteratorTypeTpl(V& _v, size_t _p) : v(&_v), p(_p){};
18
19  bool operator!=(const SiconosVectorIteratorTypeTpl& it) { return v != it.v || p != it.p; }
20  bool operator==(const SiconosVectorIteratorTypeTpl& it) { return v == it.v && p == it.p; }
21
22  SiconosVectorIteratorTypeTpl& operator++()
23  {
24    if (p < v->size()) p++;
25    return *this;
26  }
27  SiconosVectorIteratorTypeTpl operator++(int)
28  {
29    SiconosVectorIteratorTypeTpl tmp(*this);
30    if (p < v->size()) p++;
31    return tmp;
32  }
33
34  TRef operator*() { return (*v)(p); }
35};
36
37
38
39
40typedef SiconosVectorIteratorTypeTpl<SiconosVector, double, double&> SiconosVectorIteratorType;
41
42struct SiconosVectorIterator : public SiconosVectorIteratorType {
43  SiconosVectorIterator() : SiconosVectorIteratorType() {}
44  SiconosVectorIterator(SiconosVectorIteratorType& it) : SiconosVectorIteratorType(*it.v, it.p)
45  {
46  }
47  SiconosVectorIterator(SiconosVector& _v, size_t _p) : SiconosVectorIteratorType(_v, _p) {}
48};
49
50
51typedef SiconosVectorIteratorTypeTpl<const SiconosVector, const double, double>
52    SiconosVectorConstIteratorType;
53
54struct SiconosVectorConstIterator : public SiconosVectorConstIteratorType {
55  SiconosVectorConstIterator() : SiconosVectorConstIteratorType() {}
56  SiconosVectorConstIterator(SiconosVectorConstIteratorType& it)
57      : SiconosVectorConstIteratorType(*it.v, it.p)
58  {
59  }
60  SiconosVectorConstIterator(const SiconosVector& _v, size_t _p)
61      : SiconosVectorConstIteratorType(_v, _p)
62  {
63  }
64};
65
66#endif