3 #include "DM/config.hpp"
4 #include "DM/AutoLink.hpp"
55 template<
class T, std::
size_t N>
66 typedef const T* const_iterator;
68 typedef const T& const_reference;
69 typedef std::size_t size_type;
70 typedef std::ptrdiff_t difference_type;
71 typedef std::reverse_iterator<iterator> reverse_iterator;
72 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
73 enum { static_size = N };
79 template <
typename T2>
82 ::std::copy(other.begin(),other.end(), begin());
86 template <
typename T2>
89 std::copy(other,&other[N], begin());
95 { std::fill_n(begin(),size(),val); }
99 { std::swap_ranges(begin(),end(),other.begin()); }
105 iterator begin() {
return elems; }
106 const_iterator begin()
const {
return elems; }
107 iterator end() {
return elems+N; }
108 const_iterator end()
const {
return elems+N; }
110 reverse_iterator rbegin() {
return reverse_iterator(end()); }
111 const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
112 reverse_iterator rend() {
return reverse_iterator(begin()); }
113 const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
119 reference operator[](size_type i) { rangecheck(i);
return elems[i]; }
120 const_reference operator[](size_type i)
const { rangecheck(i);
return elems[i]; }
121 reference at(size_type i) { rangecheck(i);
return elems[i]; }
122 const_reference at(size_type i)
const { rangecheck(i);
return elems[i]; }
128 reference front() {
return elems[0]; }
129 const_reference front()
const {
return elems[0]; }
130 reference back() {
return elems[N-1]; }
131 const_reference back()
const {
return elems[N-1]; }
136 const T* data()
const {
return elems; }
137 T* data() {
return elems; }
138 T* c_array() {
return elems; }
143 static size_type size() {
return N; }
144 static bool empty() {
return false; }
145 static size_type max_size() {
return N; }
149 static void rangecheck (size_type i)
152 throw std::out_of_range(
"Array<>: index out of range");
160 template<
class U>
struct Must_not_instantiate_an_empty_opals_Array;
161 typedef typename Must_not_instantiate_an_empty_opals_Array<T>::Type CompilationError;
165 template<
class T, std::
size_t N>
167 return std::equal(l.begin(), l.end(), r.begin());
171 template<
class T, std::
size_t N>
172 bool operator< (
const Array<T,N>& l,
const Array<T,N>& r) {
173 return std::lexicographical_compare(l.begin(),l.end(),r.begin(),r.end());
177 template<
class T, std::
size_t N>
178 bool operator!= (
const Array<T,N>& l,
const Array<T,N>& r) {
183 template<
class T, std::
size_t N>
184 bool operator> (
const Array<T,N>& l,
const Array<T,N>& r) {
189 template<
class T, std::
size_t N>
190 bool operator<= (
const Array<T,N>& l,
const Array<T,N>& r) {
195 template<
class T, std::
size_t N>
196 bool operator>= (
const Array<T,N>& l,
const Array<T,N>& r) {
201 template<
class T, std::
size_t N>
202 void swap (Array<T,N>& l, Array<T,N>& r) {