SigUtil  0.95
Utility modules for modern C++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
list_deal.hpp
Go to the documentation of this file.
1 /*
2 Copyright© 2014 Akihiro Nishimura
3 
4 This software is released under the MIT License.
5 http://opensource.org/licenses/mit-license.php
6 */
7 
8 #ifndef SIG_UTIL_LIST_DEAL_HPP
9 #define SIG_UTIL_LIST_DEAL_HPP
10 
11 #include "../helper/helper_modules.hpp"
12 #include "../helper/container_helper.hpp"
13 
15 
16 namespace sig
17 {
19 
32 template <class T, class C = std::vector<T>>
33 auto replicate(uint n, T const& value) ->C
34 {
35  C result = impl::container_traits<C>::make(n);
36 
37  for (uint i = 0; i<n; ++i) impl::container_traits<C>::add_element(result, value);
38 
39  return result;
40 }
41 
42 
44 
61 template <class C>
63 {
64  auto result = std::forward<C>(list);
65 
66  std::reverse(std::begin(result), std::end(result));
67 
68  return result;
69 }
70 
71 
73 
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
93 >
94 auto merge(C&& list1, C&& list2) ->R
95 {
96  const uint length = list1.size() + list2.size();
97  R result = impl::container_traits<R>::make(length);
98 
99  impl::container_traits<R>::concat(result, std::forward<C>(list1));
100  impl::container_traits<R>::concat(result, std::forward<C>(list2));
101 
102  return result;
103 }
104 
105 namespace impl
106 {
107 template <class R, class C1, class C2>
108 auto merge_impl(C1&& list1, C2&& list2) ->R
109 {
110  const uint length = list1.size() + list2.size();
111  R result = impl::container_traits<R>::make(length);
112 
113  for (auto it = impl::begin(std::forward<C1>(list1)), end = impl::end(std::forward<C1>(list1)); it != end; ++it){
115  }
116  for (auto it = impl::begin(std::forward<C2>(list2)), end = impl::end(std::forward<C2>(list2)); it != end; ++it){
118  }
119 
120  return result;
121 }
122 
123 } // impl
124 
125 // コンテナの結合(異なるコンテナ型)
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
154  >::type,
155  class RR = typename impl::SameIf<R, void,
156  typename impl::remove_const_reference< typename impl::container_traits<CR1>::template rebind<RT>>::type,
157  R
158  >::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
162 >
163 auto merge(C1&& list1, C2&& list2) ->RR
164 {
165  return impl::merge_impl<RR>(std::forward<C1>(list1), std::forward<C2>(list2));
166 }
167 
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
174  >::type,
175  class RR = typename impl::SameIf<R, void,
176  typename impl::remove_const_reference< typename impl::container_traits<CR>::template rebind<RT>>::type,
177  R
178  >::type,
179  typename std::enable_if<impl::static_container_traits<SCR>::exist && (!impl::static_container_traits<CR>::exist)>::type*& = enabler
180 >
181 auto merge(SC&& list1, C&& list2) ->RR
182 {
183  return impl::merge_impl<RR>(std::forward<SC>(list1), std::forward<C>(list2));
184 }
185 
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
192  >::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>,
195  R
196  >::type,
197  typename std::enable_if<impl::static_container_traits<SCR1>::exist && impl::static_container_traits<SCR2>::exist>::type*& = enabler
198 >
199 auto merge(SC1&& list1, SC2&& list2) ->RR
200 {
201  return impl::merge_impl<RR>(std::forward<SC1>(list1), std::forward<SC2>(list2));
202 }
203 
204 
206 
222 template <class C,
223  class CR = typename impl::remove_const_reference<C>::type
224 >
225 auto take(uint n, C&& list) ->CR
226 {
227  CR result = impl::container_traits<CR>::make(n);
228  uint i = 0;
229 
230  for (auto it = impl::begin(std::forward<C>(list)); i < n; ++i, ++it) impl::container_traits<CR>::add_element(result, *it);
231 
232  return result;
233 }
234 
235 
237 
253 template <class C,
254  class CR = typename impl::remove_const_reference<C>::type
255 >
256 auto drop(uint n, C&& list) ->CR
257 {
258  CR result = impl::container_traits<CR>::make(list.size() - n);
259  uint i = 0;
260  auto it = impl::begin(list), end = impl::end(list);
261 
262  for (; i < n && it != end; ++i, ++it) ;
263  for (; it != end; ++i, ++it) impl::container_traits<CR>::add_element(result, *it);
264 
265  return result;
266 }
267 
268 }
269 #endif
auto drop(uint n, C &&list) -> CR
コンテナの先頭からn個を削除したコンテナを返す
Definition: list_deal.hpp:256
typename std::remove_const< typename std::remove_reference< T >::type >::type type
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
void * enabler
auto reverse(C &&list) -> typename impl::remove_const_reference< C >::type
コンテナの要素の順番を逆転させたコンテナを返す
Definition: list_deal.hpp:62
auto take(uint n, C &&list) -> CR
コンテナの先頭からn個の要素を取り出す
Definition: list_deal.hpp:225
auto replicate(uint n, T const &value) -> C
値を複製したコンテナを返す
Definition: list_deal.hpp:33
auto merge_impl(C1 &&list1, C2 &&list2) -> R
Definition: list_deal.hpp:108
auto merge(C &&list1, C &&list2) -> R
コンテナの結合(同じコンテナ型)
Definition: list_deal.hpp:94
Definition: array.hpp:15
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >