15 #ifndef INCG_IRIS_IUTEST_PROD_HPP_7A316C18_042D_4E48_BC31_E6AE8B6C2E28_
16 #define INCG_IRIS_IUTEST_PROD_HPP_7A316C18_042D_4E48_BC31_E6AE8B6C2E28_
23 #define IUTEST_FRIEND_TEST(testcasename_, testname_) \
24 friend class IUTEST_TEST_CLASS_NAME_(testcasename_, testname_)
26 #if !defined(_MSC_VER) || _MSC_VER > 1200
28 #if IUTEST_HAS_TYPED_TEST
33 #define IUTEST_FRIEND_TYPED_TEST(testcasename_, testname_) \
34 template<typename T>IUTEST_FRIEND_TEST(testcasename_, testname_)
38 #if IUTEST_HAS_TYPED_TEST_P
43 #define IUTEST_FRIEND_TYPED_TEST_P_DECLARATION(testcasename_, testname_) \
44 namespace IIUT_TYPED_TEST_P_NAMESPACE_(testcasename_) { template<typename T>class testname_; }
49 #define IUTEST_FRIEND_TYPED_TEST_P(testcasename_, testname_) \
50 template<typename T>friend class IIUT_TYPED_TEST_P_NAMESPACE_(testcasename_)::testname_
62 #define IUTEST_MAKE_PEEP(member_type, class_name, member_name) \
63 IUTEST_MAKE_PEEP_TAG_(member_type, class_name, member_name)
71 #define IUTEST_PEEP_GET(v, class_name, member_name) \
72 (v.*::iutest::detail::peep_tag< IIUT_PEEP_TAG_NAME_(class_name, member_name)<class_name> >::value)
79 #define IUTEST_PEEP_STATIC_GET(class_name, member_name) \
80 (*::iutest::detail::peep_tag< IIUT_PEEP_TAG_NAME_(class_name, member_name)<class_name> >::value)
82 #if IUTEST_HAS_PEEP_CLASS
89 #define IUTEST_PEEP(class_name, member_name) \
90 ::iutest::detail::peep::Peep< class_name, IIUT_PEEP_TAG_NAME_(class_name, member_name)<class_name> >::type
98 #define IUTEST_MAKE_PEEP_TAG_(member_type, class_name, member_name) \
99 template<typename T>struct IIUT_PEEP_TAG_NAME_(class_name, member_name); \
100 template<>struct IIUT_PEEP_TAG_NAME_(class_name, member_name)<class_name> { \
101 typedef ::iutest_type_traits::identity<member_type>::type type; }; \
102 template<typename T, typename Tag, typename Tag::type X> \
103 struct IIUT_PEEP_SETTER_NAME_(class_name, member_name) { \
104 IIUT_PEEP_SETTER_NAME_(class_name, member_name)() { \
105 ::iutest::detail::peep_tag<Tag>::value = X; } \
106 static IIUT_PEEP_SETTER_NAME_(class_name, member_name) instance; \
108 template<typename T, typename Tag, typename Tag::type X> \
109 IIUT_PEEP_SETTER_NAME_(class_name, member_name)<T, Tag, X> \
110 IIUT_PEEP_SETTER_NAME_(class_name, member_name)<T, Tag, X>::instance; \
111 template struct IIUT_PEEP_SETTER_NAME_(class_name, member_name)<class_name \
112 , IIUT_PEEP_TAG_NAME_(class_name, member_name)<class_name>, &class_name::member_name>
114 #define IIUT_PEEP_TAG_NAME_(class_name, member_name) iu_peep_tag_##member_name
115 #define IIUT_PEEP_SETTER_NAME_(class_name, member_name) \
116 IUTEST_PP_CAT(IUTEST_PP_CAT(iu_peep_set_, member_name), __LINE__)
132 template<
typename Tag>
135 static typename Tag::type value;
137 template<
typename Tag>
138 typename Tag::type peep_tag<Tag>::value;
140 #if IUTEST_HAS_PEEP_CLASS
148 template<
typename T,
typename Tag>
152 typedef Tag peep_tag;
153 typedef typename Tag::type peep_type;
156 template<
typename U,
typename Type>
157 class peep_member_function_impl
160 typedef typename type_traits::function_return_type<Type>::type return_type;
165 explicit peep_member_function_impl(U* ptr) : m_ptr(ptr) {}
167 #if IUTEST_HAS_VARIADIC_TEMPLATES
169 template<
typename ...Args>
170 return_type operator () (Args... args)
172 return ((*m_ptr).*detail::peep_tag<peep_tag>::value)( ::std::forward<Args>(args)... );
176 #define IIUT_DECL_PEEP_MEMBER_FUNC_(n) \
177 template<IUTEST_PP_ENUM_PARAMS(n, typename T)>return_type operator () ( \
178 IUTEST_PP_ENUM_BINARY_PARAMS(n, T, t)) { \
179 return ((*m_ptr).*detail::peep_tag<peep_tag>::value)(IUTEST_PP_ENUM_PARAMS(n, t)); }
181 return_type operator () () {
return ((*m_ptr).*detail::peep_tag<peep_tag>::value)(); }
183 IIUT_DECL_PEEP_MEMBER_FUNC_(1)
184 IIUT_DECL_PEEP_MEMBER_FUNC_(2)
185 IIUT_DECL_PEEP_MEMBER_FUNC_(3)
186 IIUT_DECL_PEEP_MEMBER_FUNC_(4)
187 IIUT_DECL_PEEP_MEMBER_FUNC_(5)
188 IIUT_DECL_PEEP_MEMBER_FUNC_(6)
189 IIUT_DECL_PEEP_MEMBER_FUNC_(7)
190 IIUT_DECL_PEEP_MEMBER_FUNC_(8)
191 IIUT_DECL_PEEP_MEMBER_FUNC_(9)
192 IIUT_DECL_PEEP_MEMBER_FUNC_(10)
193 IIUT_DECL_PEEP_MEMBER_FUNC_(11)
194 IIUT_DECL_PEEP_MEMBER_FUNC_(12)
195 IIUT_DECL_PEEP_MEMBER_FUNC_(13)
196 IIUT_DECL_PEEP_MEMBER_FUNC_(14)
197 IIUT_DECL_PEEP_MEMBER_FUNC_(15)
198 IIUT_DECL_PEEP_MEMBER_FUNC_(16)
199 IIUT_DECL_PEEP_MEMBER_FUNC_(17)
200 IIUT_DECL_PEEP_MEMBER_FUNC_(18)
201 IIUT_DECL_PEEP_MEMBER_FUNC_(19)
202 IIUT_DECL_PEEP_MEMBER_FUNC_(20)
204 #undef IIUT_DECL_PEEP_MEMBER_FUNC_
207 template<
typename U,
typename Type,
bool is_const>
208 class peep_member_object_impl
210 typedef Type value_type;
214 explicit peep_member_object_impl(U* ptr) : m_ptr(ptr) {}
216 peep_member_object_impl(
const peep_member_object_impl&);
218 operator value_type ()
const {
return (*m_ptr).*detail::peep_tag<peep_tag>::value; }
221 template<
typename U,
typename Type>
222 class peep_member_object_impl<U, Type, false>
224 typedef Type value_type;
228 explicit peep_member_object_impl(U* ptr) : m_ptr(ptr) {}
230 peep_member_object_impl(
const peep_member_object_impl&);
232 operator value_type ()
const {
return (*m_ptr).*detail::peep_tag<peep_tag>::value; }
233 operator value_type& () {
return (*m_ptr).*detail::peep_tag<peep_tag>::value; }
234 peep_member_object_impl& operator = (
const value_type& value)
236 (*m_ptr).*detail::peep_tag<peep_tag>::value = value;
242 template<
typename U,
typename Type,
bool Func>
243 struct peep_member_impl
245 typedef peep_member_function_impl<U, Type> type;
247 template<
typename U,
typename Type>
248 struct peep_member_impl<U, Type U::*, false>
250 typedef peep_member_object_impl<U, Type, type_traits::is_const<Type>::value> type;
254 template<
typename U,
typename Type,
bool Func>
255 class peep_static_impl
257 typedef typename type_traits::remove_pointer<Type>::type value_type;
259 peep_static_impl() {}
260 peep_static_impl(
const value_type& value) { *detail::peep_tag<peep_tag>::value = value; }
261 peep_static_impl(
const peep_static_impl&) {}
263 operator value_type ()
const {
return *detail::peep_tag<peep_tag>::value; }
264 operator value_type& () {
return *detail::peep_tag<peep_tag>::value; }
265 peep_static_impl& operator = (
const value_type& value)
267 *detail::peep_tag<peep_tag>::value = value;
272 template<
typename U,
typename Type>
273 class peep_static_impl<U, Type, true>
276 operator Type () {
return *detail::peep_tag<peep_tag>::value; }
279 template<
typename U,
typename Type,
bool is_member_ptr>
282 typedef peep_static_impl<U, Type, type_traits::is_function_pointer<Type>::value > type;
284 template<
typename U,
typename Type>
285 struct peep_impl<U, Type, true>
287 typedef typename peep_member_impl<U, Type
288 , type_traits::is_member_function_pointer<Type>::value >::type type;
292 typedef typename peep_impl<T, peep_type
293 , type_traits::is_member_pointer<peep_type>::value >::type type;
303 #endif // INCG_IRIS_IUTEST_PROD_HPP_7A316C18_042D_4E48_BC31_E6AE8B6C2E28_