end.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Boost.Range library
  2. //
  3. // Copyright Neil Groves 2010. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // For more information, see http://www.boost.org/libs/range/
  9. //
  10. #include <boost/detail/workaround.hpp>
  11. #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
  12. # pragma warn -8091 // suppress warning in Boost.Test
  13. # pragma warn -8057 // unused argument argc/argv in Boost.Test
  14. #endif
  15. #include <boost/range/end.hpp>
  16. #include <boost/test/unit_test.hpp>
  17. #include <boost/test/test_tools.hpp>
  18. #include <boost/test/included/unit_test.hpp>
  19. namespace mock_std
  20. {
  21. template<class SinglePassRange>
  22. inline BOOST_DEDUCED_TYPENAME boost::range_iterator<SinglePassRange>::type
  23. end(SinglePassRange& rng)
  24. {
  25. return rng.end();
  26. }
  27. template<class SinglePassRange>
  28. inline BOOST_DEDUCED_TYPENAME boost::range_iterator<const SinglePassRange>::type
  29. end(const SinglePassRange& rng)
  30. {
  31. return rng.end();
  32. }
  33. template<class SinglePassRange>
  34. void mock_algorithm_using_end(const SinglePassRange& rng)
  35. {
  36. BOOST_CHECK( end(rng) == rng.end() );
  37. }
  38. template<class SinglePassRange>
  39. void mock_algorithm_using_end(SinglePassRange& rng)
  40. {
  41. BOOST_CHECK( end(rng) == rng.end() );
  42. }
  43. }
  44. namespace boost
  45. {
  46. #ifdef BOOST_RANGE_SIMULATE_END_WITHOUT_ADL_NAMESPACE_BARRIER
  47. template<class SinglePassRange>
  48. inline BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type
  49. end(SinglePassRange& rng)
  50. {
  51. return rng.end();
  52. }
  53. template<class SinglePassRange>
  54. inline BOOST_DEDUCED_TYPENAME range_iterator<const SinglePassRange>::type
  55. end(const SinglePassRange& rng)
  56. {
  57. return rng.end();
  58. }
  59. #endif
  60. class MockTestEndCollection
  61. {
  62. public:
  63. typedef char value_type;
  64. typedef const char* const_pointer;
  65. typedef char* pointer;
  66. typedef const_pointer const_iterator;
  67. typedef pointer iterator;
  68. MockTestEndCollection()
  69. : m_first()
  70. , m_last()
  71. {
  72. }
  73. const_iterator begin() const { return m_first; }
  74. iterator begin() { return m_first; }
  75. const_iterator end() const { return m_last; }
  76. iterator end() { return m_last; }
  77. private:
  78. iterator m_first;
  79. iterator m_last;
  80. };
  81. }
  82. namespace
  83. {
  84. void test_range_end_adl_avoidance()
  85. {
  86. boost::MockTestEndCollection c;
  87. const boost::MockTestEndCollection& const_c = c;
  88. mock_std::mock_algorithm_using_end(const_c);
  89. mock_std::mock_algorithm_using_end(c);
  90. }
  91. }
  92. using boost::unit_test::test_suite;
  93. boost::unit_test::test_suite*
  94. init_unit_test_suite( int argc, char* argv[] )
  95. {
  96. boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite - end() ADL namespace barrier" );
  97. test->add( BOOST_TEST_CASE( &test_range_end_adl_avoidance ) );
  98. return test;
  99. }