1 #ifndef DM_ARRAY_HPP_INCLUDED
2 #define DM_ARRAY_HPP_INCLUDED
6 #include "DM/config.hpp"
7 #include "DM/AutoLink.hpp"
58 template<
class T, std::
size_t N>
69 typedef const T* const_iterator;
71 typedef const T& const_reference;
72 typedef std::size_t size_type;
73 typedef std::ptrdiff_t difference_type;
74 typedef std::reverse_iterator<iterator> reverse_iterator;
75 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
76 enum { static_size = N };
82 template <
typename T2>
85 ::std::copy(other.begin(),other.end(), begin());
89 template <
typename T2>
92 std::copy(other,&other[N], begin());
97 void assign(
const T &val)
98 { std::fill_n(begin(),size(),val); }
102 { std::swap_ranges(begin(),end(),other.begin()); }
108 iterator begin() {
return elems; }
109 const_iterator begin()
const {
return elems; }
110 iterator end() {
return elems+N; }
111 const_iterator end()
const {
return elems+N; }
113 reverse_iterator rbegin() {
return reverse_iterator(end()); }
114 const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
115 reverse_iterator rend() {
return reverse_iterator(begin()); }
116 const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
122 reference operator[](size_type i) { rangecheck(i);
return elems[i]; }
123 const_reference operator[](size_type i)
const { rangecheck(i);
return elems[i]; }
124 reference at(size_type i) { rangecheck(i);
return elems[i]; }
125 const_reference at(size_type i)
const { rangecheck(i);
return elems[i]; }
131 reference front() {
return elems[0]; }
132 const_reference front()
const {
return elems[0]; }
133 reference back() {
return elems[N-1]; }
134 const_reference back()
const {
return elems[N-1]; }
139 const T* data()
const {
return elems; }
140 T* data() {
return elems; }
141 T* c_array() {
return elems; }
146 static size_type size() {
return N; }
147 static bool empty() {
return false; }
148 static size_type max_size() {
return N; }
152 static void rangecheck (size_type i)
155 throw std::out_of_range(
"Array<>: index out of range");
163 template<
class U>
struct Must_not_instantiate_an_empty_opals_Array;
164 typedef typename Must_not_instantiate_an_empty_opals_Array<T>::Type CompilationError;
168 template<
class T, std::
size_t N>
170 return std::equal(l.begin(), l.end(), r.begin());
174 template<
class T, std::
size_t N>
176 return std::lexicographical_compare(l.begin(),l.end(),r.begin(),r.end());
180 template<
class T, std::
size_t N>
186 template<
class T, std::
size_t N>
192 template<
class T, std::
size_t N>
198 template<
class T, std::
size_t N>
204 template<
class T, std::
size_t N>
212 #endif //DM_ARRAY_HPP_INCLUDED