@@ -25,54 +25,55 @@ namespace linq {
25
25
// group_by
26
26
//
27
27
namespace detail {
28
- struct group_by_t
28
+
29
+ template <class KeySelector , class ElementSelector >
30
+ struct group_by_map_selector
29
31
{
30
- template <class KeySelector , class ElementSelector >
31
- struct map_selector
32
+ KeySelector key_selector;
33
+ ElementSelector element_selector;
34
+
35
+ group_by_map_selector (KeySelector key_selector, ElementSelector element_selector)
36
+ : key_selector(key_selector), element_selector(element_selector)
37
+ {}
38
+
39
+ template <class >
40
+ struct result ;
41
+
42
+ template <class F , class T >
43
+ struct result <F(T)>
32
44
{
33
- KeySelector key_selector;
34
- ElementSelector element_selector;
35
-
36
- map_selector (KeySelector key_selector, ElementSelector element_selector)
37
- : key_selector(key_selector), element_selector(element_selector)
38
- {}
39
-
40
- template <class >
41
- struct result ;
42
-
43
- template <class F , class T >
44
- struct result <F(T)>
45
- {
46
- typedef std::pair<typename linq::result_of<KeySelector(T)>::type, typename linq::result_of<ElementSelector(T)>::type > type;
47
- };
48
-
49
- template <class F , class T >
50
- struct result <F(T&&)>
51
- : result<F(T)>
52
- {};
53
-
54
- template <class T >
55
- typename result<map_selector(T&&)>::type operator ()(T && x) const
56
- {
57
- return typename result_of<map_selector (T&&)>::type (key_selector (x), element_selector (x));
58
- }
45
+ typedef std::pair<typename linq::result_of<KeySelector(T)>::type, typename linq::result_of<ElementSelector(T)>::type > type;
59
46
};
60
47
61
- template <class KeySelector , class ElementSelector >
62
- static map_selector < KeySelector, ElementSelector >
63
- make_map_selector (KeySelector && key_selector, ElementSelector && element_selector)
48
+ template <class F , class T >
49
+ struct result <F(T&&)>
50
+ : result<F(T)>
51
+ {};
52
+
53
+ template <class T >
54
+ typename result<group_by_map_selector(T&&)>::type operator ()(T && x) const
64
55
{
65
- return map_selector < KeySelector, ElementSelector >
66
- (std::forward<KeySelector>(key_selector), std::forward<ElementSelector>(element_selector));
56
+ return typename result<group_by_map_selector (T&&)>::type (key_selector (x), element_selector (x));
67
57
}
58
+ };
68
59
60
+ template <class KeySelector , class ElementSelector >
61
+ group_by_map_selector < KeySelector, ElementSelector >
62
+ make_group_by_map_selector (KeySelector && key_selector, ElementSelector && element_selector)
63
+ {
64
+ return group_by_map_selector < KeySelector, ElementSelector >
65
+ (std::forward<KeySelector>(key_selector), std::forward<ElementSelector>(element_selector));
66
+ }
67
+
68
+ struct group_by_t
69
+ {
69
70
template <class >
70
71
struct result ;
71
72
72
73
template <class F , class Range , class KeySelector , class ElementSelector >
73
74
struct result <F(Range, KeySelector, ElementSelector)>
74
75
{
75
- typedef typename as_unordered_map<typename result_of<detail::select_t (Range, map_selector <KeySelector, ElementSelector>)>::type >::type type;
76
+ typedef typename as_unordered_map<typename result_of<detail::select_t (Range, group_by_map_selector <KeySelector, ElementSelector>)>::type >::type type;
76
77
};
77
78
78
79
template <class F , class Range , class KeySelector , class ElementSelector >
@@ -88,7 +89,7 @@ struct group_by_t
88
89
template <class Range , class KeySelector >
89
90
auto operator ()(Range && r, KeySelector ks) const LINQ_RETURNS
90
91
(
91
- make_map ( r | linq::select(make_map_selector (ks, identity_selector())) )
92
+ make_map ( r | linq::select(make_group_by_map_selector (ks, identity_selector())) )
92
93
);
93
94
94
95
// TODO: Custom comparer overloads can't be supported right now,
@@ -98,7 +99,7 @@ struct group_by_t
98
99
template <class Range , class KeySelector , class ElementSelector >
99
100
auto operator ()(Range && r, KeySelector ks, ElementSelector es) const LINQ_RETURNS
100
101
(
101
- make_map ( r | linq::select(make_map_selector (ks, es)) )
102
+ make_map ( r | linq::select(make_group_by_map_selector (ks, es)) )
102
103
);
103
104
104
105
};
0 commit comments