1 #ifndef OPALS_ARRAY_HPP_INCLUDED
2 #define OPALS_ARRAY_HPP_INCLUDED
4 #include <opals/fwd.hpp>
54 template<
class T, std::
size_t N>
64 typedef const T* const_iterator;
66 typedef const T& const_reference;
67 typedef std::size_t size_type;
68 typedef std::ptrdiff_t difference_type;
69 typedef std::reverse_iterator<iterator> reverse_iterator;
70 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
71 enum { static_size = N };
76 template <
typename T2>
79 ::std::copy(other.begin(),other.end(), begin());
83 template <
typename T2>
86 std::copy(other,&other[N], begin());
92 { std::fill_n(begin(),size(),val); }
96 { std::swap_ranges(begin(),end(),other.begin()); }
102 iterator begin() {
return elems; }
103 const_iterator begin()
const {
return elems; }
104 iterator end() {
return elems+N; }
105 const_iterator end()
const {
return elems+N; }
107 reverse_iterator rbegin() {
return reverse_iterator(end()); }
108 const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
109 reverse_iterator rend() {
return reverse_iterator(begin()); }
110 const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
116 reference operator[](size_type i) { rangecheck(i);
return elems[i]; }
117 const_reference operator[](size_type i)
const { rangecheck(i);
return elems[i]; }
118 reference at(size_type i) { rangecheck(i);
return elems[i]; }
119 const_reference at(size_type i)
const { rangecheck(i);
return elems[i]; }
124 reference front() {
return elems[0]; }
125 const_reference front()
const {
return elems[0]; }
126 reference back() {
return elems[N-1]; }
127 const_reference back()
const {
return elems[N-1]; }
132 const T* data()
const {
return elems; }
133 T* data() {
return elems; }
134 T* c_array() {
return elems; }
139 static size_type size() {
return N; }
140 static bool empty() {
return false; }
141 static size_type max_size() {
return N; }
145 static void rangecheck (size_type i)
148 throw std::out_of_range(
"Array<>: index out of range");
156 template<
class U>
struct Must_not_instantiate_an_empty_opals_Array;
157 typedef typename Must_not_instantiate_an_empty_opals_Array<T>::Type CompilationError;
161 template<
class T, std::
size_t N>
163 return std::equal(l.begin(), l.end(), r.begin());
167 template<
class T, std::
size_t N>
169 return std::lexicographical_compare(l.begin(),l.end(),r.begin(),r.end());
173 template<
class T, std::
size_t N>
179 template<
class T, std::
size_t N>
185 template<
class T, std::
size_t N>
191 template<
class T, std::
size_t N>
197 template<
class T, std::
size_t N>