Conditionally replace deprecated/removed C++98 function adapters and std::random_shuffle by equivalents.

Signed-off-by: Daniela Engert <dani@ngrt.de>
This commit is contained in:
Daniela Engert
2017-05-04 18:36:40 +02:00
parent 452b1bb7e7
commit 23e5801e2a
2 changed files with 81 additions and 6 deletions

View File

@ -14,12 +14,85 @@
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/concepts.hpp> #include <boost/range/concepts.hpp>
#include <algorithm> #include <algorithm>
#ifdef BOOST_NO_CXX98_RANDOM_SHUFFLE
#include <cstdlib>
#endif
namespace boost namespace boost
{ {
namespace range 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<result_type>(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 /// \brief template function random_shuffle
/// ///
/// range-based version of the random_shuffle std algorithm /// range-based version of the random_shuffle std algorithm
@ -30,7 +103,7 @@ template<class RandomAccessRange>
inline RandomAccessRange& random_shuffle(RandomAccessRange& rng) inline RandomAccessRange& random_shuffle(RandomAccessRange& rng)
{ {
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<RandomAccessRange> )); BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<RandomAccessRange> ));
std::random_shuffle(boost::begin(rng), boost::end(rng)); detail::random_shuffle(boost::begin(rng), boost::end(rng));
return rng; return rng;
} }
@ -39,7 +112,7 @@ template<class RandomAccessRange>
inline const RandomAccessRange& random_shuffle(const RandomAccessRange& rng) inline const RandomAccessRange& random_shuffle(const RandomAccessRange& rng)
{ {
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<const RandomAccessRange> )); BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<const RandomAccessRange> ));
std::random_shuffle(boost::begin(rng), boost::end(rng)); detail::random_shuffle(boost::begin(rng), boost::end(rng));
return rng; return rng;
} }
@ -48,7 +121,7 @@ template<class RandomAccessRange, class Generator>
inline RandomAccessRange& random_shuffle(RandomAccessRange& rng, Generator& gen) inline RandomAccessRange& random_shuffle(RandomAccessRange& rng, Generator& gen)
{ {
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<RandomAccessRange> )); BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<RandomAccessRange> ));
std::random_shuffle(boost::begin(rng), boost::end(rng), gen); detail::random_shuffle(boost::begin(rng), boost::end(rng), gen);
return rng; return rng;
} }
@ -57,7 +130,7 @@ template<class RandomAccessRange, class Generator>
inline const RandomAccessRange& random_shuffle(const RandomAccessRange& rng, Generator& gen) inline const RandomAccessRange& random_shuffle(const RandomAccessRange& rng, Generator& gen)
{ {
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<const RandomAccessRange> )); BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<const RandomAccessRange> ));
std::random_shuffle(boost::begin(rng), boost::end(rng), gen); detail::random_shuffle(boost::begin(rng), boost::end(rng), gen);
return rng; return rng;
} }

View File

@ -14,7 +14,6 @@
#include <boost/test/test_tools.hpp> #include <boost/test/test_tools.hpp>
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
#include <functional>
#include <vector> #include <vector>
namespace boost namespace boost
@ -22,9 +21,12 @@ namespace boost
namespace namespace
{ {
class TestTicket5486Pred class TestTicket5486Pred
: public std::binary_function<int,int,bool>
{ {
public: public:
typedef int first_argument_type;
typedef int second_argument_type;
typedef bool result_type;
explicit TestTicket5486Pred(int x) {} explicit TestTicket5486Pred(int x) {}
bool operator()(int,int) const { return true; } bool operator()(int,int) const { return true; }
private: private: