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 >