32 #ifndef VSMC_UTILITY_ARRAY_HPP
33 #define VSMC_UTILITY_ARRAY_HPP
39 #pragma warning(disable:4351)
42 #define VSMC_STATIC_ASSERT_UTILITY_ARRAY_RANGE(Pos, N) \
43 VSMC_STATIC_ASSERT((Pos < N), USE_Array_WITH_AN_INDEX_OUT_OF_RANGE)
45 #define VSMC_RUNTIME_ASSERT_UTILITY_ARRAY_RANGE(i, N) \
46 VSMC_RUNTIME_ASSERT((i < N), ("**Array** USED WITH AN INDEX OUT OF RANGE"))
78 template <
typename T, std::
size_t N>
95 template <
typename Archive>
96 void serialize (Archive &ar,
const unsigned) {ar & data_;}
98 template <
typename Archive>
99 void serialize (Archive &ar,
const unsigned)
const {ar & data_;}
101 reference
at (size_type pos)
108 const_reference
at (size_type pos)
const
117 const_reference
operator[] (size_type pos)
const {
return data_[pos];}
119 reference
front () {
return at<0>();}
121 const_reference
front ()
const {
return at<0>();}
125 const_reference
back ()
const {
return at<N - 1>();}
127 pointer
data () {
return data_;}
129 const_pointer
data ()
const {
return data_;}
133 iterator
end () {
return data_ + N;}
135 const_iterator
begin ()
const {
return data_;}
137 const_iterator
end ()
const {
return data_ + N;}
139 const_iterator
cbegin ()
const {
return data_;}
141 const_iterator
cend ()
const {
return data_ + N;}
150 const_reverse_iterator
rend ()
const
156 const_reverse_iterator
crend ()
const
164 {
return static_cast<size_type
>(~static_cast<size_type>(0)) /
sizeof(T);}
176 for (size_type i = 0; i != N; ++i)
177 swap(data_[i], other.data_[i]);
183 for (size_type i = 0; i != N; ++i)
184 if (ary1[i] != ary2[i])
192 {
return !(ary1 == ary2);}
197 for (size_type i = 0; i != N; ++i) {
198 if (ary1[i] < ary2[i])
200 if (ary2[i] < ary1[i])
210 for (size_type i = 0; i != N; ++i) {
211 if (ary1[i] > ary2[i])
213 if (ary2[i] > ary1[i])
222 {
return !(ary1 > ary2);}
226 {
return !(ary1 < ary2);}
228 template <
typename CharT,
typename Traits>
229 friend inline std::basic_ostream<CharT, Traits> &
operator<< (
230 std::basic_ostream<CharT, Traits> &os,
const Array<T, N> &ary)
235 for (size_type i = 0; i < N - 1; ++i)
242 template <
typename CharT,
typename Traits>
243 friend inline std::basic_istream<CharT, Traits> &
operator>> (
244 std::basic_istream<CharT, Traits> &is,
Array<T, N> &ary)
250 for (size_type i = 0; i != N; ++i)
251 is >> std::ws >> ary_tmp[i];
254 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
264 template <
size_type Pos>
271 template <
size_type Pos>
272 const_reference
at ()
const
278 template <
size_type Pos>
285 template <
size_type Pos>
292 template <
size_type Pos>
295 template <
size_type Pos>
311 {
for (size_type i = 0; i != N; ++i) data_[i] = value;}
316 template <
typename T, std::
size_t N>
321 template <std::
size_t I,
typename T, std::
size_t N>
326 template <std::
size_t I,
typename T, std::
size_t N>
327 inline const T &
get (
const Array<T, N> &ary) {
return ary.template at<I>();}
329 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
330 template <std::
size_t I,
typename T, std::
size_t N>
340 template <
typename T, std::
size_t N>
348 template <std::
size_t I,
typename T, std::
size_t N>
357 #endif // VSMC_UTILITY_ARRAY_HPP
reverse_iterator rbegin()
const_reference at() const
const_pointer data() const
friend bool operator<(const Array< T, N > &ary1, const Array< T, N > &ary2)
const value_type * const_pointer
void serialize(Archive &ar, const unsigned)
std::ptrdiff_t difference_type
#define VSMC_CONSTEXPR
constexpr
const_reverse_iterator crbegin() const
const_pointer const_iterator
const_reverse_iterator rend() const
friend std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > &is, Array< T, N > &ary)
void swap(Array< T, N > &other)
friend bool operator==(const Array< T, N > &ary1, const Array< T, N > &ary2)
reference operator[](size_type pos)
const_iterator begin() const
reference at(Position< Pos >)
static constexpr size_type max_size()
integral_constant< bool, false > false_type
void serialize(Archive &ar, const unsigned) const
Function template argument used for position.
void * memset(void *dst, int ch, std::size_t n)
SIMD optimized memset with non-temporal store for large buffers.
friend bool operator>=(const Array< T, N > &ary1, const Array< T, N > &ary2)
friend bool operator!=(const Array< T, N > &ary1, const Array< T, N > &ary2)
#define VSMC_STATIC_ASSERT_UTILITY_ARRAY_RANGE(Pos, N)
static constexpr bool empty()
const_reference back() const
const_iterator cend() const
remove_reference< T >::type && move(T &&t) noexcept
const_reference at(size_type pos) const
const_reverse_iterator rbegin() const
friend bool operator>(const Array< T, N > &ary1, const Array< T, N > &ary2)
const_reference at(Position< Pos >) const
void swap(Array< T, N > &ary1, Array< T, N > &ary2)
Array ADL of swap.
const_reference front() const
friend bool operator<=(const Array< T, N > &ary1, const Array< T, N > &ary2)
std::reverse_iterator< iterator > reverse_iterator
#define VSMC_RUNTIME_ASSERT_UTILITY_ARRAY_RANGE(i, N)
const_reverse_iterator crend() const
std::reverse_iterator< const_iterator > const_reverse_iterator
void fill(const T &value)
const_iterator cbegin() const
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Array< T, N > &ary)
reference at(size_type pos)
const value_type & const_reference
static constexpr size_type size()
const_iterator end() const