test_key.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /* Boost.MultiIndex test for terse key specification syntax.
  2. *
  3. * Copyright 2003-2019 Joaquin M Lopez Munoz.
  4. * Distributed under the Boost Software License, Version 1.0.
  5. * (See accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * See http://www.boost.org/libs/multi_index for library home page.
  9. */
  10. #include "test_key.hpp"
  11. #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
  12. #include <boost/detail/lightweight_test.hpp>
  13. #include "pre_multi_index.hpp"
  14. #include <boost/multi_index/key.hpp>
  15. #if !defined(BOOST_MULTI_INDEX_KEY_SUPPORTED)
  16. #include <boost/config/pragma_message.hpp>
  17. BOOST_PRAGMA_MESSAGE("boost::multi_index::key not supported, skipping test")
  18. void test_key()
  19. {
  20. }
  21. #else
  22. #include <functional>
  23. #include <type_traits>
  24. using namespace boost::multi_index;
  25. namespace {
  26. struct base
  27. {
  28. int x;
  29. const int cx;
  30. int f(){return x;};
  31. int cf()const{return x;};
  32. int vf()volatile{return x;};
  33. int cvf()const volatile{return x;};
  34. int rf()&{return x;};
  35. int crf()const&{return x;};
  36. int vrf()volatile&{return x;};
  37. int cvrf()const volatile&{return x;};
  38. int nef()noexcept{return x;};
  39. int cnef()const noexcept{return x;};
  40. int vnef()volatile noexcept{return x;};
  41. int cvnef()const volatile noexcept{return x;};
  42. int rnef()& noexcept{return x;};
  43. int crnef()const& noexcept{return x;};
  44. int vrnef()volatile& noexcept{return x;};
  45. int cvrnef()const volatile& noexcept{return x;};
  46. };
  47. int gf(const base& b){return b.x;}
  48. int negf(const base& b)noexcept{return b.x;}
  49. struct derived:base
  50. {
  51. int y;
  52. };
  53. int gh(derived& d){return d.y;}
  54. int grh(std::reference_wrapper<derived>& d){return d.get().y;}
  55. } /* namespace */
  56. void test_key()
  57. {
  58. BOOST_TEST((std::is_same<
  59. key<&base::x>,member<base,int,&base::x>
  60. >::value));
  61. BOOST_TEST((std::is_same<
  62. key<&base::cx>,member<base,const int,&base::cx>
  63. >::value));
  64. BOOST_TEST((std::is_same<
  65. key<&base::f>,mem_fun<base,int,&base::f>
  66. >::value));
  67. BOOST_TEST((std::is_same<
  68. key<&base::cf>,const_mem_fun<base,int,&base::cf>
  69. >::value));
  70. BOOST_TEST((std::is_same<
  71. key<&base::vf>,volatile_mem_fun<base,int,&base::vf>
  72. >::value));
  73. BOOST_TEST((std::is_same<
  74. key<&base::cvf>,cv_mem_fun<base,int,&base::cvf>
  75. >::value));
  76. BOOST_TEST((std::is_same<
  77. key<&base::rf>,ref_mem_fun<base,int,&base::rf>
  78. >::value));
  79. BOOST_TEST((std::is_same<
  80. key<&base::crf>,cref_mem_fun<base,int,&base::crf>
  81. >::value));
  82. BOOST_TEST((std::is_same<
  83. key<&base::vrf>,vref_mem_fun<base,int,&base::vrf>
  84. >::value));
  85. BOOST_TEST((std::is_same<
  86. key<&base::cvrf>,cvref_mem_fun<base,int,&base::cvrf>
  87. >::value));
  88. BOOST_TEST((std::is_same<
  89. key<&base::nef>,mem_fun<base,int,&base::nef>
  90. >::value));
  91. BOOST_TEST((std::is_same<
  92. key<&base::cnef>,const_mem_fun<base,int,&base::cnef>
  93. >::value));
  94. BOOST_TEST((std::is_same<
  95. key<&base::vnef>,volatile_mem_fun<base,int,&base::vnef>
  96. >::value));
  97. BOOST_TEST((std::is_same<
  98. key<&base::cvnef>,cv_mem_fun<base,int,&base::cvnef>
  99. >::value));
  100. BOOST_TEST((std::is_same<
  101. key<&base::rnef>,ref_mem_fun<base,int,&base::rnef>
  102. >::value));
  103. BOOST_TEST((std::is_same<
  104. key<&base::crnef>,cref_mem_fun<base,int,&base::crnef>
  105. >::value));
  106. BOOST_TEST((std::is_same<
  107. key<&base::vrnef>,vref_mem_fun<base,int,&base::vrnef>
  108. >::value));
  109. BOOST_TEST((std::is_same<
  110. key<&base::cvrnef>,cvref_mem_fun<base,int,&base::cvrnef>
  111. >::value));
  112. BOOST_TEST((std::is_same<
  113. key<gf>,global_fun<const base&,int,gf>
  114. >::value));
  115. BOOST_TEST((std::is_same<
  116. key<negf>,global_fun<const base&,int,negf>
  117. >::value));
  118. BOOST_TEST((std::is_same<
  119. key<&base::x,&base::cx,&base::f,&base::cf,gf>,
  120. composite_key<
  121. base,
  122. member<base,int,&base::x>,
  123. member<base,const int,&base::cx>,
  124. mem_fun<base,int,&base::f>,
  125. const_mem_fun<base,int,&base::cf>,
  126. global_fun<const base&,int,gf>
  127. >
  128. >::value));
  129. BOOST_TEST((std::is_same<
  130. key<&base::x,&derived::y>,
  131. composite_key<
  132. derived,
  133. member<base,int,&base::x>,
  134. member<derived,int,&derived::y>
  135. >
  136. >::value));
  137. BOOST_TEST((std::is_same<
  138. key<gf,gh>,
  139. composite_key<
  140. derived,
  141. global_fun<const base&,int,gf>,
  142. global_fun<derived&,int,gh>
  143. >
  144. >::value));
  145. BOOST_TEST((std::is_same<
  146. key<gf,gh,grh>,
  147. composite_key<
  148. std::reference_wrapper<derived>,
  149. global_fun<const base&,int,gf>,
  150. global_fun<derived&,int,gh>,
  151. global_fun<std::reference_wrapper<derived>&,int,grh>
  152. >
  153. >::value));
  154. }
  155. #endif