sequencer
vector_view.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <type_traits>
4 #include <vector>
5 
6 namespace sequencer
7 {
8  template < class T, class View, class Vector >
10  {
11  public:
12  using size_type = typename Vector::size_type;
13  using value_type = T;
14 
15  constexpr explicit vector_view_base( Vector* v, size_type offset,
16  size_type stride = 1 ) noexcept
17  : v_( v ), offset_( offset ), stride_( stride )
18  {
19  }
20 
21  constexpr explicit vector_view_base( View* view, size_type offset,
22  size_type stride = 1 ) noexcept
23  : view_( view ), offset_( offset ), stride_( stride )
24  {
25  }
26 
27  const T& operator[]( size_type i ) const
28  {
29  return view_ ? ( *view_ )[ idx( i ) ] : ( *v_ )[ idx( i ) ];
30  }
31 
32  size_type size() const noexcept
33  {
34  const auto full_size = view_ ? view_->size() : v_->size();
35  return full_size / stride_ - offset_ / stride_;
36  }
37 
38  protected:
39  constexpr size_type idx( size_type i ) const noexcept
40  {
41  return offset_ + stride_ * i;
42  }
43 
44  Vector* vector() noexcept
45  {
46  return v_;
47  }
48 
49  View* view() noexcept
50  {
51  return view_;
52  }
53 
54  private:
55  Vector* v_{nullptr};
56  View* view_{nullptr};
57  const size_type offset_;
58  const size_type stride_;
59  };
60 
61  template < class T >
63  : public vector_view_base< T, const const_vector_view< T >, const std::vector< T > >
64  {
65  public:
66  using base_type =
68  using size_type = typename base_type::size_type;
70 
71  constexpr explicit const_vector_view( const std::vector< T >* v, size_type offset,
72  size_type stride = 1 ) noexcept
73  : base_type{v, offset, stride}
74  {
75  }
76 
77  constexpr explicit const_vector_view( const const_vector_view* view, size_type offset,
78  size_type stride = 1 ) noexcept
79  : base_type{view, offset, stride}
80  {
81  }
82  };
83 
84  template < class T >
85  class vector_view : public vector_view_base< T, vector_view< T >, std::vector< T > >
86  {
87  public:
88  using base_type = vector_view_base< T, vector_view< T >, std::vector< T > >;
89  using size_type = typename base_type::size_type;
91 
92  constexpr explicit vector_view( std::vector< T >* v, size_type offset,
93  size_type stride = 1 ) noexcept
94  : base_type{v, offset, stride}
95  {
96  }
97 
98  constexpr explicit vector_view( vector_view* view, size_type offset,
99  size_type stride = 1 ) noexcept
100  : base_type{view, offset, stride}
101  {
102  }
103 
104  using base_type::operator[];
105 
107  {
108  return base_type::view() ? ( *base_type::view() )[ base_type::idx( i ) ]
109  : ( *base_type::vector() )[ base_type::idx( i ) ];
110  }
111  };
112 } // namespace sequencer
constexpr vector_view(vector_view *view, size_type offset, size_type stride=1) noexcept
Definition: vector_view.hpp:98
typename base_type::value_type value_type
Definition: vector_view.hpp:69
Definition: vector_view.hpp:9
typename base_type::value_type value_type
Definition: vector_view.hpp:90
size_type size() const noexcept
Definition: vector_view.hpp:32
Definition: vector_view.hpp:85
const T & operator[](size_type i) const
Definition: vector_view.hpp:27
constexpr const_vector_view(const const_vector_view *view, size_type offset, size_type stride=1) noexcept
Definition: vector_view.hpp:77
T & operator[](size_type i)
Definition: vector_view.hpp:106
View * view() noexcept
Definition: vector_view.hpp:49
typename base_type::size_type size_type
Definition: vector_view.hpp:89
constexpr vector_view_base(View *view, size_type offset, size_type stride=1) noexcept
Definition: vector_view.hpp:21
constexpr vector_view(std::vector< T > *v, size_type offset, size_type stride=1) noexcept
Definition: vector_view.hpp:92
constexpr size_type idx(size_type i) const noexcept
Definition: vector_view.hpp:39
Definition: vector_view.hpp:62
typename base_type::size_type size_type
Definition: vector_view.hpp:68
constexpr vector_view_base(Vector *v, size_type offset, size_type stride=1) noexcept
Definition: vector_view.hpp:15
constexpr const_vector_view(const std::vector< T > *v, size_type offset, size_type stride=1) noexcept
Definition: vector_view.hpp:71
typename std::vector< T > ::size_type size_type
Definition: vector_view.hpp:12
Vector * vector() noexcept
Definition: vector_view.hpp:44