mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 04:07:10 +01:00 
			
		
		
		
	Introduce random number (Integral and Float) generators
This commit is contained in:
		| @@ -63,6 +63,7 @@ | ||||
| #include "internal/catch_capture_matchers.h" | ||||
| #endif | ||||
| #include "internal/catch_generators.hpp" | ||||
| #include "internal/catch_generators_specific.hpp" | ||||
|  | ||||
| // These files are included here so the single_include script doesn't put them | ||||
| // in the conditionally compiled sections | ||||
|   | ||||
							
								
								
									
										88
									
								
								include/internal/catch_generators_specific.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								include/internal/catch_generators_specific.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | ||||
| /* | ||||
|  *  Created by Martin on 15/6/2018. | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
| #ifndef TWOBLUECUBES_CATCH_GENERATORS_SPECIFIC_HPP_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_GENERATORS_SPECIFIC_HPP_INCLUDED | ||||
|  | ||||
| #include "catch_context.h" | ||||
| #include "catch_generators.hpp" | ||||
| #include "catch_interfaces_config.h" | ||||
|  | ||||
| #include <random> | ||||
|  | ||||
| namespace Catch { | ||||
| namespace Generators { | ||||
|  | ||||
| template <typename Float> | ||||
| class RandomFloatingGenerator final : public IGenerator<Float> { | ||||
|     // FIXME: What is the right seed? | ||||
|     std::minstd_rand m_rand; | ||||
|     std::uniform_real_distribution<Float> m_dist; | ||||
|     Float m_current_number; | ||||
| public: | ||||
|  | ||||
|     RandomFloatingGenerator(Float a, Float b): | ||||
|         m_rand(getCurrentContext().getConfig()->rngSeed()), | ||||
|         m_dist(a, b) { | ||||
|         static_cast<void>(next()); | ||||
|     } | ||||
|  | ||||
|     Float const& get() const override { | ||||
|         return m_current_number; | ||||
|     } | ||||
|     bool next() override { | ||||
|         m_current_number = m_dist(m_rand); | ||||
|         return true; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| template <typename Integer> | ||||
| class RandomIntegerGenerator final : public IGenerator<Integer> { | ||||
|     std::minstd_rand m_rand; | ||||
|     std::uniform_int_distribution<Integer> m_dist; | ||||
|     Integer m_current_number; | ||||
| public: | ||||
|  | ||||
|     RandomIntegerGenerator(Integer a, Integer b): | ||||
|         m_rand(getCurrentContext().getConfig()->rngSeed()), | ||||
|         m_dist(a, b) { | ||||
|         static_cast<void>(next()); | ||||
|     } | ||||
|  | ||||
|     Integer const& get() const override { | ||||
|         return m_current_number; | ||||
|     } | ||||
|     bool next() override { | ||||
|         m_current_number = m_dist(m_rand); | ||||
|         return true; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| // TODO: Ideally this would be also constrained against the various char types, | ||||
| //       but I don't expect users to run into that in practice. | ||||
| template <typename T> | ||||
| typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value, | ||||
| GeneratorWrapper<T>>::type | ||||
| random(T a, T b) { | ||||
|     return GeneratorWrapper<T>( | ||||
|         pf::make_unique<RandomIntegerGenerator<T>>(a, b) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| typename std::enable_if<std::is_floating_point<T>::value, | ||||
| GeneratorWrapper<T>>::type | ||||
| random(T a, T b) { | ||||
|     return GeneratorWrapper<T>( | ||||
|         pf::make_unique<RandomFloatingGenerator<T>>(a, b) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| } // namespace Generators | ||||
| } // namespace Catch | ||||
|  | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_GENERATORS_SPECIFIC_HPP_INCLUDED | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský