test_laws.hpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. /*-----------------------------------------------------------------------------+
  2. Copyright (c) 2008-2010: Joachim Faulhaber
  3. +------------------------------------------------------------------------------+
  4. Distributed under the Boost Software License, Version 1.0.
  5. (See accompanying file LICENCE.txt or copy at
  6. http://www.boost.org/LICENSE_1_0.txt)
  7. +-----------------------------------------------------------------------------*/
  8. #ifndef BOOST_LIBS_ICL_TEST_ICL_LAWS_HPP_JOFA_090119
  9. #define BOOST_LIBS_ICL_TEST_ICL_LAWS_HPP_JOFA_090119
  10. #include <boost/icl/type_traits/identity_element.hpp>
  11. #include <boost/icl/associative_interval_container.hpp>
  12. namespace boost{namespace icl
  13. {
  14. template<class Type>
  15. struct equality
  16. {
  17. typedef Type first_argument_type;
  18. typedef Type second_argument_type;
  19. typedef bool result_type;
  20. typedef bool (type)(const Type&, const Type&);
  21. };
  22. //------------------------------------------------------------------------------
  23. // Associativity
  24. //------------------------------------------------------------------------------
  25. // The definition of a boost test via a macro, that allows to be instantiated for
  26. // different operator signs 'op_sign'. For every 'op_sign' a separate function
  27. // template is generated by appending the suffic 'op_tag' to the function
  28. // name.
  29. // So this is the function template via macro that checks the law
  30. // associativity for an operator 'op_sign'
  31. #define DEFINE_ASSOCIATIVITY_CHECK_WRT(op_tag, op_sign) \
  32. template<class Type, class TypeB, class TypeC> \
  33. void check_associativity_wrt_##op_tag(const Type& a, const TypeB& b, const TypeC& c) \
  34. { \
  35. Type left = (a op_sign b) op_sign c; \
  36. Type right = a op_sign (b op_sign c); \
  37. BOOST_CHECK(left==right); \
  38. }
  39. #define DEFINE_ASSOCIATIVITY_CHECK_WRT_EQUAL(op_tag, op_sign) \
  40. template<class Type, class TypeB, class TypeC> \
  41. void check_associativity_wrt_equal_##op_tag \
  42. (typename equality<Type>::type* equal, \
  43. const Type& a, const TypeB& b, const TypeC& c) \
  44. { \
  45. Type left = (a op_sign b) op_sign c; \
  46. Type right = a op_sign (b op_sign c); \
  47. BOOST_CHECK((*equal)(left,right)); \
  48. }
  49. // Here we define the call of the test function thats definition
  50. // template has been generated by the macro above.
  51. #define CHECK_ASSOCIATIVITY_WRT(op_tag) check_associativity_wrt_##op_tag
  52. #define CHECK_ASSOCIATIVITY_WRT_EQUAL(op_tag) check_associativity_wrt_equal_##op_tag
  53. // Here we actually generate function templates by calling the defining
  54. // macros.
  55. DEFINE_ASSOCIATIVITY_CHECK_WRT (plus, + )
  56. DEFINE_ASSOCIATIVITY_CHECK_WRT_EQUAL(plus, + )
  57. DEFINE_ASSOCIATIVITY_CHECK_WRT (pipe, | )
  58. DEFINE_ASSOCIATIVITY_CHECK_WRT_EQUAL(pipe, | )
  59. DEFINE_ASSOCIATIVITY_CHECK_WRT (et, & )
  60. DEFINE_ASSOCIATIVITY_CHECK_WRT_EQUAL(et, & )
  61. DEFINE_ASSOCIATIVITY_CHECK_WRT (caret, ^ )
  62. DEFINE_ASSOCIATIVITY_CHECK_WRT_EQUAL(caret, ^ )
  63. //------------------------------------------------------------------------------
  64. // Neutrality
  65. //------------------------------------------------------------------------------
  66. #define DEFINE_RIGHT_NEUTRALITY_CHECK_WRT_EQUAL(op_tag, op_sign) \
  67. template<class Type> \
  68. void check_right_neutrality_wrt_equal_##op_tag \
  69. (typename equality<Type>::type* equal, const Type& a, const Type& identity_element) \
  70. { \
  71. Type left = a op_sign identity_element; \
  72. Type right = identity_element; \
  73. BOOST_CHECK((*equal)(left,right)); \
  74. }
  75. #define DEFINE_RIGHT_NEUTRALITY_CHECK_WRT(op_tag, op_sign) \
  76. template<class Type> \
  77. void check_right_neutrality_wrt_##op_tag \
  78. (typename equality<Type>::type* equal, const Type& a, const Type& identity_element) \
  79. { \
  80. Type left = a op_sign identity_element; \
  81. Type right = identity_element; \
  82. BOOST_CHECK(left==right); \
  83. }
  84. #define DEFINE_NEUTRALITY_CHECK_WRT_EQUAL(op_tag, op_sign) \
  85. template<class Type> \
  86. void check_neutrality_wrt_equal_##op_tag \
  87. (typename equality<Type>::type* equal, const Type& a, const Type& identity_element) \
  88. { \
  89. Type left = a op_sign identity_element; \
  90. Type right = identity_element op_sign a; \
  91. BOOST_CHECK((*equal)(left,right)); \
  92. }
  93. #define DEFINE_NEUTRALITY_CHECK_WRT(op_tag, op_sign) \
  94. template<class Type> \
  95. void check_neutrality_wrt_##op_tag \
  96. (const Type& a, const Type& identity_element) \
  97. { \
  98. Type left = a op_sign identity_element; \
  99. Type right = identity_element op_sign a; \
  100. BOOST_CHECK(left==right); \
  101. }
  102. #define CHECK_NEUTRALITY_WRT(op_tag) check_neutrality_wrt_##op_tag
  103. #define CHECK_NEUTRALITY_WRT_EQUAL(op_tag) check_neutrality_wrt_equal_##op_tag
  104. DEFINE_NEUTRALITY_CHECK_WRT (plus, + )
  105. DEFINE_NEUTRALITY_CHECK_WRT_EQUAL(plus, + )
  106. DEFINE_NEUTRALITY_CHECK_WRT (pipe, | )
  107. DEFINE_NEUTRALITY_CHECK_WRT_EQUAL(pipe, | )
  108. DEFINE_NEUTRALITY_CHECK_WRT (minus, - )
  109. DEFINE_NEUTRALITY_CHECK_WRT_EQUAL(minus, - )
  110. DEFINE_NEUTRALITY_CHECK_WRT (et, & )
  111. DEFINE_NEUTRALITY_CHECK_WRT_EQUAL(et, & )
  112. DEFINE_NEUTRALITY_CHECK_WRT (caret, ^ )
  113. DEFINE_NEUTRALITY_CHECK_WRT_EQUAL(caret, ^ )
  114. //------------------------------------------------------------------------------
  115. // Commutativity
  116. //------------------------------------------------------------------------------
  117. #define DEFINE_COMMUTATIVITY_CHECK_WRT_EQUAL(op_tag, op_sign) \
  118. template<class Type, class TypeB> \
  119. void check_commutativity_wrt_equal_##op_tag \
  120. (typename equality<Type>::type* equal, const Type& a, const TypeB& b) \
  121. { \
  122. Type left = a op_sign b; \
  123. Type right = b op_sign a; \
  124. BOOST_CHECK((*equal)(left,right)); \
  125. }
  126. #define DEFINE_COMMUTATIVITY_CHECK_WRT(op_tag, op_sign) \
  127. template<class Type, class TypeB> \
  128. void check_commutativity_wrt_##op_tag(const Type& a, const TypeB& b) \
  129. { \
  130. Type left = a op_sign b; \
  131. Type right = b op_sign a; \
  132. BOOST_CHECK(left==right); \
  133. }
  134. #define CHECK_COMMUTATIVITY_WRT_EQUAL(op_tag) check_commutativity_wrt_equal_##op_tag
  135. #define CHECK_COMMUTATIVITY_WRT(op_tag) check_commutativity_wrt_##op_tag
  136. DEFINE_COMMUTATIVITY_CHECK_WRT (plus, + )
  137. DEFINE_COMMUTATIVITY_CHECK_WRT_EQUAL(plus, + )
  138. DEFINE_COMMUTATIVITY_CHECK_WRT (pipe, | )
  139. DEFINE_COMMUTATIVITY_CHECK_WRT_EQUAL(pipe, | )
  140. DEFINE_COMMUTATIVITY_CHECK_WRT (et, & )
  141. DEFINE_COMMUTATIVITY_CHECK_WRT_EQUAL(et, & )
  142. DEFINE_COMMUTATIVITY_CHECK_WRT (caret, ^ )
  143. DEFINE_COMMUTATIVITY_CHECK_WRT_EQUAL(caret, ^ )
  144. //------------------------------------------------------------------------------
  145. // Natural inversion
  146. //------------------------------------------------------------------------------
  147. #define DEFINE_PARTIAL_INVERSION_CHECK_WRT_EQUAL(plus_tag, plus_sign) \
  148. template<class Type> \
  149. void check_partial_inversion_wrt_equal_##plus_tag \
  150. (typename equality<Type>::type* equal, const Type& identity_element, const Type& var_a) \
  151. { \
  152. Type positive_difference = var_a - var_a; \
  153. BOOST_CHECK((*equal)(positive_difference, identity_element)); \
  154. }
  155. #define DEFINE_PARTIAL_INVERSION_CHECK_WRT(plus_tag, plus_sign) \
  156. template<class Type> \
  157. void check_partial_inversion_wrt_##plus_tag \
  158. (const Type& identity_element, const Type& var_a) \
  159. { \
  160. Type positive_difference = var_a - var_a; \
  161. BOOST_CHECK(positive_difference==identity_element); \
  162. }
  163. #define CHECK_PARTIAL_INVERSION_WRT_EQUAL(plus_tag) check_partial_inversion_wrt_equal_##plus_tag
  164. #define CHECK_PARTIAL_INVERSION_WRT(plus_tag) check_partial_inversion_wrt_##plus_tag
  165. DEFINE_PARTIAL_INVERSION_CHECK_WRT (plus, + )
  166. DEFINE_PARTIAL_INVERSION_CHECK_WRT_EQUAL(plus, + )
  167. DEFINE_PARTIAL_INVERSION_CHECK_WRT (pipe, | )
  168. DEFINE_PARTIAL_INVERSION_CHECK_WRT_EQUAL(pipe, | )
  169. //------------------------------------------------------------------------------
  170. // Inverse
  171. //------------------------------------------------------------------------------
  172. #define DEFINE_INVERSE_CHECK_WRT_EQUAL(plus_tag, plus_sign) \
  173. template<class Type> \
  174. void check_inverse_wrt_equal_##plus_tag \
  175. (typename equality<Type>::type* equal, const Type& identity_element, const Type& var_a) \
  176. { \
  177. Type positive_difference = var_a - var_a; \
  178. BOOST_CHECK((*equal)(positive_difference, identity_element)); \
  179. Type negative_difference = (identity_element - var_a) plus_sign var_a; \
  180. BOOST_CHECK((*equal)(negative_difference, identity_element)); \
  181. }
  182. #define DEFINE_INVERSE_CHECK_WRT(plus_tag, plus_sign) \
  183. template<class Type> \
  184. void check_inverse_wrt_##plus_tag \
  185. (const Type& identity_element, const Type& var_a) \
  186. { \
  187. Type positive_difference = var_a - var_a; \
  188. BOOST_CHECK(positive_difference==identity_element); \
  189. Type negative_difference = (identity_element - var_a) plus_sign var_a; \
  190. BOOST_CHECK(negative_difference==identity_element); \
  191. }
  192. #define CHECK_INVERSE_WRT_EQUAL(plus_tag) check_inverse_wrt_equal_##plus_tag
  193. #define CHECK_INVERSE_WRT(plus_tag) check_inverse_wrt_##plus_tag
  194. DEFINE_INVERSE_CHECK_WRT (plus, + )
  195. DEFINE_INVERSE_CHECK_WRT_EQUAL(plus, + )
  196. DEFINE_INVERSE_CHECK_WRT (pipe, | )
  197. DEFINE_INVERSE_CHECK_WRT_EQUAL(pipe, | )
  198. //------------------------------------------------------------------------------
  199. // Containedness laws (Valid for sets, NOT for maps)
  200. //------------------------------------------------------------------------------
  201. template<class Type, class TypeB>
  202. void check_intersection_containedness(const Type& a, const TypeB& b)
  203. {
  204. BOOST_CHECK_EQUAL(contains(a, a & b), true);
  205. BOOST_CHECK_EQUAL(contains(a, b & a), true);
  206. BOOST_CHECK_EQUAL(within(a & b, a), true);
  207. BOOST_CHECK_EQUAL(within(b & a, a), true);
  208. }
  209. template<class Type, class TypeB>
  210. void check_union_containedness(const Type& a, const TypeB& b)
  211. {
  212. BOOST_CHECK_EQUAL(within(a, a + b), true);
  213. BOOST_CHECK_EQUAL(within(a, b + a), true);
  214. BOOST_CHECK_EQUAL(contains(a + b, a), true);
  215. BOOST_CHECK_EQUAL(contains(b + a, a), true);
  216. }
  217. template<class MapT>
  218. void check_domain_containedness(const MapT& a)
  219. {
  220. typedef typename MapT::set_type set_type;
  221. set_type dom;
  222. domain(dom, a);
  223. BOOST_CHECK_EQUAL(within(dom, a), true);
  224. BOOST_CHECK_EQUAL(contains(a, dom), true);
  225. if(!dom.empty())
  226. {
  227. typename MapT::domain_type a1 = *dom.begin();
  228. BOOST_CHECK_EQUAL(within(a1, a), true);
  229. BOOST_CHECK_EQUAL(contains(a, a1), true);
  230. }
  231. }
  232. //------------------------------------------------------------------------------
  233. // Laws on inner complement, between and distance
  234. //------------------------------------------------------------------------------
  235. template<class Type, class SetT>
  236. bool check_length_as_distance( const Type& object
  237. , SetT& in_between
  238. , typename Type::difference_type& between_len
  239. , typename Type::difference_type& obj_dist )
  240. {
  241. //LAW LengthAsDistance: distance(x) == length(between(x))
  242. icl::between(in_between, object);
  243. between_len = icl::length(in_between);
  244. obj_dist = icl::distance(object);
  245. BOOST_CHECK_EQUAL(obj_dist, between_len);
  246. return obj_dist == between_len;
  247. }
  248. template<class Type, class SetT>
  249. bool has_length_as_distance(const Type& object)
  250. {
  251. typedef typename Type::difference_type DiffT;
  252. SetT in_between; DiffT between_len, obj_dist;
  253. return check_length_as_distance(object, in_between, between_len, obj_dist);
  254. }
  255. template<class Type>
  256. bool check_length_complementarity( const Type& object
  257. , typename Type::difference_type& obj_len
  258. , typename Type::difference_type& obj_dist
  259. , typename Type::difference_type& hull_len )
  260. {
  261. //LAW Length Complementarity: length(x) + distance(x) == length(hull(x))
  262. obj_len = icl::length(object);
  263. obj_dist = icl::distance(object);
  264. hull_len = icl::length(hull(object));
  265. BOOST_CHECK_EQUAL(obj_len + obj_dist, hull_len);
  266. return obj_len + obj_dist == hull_len;
  267. }
  268. template<class Type>
  269. bool has_length_complementarity(const Type& object)
  270. {
  271. typedef typename Type::difference_type DiffT;
  272. DiffT obj_len, obj_dist, hull_len;
  273. return check_length_complementarity(object, obj_len, obj_dist, hull_len);
  274. }
  275. template<class Type, class SetT>
  276. bool check_inner_complementarity(const Type& object, SetT& in_between, SetT& lhs, SetT& rhs)
  277. {
  278. //LAW Inner Complementarity1: domain(x) + between(x) =e= hull(x)
  279. //LAW Inner Complementarity2: join(domain(x) + between(x)) == hull(x)
  280. SetT dom;
  281. icl::domain(dom, object);
  282. lhs = dom + between(in_between, object);
  283. join(lhs);
  284. rhs = SetT(hull(object));
  285. BOOST_CHECK_EQUAL(lhs, rhs);
  286. return lhs == rhs;
  287. }
  288. template<class Type, class SetT>
  289. bool has_inner_complementarity(const Type& object)
  290. {
  291. SetT in_between, lhs, rhs;
  292. return check_inner_complementarity(object, in_between, lhs, rhs);
  293. }
  294. //==============================================================================
  295. // Law tests are now combined to test algebraic concepts.
  296. //------------------------------------------------------------------------------
  297. // Monodid EAN
  298. //------------------------------------------------------------------------------
  299. #define DEFINE_MONOID_CHECK_WRT_EQUAL(op_tag) \
  300. template<class Type, class TypeB, class TypeC> \
  301. void check_monoid_wrt_equal_##op_tag \
  302. (typename equality<Type>::type* equal, const Type& identity_element, \
  303. const Type& a, const TypeB& b, const TypeC& c) \
  304. { \
  305. CHECK_ASSOCIATIVITY_WRT_EQUAL(op_tag)(equal,a,b,c); \
  306. CHECK_NEUTRALITY_WRT_EQUAL(op_tag)(equal,a,identity_element); \
  307. }
  308. #define DEFINE_MONOID_CHECK_WRT(op_tag) \
  309. template<class Type, class TypeB, class TypeC> \
  310. void check_monoid_wrt_##op_tag \
  311. (const Type& identity_element, \
  312. const Type& a, const TypeB& b, const TypeC& c) \
  313. { \
  314. CHECK_ASSOCIATIVITY_WRT(op_tag)(a,b,c); \
  315. CHECK_NEUTRALITY_WRT(op_tag)(a,identity_element); \
  316. }
  317. DEFINE_MONOID_CHECK_WRT (plus)
  318. DEFINE_MONOID_CHECK_WRT_EQUAL(plus)
  319. DEFINE_MONOID_CHECK_WRT (pipe)
  320. DEFINE_MONOID_CHECK_WRT_EQUAL(pipe)
  321. DEFINE_MONOID_CHECK_WRT (et)
  322. DEFINE_MONOID_CHECK_WRT_EQUAL(et)
  323. DEFINE_MONOID_CHECK_WRT (caret)
  324. DEFINE_MONOID_CHECK_WRT_EQUAL(caret)
  325. #define CHECK_MONOID_WRT(op_tag) check_monoid_wrt_##op_tag
  326. #define CHECK_MONOID_WRT_EQUAL(op_tag) check_monoid_wrt_equal_##op_tag
  327. //------------------------------------------------------------------------------
  328. // Commutative or Abelian monodid EANC
  329. //------------------------------------------------------------------------------
  330. #define DEFINE_ABELIAN_MONOID_CHECK_WRT_EQUAL(op_tag) \
  331. template<class Type, class TypeB, class TypeC> \
  332. void check_abelian_monoid_wrt_equal_##op_tag \
  333. (typename equality<Type>::type* equal, const Type& identity_element, \
  334. const Type& a, const TypeB& b, const TypeC& c) \
  335. { \
  336. CHECK_ASSOCIATIVITY_WRT_EQUAL(op_tag)(equal,a,b,c); \
  337. CHECK_NEUTRALITY_WRT_EQUAL(op_tag)(equal,a,identity_element); \
  338. CHECK_COMMUTATIVITY_WRT_EQUAL(op_tag)(equal,a,b); \
  339. CHECK_COMMUTATIVITY_WRT_EQUAL(op_tag)(equal,a,c); \
  340. }
  341. #define DEFINE_ABELIAN_MONOID_CHECK_WRT(op_tag) \
  342. template<class Type, class TypeB, class TypeC> \
  343. void check_abelian_monoid_wrt_##op_tag \
  344. (const Type& identity_element, \
  345. const Type& a, const TypeB& b, const TypeC& c) \
  346. { \
  347. CHECK_ASSOCIATIVITY_WRT(op_tag)(a,b,c); \
  348. CHECK_NEUTRALITY_WRT(op_tag)(a,identity_element); \
  349. CHECK_COMMUTATIVITY_WRT(op_tag)(a,b); \
  350. CHECK_COMMUTATIVITY_WRT(op_tag)(a,c); \
  351. }
  352. DEFINE_ABELIAN_MONOID_CHECK_WRT (plus)
  353. DEFINE_ABELIAN_MONOID_CHECK_WRT_EQUAL(plus)
  354. DEFINE_ABELIAN_MONOID_CHECK_WRT (pipe)
  355. DEFINE_ABELIAN_MONOID_CHECK_WRT_EQUAL(pipe)
  356. DEFINE_ABELIAN_MONOID_CHECK_WRT (et)
  357. DEFINE_ABELIAN_MONOID_CHECK_WRT_EQUAL(et)
  358. DEFINE_ABELIAN_MONOID_CHECK_WRT (caret)
  359. DEFINE_ABELIAN_MONOID_CHECK_WRT_EQUAL(caret)
  360. #define CHECK_ABELIAN_MONOID_WRT(op_tag) check_abelian_monoid_wrt_##op_tag
  361. #define CHECK_ABELIAN_MONOID_WRT_EQUAL(op_tag) check_abelian_monoid_wrt_equal_##op_tag
  362. //------------------------------------------------------------------------------
  363. // Abelian monodid EANC with partial inversion
  364. //------------------------------------------------------------------------------
  365. #define DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT_EQUAL(op_tag) \
  366. template<class Type, class TypeB, class TypeC> \
  367. void check_partial_invertive_monoid_wrt_equal_##op_tag \
  368. (typename equality<Type>::type* equal, const Type& identity_element, \
  369. const Type& a, const TypeB& b, const TypeC& c) \
  370. { \
  371. CHECK_ABELIAN_MONOID_WRT_EQUAL(op_tag)(equal,identity_element,a,b,c); \
  372. CHECK_PARTIAL_INVERSION_WRT_EQUAL(op_tag)(equal,identity_element,a); \
  373. }
  374. #define DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT(op_tag) \
  375. template<class Type, class TypeB, class TypeC> \
  376. void check_partial_invertive_monoid_wrt_##op_tag \
  377. (const Type& identity_element, \
  378. const Type& a, const TypeB& b, const TypeC& c) \
  379. { \
  380. CHECK_ABELIAN_MONOID_WRT(op_tag)(identity_element,a,b,c); \
  381. CHECK_PARTIAL_INVERSION_WRT(op_tag)(identity_element,a); \
  382. }
  383. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT (plus)
  384. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT_EQUAL(plus)
  385. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT (pipe)
  386. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT_EQUAL(pipe)
  387. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT (et)
  388. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT_EQUAL(et)
  389. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT (caret)
  390. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_WRT_EQUAL(caret)
  391. #define CHECK_PARTIAL_INVERTIVE_MONOID_WRT(op_tag) check_partial_invertive_monoid_wrt_##op_tag
  392. #define CHECK_PARTIAL_INVERTIVE_MONOID_WRT_EQUAL(op_tag) check_partial_invertive_monoid_wrt_equal_##op_tag
  393. //------------------------------------------------------------------------------
  394. // Abelian group EANIC
  395. //------------------------------------------------------------------------------
  396. #define DEFINE_ABELIAN_GROUP_CHECK_WRT_EQUAL(op_tag) \
  397. template<class Type, class TypeB, class TypeC> \
  398. void check_abelian_group_wrt_equal_##op_tag \
  399. (typename equality<Type>::type* equal, const Type& identity_element, \
  400. const Type& a, const TypeB& b, const TypeC& c) \
  401. { \
  402. CHECK_ABELIAN_MONOID_WRT_EQUAL(op_tag)(equal,identity_element,a,b,c); \
  403. CHECK_INVERSE_WRT_EQUAL(op_tag)(equal,identity_element,a); \
  404. }
  405. #define DEFINE_ABELIAN_GROUP_CHECK_WRT(op_tag) \
  406. template<class Type, class TypeB, class TypeC> \
  407. void check_abelian_group_wrt_##op_tag \
  408. (const Type& identity_element, \
  409. const Type& a, const TypeB& b, const TypeC& c) \
  410. { \
  411. CHECK_ABELIAN_MONOID_WRT(op_tag)(identity_element,a,b,c); \
  412. CHECK_INVERSE_WRT(op_tag)(identity_element,a); \
  413. }
  414. DEFINE_ABELIAN_GROUP_CHECK_WRT (plus)
  415. DEFINE_ABELIAN_GROUP_CHECK_WRT_EQUAL(plus)
  416. DEFINE_ABELIAN_GROUP_CHECK_WRT (pipe)
  417. DEFINE_ABELIAN_GROUP_CHECK_WRT_EQUAL(pipe)
  418. #define CHECK_ABELIAN_GROUP_WRT(op_tag) check_abelian_group_wrt_##op_tag
  419. #define CHECK_ABELIAN_GROUP_WRT_EQUAL(op_tag) check_abelian_group_wrt_equal_##op_tag
  420. //------------------------------------------------------------------------------
  421. // Modoid permuted
  422. //------------------------------------------------------------------------------
  423. #define DEFINE_MONOID_CHECK_PERMUTED_WRT_EQUAL(op_tag) \
  424. template<class TypeA, class TypeB, class Assoc> \
  425. void check_monoid_permuted_wrt_equal_##op_tag \
  426. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  427. { \
  428. CHECK_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  429. CHECK_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  430. CHECK_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  431. CHECK_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  432. }
  433. #define DEFINE_MONOID_CHECK_PERMUTED_WRT(op_tag) \
  434. template<class TypeA, class TypeB, class Assoc> \
  435. void check_monoid_permuted_wrt_##op_tag \
  436. (const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  437. { \
  438. CHECK_MONOID_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  439. CHECK_MONOID_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  440. CHECK_MONOID_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  441. CHECK_MONOID_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  442. }
  443. DEFINE_MONOID_CHECK_PERMUTED_WRT (plus)
  444. DEFINE_MONOID_CHECK_PERMUTED_WRT_EQUAL(plus)
  445. DEFINE_MONOID_CHECK_PERMUTED_WRT (pipe)
  446. DEFINE_MONOID_CHECK_PERMUTED_WRT_EQUAL(pipe)
  447. DEFINE_MONOID_CHECK_PERMUTED_WRT (et)
  448. DEFINE_MONOID_CHECK_PERMUTED_WRT_EQUAL(et)
  449. DEFINE_MONOID_CHECK_PERMUTED_WRT (caret)
  450. DEFINE_MONOID_CHECK_PERMUTED_WRT_EQUAL(caret)
  451. #define CHECK_MONOID_PERMUTED_WRT(op_tag) check_monoid_permuted_wrt_##op_tag
  452. #define CHECK_MONOID_PERMUTED_WRT_EQUAL(op_tag) check_monoid_permuted_wrt_equal_##op_tag
  453. //------------------------------------------------------------------------------
  454. // Abelian modoid permuted
  455. //------------------------------------------------------------------------------
  456. #define DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT_EQUAL(op_tag) \
  457. template<class TypeA, class TypeB, class Assoc> \
  458. void check_abelian_monoid_permuted_wrt_equal_##op_tag \
  459. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  460. { \
  461. CHECK_ABELIAN_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  462. CHECK_ABELIAN_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  463. CHECK_ABELIAN_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  464. CHECK_ABELIAN_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  465. }
  466. #define DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT(op_tag) \
  467. template<class TypeA, class TypeB, class Assoc> \
  468. void check_abelian_monoid_permuted_wrt_##op_tag \
  469. (const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  470. { \
  471. CHECK_ABELIAN_MONOID_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  472. CHECK_ABELIAN_MONOID_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  473. CHECK_ABELIAN_MONOID_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  474. CHECK_ABELIAN_MONOID_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  475. }
  476. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT (plus)
  477. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT_EQUAL(plus)
  478. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT (pipe)
  479. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT_EQUAL(pipe)
  480. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT (et)
  481. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT_EQUAL(et)
  482. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT (caret)
  483. DEFINE_ABELIAN_MONOID_CHECK_PERMUTED_WRT_EQUAL(caret)
  484. #define CHECK_ABELIAN_MONOID_PERMUTED_WRT(op_tag) check_abelian_monoid_permuted_wrt_##op_tag
  485. #define CHECK_ABELIAN_MONOID_PERMUTED_WRT_EQUAL(op_tag) check_abelian_monoid_permuted_wrt_equal_##op_tag
  486. //------------------------------------------------------------------------------
  487. // Abelian modoid with partial inversion permuted
  488. //------------------------------------------------------------------------------
  489. #define DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT_EQUAL(op_tag) \
  490. template<class TypeA, class TypeB, class Assoc> \
  491. void check_partial_invertive_monoid_permuted_wrt_equal_##op_tag \
  492. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  493. { \
  494. CHECK_PARTIAL_INVERTIVE_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  495. CHECK_PARTIAL_INVERTIVE_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  496. CHECK_PARTIAL_INVERTIVE_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  497. CHECK_PARTIAL_INVERTIVE_MONOID_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  498. }
  499. #define DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT(op_tag) \
  500. template<class TypeA, class TypeB, class Assoc> \
  501. void check_partial_invertive_monoid_permuted_wrt_##op_tag \
  502. (const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  503. { \
  504. CHECK_PARTIAL_INVERTIVE_MONOID_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  505. CHECK_PARTIAL_INVERTIVE_MONOID_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  506. CHECK_PARTIAL_INVERTIVE_MONOID_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  507. CHECK_PARTIAL_INVERTIVE_MONOID_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  508. }
  509. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT (plus)
  510. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT_EQUAL(plus)
  511. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT (pipe)
  512. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT_EQUAL(pipe)
  513. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT (et)
  514. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT_EQUAL(et)
  515. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT (caret)
  516. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_PERMUTED_WRT_EQUAL(caret)
  517. #define CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT(op_tag) check_partial_invertive_monoid_permuted_wrt_##op_tag
  518. #define CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT_EQUAL(op_tag) check_partial_invertive_monoid_permuted_wrt_equal_##op_tag
  519. //------------------------------------------------------------------------------
  520. // Abelian group permuted
  521. //------------------------------------------------------------------------------
  522. #define DEFINE_ABELIAN_GROUP_CHECK_PERMUTED_WRT_EQUAL(op_tag) \
  523. template<class TypeA, class TypeB, class Assoc> \
  524. void check_abelian_group_permuted_wrt_equal_##op_tag \
  525. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  526. { \
  527. CHECK_ABELIAN_GROUP_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  528. CHECK_ABELIAN_GROUP_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  529. CHECK_ABELIAN_GROUP_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  530. CHECK_ABELIAN_GROUP_WRT_EQUAL(op_tag)(equal, icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  531. }
  532. #define DEFINE_ABELIAN_GROUP_CHECK_PERMUTED_WRT(op_tag) \
  533. template<class TypeA, class TypeB, class Assoc> \
  534. void check_abelian_group_permuted_wrt_##op_tag \
  535. (const TypeA& var_a, const TypeB& var_b, const Assoc& assoc) \
  536. { \
  537. CHECK_ABELIAN_GROUP_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, var_b, assoc);\
  538. CHECK_ABELIAN_GROUP_WRT(op_tag)(icl::identity_element<TypeA>::value(), var_a, assoc, var_b);\
  539. CHECK_ABELIAN_GROUP_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, var_a, assoc);\
  540. CHECK_ABELIAN_GROUP_WRT(op_tag)(icl::identity_element<TypeB>::value(), var_b, assoc, var_a);\
  541. }
  542. DEFINE_ABELIAN_GROUP_CHECK_PERMUTED_WRT (plus)
  543. DEFINE_ABELIAN_GROUP_CHECK_PERMUTED_WRT_EQUAL(plus)
  544. DEFINE_ABELIAN_GROUP_CHECK_PERMUTED_WRT (pipe)
  545. DEFINE_ABELIAN_GROUP_CHECK_PERMUTED_WRT_EQUAL(pipe)
  546. #define CHECK_ABELIAN_GROUP_PERMUTED_WRT(op_tag) check_abelian_group_permuted_wrt_##op_tag
  547. #define CHECK_ABELIAN_GROUP_PERMUTED_WRT_EQUAL(op_tag) check_abelian_group_permuted_wrt_equal_##op_tag
  548. //------------------------------------------------------------------------------
  549. // Modoid instance
  550. //------------------------------------------------------------------------------
  551. #define DEFINE_MONOID_CHECK_INSTANCE_WRT_EQUAL(op_tag) \
  552. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  553. void check_monoid_instance_wrt_equal_##op_tag \
  554. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  555. const AssocA& ass_a, const AssocB& ass_b) \
  556. { \
  557. CHECK_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, var_c);\
  558. CHECK_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_a);\
  559. CHECK_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_b);\
  560. }
  561. #define DEFINE_MONOID_CHECK_INSTANCE_WRT(op_tag) \
  562. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  563. void check_monoid_instance_wrt_##op_tag \
  564. (const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  565. const AssocA& ass_a, const AssocB& ass_b) \
  566. { \
  567. CHECK_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, var_c);\
  568. CHECK_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, ass_a);\
  569. CHECK_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, ass_b);\
  570. }
  571. DEFINE_MONOID_CHECK_INSTANCE_WRT (plus)
  572. DEFINE_MONOID_CHECK_INSTANCE_WRT_EQUAL(plus)
  573. DEFINE_MONOID_CHECK_INSTANCE_WRT (pipe)
  574. DEFINE_MONOID_CHECK_INSTANCE_WRT_EQUAL(pipe)
  575. DEFINE_MONOID_CHECK_INSTANCE_WRT (et)
  576. DEFINE_MONOID_CHECK_INSTANCE_WRT_EQUAL(et)
  577. DEFINE_MONOID_CHECK_INSTANCE_WRT (caret)
  578. DEFINE_MONOID_CHECK_INSTANCE_WRT_EQUAL(caret)
  579. #define CHECK_MONOID_INSTANCE_WRT(op_tag) check_monoid_instance_wrt_##op_tag
  580. #define CHECK_MONOID_INSTANCE_WRT_EQUAL(op_tag) check_monoid_instance_wrt_equal_##op_tag
  581. //------------------------------------------------------------------------------
  582. // Abelian modoid instance
  583. //------------------------------------------------------------------------------
  584. #define DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT_EQUAL(op_tag) \
  585. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  586. void check_abelian_monoid_instance_wrt_equal_##op_tag \
  587. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  588. const AssocA& ass_a, const AssocB& ass_b) \
  589. { \
  590. CHECK_ABELIAN_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, var_c);\
  591. CHECK_ABELIAN_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_a);\
  592. CHECK_ABELIAN_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_b);\
  593. }
  594. #define DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT(op_tag) \
  595. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  596. void check_abelian_monoid_instance_wrt_##op_tag \
  597. (const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  598. const AssocA& ass_a, const AssocB& ass_b) \
  599. { \
  600. CHECK_ABELIAN_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, var_c);\
  601. CHECK_ABELIAN_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, ass_a);\
  602. CHECK_ABELIAN_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, ass_b);\
  603. }
  604. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT (plus)
  605. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT_EQUAL(plus)
  606. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT (pipe)
  607. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT_EQUAL(pipe)
  608. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT (et)
  609. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT_EQUAL(et)
  610. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT (caret)
  611. DEFINE_ABELIAN_MONOID_CHECK_INSTANCE_WRT_EQUAL(caret)
  612. #define CHECK_ABELIAN_MONOID_INSTANCE_WRT(op_tag) check_abelian_monoid_instance_wrt_##op_tag
  613. #define CHECK_ABELIAN_MONOID_INSTANCE_WRT_EQUAL(op_tag) check_abelian_monoid_instance_wrt_equal_##op_tag
  614. //------------------------------------------------------------------------------
  615. // Abelian partial invertive modoid instance
  616. //------------------------------------------------------------------------------
  617. #define DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT_EQUAL(op_tag) \
  618. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  619. void check_partial_invertive_monoid_instance_wrt_equal_##op_tag \
  620. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  621. const AssocA& ass_a, const AssocB& ass_b) \
  622. { \
  623. CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, var_c);\
  624. CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_a);\
  625. CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_b);\
  626. }
  627. #define DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT(op_tag) \
  628. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  629. void check_partial_invertive_monoid_instance_wrt_##op_tag \
  630. (const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  631. const AssocA& ass_a, const AssocB& ass_b) \
  632. { \
  633. CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, var_c);\
  634. CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, ass_a);\
  635. CHECK_PARTIAL_INVERTIVE_MONOID_PERMUTED_WRT(op_tag)(var_a, var_b, ass_b);\
  636. }
  637. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT (plus)
  638. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT_EQUAL(plus)
  639. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT (pipe)
  640. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT_EQUAL(pipe)
  641. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT (et)
  642. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT_EQUAL(et)
  643. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT (caret)
  644. DEFINE_PARTIAL_INVERTIVE_MONOID_CHECK_INSTANCE_WRT_EQUAL(caret)
  645. #define CHECK_PARTIAL_INVERTIVE_MONOID_INSTANCE_WRT(op_tag) check_partial_invertive_monoid_instance_wrt_##op_tag
  646. #define CHECK_PARTIAL_INVERTIVE_MONOID_INSTANCE_WRT_EQUAL(op_tag) check_partial_invertive_monoid_instance_wrt_equal_##op_tag
  647. //------------------------------------------------------------------------------
  648. // Abelian group instance
  649. //------------------------------------------------------------------------------
  650. #define DEFINE_ABELIAN_GROUP_CHECK_INSTANCE_WRT_EQUAL(op_tag) \
  651. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  652. void check_abelian_group_instance_wrt_equal_##op_tag \
  653. (typename equality<TypeA>::type* equal, const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  654. const AssocA& ass_a, const AssocB& ass_b) \
  655. { \
  656. CHECK_ABELIAN_GROUP_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, var_c);\
  657. CHECK_ABELIAN_GROUP_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_a);\
  658. CHECK_ABELIAN_GROUP_PERMUTED_WRT_EQUAL(op_tag)(equal, var_a, var_b, ass_b);\
  659. }
  660. #define DEFINE_ABELIAN_GROUP_CHECK_INSTANCE_WRT(op_tag) \
  661. template<class TypeA, class TypeB, class TypeC, class AssocA, class AssocB> \
  662. void check_abelian_group_instance_wrt_##op_tag \
  663. (const TypeA& var_a, const TypeB& var_b, const TypeC& var_c, \
  664. const AssocA& ass_a, const AssocB& ass_b) \
  665. { \
  666. CHECK_ABELIAN_GROUP_PERMUTED_WRT(op_tag)(var_a, var_b, var_c);\
  667. CHECK_ABELIAN_GROUP_PERMUTED_WRT(op_tag)(var_a, var_b, ass_a);\
  668. CHECK_ABELIAN_GROUP_PERMUTED_WRT(op_tag)(var_a, var_b, ass_b);\
  669. }
  670. DEFINE_ABELIAN_GROUP_CHECK_INSTANCE_WRT (plus)
  671. DEFINE_ABELIAN_GROUP_CHECK_INSTANCE_WRT_EQUAL(plus)
  672. DEFINE_ABELIAN_GROUP_CHECK_INSTANCE_WRT (pipe)
  673. DEFINE_ABELIAN_GROUP_CHECK_INSTANCE_WRT_EQUAL(pipe)
  674. #define CHECK_ABELIAN_GROUP_INSTANCE_WRT(op_tag) check_abelian_group_instance_wrt_##op_tag
  675. #define CHECK_ABELIAN_GROUP_INSTANCE_WRT_EQUAL(op_tag) check_abelian_group_instance_wrt_equal_##op_tag
  676. }} // namespace icl boost
  677. #endif // BOOST_LIBS_ICL_TEST_ICL_LAWS_HPP_JOFA_090119