8 #ifndef SIG_UTILCONTAINER_TRAITS_H
9 #define SIG_UTILCONTAINER_TRAITS_H
22 #if SIG_ENABLE_MOVEITERATOR
24 class RC =
typename impl::remove_const_reference<C>::type,
25 typename std::enable_if<std::is_same<C, RC>::value>::type *& =
enabler,
26 typename std::enable_if<!std::is_same<typename RC::iterator, typename RC::const_iterator>::value>::type*& = enabler
28 auto begin(C&& c) ->std::move_iterator<
typename RC::iterator>
35 typename std::enable_if<(!std::is_same<C, RC>::value) || (std::is_same<typename RC::iterator, typename RC::const_iterator>::value)>::type *& = enabler
44 typename std::enable_if<std::is_same<C, RC>::value>::type *& =
enabler,
45 typename std::enable_if<!std::is_same<typename RC::iterator, typename RC::const_iterator>::value>::type*& = enabler
47 auto end(C&& c) ->std::move_iterator<
typename RC::iterator>
49 return std::make_move_iterator(
std::end(c));
54 typename std::enable_if<(!std::is_same<C, RC>::value) || (std::is_same<typename RC::iterator, typename RC::const_iterator>::value)>::type *& = enabler
75 #if SIG_MSVC_ENV || (SIG_GCC_ENV && SIG_GCC_GT5_0_0) || (SIG_CLANG_ENV)
77 class RC =
typename impl::remove_const_reference<C>::type,
78 typename std::enable_if<std::is_same<C, RC>::value>::type *& =
enabler,
79 typename std::enable_if<!std::is_same<typename RC::reverse_iterator, typename RC::const_reverse_iterator>::value>::type*& = enabler
81 auto rbegin(C&& c) ->std::move_iterator<
typename RC::reverse_iterator>
88 typename std::enable_if<(!std::is_same<C, RC>::value) || (std::is_same<typename RC::reverse_iterator, typename RC::const_reverse_iterator>::value)>::type *& = enabler
98 typename std::enable_if<std::is_same<C, RC>::value>::type *& =
enabler,
99 typename std::enable_if<!std::is_same<typename RC::reverse_iterator, typename RC::const_reverse_iterator>::value>::type*& = enabler
101 auto rend(C&& c) ->std::move_iterator<
typename RC::reverse_iterator>
103 return std::make_move_iterator(
std::rend(c));
108 typename std::enable_if<(!std::is_same<C, RC>::value) || (std::is_same<typename RC::reverse_iterator, typename RC::const_reverse_iterator>::value)>::type *& = enabler
122 template<
class It,
class... Its>
132 template <class C, typename std::enable_if<container_traits<typename remove_const_reference<C>::type>::exist>::type*& = enabler>
136 using R1 =
typename std::remove_reference<C>::type;
137 using RR =
typename std::remove_const<R1>::type;
140 using CT =
typename std::conditional<
141 std::is_const<R1>::value,
142 typename std::add_const<ET>::type,
146 using CRT =
typename std::conditional<
147 std::is_lvalue_reference<C>::value,
148 typename std::add_lvalue_reference<CT>::type,
149 typename std::add_rvalue_reference<CT>::type
171 return *std::forward<It>(iter);
177 template <
class C,
class F,
class... Its>
186 template <
class T,
class F1,
class F2,
class... Its>
196 template <
class F,
class... Its>
203 template <
class F,
class... Its>
231 template <class C, class F, typename std::enable_if<impl::sequence_container_traits<C>::exist>::type*& = enabler>
237 template <class C, class F, typename std::enable_if<impl::associative_container_traits<C>::exist>::type*& = enabler>
238 void erase_if(C& container, F
const& remove_pred)
241 if (remove_pred(*it)){
242 it = container.erase(it);
248 template <class C, class F, typename std::enable_if<impl::hash_container_traits<C>::exist>::type*& = enabler>
249 void erase_if(C& container, F
const& remove_pred)
252 if (remove_pred(*it)){
253 it = container.erase(it);
268 template <
class RC,
class C>
void increment_iterator(It &&iter)
typename std::remove_const< typename std::remove_reference< T >::type >::type type
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
auto rend(C &&c) -> decltype(std::rend(c))
auto rbegin(C &&c) -> std::move_iterator< typename RC::reverse_iterator >
auto end(C &&c) -> decltype(std::end(c))
void iterative_assign(uint loop, F &&func, Its...iterators)
auto rbegin(C &&c) -> decltype(std::rbegin(c))
auto rend(C &&c) -> std::move_iterator< typename RC::reverse_iterator >
sequence_container_traits
auto zip(Cs &&...lists)
複数のコンテナから、タプルのコンテナを作る
auto dereference_iterator(It &&iter) -> decltype(*std::forward< It >(iter))
void erase(C &container, typename impl::sequence_container_traits< C >::value_type const &t)
auto eval(F &&f, Args &&...args) -> decltype(f(std::forward< Args >(args)...))
auto begin(C &&c) -> decltype(std::begin(c))
void erase_if(C &container, F const &remove_pred)
void iterative_fold(uint loop, T &dest, F1 &&zip, F2 &&fold, Its...iterators)
associative_container_traits
auto copy(C &&src) -> RC
別の種類のコンテナに要素をコピーする
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >
void iterative_make(uint loop, C &dest, F &&func, Its...iterators)