8 #ifndef SIG_UTIL_ARRAY_HPP
9 #define SIG_UTIL_ARRAY_HPP
13 #include <initializer_list>
26 template <
class T,
size_t N>
35 using iterator =
typename std::array<T, N>::iterator;
42 using result_type =
typename boost::call_traits<T>::value_type;
43 using param_type =
typename boost::call_traits<T>::param_type;
46 using param_type =
typename std::conditional<std::is_class<T>::value, T
const&, T>::type;
50 std::array<T, N> array_;
54 template <
class OP,
class C1,
class C2>
55 void compound_assignment_(OP
const& assign_op, C1& dest, C2
const& src)
60 while (it1 != end1 && it2 != end2){
61 assign_op(*it1, *it2);
70 throw std::out_of_range(
"invalid sig::array<T, N> subscript");
78 for (
auto pit = it; it.base() != pos; pit = it++){
79 *pit = std::move(*it);
88 for (
auto pit = pos,
end = this->
end(); pos !=
end; pit = pos++){
89 *pit = std::move(*pos);
113 array(std::initializer_list<T> init) : tail_(0)
115 assert(init.size() <= N);
116 for(
auto it = init.begin(),
end = init.end(); it !=
end; ++it){
117 array_[tail_] = std::move(*it);
126 template <
size_type M>
127 explicit array(std::array<T,M>
const& src) : tail_(0)
129 static_assert(M <= N,
"M must be less than N");
130 compound_assignment_([
this](T& dest, ParamType<T> src){ dest = src; ++tail_; }, array_, src);
137 template <
size_type M>
140 static_assert(M <= N,
"M must be less than N");
141 compound_assignment_([
this](T& dest, ParamType<T> src){ dest = src; }, array_, src.std_array());
150 compound_assignment_([
this](T& dest, ParamType<T> src){ dest = src; }, array_, src.array_);
161 for (
auto it = src.begin(),
end = src.end(); it !=
end; ++it){
162 array_[tail_] = std::move(*it);
176 auto tmp =
array(src);
202 template <
size_type M>
205 static_assert(M <= N,
"M must be less than N");
217 template <
size_type M>
220 static_assert(M <= N,
"M must be less than N");
228 if (tail_ != obj.tail_)
return false;
230 for (
size_type i = 0; i < tail_; ++i) same = same && (array_[i] == obj.array_[i]);
236 return !(*
this == obj);
316 bool empty() const noexcept{
return tail_ == 0; }
359 std::swap(array_, other.array_);
360 std::swap(tail_, other.tail_);
373 if (tail_ >= N)
throw std::length_error(
"this container reached upper maxsize limit. so, can't hold more elements.");
374 array_[tail_++] = val;
378 if (tail_ >= N)
throw std::length_error(
"this container reached upper maxsize limit. so, can't hold more elements.");
379 array_[tail_++] = std::forward<value_type>(val);
398 if (tail_ >= N)
throw std::length_error(
"this container reached upper maxsize limit. so, can't hold more elements.");
400 auto p = back_shift_(position);
406 if (tail_ >= N)
throw std::length_error(
"this container reached upper maxsize limit. so, can't hold more elements.");
408 auto p = back_shift_(position);
423 auto p = front_shift_(position);
void push_back(value_type &&val)
size_type max_size() const noexcept
コンテナの最大容量を返す
array(std::initializer_list< T > init)
initializer_list から値をムーブしてコンストラクト
const_reference front() const
size_type size() const noexcept
コンテナに格納された要素数を返す
array & operator=(array const &src)
コピー代入演算子
reference front()
先頭要素へのアクセス
auto std_array() const noexcept-> std::array< T, N > const &
void fill(value_type const &val)
コンテナの全要素(最大容量まで)を指定した値でコピーする
void pop_back() noexcept
コンテナの末尾から要素を取り除く
array(size_type size, T val)
値をコピーしてコンストラクト
typename std::array< T, N >::iterator iterator
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
typename std::array< T, N >::difference_type difference_type
typename std::array< T, N >::const_iterator const_iterator
const_iterator cend() const noexcept
array(std::array< T, M > const &src)
std::array から値をコピーしてコンストラクト
const_reverse_iterator rend() const noexcept
typename std::array< T, N >::reverse_iterator reverse_iterator
array & operator=(array &&src)
ムーブ代入演算子
array(array const &src)
コピーコンストラクタ
void push_back(value_type const &val)
コンテナの末尾に指定した値を追加する
const_iterator end() const noexcept
T const & const_reference
typename std::array< T, N >::const_reverse_iterator const_reverse_iterator
typename boost::call_traits< T >::value_type result_type
reference at(size_type pos)
添字による要素へのアクセス
const_reverse_iterator rbegin() const noexcept
array & operator=(sig::array< T, M > const &src)
sig::array(サイズが異なる)から値をコピーして代入
array(sig::array< T, M > const &src)
sig::array(サイズが異なる)から値をコピーしてコンストラクト
const_reverse_iterator crend() const noexcept
reference operator[](size_type pos)
添字による要素へのアクセス
iterator insert(const_iterator position, value_type &&val)
void clear() noexcept
コンテナを空にする
auto std_array() noexcept-> std::array< T, N > &
内部で保有するstd::arrayへの参照を返す
iterator end() noexcept
末尾要素の後ろを指すイテレータを返す
const_iterator begin() const noexcept
typename boost::call_traits< T >::param_type param_type
iterator insert(const_iterator position, const value_type &val)
指定位置の後ろに指定した値を挿入する
const_reverse_iterator crbegin() const noexcept
const_iterator cbegin() const noexcept
void swap(array &other)
他の最大容量が同じsig::arrayと保持メンバを入れ替える
iterator begin() noexcept
先頭要素を指すイテレータを返す
value_type * data() noexcept
内部で保有する生配列へのポインタを返す
reference back()
末尾要素へのアクセス
array & operator=(std::array< T, M > const &src)
std::array から値をコピーして代入
bool empty() const noexcept
コンテナが空であるかを確認
reverse_iterator rend() noexcept
先頭要素の前を指す逆イテレータを返す
iterator erase(iterator position)
指定位置の要素を取り除く
const_reference back() const
bool operator!=(array const &obj)
非等値比較演算子
value_type const * data() const noexcept
const_reference at(size_type pos) const
reverse_iterator rbegin() noexcept
末尾要素を指す逆イテレータを返す
bool operator==(array const &obj)
等値比較演算子
auto copy(C &&src) -> RC
別の種類のコンテナに要素をコピーする
array(array &&src)
ムーブコンストラクタ
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >