123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #ifndef BOOST_TEST_DATA_MONOMORPHIC_GENERATORS_XRANGE_HPP_112011GER
- #define BOOST_TEST_DATA_MONOMORPHIC_GENERATORS_XRANGE_HPP_112011GER
- #include <boost/test/data/config.hpp>
- #include <boost/test/data/monomorphic/generators/keywords.hpp>
- #include <boost/test/data/monomorphic/generate.hpp>
- #include <boost/optional.hpp>
- #include <boost/utility/enable_if.hpp>
- #include <boost/type_traits/is_unsigned.hpp>
- #include <limits>
- #include <cmath>
- #include <boost/test/detail/suppress_warnings.hpp>
- namespace boost {
- namespace unit_test {
- namespace data {
- namespace monomorphic {
- template<typename SampleType, typename StepType=SampleType>
- class xrange_t {
- public:
- typedef SampleType sample;
- xrange_t( SampleType const& begin_, StepType const& step_, data::size_t size_ )
- : m_begin( begin_ )
- , m_curr( begin_ )
- , m_step( step_ )
- , m_index( 0 )
- , m_size( size_ )
- {}
-
- data::size_t capacity() const { return m_size; }
- SampleType next()
- {
- if( m_index == m_size )
- return m_curr;
- SampleType res = m_curr;
- m_curr += m_step;
- ++m_index;
- return res;
- }
- void reset()
- {
- m_curr = m_begin;
- m_index = 0;
- }
- private:
-
- SampleType m_begin;
- SampleType m_curr;
- StepType m_step;
- data::size_t m_index;
- data::size_t m_size;
- };
- namespace ds_detail {
- template<typename SampleType, typename StepType=SampleType>
- struct make_xrange {
- static StepType abs( StepType s, boost::true_type* ) { return s; }
- static StepType abs( StepType s, boost::false_type* ) { return std::abs(s); }
- typedef xrange_t<SampleType, StepType> range_gen;
- template<typename Params>
- static generated_by<range_gen>
- _( Params const& params )
- {
- SampleType begin_val = params.has( data::begin ) ? params[data::begin] : SampleType();
- optional<SampleType> end_val = params.has( data::end ) ? params[data::end] : optional<SampleType>();
- StepType step_val = params.has( data::step ) ? params[data::step] : 1;
- BOOST_TEST_DS_ASSERT( step_val != 0, "Range step can't be zero" );
- data::size_t size;
- if( !end_val.is_initialized() )
- size = BOOST_TEST_DS_INFINITE_SIZE;
- else {
- BOOST_TEST_DS_ASSERT( (step_val < 0) ^ (begin_val < *end_val), "Invalid step direction" );
- SampleType abs_distance = step_val < 0 ? begin_val - *end_val : *end_val-begin_val;
- StepType abs_step = make_xrange::abs(step_val, (typename boost::is_unsigned<StepType>::type*)0 );
- std::size_t s = static_cast<std::size_t>(abs_distance/abs_step);
- if( static_cast<SampleType>(s*abs_step) < abs_distance )
- s++;
- size = s;
- }
- return generated_by<range_gen>( range_gen( begin_val, step_val, size ) );
- }
- };
- }
- }
- template<typename SampleType, typename Params>
- inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
- xrange( Params const& params )
- {
- return monomorphic::ds_detail::make_xrange<SampleType>::_( params );
- }
- template<typename SampleType>
- inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
- xrange( SampleType const& end_val )
- {
- return monomorphic::ds_detail::make_xrange<SampleType>::_( data::end=end_val );
- }
- template<typename SampleType, typename Params>
- inline typename enable_if_c<nfp::is_named_param_pack<Params>::value,
- monomorphic::generated_by<monomorphic::xrange_t<SampleType>>>::type
- xrange( SampleType const& end_val, Params const& params )
- {
- return monomorphic::ds_detail::make_xrange<SampleType>::_(( params, data::end=end_val ));
- }
- template<typename SampleType>
- inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
- xrange( SampleType const& begin_val, SampleType const& end_val )
- {
- return monomorphic::ds_detail::make_xrange<SampleType>::_((
- data::begin=begin_val,
- data::end=end_val ));
- }
- template<typename SampleType,typename StepType>
- inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
- xrange( SampleType const& begin_val, SampleType const& end_val, StepType const& step_val )
- {
- return monomorphic::ds_detail::make_xrange<SampleType,StepType>::_((
- data::begin=begin_val,
- data::end=end_val,
- data::step=step_val ));
- }
- }
- }
- }
- #include <boost/test/detail/enable_warnings.hpp>
- #endif
|