openMSX
array_ref.hh
Go to the documentation of this file.
1 #ifndef ARRAY_REF_HH
2 #define ARRAY_REF_HH
3 
4 #include <algorithm>
5 #include <iterator>
6 #include <vector>
7 #include <cassert>
8 #include <cstddef>
9 
18 template<typename T>
19 class array_ref
20 {
21 public:
22  // types
23  using value_type = T;
24  using pointer = const T*;
25  using reference = const T&;
26  using const_reference = const T&;
27  using const_iterator = const T*;
29  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
31  using size_type = size_t;
32  using difference_type = ptrdiff_t;
33 
34  // construct/copy/assign
35  array_ref() = default;
36  array_ref(const array_ref& r)
37  : dat(r.data()), siz(r.size()) {}
38  array_ref(const T* array, size_t length)
39  : dat(array), siz(length) {}
40  template<typename ITER> array_ref(ITER first, ITER last)
41  : dat(&*first), siz(std::distance(first, last)) {}
42  /*implicit*/ array_ref(const std::vector<T>& v)
43  : dat(v.data()), siz(v.size()) {}
44  /*implicit*/ template<size_t N> array_ref(const T(&a)[N])
45  : dat(a), siz(N) {}
46 
47  array_ref& operator=(const array_ref& rhs) {
48  dat = rhs.data();
49  siz = rhs.size();
50  return *this;
51  }
52 
53  // iterators
54  const_iterator begin() const { return dat; }
55  const_iterator end() const { return dat + siz; }
58 
59  // capacity
60  size_type size() const { return siz; }
61  bool empty() const { return siz == 0; }
62 
63  // element access
64  const T& operator[](size_t i) const {
65  assert(i < siz);
66  return dat[i];
67  }
68  const T& front() const { return (*this)[0]; }
69  const T& back() const { return (*this)[siz - 1]; }
70  const T* data() const { return dat; }
71 
72  // mutators
73  void clear() { siz = 0; } // no need to change 'dat'
75  if (n <= siz) {
76  dat += n;
77  siz -= n;
78  } else {
79  clear();
80  }
81  }
83  if (n <= siz) {
84  siz -= n;
85  } else {
86  clear();
87  }
88  }
89  void pop_back() { remove_suffix(1); }
90  void pop_front() { remove_prefix(1); }
91 
93  if (pos >= siz) return array_ref();
94  return array_ref(dat + pos, std::min(n, siz - pos));
95  }
96 
97 private:
98  const T* dat = nullptr;
99  size_type siz = 0;
100 };
101 
102 // deducing constructor wrappers
103 template<typename T> inline array_ref<T> make_array_ref(const T* array, size_t length)
104 {
105  return array_ref<T>(array, length);
106 }
107 
108 template<typename T, size_t N> inline array_ref<T> make_array_ref(const T(&a)[N])
109 {
110  return array_ref<T>(a);
111 }
112 
113 template<typename T> inline array_ref<T> make_array_ref(const std::vector<T>& v)
114 {
115  return array_ref<T>(v);
116 }
117 
118 #endif
T length(const vecN< N, T > &x)
Definition: gl_vec.hh:334
void pop_front()
Definition: array_ref.hh:90
void pop_back()
Definition: array_ref.hh:89
vecN< N, T > min(const vecN< N, T > &x, const vecN< N, T > &y)
Definition: gl_vec.hh:269
const T & reference
Definition: array_ref.hh:25
const_iterator begin() const
Definition: array_ref.hh:54
STL namespace.
array_ref(const std::vector< T > &v)
Definition: array_ref.hh:42
size_t size_type
Definition: array_ref.hh:31
T value_type
Definition: array_ref.hh:23
void remove_suffix(size_type n)
Definition: array_ref.hh:82
array_ref(const array_ref &r)
Definition: array_ref.hh:36
const T & const_reference
Definition: array_ref.hh:26
array_ref & operator=(const array_ref &rhs)
Definition: array_ref.hh:47
void clear()
Definition: array_ref.hh:73
This class implements a subset of the proposal for std::array_ref (proposed for the next c++ standard...
Definition: array_ref.hh:19
const T * data() const
Definition: array_ref.hh:70
ptrdiff_t difference_type
Definition: array_ref.hh:32
array_ref< T > make_array_ref(const T *array, size_t length)
Definition: array_ref.hh:103
array_ref(const T(&a)[N])
Definition: array_ref.hh:44
const T & back() const
Definition: array_ref.hh:69
const T * const_iterator
Definition: array_ref.hh:27
std::iterator_traits< octet_iterator >::difference_type distance(octet_iterator first, octet_iterator last)
bool empty() const
Definition: array_ref.hh:61
array_ref substr(size_type pos, size_type n=size_type(-1)) const
Definition: array_ref.hh:92
size_type size() const
Definition: array_ref.hh:60
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: array_ref.hh:29
array_ref()=default
const_iterator iterator
Definition: array_ref.hh:28
void remove_prefix(size_type n)
Definition: array_ref.hh:74
array_ref(ITER first, ITER last)
Definition: array_ref.hh:40
const_reverse_iterator reverse_iterator
Definition: array_ref.hh:30
const_iterator end() const
Definition: array_ref.hh:55
const T & operator[](size_t i) const
Definition: array_ref.hh:64
const_reverse_iterator rend() const
Definition: array_ref.hh:57
const T & front() const
Definition: array_ref.hh:68
array_ref(const T *array, size_t length)
Definition: array_ref.hh:38
const T * pointer
Definition: array_ref.hh:24
const_reverse_iterator rbegin() const
Definition: array_ref.hh:56