8 #ifndef SIG_UTIL_LIST_DEAL_HPP
9 #define SIG_UTIL_LIST_DEAL_HPP
11 #include "../helper/helper_modules.hpp"
12 #include "../helper/container_helper.hpp"
32 template <
class T,
class C = std::vector<T>>
37 for (uint i = 0; i<n; ++i) impl::container_traits<C>::add_element(result, value);
64 auto result = std::forward<C>(list);
91 template <class C, class R = typename impl::remove_const_reference<C>::type,
92 typename std::enable_if<!impl::static_container_traits<R>::exist>::type*& =
enabler
94 auto merge(C&& list1, C&& list2) ->R
96 const uint length = list1.size() + list2.size();
107 template <
class R,
class C1,
class C2>
110 const uint length = list1.size() + list2.size();
148 template <
class R = void,
class C1,
class C2,
149 class CR1 =
typename impl::remove_const_reference<C1>::type,
150 class CR2 =
typename impl::remove_const_reference<C2>::type,
151 class RT =
typename std::common_type<
152 typename impl::container_traits<CR1>::value_type,
153 typename impl::container_traits<CR2>::value_type
155 class RR =
typename impl::SameIf<R, void,
156 typename impl::remove_const_reference< typename impl::container_traits<CR1>::template rebind<RT>>::type,
159 class AT1 =
typename impl::forward_element<C1>::type,
160 class AT2 =
typename impl::forward_element<C2>::type,
161 typename std::enable_if<!(impl::static_container_traits<CR1>::exist)>::type*& =
enabler
163 auto merge(C1&& list1, C2&& list2) ->RR
165 return impl::merge_impl<RR>(std::forward<C1>(list1), std::forward<C2>(list2));
168 template <
class R = void,
class SC,
class C,
169 class SCR =
typename impl::remove_const_reference<SC>::type,
170 class CR =
typename impl::remove_const_reference<C>::type,
171 class RT =
typename std::common_type<
172 typename impl::static_container_traits<SCR>::value_type,
173 typename impl::container_traits<CR>::value_type
175 class RR =
typename impl::SameIf<R, void,
176 typename impl::remove_const_reference< typename impl::container_traits<CR>::template rebind<RT>>::type,
179 typename std::enable_if<impl::static_container_traits<SCR>::exist && (!impl::static_container_traits<CR>::exist)>::type*& =
enabler
181 auto merge(SC&& list1, C&& list2) ->RR
183 return impl::merge_impl<RR>(std::forward<SC>(list1), std::forward<C>(list2));
186 template <
class R = void,
class SC1,
class SC2,
187 class SCR1 =
typename impl::remove_const_reference<SC1>::type,
188 class SCR2 =
typename impl::remove_const_reference<SC2>::type,
189 class RT =
typename std::common_type<
190 typename impl::static_container_traits<SCR1>::value_type,
191 typename impl::static_container_traits<SCR2>::value_type
193 class RR =
typename impl::SameIf<R, void,
194 typename impl::static_container_traits<SCR1>::template rebind_t<RT, impl::plus_t<impl::static_container_traits<SCR1>::size, impl::static_container_traits<SCR2>::size>::value>,
197 typename std::enable_if<impl::static_container_traits<SCR1>::exist && impl::static_container_traits<SCR2>::exist>::type*& =
enabler
199 auto merge(SC1&& list1, SC2&& list2) ->RR
201 return impl::merge_impl<RR>(std::forward<SC1>(list1), std::forward<SC2>(list2));
223 class CR =
typename impl::remove_const_reference<C>::type
225 auto take(uint n, C&& list) ->CR
230 for (
auto it =
impl::begin(std::forward<C>(list)); i < n; ++i, ++it) impl::container_traits<CR>::add_element(result, *it);
254 class CR =
typename impl::remove_const_reference<C>::type
256 auto drop(uint n, C&& list) ->CR
262 for (; i < n && it !=
end; ++i, ++it) ;
auto drop(uint n, C &&list) -> CR
コンテナの先頭からn個を削除したコンテナを返す
typename std::remove_const< typename std::remove_reference< T >::type >::type type
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
auto reverse(C &&list) -> typename impl::remove_const_reference< C >::type
コンテナの要素の順番を逆転させたコンテナを返す
auto take(uint n, C &&list) -> CR
コンテナの先頭からn個の要素を取り出す
auto replicate(uint n, T const &value) -> C
値を複製したコンテナを返す
auto merge_impl(C1 &&list1, C2 &&list2) -> R
auto merge(C &&list1, C &&list2) -> R
コンテナの結合(同じコンテナ型)
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >