MPL11
 All Classes Namespaces Files Typedefs Macros Groups Pages
orderable.hpp
Go to the documentation of this file.
1 
12 #ifndef BOOST_MPL11_ORDERABLE_HPP
13 #define BOOST_MPL11_ORDERABLE_HPP
14 
16 
17 #include <boost/mpl11/fwd/bool.hpp>
18 #include <boost/mpl11/fwd/core.hpp>
20 
21 
22 namespace boost { namespace mpl11 {
23  template <>
24  struct instantiate<Orderable> {
25  template <typename Left, typename Right = Left>
26  struct with : true_ {
27  template <typename x, typename y>
28  using less_equal_impl = not_<less<box<y>, box<x>>>;
29 
30  template <typename x, typename y>
31  using greater_impl = less<box<y>, box<x>>;
32 
33  template <typename x, typename y>
34  using greater_equal_impl = not_<less<box<x>, box<y>>>;
35 
36  template <typename x, typename y>
37  using min_impl = if_c<less<box<x>, box<y>>::value, box<x>, box<y>>;
38 
39  template <typename x, typename y>
40  using max_impl = if_c<less<box<x>, box<y>>::value, box<y>, box<x>>;
41  };
42  };
43 }} // end namespace boost::mpl11
44 
45 
46 #include <boost/mpl11/bool.hpp>
47 #include <boost/mpl11/core.hpp>
49 #include <boost/mpl11/logical.hpp>
50 
51 
52 namespace boost { namespace mpl11 {
53  template <typename Left, typename Right, typename>
54  struct Orderable : false_ { };
55 
56  template <typename x1, typename x2, typename ...xs>
57  struct less
58  : and_<less<x1, x2>, less<x2, xs...>>
59  { };
60 
61  template <typename x, typename y>
62  struct less<x, y> :
63  Orderable<
64  typename datatype<typename x::type>::type,
65  typename datatype<typename y::type>::type
66  >::template less_impl<typename x::type, typename y::type>
67  { };
68 
69 
70  template <typename x1, typename x2, typename ...xs>
71  struct less_equal
72  : and_<less_equal<x1, x2>, less_equal<x2, xs...>>
73  { };
74 
75  template <typename x, typename y>
76  struct less_equal<x, y> :
77  Orderable<
78  typename datatype<typename x::type>::type,
79  typename datatype<typename y::type>::type
80  >::template less_equal_impl<typename x::type, typename y::type>
81  { };
82 
83 
84  template <typename x1, typename x2, typename ...xs>
85  struct greater
86  : and_<greater<x1, x2>, greater<x2, xs...>>
87  { };
88 
89  template <typename x, typename y>
90  struct greater<x, y> :
91  Orderable<
92  typename datatype<typename x::type>::type,
93  typename datatype<typename y::type>::type
94  >::template greater_impl<typename x::type, typename y::type>
95  { };
96 
97 
98  template <typename x1, typename x2, typename ...xs>
99  struct greater_equal
100  : and_<greater_equal<x1, x2>, greater_equal<x2, xs...>>
101  { };
102 
103  template <typename x, typename y>
104  struct greater_equal<x, y> :
105  Orderable<
106  typename datatype<typename x::type>::type,
107  typename datatype<typename y::type>::type
108  >::template greater_equal_impl<typename x::type, typename y::type>
109  { };
110 
111 
112  template <typename x1, typename x2, typename ...xs>
113  struct min
114  : detail::left_folds::variadic<min, x1, x2, xs...>
115  { };
116 
117  template <typename x, typename y>
118  struct min<x, y> :
119  Orderable<
120  typename datatype<typename x::type>::type,
121  typename datatype<typename y::type>::type
122  >::template min_impl<typename x::type, typename y::type>
123  { };
124 
125 
126  template <typename x1, typename x2, typename ...xs>
127  struct max
128  : detail::left_folds::variadic<max, x1, x2, xs...>
129  { };
130 
131  template <typename x, typename y>
132  struct max<x, y> :
133  Orderable<
134  typename datatype<typename x::type>::type,
135  typename datatype<typename y::type>::type
136  >::template max_impl<typename x::type, typename y::type>
137  { };
138 }} // end namespace boost::mpl11
139 
140 #endif // !BOOST_MPL11_ORDERABLE_HPP
Forward declares the Core module.
Forwards to boost/mpl11/fwd/integer.hpp.
Forward declares logical metafunctions.
Defines the Logical module.
Defines the Core module.
Defines boost::mpl11::detail::left_folds::variadic.
Forwards to boost/mpl11/integer.hpp.
Forward declares the Orderable typeclass.