Use std::shuffle instead of (deprecated) std::random_shuffle if C++14 detected

This commit is contained in:
Phil Nash 2016-06-09 08:15:57 +01:00
parent a74d760d74
commit be3570ef22
2 changed files with 34 additions and 11 deletions

View File

@ -36,8 +36,16 @@
// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 // All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11
#if defined(__cplusplus) && __cplusplus >= 201103L #ifdef __cplusplus
# define CATCH_CPP11_OR_GREATER
# if __cplusplus >= 201103L
# define CATCH_CPP11_OR_GREATER
# endif
# if __cplusplus >= 201402L
# define CATCH_CPP14_OR_GREATER
# endif
#endif #endif
#ifdef __clang__ #ifdef __clang__

View File

@ -19,13 +19,30 @@
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
namespace Catch { #ifdef CATCH_CPP14_OR_GREATER
#include <random>
#endif
struct LexSort { namespace Catch {
bool operator() (TestCase i,TestCase j) const { return (i<j);}
};
struct RandomNumberGenerator { struct RandomNumberGenerator {
int operator()( int n ) const { return std::rand() % n; } typedef int result_type;
result_type operator()( result_type n ) const { return std::rand() % n; }
#ifdef CATCH_CPP14_OR_GREATER
static constexpr result_type min() { return 0; }
static constexpr result_type max() { return 1000000; }
result_type operator()() const { return std::rand() % max(); }
#endif
template<typename V>
static void shuffle( V& vector ) {
#ifdef CATCH_CPP14_OR_GREATER
std::shuffle( vector.begin(), vector.end(), RandomNumberGenerator() );
#else
std::random_shuffle( vector.begin(), vector.end(), RandomNumberGenerator() );
#endif
}
}; };
inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) { inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
@ -34,14 +51,12 @@ namespace Catch {
switch( config.runOrder() ) { switch( config.runOrder() ) {
case RunTests::InLexicographicalOrder: case RunTests::InLexicographicalOrder:
std::sort( sorted.begin(), sorted.end(), LexSort() ); std::sort( sorted.begin(), sorted.end() );
break; break;
case RunTests::InRandomOrder: case RunTests::InRandomOrder:
{ {
seedRng( config ); seedRng( config );
RandomNumberGenerator::shuffle( sorted );
RandomNumberGenerator rng;
std::random_shuffle( sorted.begin(), sorted.end(), rng );
} }
break; break;
case RunTests::InDeclarationOrder: case RunTests::InDeclarationOrder: