utilities.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include <catch.hpp>
  2. #include <zmq.hpp>
  3. #if defined(ZMQ_CPP11) && !defined(ZMQ_CPP11_PARTIAL)
  4. namespace test_ns
  5. {
  6. struct T_nr
  7. {
  8. };
  9. struct T_mr
  10. {
  11. void *begin() const noexcept { return nullptr; }
  12. void *end() const noexcept { return nullptr; }
  13. };
  14. struct T_fr
  15. {
  16. };
  17. inline void *begin(const T_fr &) noexcept
  18. {
  19. return nullptr;
  20. }
  21. inline void *end(const T_fr &) noexcept
  22. {
  23. return nullptr;
  24. }
  25. struct T_mfr
  26. {
  27. void *begin() const noexcept { return nullptr; }
  28. void *end() const noexcept { return nullptr; }
  29. };
  30. inline void *begin(const T_mfr &) noexcept
  31. {
  32. return nullptr;
  33. }
  34. inline void *end(const T_mfr &) noexcept
  35. {
  36. return nullptr;
  37. }
  38. // types with associated namespace std
  39. struct T_assoc_ns_nr : std::exception
  40. {
  41. };
  42. struct T_assoc_ns_mr : std::exception
  43. {
  44. void *begin() const noexcept { return nullptr; }
  45. void *end() const noexcept { return nullptr; }
  46. };
  47. struct T_assoc_ns_fr : std::exception
  48. {
  49. };
  50. inline void *begin(const T_assoc_ns_fr &) noexcept
  51. {
  52. return nullptr;
  53. }
  54. inline void *end(const T_assoc_ns_fr &) noexcept
  55. {
  56. return nullptr;
  57. }
  58. struct T_assoc_ns_mfr : std::exception
  59. {
  60. void *begin() const noexcept { return nullptr; }
  61. void *end() const noexcept { return nullptr; }
  62. };
  63. inline void *begin(const T_assoc_ns_mfr &) noexcept
  64. {
  65. return nullptr;
  66. }
  67. inline void *end(const T_assoc_ns_mfr &) noexcept
  68. {
  69. return nullptr;
  70. }
  71. } // namespace test_ns
  72. TEST_CASE("range SFINAE", "[utilities]")
  73. {
  74. CHECK(!zmq::detail::is_range<int>::value);
  75. CHECK(zmq::detail::is_range<std::string>::value);
  76. CHECK(zmq::detail::is_range<std::string &>::value);
  77. CHECK(zmq::detail::is_range<const std::string &>::value);
  78. CHECK(zmq::detail::is_range<decltype("hello")>::value);
  79. CHECK(zmq::detail::is_range<std::initializer_list<int>>::value);
  80. CHECK(!zmq::detail::is_range<test_ns::T_nr>::value);
  81. CHECK(zmq::detail::is_range<test_ns::T_mr>::value);
  82. CHECK(zmq::detail::is_range<test_ns::T_fr>::value);
  83. CHECK(zmq::detail::is_range<test_ns::T_mfr>::value);
  84. CHECK(!zmq::detail::is_range<test_ns::T_assoc_ns_nr>::value);
  85. CHECK(zmq::detail::is_range<test_ns::T_assoc_ns_mr>::value);
  86. CHECK(zmq::detail::is_range<test_ns::T_assoc_ns_fr>::value);
  87. CHECK(zmq::detail::is_range<test_ns::T_assoc_ns_mfr>::value);
  88. }
  89. #endif