15 #ifndef INCG_IRIS_IUTEST_GENPARAMS_HPP_7845F59A_825C_426A_B451_573245408998_
16 #define INCG_IRIS_IUTEST_GENPARAMS_HPP_7845F59A_825C_426A_B451_573245408998_
18 #if IUTEST_HAS_PARAM_TEST
27 template<
typename Generator1,
typename Generator2>
class iuConcatParamHolder;
36 class iuIParamGenerator
41 typedef iuIParamGenerator<T>* (*Generator)();
43 virtual ~iuIParamGenerator() {}
45 virtual void Begin() = 0;
46 virtual T GetCurrent()
const = 0;
47 virtual void Next() = 0;
48 virtual bool IsEnd()
const = 0;
57 typedef iuIParamGenerator<T> _Interface;
58 typedef iuParamGenerator<T> _Myt;
62 iuParamGenerator(_Interface* pInterface=NULL) : m_pInterface(pInterface) {}
65 operator iuIParamGenerator<T>* ()
const {
return m_pInterface; }
69 template<
typename Other>
70 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
72 return iuConcatParamHolder<_Myt, Other>(*
this, g);
82 _Interface* m_pInterface;
103 iuRangeParamsGenerator(T begin, T end, T step)
121 class iuBoolParamsGenerator
IUTEST_CXX_FINAL :
public iuIParamGenerator<bool>
126 iuBoolParamsGenerator()
143 class iuValuesInParamsGenerator :
public iuIParamGenerator<T>
145 typedef ::std::vector<T> params_t;
147 typename params_t::const_iterator m_it;
149 explicit iuValuesInParamsGenerator(
const params_t& values)
150 : m_values(values) {}
151 template<
typename Container>
152 explicit iuValuesInParamsGenerator(
const Container& values)
154 m_values.insert(m_values.end(), values.begin(), values.end());
156 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)
157 template<
typename TT,
size_t SIZE>
158 explicit iuValuesInParamsGenerator(
const TT (&values)[SIZE])
160 m_values.insert(m_values.end(), values, values + SIZE);
164 template<
typename Ite>
165 iuValuesInParamsGenerator(Ite begin, Ite end)
167 m_values.insert(m_values.end(), begin, end);
170 #if IUTEST_HAS_INITIALIZER_LIST
171 iuValuesInParamsGenerator(::std::initializer_list<T> l)
173 m_values.insert(m_values.end(), l.begin(), l.end());
185 #if IUTEST_HAS_CONCAT
189 template<
typename G1,
typename G2>
190 class iuConcatParamHolder
192 typedef iuConcatParamHolder<G1, G2> _Myt;
194 iuConcatParamHolder(
const G1& g1,
const G2& g2)
195 : m_g1(g1), m_g2(g2) {}
202 operator iuIParamGenerator<T>* ()
207 return new iuValuesInParamsGenerator<T>(params.val);
210 template<
typename Other>
211 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
213 return iuConcatParamHolder<_Myt, Other>(*
this, g);
220 typedef iuIParamGenerator<T> IParamGenerater;
221 ::std::vector<T> val;
223 void append(IParamGenerater* gen)
225 detail::scoped_ptr<IParamGenerater> p(gen);
226 for( p->Begin(); !p->IsEnd(); p->Next() )
228 val.push_back(p->GetCurrent());
232 void append(iuParamGenerator<U>& gen)
234 for( gen.Begin(); !gen.IsEnd(); gen.Next() )
236 val.push_back(
static_cast<T
>(gen.GetCurrent()));
247 #if IUTEST_HAS_VARIADIC_VALUES
248 template<
typename... Args>
251 typedef tuples::tuple<Args...> _MyTuple;
252 typedef iuValueArray<Args...> _Myt;
257 T val[
sizeof...(Args)];
260 void operator ()(
int index,
const U& value) { val[index] = value; }
262 explicit make_array(
const _MyTuple& t)
264 tuples::tuple_foreach(t, *
this);
268 explicit iuValueArray(
const Args&... args)
272 #if defined(__clang__) && defined(IUTEST_LIBSTDCXX_VERSION) && IUTEST_LIBSTDCXX_VERSION >= 40900
273 #if IUTEST_HAS_RVALUE_REFS
275 iuValueArray(
const iuValueArray& rhs)
277 iuValueArray(iuValueArray&& rhs)
284 operator iuIParamGenerator<T>* ()
const
287 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)
288 return new iuValuesInParamsGenerator<T>(ar.val);
290 return new iuValuesInParamsGenerator<T>(ar.val, ar.val + IUTEST_PP_COUNTOF(ar.val));
295 #if IUTEST_HAS_CONCAT
296 template<
typename Other>
297 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
299 return iuConcatParamHolder<_Myt, Other>(*
this, g);
339 #define IIUT_DECL_VALUEARRAY_CONSTRUCT_(i, p1, p2) IUTEST_PP_CAT(p1, i)(IUTEST_PP_CAT(p2, i))
340 #define IIUT_DECL_VALUEARRAY_STATICCAST_(i, p1, p2) static_cast<p1>(IUTEST_PP_CAT(p2, i))
341 #define IIUT_DECL_VALUEARRAY_VARIABLE_(i, p1, p2) IUTEST_PP_CAT(p1, i) IUTEST_PP_CAT(p2, i);
342 #if IUTEST_HAS_CONCAT
343 # define IIUT_DECL_VALUEARRAY_CONCAT_() \
344 template<typename Other> iuConcatParamHolder<_Myt, Other> operator + (const Other& g) const { \
345 return iuConcatParamHolder<_Myt, Other>(*this, g); }
347 # define IIUT_DECL_VALUEARRAY_CONCAT_()
351 #define IIUT_DECL_VALUEARRAY_(n) \
352 template< IUTEST_PP_ENUM_PARAMS(n, typename A) > \
353 class IUTEST_PP_CAT(iuValueArray, n) { \
354 typedef IUTEST_PP_CAT(iuValueArray, n)< IUTEST_PP_ENUM_PARAMS(n, A) > _Myt; \
356 IUTEST_PP_CAT(iuValueArray, n)( IUTEST_PP_ENUM_BINARY_PARAMS(n, A, a) ) \
357 : IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_VALUEARRAY_CONSTRUCT_, v, a) {} \
358 template<typename T>operator iuIParamGenerator<T>* () const { \
359 const T val[] = { IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_VALUEARRAY_STATICCAST_, T, v) }; \
360 return new iuValuesInParamsGenerator<T>(val); \
362 IIUT_DECL_VALUEARRAY_CONCAT_() \
363 private: IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_VALUEARRAY_VARIABLE_, A, v) \
369 IIUT_DECL_VALUEARRAY_(1);
370 IIUT_DECL_VALUEARRAY_(2);
371 IIUT_DECL_VALUEARRAY_(3);
372 IIUT_DECL_VALUEARRAY_(4);
373 IIUT_DECL_VALUEARRAY_(5);
374 IIUT_DECL_VALUEARRAY_(6);
375 IIUT_DECL_VALUEARRAY_(7);
376 IIUT_DECL_VALUEARRAY_(8);
377 IIUT_DECL_VALUEARRAY_(9);
378 IIUT_DECL_VALUEARRAY_(10);
379 IIUT_DECL_VALUEARRAY_(11);
380 IIUT_DECL_VALUEARRAY_(12);
381 IIUT_DECL_VALUEARRAY_(13);
382 IIUT_DECL_VALUEARRAY_(14);
383 IIUT_DECL_VALUEARRAY_(15);
384 IIUT_DECL_VALUEARRAY_(16);
385 IIUT_DECL_VALUEARRAY_(17);
386 IIUT_DECL_VALUEARRAY_(18);
387 IIUT_DECL_VALUEARRAY_(19);
388 IIUT_DECL_VALUEARRAY_(20);
389 IIUT_DECL_VALUEARRAY_(21);
390 IIUT_DECL_VALUEARRAY_(22);
391 IIUT_DECL_VALUEARRAY_(23);
392 IIUT_DECL_VALUEARRAY_(24);
393 IIUT_DECL_VALUEARRAY_(25);
394 IIUT_DECL_VALUEARRAY_(26);
395 IIUT_DECL_VALUEARRAY_(27);
396 IIUT_DECL_VALUEARRAY_(28);
397 IIUT_DECL_VALUEARRAY_(29);
398 IIUT_DECL_VALUEARRAY_(30);
399 IIUT_DECL_VALUEARRAY_(31);
400 IIUT_DECL_VALUEARRAY_(32);
401 IIUT_DECL_VALUEARRAY_(33);
402 IIUT_DECL_VALUEARRAY_(34);
403 IIUT_DECL_VALUEARRAY_(35);
404 IIUT_DECL_VALUEARRAY_(36);
405 IIUT_DECL_VALUEARRAY_(37);
406 IIUT_DECL_VALUEARRAY_(38);
407 IIUT_DECL_VALUEARRAY_(39);
408 IIUT_DECL_VALUEARRAY_(40);
409 IIUT_DECL_VALUEARRAY_(41);
410 IIUT_DECL_VALUEARRAY_(42);
411 IIUT_DECL_VALUEARRAY_(43);
412 IIUT_DECL_VALUEARRAY_(44);
413 IIUT_DECL_VALUEARRAY_(45);
414 IIUT_DECL_VALUEARRAY_(46);
415 IIUT_DECL_VALUEARRAY_(47);
416 IIUT_DECL_VALUEARRAY_(48);
417 IIUT_DECL_VALUEARRAY_(49);
418 IIUT_DECL_VALUEARRAY_(50);
420 #undef IIUT_DECL_VALUEARRAY_CONSTRUCT_
421 #undef IIUT_DECL_VALUEARRAY_STATICCAST_
422 #undef IIUT_DECL_VALUEARRAY_VARIABLE_
423 #undef IIUT_DECL_VALUEARRAY_CONCAT_
424 #undef IIUT_DECL_VALUEARRAY_
428 #if IUTEST_HAS_COMBINE
430 #if IUTEST_HAS_VARIADIC_COMBINE
432 template<
typename... Args>
433 class iuCartesianProductGenerator
IUTEST_CXX_FINAL :
public iuIParamGenerator< tuples::tuple<Args...> >
435 typedef tuples::tuple< iuParamGenerator<Args>... > _MyTuple;
436 static const int kCount =
sizeof...(Args);
441 void operator ()(
int, T& value)
const { value.Begin(); }
444 template<
int index,
int end,
typename Tuple>
445 bool is_end_foreach(Tuple& t
446 ,
typename detail::enable_if<index != end, void>::type*& = detail::enabler::value )
const
448 const bool b = tuples::get<index>(t).IsEnd();
449 return b && is_end_foreach<index+1, end>(t);
451 template<
int index,
int end,
typename Tuple>
452 bool is_end_foreach(Tuple&
453 ,
typename detail::enable_if<index == end, void>::type*& = detail::enabler::value )
const
458 template<
int index,
int end,
typename Tuple>
459 void next_foreach(Tuple& t
460 ,
typename detail::enable_if<index != end, void>::type*& = detail::enabler::value )
462 next_foreach<index+1, end>(t);
463 if( is_end_foreach<index+1, end>(t) )
465 tuples::get<index>(t).Next();
466 if( !tuples::get<index>(t).IsEnd() )
468 tuples::tuple_foreach<index + 1>(t, begin_func());
472 template<
int index,
int end,
typename Tuple>
473 void next_foreach(Tuple&
474 ,
typename detail::enable_if<index == end, void>::type*& = detail::enabler::value )
478 template<
int index,
int end,
typename T1,
typename ...TArgs>
479 tuples::tuple<T1, TArgs...> current_foreach(
480 typename detail::enable_if<index != end-1, void>::type*& = detail::enabler::value )
const
482 return ::std::tuple_cat( tuples::tuple<T1>(tuples::get<index>(v).GetCurrent())
483 , current_foreach<index+1, end, TArgs...>());
485 template<
int index,
int end,
typename T1,
typename ...TArgs>
486 tuples::tuple<T1> current_foreach(
487 typename detail::enable_if<index == end-1, void>::type*& = detail::enabler::value )
const
489 return tuples::tuple<T1>(tuples::get<index>(v).GetCurrent());
493 typedef tuples::tuple<Args...> ParamType;
495 iuCartesianProductGenerator() {}
500 tuples::tuple_foreach(v, begin_func());
506 next_foreach<0, kCount>(v);
511 return is_end_foreach<0, kCount>(v);
515 return current_foreach<0, kCount, Args...>();
518 _MyTuple& generators() {
return v; }
523 template<
typename... Generator>
524 class iuCartesianProductHolder
526 typedef iuCartesianProductHolder<Generator...> _Myt;
527 typedef tuples::tuple<
const Generator...> _MyTuple;
530 iuCartesianProductHolder(
const iuCartesianProductHolder& rhs)
534 explicit iuCartesianProductHolder(
const Generator&... generators)
535 : v(generators...) {}
538 template<
typename... Args>
539 operator iuIParamGenerator< tuples::tuple<Args...> >* ()
const
541 iuCartesianProductGenerator<Args...>* p =
new iuCartesianProductGenerator<Args...>();
542 tuples::tuple_cast_copy(p->generators(), v);
547 #if IUTEST_HAS_CONCAT
548 template<
typename Other>
549 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
551 return iuConcatParamHolder<_Myt, Other>(*
this, g);
564 template<
typename Generator1,
typename Generator2,
typename ParamType>
565 class iuICartesianProductGeneratorBase :
public iuIParamGenerator< ParamType >
568 iuICartesianProductGeneratorBase(
const Generator1& g1,
const Generator2& g2)
595 return m_g1.IsEnd() && m_g2.IsEnd();
603 template<
typename T1,
typename T2>
604 class iuCartesianProductGenerator2
605 :
public iuICartesianProductGeneratorBase<iuParamGenerator<T1>, iuParamGenerator<T2>, tuples::tuple<T1, T2> >
607 typedef iuICartesianProductGeneratorBase<iuParamGenerator<T1>, iuParamGenerator<T2>, tuples::tuple<T1, T2> > _Mybase;
608 typedef iuParamGenerator<T1> Generator1;
609 typedef iuParamGenerator<T2> Generator2;
611 typedef tuples::tuple<T1, T2> ParamType;
614 iuCartesianProductGenerator2(
const Generator1 &g1,
const Generator2 &g2)
621 return ParamType(this->m_g1.GetCurrent(), this->m_g2.GetCurrent());
656 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TYPEDEF_(i, p1, p2) \
657 typedef iuParamGenerator<IUTEST_PP_CAT(p1, i)> IUTEST_PP_CAT(p2, i);
659 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TUPLEGET_(i, param) \
660 tuples::get<i>(param)
662 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_(n) \
663 iuICartesianProductGeneratorBase< iuParamGenerator<T0> \
664 , IUTEST_PP_CAT(iuCartesianProductGenerator, IUTEST_PP_DEC(n))< \
665 IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), T) > \
666 , tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > >
668 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(n) \
669 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
670 class IUTEST_PP_CAT(iuCartesianProductGenerator, n) \
671 : public IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_(n) { \
672 typedef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_(n) _Mybase; \
673 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TYPEDEF_, T, Generator) \
675 typedef tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > ParamType; \
676 IUTEST_PP_CAT(iuCartesianProductGenerator, n)( IUTEST_PP_ENUM_BINARY_PARAMS(n, const Generator, &g) ) \
677 : _Mybase(g0, IUTEST_PP_CAT(iuCartesianProductGenerator, IUTEST_PP_DEC(n))< \
678 IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), T)> \
679 ( IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), g) ) ) {} \
680 virtual ParamType GetCurrent() const IUTEST_CXX_OVERRIDE { \
681 tuples::tuple< IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), T) > \
682 params(this->m_g2.GetCurrent()); \
683 return ParamType(this->m_g1.GetCurrent(), IUTEST_PP_ENUM(IUTEST_PP_DEC(n) \
684 , IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TUPLEGET_, params) ); \
692 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(3);
693 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(4);
694 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(5);
695 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(6);
696 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(7);
697 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(8);
698 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(9);
700 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TYPEDEF_
701 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TUPLEGET_
702 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_
703 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_
745 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONSTRUCT_(i, p1, p2) IUTEST_PP_CAT(p1, i)(IUTEST_PP_CAT(p2, i))
746 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_STATICCAST_(i, p1, p2) \
747 static_cast< iuIParamGenerator< IUTEST_PP_CAT(p1, i) >* >(IUTEST_PP_CAT(p2, i))
748 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_VARIABLE_(i, p1, p2) IUTEST_PP_CAT(p1, i) IUTEST_PP_CAT(p2, i);
749 #if IUTEST_HAS_CONCAT
750 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_() \
751 template<typename Other> iuConcatParamHolder<_Myt, Other> operator + (const Other& g) const { \
752 return iuConcatParamHolder<_Myt, Other>(*this, g); }
754 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_()
757 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(n) \
758 template< IUTEST_PP_ENUM_PARAMS(n, typename Generator) > \
759 class IUTEST_PP_CAT(iuCartesianProductHolder, n) { \
760 typedef IUTEST_PP_CAT(iuCartesianProductHolder, n)< IUTEST_PP_ENUM_PARAMS(n, Generator) > _Myt; \
762 IUTEST_PP_CAT(iuCartesianProductHolder, n)( IUTEST_PP_ENUM_BINARY_PARAMS(n, const Generator, &g) ) \
763 : IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONSTRUCT_, m_g, g) {} \
764 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
765 operator iuIParamGenerator< tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > >* () const { \
766 return new IUTEST_PP_CAT(iuCartesianProductGenerator, n)< IUTEST_PP_ENUM_PARAMS(n, T) >( \
767 IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_STATICCAST_, T, m_g) ); \
769 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_() \
770 private: _Myt& operator = (const _Myt&) IUTEST_CXX_DELETED_FUNCTION; \
771 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_VARIABLE_, const Generator, m_g) \
778 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(2);
779 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(3);
780 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(4);
781 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(5);
782 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(6);
783 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(7);
784 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(8);
785 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(9);
787 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONSTRUCT_
788 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_STATICCAST_
789 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_VARIABLE_
790 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_
791 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_
797 #if IUTEST_HAS_PAIRWISE
799 class iuPairwiseGeneratorBase
806 ParamIndexes() {
for(
int i=0; i < N; ++i ) index[i] = -1; }
811 PairInfo(
int r1,
int r2,
int i1,
int i2)
812 : raw1(r1), raw2(r2), idx1(i1), idx2(i2) {}
817 template<
typename T1>
818 static void MakeParamVector( ::std::vector<T1>& list, iuParamGenerator<T1>& g1)
820 for( g1.Begin(); !g1.IsEnd(); g1.Next() )
822 list.push_back(g1.GetCurrent());
826 template<
typename T1,
typename T2>
827 static void MakePairList( ::std::vector< ::std::pair<T1, T2> >& list
828 , iuParamGenerator<T1>& g1, iuParamGenerator<T2>& g2)
830 for( g1.Begin(); !g1.IsEnd(); g1.Next() )
832 T1 t1 = g1.GetCurrent();
833 for( g2.Begin(); !g2.IsEnd(); g2.Next() )
835 #if IUTEST_HAS_STD_EMPLACE
836 list.emplace_back(t1, g2.GetCurrent());
838 list.push_back(::std::pair<T1, T2>(t1, g2.GetCurrent()));
845 static void MakeIndexList( ::std::vector< ParamIndexes<N> >& list,
int* count_list)
847 typedef typename ::std::vector< ParamIndexes<N> >::iterator list_iterator;
851 ::std::vector<PairInfo> pair_list;
852 for(
int i=0; i < N; ++i )
854 int l = count_list[i];
855 for(
int j=i+1; j < N; ++j )
857 int r = count_list[j];
858 for(
int li=0; li < l; ++li )
860 for(
int ri=0; ri < r; ++ri )
862 #if IUTEST_HAS_STD_EMPLACE
863 pair_list.emplace_back(i, j, li, ri);
865 PairInfo info( i, j, li, ri );
866 pair_list.push_back(info);
880 random.shuffle(pair_list.begin(), pair_list.end());
882 for( ::std::vector<PairInfo>::const_iterator it=pair_list.begin(); it != pair_list.end(); ++it )
884 const PairInfo& pair_info = *it;
885 list_iterator find = Find(list, pair_info, list.begin());
886 if( find == list.end() )
888 find = FindFree(list, pair_info, list.begin());
889 if( find == list.end() )
892 ParamIndexes<N> params;
893 params.index[pair_info.raw1] = pair_info.idx1;
894 params.index[pair_info.raw2] = pair_info.idx2;
895 list.push_back(params);
900 ParamIndexes<N>& params = *find;
901 params.index[pair_info.raw1] = pair_info.idx1;
902 params.index[pair_info.raw2] = pair_info.idx2;
914 template<
int N,
typename Fn>
915 static int GetParamIndex(
const ParamIndexes<N>& indexes,
int raw,
int count, Fn& func)
917 return indexes.index[raw] == -1 ? func(count)
918 : indexes.index[raw];
921 template<
int N,
typename T>
922 static T GetParam(const ::std::vector<T>& params,
const ParamIndexes<N>& indexes,
int raw)
925 const int index = GetParamIndex(indexes, raw,
static_cast<int>(params.size()), rnd);
926 return params[index];
931 static typename ::std::vector< ParamIndexes<N> >::iterator Find( ::std::vector< ParamIndexes<N> >& list
932 ,
const PairInfo& pair_info, typename ::std::vector< ParamIndexes<N> >::iterator start)
934 typedef typename ::std::vector< ParamIndexes<N> >::iterator iterator;
935 for( iterator it = start, end=list.end(); it != end; ++it )
937 ParamIndexes<N>& indexes = *it;
938 if( indexes.index[pair_info.raw1] == pair_info.idx1
939 && indexes.index[pair_info.raw2] == pair_info.idx2 )
948 static typename ::std::vector< ParamIndexes<N> >::iterator FindFree( ::std::vector< ParamIndexes<N> >& list
949 ,
const PairInfo& pair_info, typename ::std::vector< ParamIndexes<N> >::iterator start)
952 typedef typename ::std::vector< ParamIndexes<N> >::iterator iterator;
953 iterator find = list.end();
955 for( iterator it = start, end=list.end(); it != end; ++it )
957 ParamIndexes<N>& indexes = *it;
960 if( indexes.index[pair_info.raw1] == -1 && indexes.index[pair_info.raw2] == pair_info.idx2 )
962 free_raw = pair_info.raw1;
963 free_idx = pair_info.idx1;
965 if( indexes.index[pair_info.raw2] == -1 && indexes.index[pair_info.raw1] == pair_info.idx1 )
967 free_raw = pair_info.raw2;
968 free_idx = pair_info.idx2;
974 for(
int i=0; i < N; ++i )
976 if( indexes.index[i] == -1 || i == free_raw )
980 PairInfo tmp(i, free_raw, indexes.index[i], free_idx);
981 iterator it2 = Find(list, tmp, list.begin());
986 it2 = Find(list, tmp, it2);
993 if( find == list.end()
994 || (overlap < max_overlap) )
997 max_overlap = overlap;
1001 if( find != list.end() )
1006 typedef typename ::std::vector< ParamIndexes<N> >::iterator iterator;
1007 for( iterator it = start, end=list.end(); it != end; ++it )
1009 ParamIndexes<N>& indexes = *it;
1010 if( indexes.index[pair_info.raw1] == -1 && indexes.index[pair_info.raw2] == -1 )
1019 #if IUTEST_HAS_VARIADIC_PAIRWISE
1021 template<
typename... Args>
1022 class iuPairwiseGenerator :
public iuPairwiseGeneratorBase
1024 typedef tuples::tuple< Args... > ParamType;
1025 typedef tuples::tuple< iuParamGenerator<Args>... > GeneratorTuple;
1026 static const int kRAW_COUNT =
sizeof...(Args);
1028 typedef ParamIndexes<kRAW_COUNT> _MyParamIndexes;
1029 typedef ::std::vector< _MyParamIndexes > ParamIndexesList;
1031 typedef tuples::tuple< ::std::vector<Args>... > ParamsTuple;
1034 static iuIParamGenerator< ParamType >* Create(GeneratorTuple& generators)
1036 ParamIndexesList list;
1037 ParamVecotrs param_vectors(generators);
1039 MakeIndexList(list, param_vectors.count_list);
1041 ::std::vector<ParamType> params;
1042 for(
typename ParamIndexesList::const_iterator it=list.begin(), end=list.end(); it != end; ++it )
1044 const _MyParamIndexes& indexes = *it;
1045 params.push_back(MakeParam<0, Args...>(param_vectors.params_list, indexes));
1048 return new iuValuesInParamsGenerator< ParamType >(params);
1051 template<
int N,
typename T1,
typename... TArgs>
1052 static tuples::tuple<T1, TArgs...> MakeParam(ParamsTuple& list,
const _MyParamIndexes& indexes
1053 ,
typename detail::disable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1055 return ::std::tuple_cat( tuples::tuple<T1>(GetParam(tuples::get<N>(list), indexes, N))
1056 , MakeParam<N+1, TArgs...>(list, indexes) );
1058 template<
int N,
typename T1,
typename... TArgs>
1059 static tuples::tuple<T1> MakeParam(ParamsTuple& list,
const _MyParamIndexes& indexes
1060 ,
typename detail::enable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1062 return tuples::tuple<T1>( GetParam( tuples::get<N>(list), indexes, N) );
1067 ParamsTuple params_list;
1068 int count_list[kRAW_COUNT];
1071 void MakeParamVecotrs(GeneratorTuple& generators
1072 ,
typename detail::disable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1074 MakeParamVector(tuples::get<N>(params_list), tuples::get<N>(generators));
1075 count_list[N] =
static_cast<int>(tuples::get<N>(params_list).size());
1076 MakeParamVecotrs<N+1>(generators);
1079 void MakeParamVecotrs(GeneratorTuple& generators
1080 ,
typename detail::enable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1082 MakeParamVector(tuples::get<N>(params_list), tuples::get<N>(generators));
1083 count_list[N] =
static_cast<int>(tuples::get<N>(params_list).size());
1086 explicit ParamVecotrs(GeneratorTuple& generators)
1088 MakeParamVecotrs<0>(generators);
1093 template<
typename... Generator>
1094 class iuPairwiseHolder
1096 typedef iuPairwiseHolder<Generator...> _Myt;
1097 typedef tuples::tuple<
const Generator...> _MyTuple;
1100 iuPairwiseHolder(
const iuPairwiseHolder& rhs)
1102 explicit iuPairwiseHolder(
const Generator&... generators)
1103 : v(generators...) {}
1106 template<
typename... Args>
1107 operator iuIParamGenerator< tuples::tuple<Args...> >* ()
const
1109 tuples::tuple< iuParamGenerator<Args>... > generators;
1110 tuples::tuple_cast_copy(generators, v);
1111 return iuPairwiseGenerator<Args...>::Create(generators);
1115 #if IUTEST_HAS_CONCAT
1116 template<
typename Other>
1117 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
1119 return iuConcatParamHolder<_Myt, Other>(*
this, g);
1131 template<
typename T1,
typename T2>
1132 class iuPairwiseGenerator2
IUTEST_CXX_FINAL :
public iuIParamGenerator< tuples::tuple<T1, T2> >
1134 typedef iuParamGenerator<T1> Generator1;
1135 typedef iuParamGenerator<T2> Generator2;
1137 typedef tuples::tuple<T1, T2> ParamType;
1140 iuPairwiseGenerator2(
const Generator1& g1,
const Generator2& g2)
1141 : m_g1(g1), m_g2(g2)
1144 static iuIParamGenerator< ParamType >* Create(
const Generator1& g1,
const Generator2& g2)
1146 return new iuPairwiseGenerator2<T1, T2>(g1, g2);
1172 return m_g1.IsEnd() && m_g2.IsEnd();
1176 return ParamType(this->m_g1.GetCurrent(), this->m_g2.GetCurrent());
1237 #define IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_(i, p1, p2) \
1238 p1<IUTEST_PP_CAT(T, i)> IUTEST_PP_CAT(p2, i);
1239 #define IIUT_DECL_PAIRWISE_GENERATOR_MAKEPARAM_VECTOR_(i, p1, p2) \
1240 MakeParamVector( IUTEST_PP_CAT(p1, i), IUTEST_PP_CAT(p2, i) );
1241 #define IIUT_DECL_PAIRWISE_GENERATOR_PARAM_SIZE_(i, param) \
1242 static_cast<int>( IUTEST_PP_CAT(param, i).size() )
1243 #define IIUT_DECL_PAIRWISE_GENERATOR_GETPARAM_(i, param) \
1244 GetParam( IUTEST_PP_CAT(param, i), indexes, i)
1246 #define IIUT_DECL_PAIRWISE_GENERATOR_(n) \
1247 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
1248 class IUTEST_PP_CAT(iuPairwiseGenerator, n) IUTEST_CXX_FINAL : public iuPairwiseGeneratorBase { \
1249 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_, typedef iuParamGenerator, Generator) \
1250 typedef ParamIndexes<n> _MyParamIndexes; \
1251 typedef ::std::vector< _MyParamIndexes > ParamIndexesList; \
1252 public: typedef tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > ParamType; \
1253 static iuIParamGenerator< ParamType >* Create( \
1254 IUTEST_PP_ENUM_BINARY_PARAMS(n, Generator, g) ) { \
1255 ParamIndexesList list; \
1256 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_, ::std::vector, params) \
1257 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_GENERATOR_MAKEPARAM_VECTOR_, params, g) \
1258 int count_list[] = { IUTEST_PP_ENUM(n, IIUT_DECL_PAIRWISE_GENERATOR_PARAM_SIZE_, params) }; \
1259 MakeIndexList(list, count_list); \
1260 ::std::vector<ParamType> params; \
1261 for( typename ParamIndexesList::const_iterator it=list.begin(), end=list.end(); it != end; ++it ) { \
1262 const _MyParamIndexes& indexes = *it; \
1263 params.push_back( ParamType( IUTEST_PP_ENUM(n, IIUT_DECL_PAIRWISE_GENERATOR_GETPARAM_, params) ) ); \
1265 return new iuValuesInParamsGenerator< ParamType >(params); \
1273 IIUT_DECL_PAIRWISE_GENERATOR_(3);
1274 IIUT_DECL_PAIRWISE_GENERATOR_(4);
1275 IIUT_DECL_PAIRWISE_GENERATOR_(5);
1276 IIUT_DECL_PAIRWISE_GENERATOR_(6);
1277 IIUT_DECL_PAIRWISE_GENERATOR_(7);
1278 IIUT_DECL_PAIRWISE_GENERATOR_(8);
1279 IIUT_DECL_PAIRWISE_GENERATOR_(9);
1281 #undef IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_
1282 #undef IIUT_DECL_PAIRWISE_GENERATOR_MAKEPARAM_VECTOR_
1283 #undef IIUT_DECL_PAIRWISE_GENERATOR_PARAM_SIZE_
1284 #undef IIUT_DECL_PAIRWISE_GENERATOR_GETPARAM_
1285 #undef IIUT_DECL_PAIRWISE_GENERATOR_
1321 #define IIUT_DECL_PAIRWISE_HOLDER_CONSTRUCT_(i, p1, p2) IUTEST_PP_CAT(p1, i)(IUTEST_PP_CAT(p2, i))
1322 #define IIUT_DECL_PAIRWISE_HOLDER_STATICCAST_(i, p1, p2) \
1323 static_cast< iuIParamGenerator< IUTEST_PP_CAT(p1, i) >* >(IUTEST_PP_CAT(p2, i))
1324 #define IIUT_DECL_PAIRWISE_HOLDER_VARIABLE_(i, p1, p2) IUTEST_PP_CAT(p1, i) IUTEST_PP_CAT(p2, i);
1325 #if IUTEST_HAS_CONCAT
1326 # define IIUT_DECL_PAIRWISE_HOLDER_CONCAT_() \
1327 template<typename Other> iuConcatParamHolder<_Myt, Other> operator + (const Other& g) const { \
1328 return iuConcatParamHolder<_Myt, Other>(*this, g); }
1330 # define IIUT_DECL_PAIRWISE_HOLDER_CONCAT_()
1333 #define IIUT_DECL_PAIRWISE_HOLDER_(n) \
1334 template< IUTEST_PP_ENUM_PARAMS(n, typename Generator) > \
1335 class IUTEST_PP_CAT(iuPairwiseHolder, n) { \
1336 typedef IUTEST_PP_CAT(iuPairwiseHolder, n)< IUTEST_PP_ENUM_PARAMS(n, Generator) > _Myt; \
1337 public: IUTEST_PP_CAT(iuPairwiseHolder, n)( \
1338 IUTEST_PP_ENUM_BINARY_PARAMS(n, const Generator, &g) ) \
1339 : IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_PAIRWISE_HOLDER_CONSTRUCT_, m_g, g) {} \
1340 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
1341 operator iuIParamGenerator< tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > >* () const { \
1342 return IUTEST_PP_CAT(iuPairwiseGenerator, n)< IUTEST_PP_ENUM_PARAMS(n, T) >::Create( \
1343 IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_PAIRWISE_HOLDER_STATICCAST_, T, m_g) ); \
1345 IIUT_DECL_PAIRWISE_HOLDER_CONCAT_() \
1346 private: _Myt& operator = (const _Myt&) IUTEST_CXX_DELETED_FUNCTION; \
1347 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_HOLDER_VARIABLE_, const Generator, m_g) \
1350 IIUT_DECL_PAIRWISE_HOLDER_(2);
1351 IIUT_DECL_PAIRWISE_HOLDER_(3);
1352 IIUT_DECL_PAIRWISE_HOLDER_(4);
1353 IIUT_DECL_PAIRWISE_HOLDER_(5);
1354 IIUT_DECL_PAIRWISE_HOLDER_(6);
1355 IIUT_DECL_PAIRWISE_HOLDER_(7);
1356 IIUT_DECL_PAIRWISE_HOLDER_(8);
1357 IIUT_DECL_PAIRWISE_HOLDER_(9);
1359 #undef IIUT_DECL_PAIRWISE_HOLDER_CONSTRUCT_
1360 #undef IIUT_DECL_PAIRWISE_HOLDER_STATICCAST_
1361 #undef IIUT_DECL_PAIRWISE_HOLDER_VARIABLE_
1362 #undef IIUT_DECL_PAIRWISE_HOLDER_CONCAT_
1363 #undef IIUT_DECL_PAIRWISE_HOLDER_
1369 #if IUTEST_HAS_VALUESGEN
1375 template<
typename StdGenerator>
1376 class iuValuesParamsGeneratorHolder
1378 typedef iuValuesParamsGeneratorHolder<StdGenerator> _Myt;
1380 iuValuesParamsGeneratorHolder(
size_t num,
const StdGenerator& g)
1381 : m_num(num), m_g(g)
1384 template<
typename T>
1385 operator iuIParamGenerator<T>* ()
const
1387 ::std::vector<T> params(m_num);
1388 ::std::generate(params.begin(), params.end(), m_g);
1389 return new iuValuesInParamsGenerator<T>( params );
1393 #if IUTEST_HAS_CONCAT
1394 template<
typename Other>
1395 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
1397 return iuConcatParamHolder<_Myt, Other>(*
this, g);
1409 template<
typename T,
typename F>
1410 class iuRandomFilterParamGenerator
1414 iuRandomFilterParamGenerator(
const F& fn,
unsigned int seed)
1415 : m_fn(fn), m_rnd(seed) {}
1419 type val = m_rnd.genrand();
1420 for( ; !(m_fn)(val); val = m_rnd.genrand() ) {}
1425 iuTypedRandom<type> m_rnd;
1430 #if IUTEST_HAS_RANDOMVALUES
1435 class iuRandomParamsHolder
1439 : m_num(num), m_seed(seed) {}
1441 template<
typename T>
1442 operator iuIParamGenerator<T>* ()
const
1444 unsigned int seed = m_seed;
1447 seed = GetIndefiniteValue();
1449 iuValuesParamsGeneratorHolder< iuTypedRandom<T> > gen( m_num, iuTypedRandom<T>(seed) );
1454 #if IUTEST_HAS_CONCAT
1455 template<
typename Other>
1456 iuConcatParamHolder<iuRandomParamsHolder, Other> operator + (
const Other& g)
const
1458 return iuConcatParamHolder<iuRandomParamsHolder, Other>(*
this, g);
1464 unsigned int m_seed;
static detail::iuRandom & genrand()
乱数生成器
Definition: iutest_env.hpp:354
static unsigned int get_random_seed()
乱数シード
Definition: iutest_env.hpp:355
#define IUTEST_CXX_DELETED_FUNCTION
delete function
Definition: iutest_compiler.hpp:445
#define IUTEST_CXX_FINAL
final definition
Definition: iutest_compiler.hpp:756
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:747
#define IUTEST_CXX_NOEXCEPT_SPEC
noexcept specification definition
Definition: iutest_compiler.hpp:811
iutest root namespace
Definition: iutest_charcode.hpp:33
detail::type_fit_t< 4 >::UInt UInt32
32 bit 符号なし整数型
Definition: iutest_defs.hpp:503