From 23e5801e2a590084ae31ce027c3498f97a8d71d1 Mon Sep 17 00:00:00 2001 From: Daniela Engert Date: Thu, 4 May 2017 18:36:40 +0200 Subject: [PATCH] Conditionally replace deprecated/removed C++98 function adapters and std::random_shuffle by equivalents. Signed-off-by: Daniela Engert --- .../boost/range/algorithm/random_shuffle.hpp | 81 ++++++++++++++++++- test/ticket_5486.cpp | 6 +- 2 files changed, 81 insertions(+), 6 deletions(-) diff --git a/include/boost/range/algorithm/random_shuffle.hpp b/include/boost/range/algorithm/random_shuffle.hpp index 95bbd97..2475173 100644 --- a/include/boost/range/algorithm/random_shuffle.hpp +++ b/include/boost/range/algorithm/random_shuffle.hpp @@ -14,12 +14,85 @@ #include #include #include +#ifdef BOOST_NO_CXX98_RANDOM_SHUFFLE +#include +#endif namespace boost { namespace range { + namespace detail + { +#ifdef BOOST_NO_CXX98_RANDOM_SHUFFLE + +// wrap std::rand as UniformRandomBitGenerator +struct wrap_rand +{ + typedef unsigned int result_type; + + static result_type (min)() + { + return 0; + } + + static result_type (max)() + { + return RAND_MAX; + } + + result_type operator()() + { + return std::rand(); + } +}; + +template< class RandomIt > +inline void random_shuffle(RandomIt first, RandomIt last) +{ + std::shuffle(first, last, wrap_rand()); +} + +// wrap Generator as UniformRandomBitGenerator +template< class Generator > +struct wrap_generator +{ + typedef unsigned int result_type; + static const int max_arg = ((0u - 1u) >> 2) + 1; + Generator& g; + + wrap_generator(Generator& gen) : g(gen) {} + + static result_type (min)() + { + return 0; + } + + static result_type (max)() + { + return max_arg - 1; + } + + result_type operator()() + { + return static_cast(g(max_arg)); + } +}; + +template< class RandomIt, class Generator > +inline void random_shuffle(RandomIt first, RandomIt last, Generator& gen) +{ + std::shuffle(first, last, wrap_generator< Generator >(gen)); +} + +#else + +using std::random_shuffle; + +#endif + } // namespace detail + /// \brief template function random_shuffle /// /// range-based version of the random_shuffle std algorithm @@ -30,7 +103,7 @@ template inline RandomAccessRange& random_shuffle(RandomAccessRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept )); - std::random_shuffle(boost::begin(rng), boost::end(rng)); + detail::random_shuffle(boost::begin(rng), boost::end(rng)); return rng; } @@ -39,7 +112,7 @@ template inline const RandomAccessRange& random_shuffle(const RandomAccessRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept )); - std::random_shuffle(boost::begin(rng), boost::end(rng)); + detail::random_shuffle(boost::begin(rng), boost::end(rng)); return rng; } @@ -48,7 +121,7 @@ template inline RandomAccessRange& random_shuffle(RandomAccessRange& rng, Generator& gen) { BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept )); - std::random_shuffle(boost::begin(rng), boost::end(rng), gen); + detail::random_shuffle(boost::begin(rng), boost::end(rng), gen); return rng; } @@ -57,7 +130,7 @@ template inline const RandomAccessRange& random_shuffle(const RandomAccessRange& rng, Generator& gen) { BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept )); - std::random_shuffle(boost::begin(rng), boost::end(rng), gen); + detail::random_shuffle(boost::begin(rng), boost::end(rng), gen); return rng; } diff --git a/test/ticket_5486.cpp b/test/ticket_5486.cpp index 3a6bf4b..94d8dd4 100644 --- a/test/ticket_5486.cpp +++ b/test/ticket_5486.cpp @@ -14,7 +14,6 @@ #include #include -#include #include namespace boost @@ -22,9 +21,12 @@ namespace boost namespace { class TestTicket5486Pred - : public std::binary_function { public: + typedef int first_argument_type; + typedef int second_argument_type; + typedef bool result_type; + explicit TestTicket5486Pred(int x) {} bool operator()(int,int) const { return true; } private: