test_relation.hpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. // Boost.Bimap
  2. //
  3. // Copyright (c) 2006-2007 Matias Capeletto
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. #ifndef BOOST_BIMAP_TEST_TEST_RELATION_HPP
  9. #define BOOST_BIMAP_TEST_TEST_RELATION_HPP
  10. #if defined(_MSC_VER)
  11. #pragma once
  12. #endif
  13. #include <boost/config.hpp>
  14. // Boost.Test
  15. #include <boost/test/minimal.hpp>
  16. // Boost.MPL
  17. #include <boost/mpl/assert.hpp>
  18. #include <boost/type_traits/is_same.hpp>
  19. // Boost.Bimap
  20. #include <boost/bimap/detail/test/check_metadata.hpp>
  21. #include <boost/bimap/tags/tagged.hpp>
  22. // Boost.Bimap.Relation
  23. #include <boost/bimap/relation/member_at.hpp>
  24. #include <boost/bimap/relation/support/get.hpp>
  25. #include <boost/bimap/relation/support/pair_by.hpp>
  26. #include <boost/bimap/relation/support/pair_type_by.hpp>
  27. #include <boost/bimap/relation/support/value_type_of.hpp>
  28. #include <boost/bimap/relation/support/member_with_tag.hpp>
  29. #include <boost/bimap/relation/support/is_tag_of_member_at.hpp>
  30. template< class Relation >
  31. void test_relation_with_default_tags(Relation & rel,
  32. const typename Relation::left_value_type & lv,
  33. const typename Relation::right_value_type & rv)
  34. {
  35. using namespace boost::bimaps::relation::support;
  36. using namespace boost::bimaps::relation;
  37. using namespace boost::bimaps::tags;
  38. // It must work with normal tags
  39. BOOST_CHECK( pair_by<member_at::left >(rel).first == lv );
  40. BOOST_CHECK( pair_by<member_at::left >(rel).second == rv );
  41. BOOST_CHECK( pair_by<member_at::right>(rel).first == rv );
  42. BOOST_CHECK( pair_by<member_at::right>(rel).second == lv );
  43. BOOST_CHECK( get<member_at::left >(rel) == rel.left );
  44. BOOST_CHECK( get<member_at::right>(rel) == rel.right );
  45. BOOST_CHECK(
  46. get<member_at::left >(pair_by<member_at::left >(rel)) == rel.left
  47. );
  48. BOOST_CHECK(
  49. get<member_at::right>(pair_by<member_at::left >(rel)) == rel.right
  50. );
  51. BOOST_CHECK(
  52. get<member_at::left >(pair_by<member_at::right>(rel)) == rel.left
  53. );
  54. BOOST_CHECK(
  55. get<member_at::right>(pair_by<member_at::right>(rel)) == rel.right
  56. );
  57. }
  58. template< class Relation, class LeftTag, class RightTag >
  59. void test_relation_with_user_tags(Relation & rel,
  60. const typename Relation::left_value_type & lv,
  61. const typename Relation::right_value_type & rv)
  62. {
  63. using namespace boost::bimaps::relation::support;
  64. using namespace boost::bimaps::relation;
  65. using namespace boost::bimaps::tags;
  66. // And with users ones
  67. BOOST_CHECK( pair_by<LeftTag >(rel).first == lv );
  68. BOOST_CHECK( pair_by<LeftTag >(rel).second == rv );
  69. BOOST_CHECK( pair_by<RightTag>(rel).first == rv );
  70. BOOST_CHECK( pair_by<RightTag>(rel).second == lv );
  71. BOOST_CHECK( get<LeftTag >(rel) == rel.left );
  72. BOOST_CHECK( get<RightTag>(rel) == rel.right );
  73. BOOST_CHECK( get<LeftTag >(pair_by<LeftTag >(rel)) == rel.left );
  74. BOOST_CHECK( get<RightTag>(pair_by<LeftTag >(rel)) == rel.right );
  75. BOOST_CHECK( get<LeftTag >(pair_by<RightTag>(rel)) == rel.left );
  76. BOOST_CHECK( get<RightTag>(pair_by<RightTag>(rel)) == rel.right );
  77. //----------------------------------------------------------------
  78. BOOST_CHECK( rel.template get<LeftTag >() == rel.left );
  79. BOOST_CHECK( rel.template get<RightTag>() == rel.right );
  80. BOOST_CHECK( pair_by<LeftTag >(rel).template get<LeftTag >()== rel.left );
  81. BOOST_CHECK( pair_by<LeftTag >(rel).template get<RightTag>()== rel.right);
  82. BOOST_CHECK( pair_by<RightTag>(rel).template get<LeftTag >()== rel.left );
  83. BOOST_CHECK( pair_by<RightTag>(rel).template get<RightTag>()== rel.right);
  84. }
  85. struct left_user_tag {};
  86. struct right_user_tag {};
  87. template< class RelationBuilder, class LeftData, class RightData >
  88. void test_relation(const LeftData & lv, const RightData & rv)
  89. {
  90. using namespace boost::bimaps::relation::support;
  91. using namespace boost::bimaps::relation;
  92. using boost::bimaps::tags::tagged;
  93. // Untagged test
  94. {
  95. typedef typename RelationBuilder::template build
  96. <
  97. LeftData,
  98. RightData
  99. >::type rel_type;
  100. rel_type rel( lv, rv );
  101. test_relation_with_default_tags( rel, lv, rv);
  102. }
  103. // Tagged test
  104. {
  105. typedef typename RelationBuilder::template build
  106. <
  107. tagged<LeftData , left_user_tag >,
  108. tagged<RightData, right_user_tag >
  109. >::type rel_type;
  110. rel_type rel( lv, rv );
  111. test_relation_with_default_tags(rel, lv, rv );
  112. test_relation_with_user_tags
  113. <
  114. rel_type,
  115. left_user_tag,right_user_tag
  116. >(rel,lv,rv);
  117. }
  118. // Default Constructor, Constructor from views and some operators
  119. {
  120. /*
  121. typedef typename RelationBuilder::template build
  122. <
  123. tagged<LeftData , left_user_tag >,
  124. tagged<RightData, right_user_tag >
  125. >::type rel_type;
  126. typedef typename pair_type_by< left_user_tag,rel_type>::type left_pair;
  127. typedef typename pair_type_by<right_user_tag,rel_type>::type right_pair;
  128. rel_type rel_from_left ( left_pair(lv,rv) );
  129. rel_type rel_from_right( right_pair(rv,lv) );
  130. BOOST_CHECK( rel_from_left == rel_from_right );
  131. BOOST_CHECK( rel_from_left == rel_type(lv,rv) );
  132. rel_type rel;
  133. rel = rel_from_left;
  134. BOOST_CHECK( rel == rel_from_left );
  135. */
  136. }
  137. }
  138. #endif // BOOST_BIMAP_TEST_TEST_RELATION_HPP