Interface Documentation
Version: invalid
array_ref.hh
Go to the documentation of this file.
1 /*
2  @@@@@@@@ @@ @@@@@@ @@@@@@@@ @@
3  /@@///// /@@ @@////@@ @@////// /@@
4  /@@ /@@ @@@@@ @@ // /@@ /@@
5  /@@@@@@@ /@@ @@///@@/@@ /@@@@@@@@@/@@
6  /@@//// /@@/@@@@@@@/@@ ////////@@/@@
7  /@@ /@@/@@//// //@@ @@ /@@/@@
8  /@@ @@@//@@@@@@ //@@@@@@ @@@@@@@@ /@@
9  // /// ////// ////// //////// //
10 
11  Copyright (c) 2016, Triad National Security, LLC
12  All rights reserved.
13  */
14 #pragma once
15 
18 #include <array>
19 #include <assert.h>
20 #include <cstddef>
21 #include <limits>
22 #include <stdexcept>
23 #include <string>
24 #include <vector>
25 
26 namespace flecsi {
27 namespace util {
28 
69 template<typename T>
70 class array_ref
71 {
72 
73 public:
76  typedef T value_type;
78  typedef const T * pointer;
79  typedef const T & reference;
80  typedef const T & const_reference;
83  typedef const T * const_iterator;
86  typedef const_iterator iterator;
87  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
88  typedef const_reverse_iterator reverse_iterator;
89  typedef std::size_t size_type;
90  typedef ptrdiff_t difference_type;
92 
95 
97  constexpr array_ref() : ptr_(nullptr), length_(0) {}
98  constexpr array_ref(const array_ref &) = default;
99  array_ref & operator=(const array_ref &) = default;
100 
101  constexpr array_ref(const T * array, const size_type length)
102  : ptr_(array), length_(length) {}
103 
104  // Implicit conversion constructors
105 
108  template<typename Allocator>
109  array_ref(const std::vector<T, Allocator> & v)
110  : ptr_(v.data()), length_(v.size()) {}
111 
112  template<typename traits, typename Allocator>
113  array_ref(const std::basic_string<T, traits, Allocator> & s)
114  : ptr_(s.data()), length_(s.size()) {}
115 
116  template<size_type N>
117  constexpr array_ref(const T (&a)[N]) : ptr_(a), length_(N) {}
118 
121  template<size_type N>
122  constexpr array_ref(const std::array<T, N> & a)
123  : ptr_(a.data()), length_(N) {}
124 
128  constexpr array_ref substr(const size_type pos,
129  const size_type n = size_type(-1)) const {
130  // Recursive implementation to satisfy constexpr.
131  return (pos > size() ? substr(size(), n)
132  : n > size() - pos ? substr(pos, size() - pos)
133  : array_ref(data() + pos, n));
134  }
136 
139  constexpr const_iterator begin() const {
140  return ptr_;
141  }
142  constexpr const_iterator end() const {
143  return ptr_ + length_;
144  }
145  constexpr const_iterator cbegin() const {
146  return begin();
147  }
148  constexpr const_iterator cend() const {
149  return end();
150  }
151  const_reverse_iterator rbegin() const {
152  return const_reverse_iterator(end());
153  }
154  const_reverse_iterator rend() const {
155  return const_reverse_iterator(begin());
156  }
157  const_reverse_iterator crbegin() const {
158  return rbegin();
159  }
160  const_reverse_iterator crend() const {
161  return rend();
162  }
164 
167  constexpr size_type size() const {
168  return length_;
169  }
170  constexpr size_type max_size() const {
171  return (std::numeric_limits<size_type>::max)() / sizeof(T);
172  }
173  constexpr bool empty() const {
174  return length_ == 0;
175  }
177 
180  constexpr const T & operator[](const size_type i) const {
181  return ptr_[i];
182  }
183  constexpr const T & at(const size_type i) const {
184  // This makes at() constexpr as long as the argument is within the
185  // bounds of the array_ref.
186  /*
187  // However, possibly returning a throw, as in the following construction,
188  // gives "warning: returning reference to temporary [-Wreturn-local-addr]"
189  return i >= size() ? throw std::out_of_range("at() argument out of range")
190  : ptr_[i];
191  */
192  if(i >= size())
193  throw std::out_of_range("at() argument out of range");
194  return ptr_[i];
195  }
196 
197  constexpr const T & front() const {
198  return ptr_[0];
199  }
200  constexpr const T & back() const {
201  return ptr_[length_ - 1];
202  }
203 
207  constexpr const T * data() const {
208  return ptr_;
209  }
211 
224 
227  explicit operator std::vector<T>() const {
228  return std::vector<T>(begin(), end());
229  }
230  std::vector<T> vec() const {
231  return std::vector<T>(*this);
232  }
233 
236  template<typename traits, typename Allocator>
237  explicit operator std::basic_string<T, traits, Allocator>() const {
238  return std::basic_string<T, traits, Allocator>(begin(), end());
239  }
240  std::basic_string<T> str() const {
241  return std::basic_string<T>(*this);
242  }
243 
245 
248 
251  void clear() {
252  *this = array_ref();
253  }
254 
258  void remove_prefix(const size_type n) {
259  assert(length_ >= n);
260  ptr_ += n;
261  length_ -= n;
262  }
263 
267  void remove_suffix(const size_type n) {
268  assert(length_ >= n);
269  length_ -= n;
270  }
273  void pop_back() {
274  remove_suffix(1);
275  }
278  void pop_front() {
279  remove_prefix(1);
280  }
282 
283 private:
284  const T * ptr_;
285  size_type length_;
286 };
287 
296 
297 template<typename T>
298 constexpr array_ref<T>
299 make_array_ref(const T * array, const std::size_t length) {
300  return array_ref<T>(array, length);
301 }
302 
303 template<typename T, std::size_t N>
304 constexpr array_ref<T>
305 make_array_ref(const T (&a)[N]) {
306  return array_ref<T>(a);
307 }
308 
309 template<typename T>
311 make_array_ref(const std::vector<T> & v) {
312  return array_ref<T>(v);
313 }
314 
315 template<typename T, std::size_t N>
317 make_array_ref(const std::array<T, N> & a) {
318  return array_ref<T>(a);
319 }
320 
322 
323 } // namespace util
324 } // namespace flecsi
constexpr array_ref()
Definition: array_ref.hh:97
const T * const_iterator
Definition: array_ref.hh:83
Definition: array_ref.hh:70
constexpr array_ref(const std::array< T, N > &a)
Definition: array_ref.hh:122
const_iterator iterator
Definition: array_ref.hh:86
void clear()
Definition: array_ref.hh:251
void remove_suffix(const size_type n)
Definition: array_ref.hh:267
constexpr array_ref substr(const size_type pos, const size_type n=size_type(-1)) const
Definition: array_ref.hh:128
void remove_prefix(const size_type n)
Definition: array_ref.hh:258
constexpr const T * data() const
Definition: array_ref.hh:207
array_ref(const std::vector< T, Allocator > &v)
Definition: array_ref.hh:109
void pop_back()
Definition: array_ref.hh:273
const T * pointer
Definition: array_ref.hh:78
void pop_front()
Definition: array_ref.hh:278
Definition: control.hh:31