32 #include <type_traits>
35 #include <QStringList>
36 #include <boost/optional.hpp>
43 template<
typename T1,
typename T2,
template<
typename U>
class Container,
typename F>
44 auto ZipWith (
const Container<T1>& c1,
const Container<T2>& c2, F f) -> Container<typename std::result_of<F (T1, T2)>::type>
46 Container<typename std::result_of<F (T1, T2)>::type> result;
51 auto i1 = begin (c1), e1 = end (c1);
52 auto i2 = begin (c2), e2 = end (c2);
53 for ( ; i1 != e1 && i2 != e2; ++i1, ++i2)
54 result.push_back (f (*i1, *i2));
58 template<
typename T1,
typename T2,
59 template<
typename U>
class Container,
60 template<
typename U1,
typename U2>
class Pair = QPair>
61 auto Zip (
const Container<T1>& c1,
const Container<T2>& c2) -> Container<Pair<T1, T2>>
64 [] (
const T1& t1,
const T2& t2) -> Pair<T1, T2>
65 {
return { t1, t2}; });
85 template<
typename Res,
typename T>
86 void Append (Res& result, T&& val, decltype (result.push_back (std::forward<T> (val)))* =
nullptr)
88 result.push_back (std::forward<T> (val));
91 template<
typename Res,
typename T>
92 void Append (Res& result, T&& val, decltype (result.insert (std::forward<T> (val)))* =
nullptr)
94 result.insert (std::forward<T> (val));
97 template<
typename T,
typename F>
103 template<
typename T,
typename F>
109 template<
typename T,
typename F>
112 return IsInvokableWithConstImpl<typename std::decay<T>::type, F> (0);
116 template<
typename T,
template<
typename U>
class Container,
typename F>
117 auto Map (
const Container<T>& c, F f) ->
typename std::enable_if<!std::is_same<void, decltype (Invoke (f, std::declval<T> ()))>::value,
118 WrapType_t<Container<
typename std::decay<decltype (
Invoke (f, std::declval<T> ()))>::type>>>::type
120 Container<typename std::decay<decltype (Invoke (f, std::declval<T> ()))>::type> result;
126 template<
template<
typename...>
class Container,
typename F,
template<
typename>
class ResultCont =
QList,
typename... ContArgs>
127 auto Map (
const Container<ContArgs...>& c, F f) ->
typename std::enable_if<!std::is_same<void, decltype (
Invoke (f, *c.begin ()))>::value,
128 WrapType_t<ResultCont<
typename std::decay<decltype (
Invoke (f, *c.begin ()))>::type>>>::type
130 ResultCont<
typename std::decay<decltype (
Invoke (f, *c.begin ()))>::type> cont;
136 template<
template<
typename...>
class Container,
typename F,
typename... ContArgs>
137 auto Map (Container<ContArgs...>& c, F f) ->
typename std::enable_if<std::is_same<void, decltype (
Invoke (f, *c.begin ()))>::value>::type
143 template<
template<
typename...>
class Container,
typename F,
typename... ContArgs>
144 auto Map (
const Container<ContArgs...>& c, F f) ->
typename std::enable_if<std::is_same<void, decltype (
Invoke (f, *c.begin ()))>::value>::type
156 result.push_back (
Invoke (f, t));
161 template<
typename T,
template<
typename U>
class Container,
typename F>
162 auto Map (
const Container<T>& c, F f) ->
typename std::enable_if<std::is_same<void, decltype (Invoke (f, std::declval<T> ()))>::value,
void>::type
168 template<
typename T,
template<
typename U>
class Container,
typename F>
169 auto Filter (
const Container<T>& c, F f) -> Container<T>
172 std::copy_if (c.begin (), c.end (), std::back_inserter (result), f);
176 template<
template<
typename>
class Container,
typename T>
177 Container<T>
Concat (
const Container<Container<T>>& containers)
180 for (
const auto& cont : containers)
181 std::copy (cont.begin (), cont.end (), std::back_inserter (result));
185 template<
template<
typename...>
class Container,
typename... ContArgs>
186 auto Concat (
const Container<ContArgs...>& containers) ->
typename std::decay<decltype (*containers.begin ())>::type
188 typename std::decay<decltype (*containers.begin ())>::type result;
189 for (
const auto& cont : containers)
190 std::copy (cont.begin (), cont.end (), std::back_inserter (result));
194 template<
template<
typename>
class Container,
typename T>
195 Container<Container<T>>
SplitInto (
size_t numChunks,
const Container<T>& container)
197 Container<Container<T>> result;
199 const size_t chunkSize = container.size () / numChunks;
200 for (
size_t i = 0; i < numChunks; ++i)
202 Container<T> subcont;
203 const auto start = container.begin () + chunkSize * i;
204 const auto end = start + chunkSize;
205 std::copy (start, end, std::back_inserter (subcont));
206 result.push_back (subcont);
209 const auto lastStart = container.begin () + chunkSize * numChunks;
210 const auto lastEnd = container.end ();
211 std::copy (lastStart, lastEnd, std::back_inserter (result.front ()));
216 template<
template<
typename Pair,
typename... Rest>
class Cont, template<typename K, typename V> class Pair, typename K, typename V, typename KV, typename... Rest>
217 boost::optional<V>
Lookup (const KV& key, const Cont<Pair<K, V>, Rest...>& cont)
219 for (
const auto& pair : cont)
220 if (pair.first == key)
230 return [r] (
const auto& left,
const auto& right) {
return r (left) < r (right); };
233 auto Apply = [] (
const auto& t) {
return t (); };
245 return R_ (left) <
R_ (right);
259 typename std::result_of<T ()>::type operator() (
const T& t)
const
auto ZipWith(const Container< T1 > &c1, const Container< T2 > &c2, F f) -> Container< typename std::result_of< F(T1, T2)>::type >
auto Zip(const Container< T1 > &c1, const Container< T2 > &c2) -> Container< Pair< T1, T2 >>
boost::optional< V > Lookup(const KV &key, const Cont< Pair< K, V >, Rest...> &cont)
auto Filter(const Container< T > &c, F f) -> Container< T >
Container< T > Concat(const Container< Container< T >> &containers)
auto Map(const Container< T > &c, F f) -> typename std::enable_if<!std::is_same< void, decltype(Invoke(f, std::declval< T >()))>::value, WrapType_t< Container< typename std::decay< decltype(Invoke(f, std::declval< T >()))>::type >>>::type
detail::ComparingByClosure< R > ComparingBy(R r)
bool operator()(const T &left, const T &right) const
constexpr bool IsInvokableWithConstImpl(typename std::result_of< F(const T &)>::type *)
void Append(Res &result, T &&val, decltype(result.push_back(std::forward< T >(val)))*=nullptr)
struct LeechCraft::Util::@0 Apply
auto Invoke(F &&f, Args &&...args) -> decltype(std::forward< F >(f)(std::forward< Args >(args)...))
typename WrapType< T >::type WrapType_t
constexpr bool IsInvokableWithConst()
Container< Container< T > > SplitInto(size_t numChunks, const Container< T > &container)