LeechCraft  %{LEECHCRAFT_VERSION}
Modular cross-platform feature rich live environment.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
prelude.h
Go to the documentation of this file.
1 /**********************************************************************
2  * LeechCraft - modular cross-platform feature rich internet client.
3  * Copyright (C) 2006-2014 Georg Rudoy
4  *
5  * Boost Software License - Version 1.0 - August 17th, 2003
6  *
7  * Permission is hereby granted, free of charge, to any person or organization
8  * obtaining a copy of the software and accompanying documentation covered by
9  * this license (the "Software") to use, reproduce, display, distribute,
10  * execute, and transmit the Software, and to prepare derivative works of the
11  * Software, and to permit third-parties to whom the Software is furnished to
12  * do so, all subject to the following:
13  *
14  * The copyright notices in the Software and this entire statement, including
15  * the above license grant, this restriction and the following disclaimer,
16  * must be included in all copies of the Software, in whole or in part, and
17  * all derivative works of the Software, unless such copies or derivative
18  * works are solely in the form of machine-executable object code generated by
19  * a source language processor.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
24  * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
25  * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
26  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27  * DEALINGS IN THE SOFTWARE.
28  **********************************************************************/
29 
30 #pragma once
31 
32 #include <type_traits>
33 #include <iterator>
34 
35 namespace LeechCraft
36 {
37 namespace Util
38 {
39  template<typename T1, typename T2, template<typename U> class Container, typename F>
40  auto ZipWith (const Container<T1>& c1, const Container<T2>& c2, F f) -> Container<typename std::result_of<F (T1, T2)>::type>
41  {
42  Container<typename std::result_of<F (T1, T2)>::type> result;
43 
44  auto i1 = std::begin (c1), e1 = std::end (c1);
45  auto i2 = std::begin (c2), e2 = std::end (c2);
46  for ( ; i1 != e1 && i2 != e2; ++i1, ++i2)
47  result.push_back (f (*i1, *i2));
48  return result;
49  }
50 
51  template<typename T1, typename T2,
52  template<typename U> class Container,
53  template<typename U1, typename U2> class Pair = QPair>
54  auto Zip (const Container<T1>& c1, const Container<T2>& c2) -> Container<Pair<T1, T2>>
55  {
56  return ZipWith (c1, c2,
57  [] (const T1& t1, const T2& t2) -> Pair<T1, T2>
58  { return { t1, t2}; });
59  }
60 
61  template<typename T, template<typename U> class Container, typename F>
62  auto Map (const Container<T>& c, F f) -> Container<decltype (f (T ()))>
63  {
64  Container<decltype (f (T ()))> result;
65  for (auto t : c)
66  result.push_back (f (t));
67  return result;
68  }
69 }
70 }
71 
auto ZipWith(const Container< T1 > &c1, const Container< T2 > &c2, F f) -> Container< typename std::result_of< F(T1, T2)>::type >
Definition: prelude.h:40
auto Zip(const Container< T1 > &c1, const Container< T2 > &c2) -> Container< Pair< T1, T2 >>
Definition: prelude.h:54
auto Map(const Container< T > &c, F f) -> Container< decltype(f(T()))>
Definition: prelude.h:62