1 /*=============================================================================
2 Copyright (c) 2016 Lee Clagett
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
8 #include <boost/fusion/sequence/comparison.hpp>
9 #include <boost/mpl/identity.hpp>
15 convertible() : value_() {}
16 convertible(int value) : value_(value) {}
20 bool operator==(convertible const& lhs, convertible const& rhs)
22 return lhs.value_ == rhs.value_;
25 bool operator!=(convertible const& lhs, convertible const& rhs)
27 return lhs.value_ != rhs.value_;
30 // Testing conversion at function call allows for testing mutable lvalue,
31 // const lvalue, and rvalue as the source. mpl::identity prevents deduction
33 T implicit_construct(typename boost::mpl::identity<T>::type source)
38 template <typename F, typename Source, typename Expected>
39 bool run(Source const& source, Expected const& expected)
41 return F()(source, expected);
44 template <typename F, typename Source>
45 bool run(Source const& source)
47 return run<F>(source, source);
51 struct can_rvalue_implicit_construct
53 template<typename Source, typename Expected>
54 bool operator()(Source const& source, Expected const& expected) const
56 return expected == implicit_construct<T>(implicit_construct<Source>(source));
61 struct can_lvalue_implicit_construct
63 template <typename Source, typename Expected>
64 bool operator()(Source source, Expected const& expected) const
66 return expected == implicit_construct<T>(source);
71 struct can_const_lvalue_implicit_construct
73 template <typename Source, typename Expected>
74 bool operator()(Source const& source, Expected const& expected) const
76 return expected == implicit_construct<T>(source);
81 struct can_implicit_construct
83 template <typename Source, typename Expected>
84 bool operator()(Source const& source, Expected const& expected) const
87 run< can_rvalue_implicit_construct<T> >(source, expected) &&
88 run< can_lvalue_implicit_construct<T> >(source, expected) &&
89 run< can_const_lvalue_implicit_construct<T> >(source, expected);
94 struct can_rvalue_construct
96 template<typename Source, typename Expected>
97 bool operator()(Source const& source, Expected const& expected) const
99 return expected == T(implicit_construct<Source>(source));
103 template <typename T>
104 struct can_lvalue_construct
106 template <typename Source, typename Expected>
107 bool operator()(Source source, Expected const& expected) const
109 return expected == T(source);
113 template <typename T>
114 struct can_const_lvalue_construct
116 template <typename Source, typename Expected>
117 bool operator()(Source const& source, Expected const& expected) const
119 return expected == T(source);
123 template <typename T>
126 template <typename Source, typename Expected>
127 bool operator()(Source const& source, Expected const& expected) const
130 run< can_rvalue_construct<T> >(source, expected) &&
131 run< can_lvalue_construct<T> >(source, expected) &&
132 run< can_const_lvalue_construct<T> >(source, expected);
136 template <typename T>
137 struct can_rvalue_assign
139 template <typename Source, typename Expected>
140 bool operator()(Source const& source, Expected const& expected) const
145 result &= (seq == expected || seq != expected);
147 seq = implicit_construct<Source>(source);
148 result &= (seq == expected);
154 template <typename T>
155 struct can_lvalue_assign
158 template <typename Source, typename Expected>
159 bool operator()(Source source, Expected const& expected) const
164 result &= (seq == expected || seq != expected);
167 result &= (seq == expected);
173 template <typename T>
174 struct can_const_lvalue_assign
176 template <typename Source, typename Expected>
177 bool operator()(Source const& source, Expected const& expected) const
182 result &= (seq == expected || seq != expected);
185 result &= (seq == expected);
191 template <typename T>
194 template <typename Source, typename Expected>
195 bool operator()(Source const& source, Expected const& expected) const
198 run< can_rvalue_assign<T> >(source, expected) &&
199 run< can_lvalue_assign<T> >(source, expected) &&
200 run< can_const_lvalue_assign<T> >(source, expected);
204 template <typename T>
207 template <typename Source, typename Expected>
208 bool operator()(Source const& source, Expected const& expected) const
211 run< can_construct<T> >(source, expected) &&
212 run< can_implicit_construct<T> >(source, expected) &&
213 run< can_assign<T> >(source, expected);