iutest  1.17.99.14
iutest_prod.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_PROD_HPP_7A316C18_042D_4E48_BC31_E6AE8B6C2E28_
16 #define INCG_IRIS_IUTEST_PROD_HPP_7A316C18_042D_4E48_BC31_E6AE8B6C2E28_
17 
18 //======================================================================
19 // define
23 #define IUTEST_FRIEND_TEST(testsuitename_, testname_) \
24  friend class IUTEST_TEST_CLASS_NAME_(testsuitename_, testname_)
25 
26 #if !defined(_MSC_VER) || _MSC_VER > 1200
27 
28 #if IUTEST_HAS_TYPED_TEST
29 
33 #define IUTEST_FRIEND_TYPED_TEST(testsuitename_, testname_) \
34  template<typename T>IUTEST_FRIEND_TEST(testsuitename_, testname_)
35 
36 #endif
37 
38 #if IUTEST_HAS_TYPED_TEST_P
39 
43 #define IUTEST_FRIEND_TYPED_TEST_P_DECLARATION(testsuitename_, testname_) \
44  namespace IIUT_TYPED_TEST_P_NAMESPACE_(testsuitename_) { template<typename T>class testname_; }
45 
49 #define IUTEST_FRIEND_TYPED_TEST_P(testsuitename_, testname_) \
50  template<typename T>friend class IIUT_TYPED_TEST_P_NAMESPACE_(testsuitename_)::testname_
51 
52 #endif
53 
54 #endif
55 
62 #define IUTEST_MAKE_PEEP(member_type, class_name, member_name) \
63  IUTEST_MAKE_PEEP_TAG_(member_type, class_name, member_name)
64 
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)
73 
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)
81 
82 #if IUTEST_HAS_PEEP_CLASS
83 
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
91 
92 #endif
93 
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; \
107  }; \
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>
113 
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__)
117 
122 namespace iutest {
123 
124 //======================================================================
125 // class
126 namespace detail
127 {
128 
132 template<typename Tag>
133 struct peep_tag
134 {
135  static typename Tag::type value;
136 };
137 template<typename Tag>
138 typename Tag::type peep_tag<Tag>::value;
139 
140 #if IUTEST_HAS_PEEP_CLASS
141 
142 namespace peep
143 {
144 
148 template<typename T, typename Tag>
149 class Peep
150 {
151 private:
152  typedef Tag peep_tag;
153  typedef typename Tag::type peep_type;
154 
155 private:
156  template<typename U, typename Type>
157  class peep_member_function_impl
158  {
159  private:
160  typedef typename type_traits::function_return_type<Type>::type return_type;
161 
162  private:
163  U* m_ptr;
164  public:
165  explicit peep_member_function_impl(U* ptr) : m_ptr(ptr) {}
166 
167 #if IUTEST_HAS_VARIADIC_TEMPLATES
168  public:
169  template<typename ...Args>
170  return_type operator () (Args... args)
171  {
172  return ((*m_ptr).*detail::peep_tag<peep_tag>::value)( ::std::forward<Args>(args)... );
173  }
174 #else
175 
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)); }
180 
181  return_type operator () () { return ((*m_ptr).*detail::peep_tag<peep_tag>::value)(); }
182 
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)
203 
204 #undef IIUT_DECL_PEEP_MEMBER_FUNC_
205 #endif
206  };
207  template<typename U, typename Type, bool is_const>
208  class peep_member_object_impl
209  {
210  typedef Type value_type;
211  private:
212  U* m_ptr;
213  public:
214  explicit peep_member_object_impl(U* ptr) : m_ptr(ptr) {}
215  private:
216  peep_member_object_impl(const peep_member_object_impl&);
217  public:
218  operator value_type () const { return (*m_ptr).*detail::peep_tag<peep_tag>::value; }
219  peep_member_object_impl& operator = (const value_type& value) IUTEST_CXX_DELETED_FUNCTION;
220  };
221  template<typename U, typename Type>
222  class peep_member_object_impl<U, Type, false>
223  {
224  typedef Type value_type;
225  private:
226  U* m_ptr;
227  public:
228  explicit peep_member_object_impl(U* ptr) : m_ptr(ptr) {}
229  private:
230  peep_member_object_impl(const peep_member_object_impl&);
231  public:
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)
235  {
236  (*m_ptr).*detail::peep_tag<peep_tag>::value = value;
237  return *this;
238  }
239  };
240 
241 
242  template<typename U, typename Type, bool Func>
243  struct peep_member_impl
244  {
245  typedef peep_member_function_impl<U, Type> type;
246  };
247  template<typename U, typename Type>
248  struct peep_member_impl<U, Type U::*, false>
249  {
250  typedef peep_member_object_impl<U, Type, type_traits::is_const<Type>::value> type;
251  };
252 
253 private:
254  template<typename U, typename Type, bool Func>
255  class peep_static_impl
256  {
257  typedef typename type_traits::remove_pointer<Type>::type value_type;
258  public:
259  peep_static_impl() {}
260  peep_static_impl(const value_type& value) { *detail::peep_tag<peep_tag>::value = value; } // NOLINT
261  peep_static_impl(const peep_static_impl&) {}
262  public:
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)
266  {
267  *detail::peep_tag<peep_tag>::value = value;
268  return *this;
269  }
270  };
271 
272  template<typename U, typename Type>
273  class peep_static_impl<U, Type, true>
274  {
275  public:
276  operator Type () { return *detail::peep_tag<peep_tag>::value; }
277  };
278 private:
279  template<typename U, typename Type, bool is_member_ptr>
280  struct peep_impl
281  {
282  typedef peep_static_impl<U, Type, type_traits::is_function_pointer<Type>::value > type;
283  };
284  template<typename U, typename Type>
285  struct peep_impl<U, Type, true>
286  {
287  typedef typename peep_member_impl<U, Type
288  , type_traits::is_member_function_pointer<Type>::value >::type type;
289  };
290 public:
292  typedef typename peep_impl<T, peep_type
293  , type_traits::is_member_pointer<peep_type>::value >::type type;
294 };
295 
296 } // end of namespace peep
297 
298 #endif
299 
300 } // end of namespace detail
301 } // end of namespace iutest
302 
303 #endif // INCG_IRIS_IUTEST_PROD_HPP_7A316C18_042D_4E48_BC31_E6AE8B6C2E28_
#define IUTEST_CXX_DELETED_FUNCTION
delete function
Definition: iutest_compiler.hpp:445
iutest root namespace
Definition: iutest_charcode.hpp:33