12 #ifndef BOOST_MPL11_ORDERABLE_HPP
13 #define BOOST_MPL11_ORDERABLE_HPP
22 namespace boost {
namespace mpl11 {
24 struct instantiate<Orderable> {
25 template <
typename Left,
typename Right = Left>
27 template <
typename x,
typename y>
28 using less_equal_impl = not_<less<box<y>, box<x>>>;
30 template <
typename x,
typename y>
31 using greater_impl = less<box<y>, box<x>>;
33 template <
typename x,
typename y>
34 using greater_equal_impl = not_<less<box<x>, box<y>>>;
36 template <
typename x,
typename y>
37 using min_impl = if_c<less<box<x>, box<y>>::value, box<x>, box<y>>;
39 template <
typename x,
typename y>
40 using max_impl = if_c<less<box<x>, box<y>>::value, box<y>, box<x>>;
52 namespace boost {
namespace mpl11 {
53 template <
typename Left,
typename Right,
typename>
54 struct Orderable : false_ { };
56 template <
typename x1,
typename x2,
typename ...xs>
58 : and_<less<x1, x2>, less<x2, xs...>>
61 template <
typename x,
typename y>
64 typename datatype<typename x::type>::type,
65 typename datatype<typename y::type>::type
66 >::template less_impl<typename x::type, typename y::type>
70 template <
typename x1,
typename x2,
typename ...xs>
72 : and_<less_equal<x1, x2>, less_equal<x2, xs...>>
75 template <
typename x,
typename y>
76 struct less_equal<x, y> :
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>
84 template <
typename x1,
typename x2,
typename ...xs>
86 : and_<greater<x1, x2>, greater<x2, xs...>>
89 template <
typename x,
typename y>
90 struct greater<x, y> :
92 typename datatype<typename x::type>::type,
93 typename datatype<typename y::type>::type
94 >::template greater_impl<typename x::type, typename y::type>
98 template <
typename x1,
typename x2,
typename ...xs>
100 : and_<greater_equal<x1, x2>, greater_equal<x2, xs...>>
103 template <
typename x,
typename y>
104 struct greater_equal<x, y> :
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>
112 template <
typename x1,
typename x2,
typename ...xs>
114 : detail::left_folds::variadic<min, x1, x2, xs...>
117 template <
typename x,
typename y>
120 typename datatype<typename x::type>::type,
121 typename datatype<typename y::type>::type
122 >::template min_impl<typename x::type, typename y::type>
126 template <
typename x1,
typename x2,
typename ...xs>
128 : detail::left_folds::variadic<max, x1, x2, xs...>
131 template <
typename x,
typename y>
134 typename datatype<typename x::type>::type,
135 typename datatype<typename y::type>::type
136 >::template max_impl<typename x::type, typename y::type>
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 boost::mpl11::detail::left_folds::variadic.
Forwards to boost/mpl11/integer.hpp.
Forward declares the Orderable typeclass.