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;
55 class iuParamGenerator :
public iuIParamGenerator<T>
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;
90 class iuRangeParamsGenerator :
public iuIParamGenerator<T>
103 iuRangeParamsGenerator(T begin, T end, T step)
121 class iuBoolParamsGenerator :
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 :
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 explicit iuCartesianProductHolder(
const Generator&... generators)
531 : v(generators...) {}
534 template<
typename... Args>
535 operator iuIParamGenerator< tuples::tuple<Args...> >* ()
const
537 iuCartesianProductGenerator<Args...>* p =
new iuCartesianProductGenerator<Args...>();
538 tuples::tuple_cast_copy(p->generators(), v);
543 #if IUTEST_HAS_CONCAT
544 template<
typename Other>
545 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
547 return iuConcatParamHolder<_Myt, Other>(*
this, g);
560 template<
typename Generator1,
typename Generator2,
typename ParamType>
561 class iuICartesianProductGeneratorBase :
public iuIParamGenerator< ParamType >
564 iuICartesianProductGeneratorBase(
const Generator1& g1,
const Generator2& g2)
591 return m_g1.IsEnd() && m_g2.IsEnd();
599 template<
typename T1,
typename T2>
600 class iuCartesianProductGenerator2
601 :
public iuICartesianProductGeneratorBase<iuParamGenerator<T1>, iuParamGenerator<T2>, tuples::tuple<T1, T2> >
603 typedef iuICartesianProductGeneratorBase<iuParamGenerator<T1>, iuParamGenerator<T2>, tuples::tuple<T1, T2> > _Mybase;
604 typedef iuParamGenerator<T1> Generator1;
605 typedef iuParamGenerator<T2> Generator2;
607 typedef tuples::tuple<T1, T2> ParamType;
610 iuCartesianProductGenerator2(
const Generator1 &g1,
const Generator2 &g2)
617 return ParamType(this->m_g1.GetCurrent(), this->m_g2.GetCurrent());
651 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TYPEDEF_(i, p1, p2) \
652 typedef iuParamGenerator<IUTEST_PP_CAT(p1, i)> IUTEST_PP_CAT(p2, i);
654 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TUPLEGET_(i, param) \
655 tuples::get<i>(param)
657 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_(n) \
658 iuICartesianProductGeneratorBase< iuParamGenerator<T0> \
659 , IUTEST_PP_CAT(iuCartesianProductGenerator, IUTEST_PP_DEC(n))< \
660 IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), T) > \
661 , tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > >
663 #define IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(n) \
664 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
665 class IUTEST_PP_CAT(iuCartesianProductGenerator, n) \
666 : public IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_(n) { \
667 typedef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_(n) _Mybase; \
668 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TYPEDEF_, T, Generator) \
670 typedef tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > ParamType; \
671 IUTEST_PP_CAT(iuCartesianProductGenerator, n)( IUTEST_PP_ENUM_BINARY_PARAMS(n, const Generator, &g) ) \
672 : _Mybase(g0, IUTEST_PP_CAT(iuCartesianProductGenerator, IUTEST_PP_DEC(n))< \
673 IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), T)> \
674 ( IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), g) ) ) {} \
675 virtual ParamType GetCurrent() const IUTEST_CXX_OVERRIDE { \
676 tuples::tuple< IUTEST_PP_ENUM_SHIFTED_PARAMS(IUTEST_PP_DEC(n), T) > \
677 params(this->m_g2.GetCurrent()); \
678 return ParamType(this->m_g1.GetCurrent(), IUTEST_PP_ENUM(IUTEST_PP_DEC(n) \
679 , IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TUPLEGET_, params) ); \
687 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(3);
688 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(4);
689 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(5);
690 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(6);
691 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(7);
692 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(8);
693 IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_(9);
695 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TYPEDEF_
696 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_TUPLEGET_
697 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_BASE_
698 #undef IIUT_DECL_CARTESIAN_PRODUCT_GENERATOR_
740 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONSTRUCT_(i, p1, p2) IUTEST_PP_CAT(p1, i)(IUTEST_PP_CAT(p2, i))
741 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_STATICCAST_(i, p1, p2) \
742 static_cast< iuIParamGenerator< IUTEST_PP_CAT(p1, i) >* >(IUTEST_PP_CAT(p2, i))
743 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_VARIABLE_(i, p1, p2) IUTEST_PP_CAT(p1, i) IUTEST_PP_CAT(p2, i);
744 #if IUTEST_HAS_CONCAT
745 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_() \
746 template<typename Other> iuConcatParamHolder<_Myt, Other> operator + (const Other& g) const { \
747 return iuConcatParamHolder<_Myt, Other>(*this, g); }
749 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_()
752 #define IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(n) \
753 template< IUTEST_PP_ENUM_PARAMS(n, typename Generator) > \
754 class IUTEST_PP_CAT(iuCartesianProductHolder, n) { \
755 typedef IUTEST_PP_CAT(iuCartesianProductHolder, n)< IUTEST_PP_ENUM_PARAMS(n, Generator) > _Myt; \
757 IUTEST_PP_CAT(iuCartesianProductHolder, n)( IUTEST_PP_ENUM_BINARY_PARAMS(n, const Generator, &g) ) \
758 : IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONSTRUCT_, m_g, g) {} \
759 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
760 operator iuIParamGenerator< tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > >* () const { \
761 return new IUTEST_PP_CAT(iuCartesianProductGenerator, n)< IUTEST_PP_ENUM_PARAMS(n, T) >( \
762 IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_STATICCAST_, T, m_g) ); \
764 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_() \
765 private: _Myt& operator = (const _Myt&); \
766 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_VARIABLE_, const Generator, m_g) \
773 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(2);
774 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(3);
775 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(4);
776 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(5);
777 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(6);
778 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(7);
779 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(8);
780 IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_(9);
782 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONSTRUCT_
783 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_STATICCAST_
784 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_VARIABLE_
785 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_CONCAT_
786 #undef IIUT_DECL_CARTESIAN_PRODUCT_HOLDER_
792 #if IUTEST_HAS_PAIRWISE
794 class iuPairwiseGeneratorBase
801 ParamIndexes() {
for(
int i=0; i < N; ++i ) index[i] = -1; }
806 PairInfo(
int r1,
int r2,
int i1,
int i2)
807 : raw1(r1), raw2(r2), idx1(i1), idx2(i2) {}
812 template<
typename T1>
813 static void MakeParamVector( ::std::vector<T1>& list, iuParamGenerator<T1>& g1)
815 for( g1.Begin(); !g1.IsEnd(); g1.Next() )
817 list.push_back(g1.GetCurrent());
821 template<
typename T1,
typename T2>
822 static void MakePairList( ::std::vector< ::std::pair<T1, T2> >& list
823 , iuParamGenerator<T1>& g1, iuParamGenerator<T2>& g2)
825 for( g1.Begin(); !g1.IsEnd(); g1.Next() )
827 T1 t1 = g1.GetCurrent();
828 for( g2.Begin(); !g2.IsEnd(); g2.Next() )
830 #if IUTEST_HAS_STD_EMPLACE
831 list.emplace_back(t1, g2.GetCurrent());
833 list.push_back(::std::pair<T1, T2>(t1, g2.GetCurrent()));
840 static void MakeIndexList( ::std::vector< ParamIndexes<N> >& list,
int* count_list)
842 typedef typename ::std::vector< ParamIndexes<N> >::iterator list_iterator;
846 ::std::vector<PairInfo> pair_list;
847 for(
int i=0; i < N; ++i )
849 int l = count_list[i];
850 for(
int j=i+1; j < N; ++j )
852 int r = count_list[j];
853 for(
int li=0; li < l; ++li )
855 for(
int ri=0; ri < r; ++ri )
857 #if IUTEST_HAS_STD_EMPLACE
858 pair_list.emplace_back(i, j, li, ri);
860 PairInfo info( i, j, li, ri );
861 pair_list.push_back(info);
870 unsigned int seed = TestEnv::get_random_seed();
875 random.shuffle(pair_list.begin(), pair_list.end());
877 for( ::std::vector<PairInfo>::const_iterator it=pair_list.begin(); it != pair_list.end(); ++it )
879 const PairInfo& pair_info = *it;
880 list_iterator find = Find(list, pair_info, list.begin());
881 if( find == list.end() )
883 find = FindFree(list, pair_info, list.begin());
884 if( find == list.end() )
887 ParamIndexes<N> params;
888 params.index[pair_info.raw1] = pair_info.idx1;
889 params.index[pair_info.raw2] = pair_info.idx2;
890 list.push_back(params);
895 ParamIndexes<N>& params = *find;
896 params.index[pair_info.raw1] = pair_info.idx1;
897 params.index[pair_info.raw2] = pair_info.idx2;
909 template<
int N,
typename Fn>
910 static int GetParamIndex(
const ParamIndexes<N>& indexes,
int raw,
int count, Fn& func)
912 return indexes.index[raw] == -1 ? func(count)
913 : indexes.index[raw];
916 template<
int N,
typename T>
917 static T GetParam(const ::std::vector<T>& params,
const ParamIndexes<N>& indexes,
int raw)
919 iuTypedRandom<int> rnd(TestEnv::genrand()());
920 const int index = GetParamIndex(indexes, raw,
static_cast<int>(params.size()), rnd);
921 return params[index];
926 static typename ::std::vector< ParamIndexes<N> >::iterator Find( ::std::vector< ParamIndexes<N> >& list
927 ,
const PairInfo& pair_info, typename ::std::vector< ParamIndexes<N> >::iterator start)
929 typedef typename ::std::vector< ParamIndexes<N> >::iterator iterator;
930 for( iterator it = start, end=list.end(); it != end; ++it )
932 ParamIndexes<N>& indexes = *it;
933 if( indexes.index[pair_info.raw1] == pair_info.idx1
934 && indexes.index[pair_info.raw2] == pair_info.idx2 )
943 static typename ::std::vector< ParamIndexes<N> >::iterator FindFree( ::std::vector< ParamIndexes<N> >& list
944 ,
const PairInfo& pair_info, typename ::std::vector< ParamIndexes<N> >::iterator start)
947 typedef typename ::std::vector< ParamIndexes<N> >::iterator iterator;
948 iterator find = list.end();
950 for( iterator it = start, end=list.end(); it != end; ++it )
952 ParamIndexes<N>& indexes = *it;
955 if( indexes.index[pair_info.raw1] == -1 && indexes.index[pair_info.raw2] == pair_info.idx2 )
957 free_raw = pair_info.raw1;
958 free_idx = pair_info.idx1;
960 if( indexes.index[pair_info.raw2] == -1 && indexes.index[pair_info.raw1] == pair_info.idx1 )
962 free_raw = pair_info.raw2;
963 free_idx = pair_info.idx2;
969 for(
int i=0; i < N; ++i )
971 if( indexes.index[i] == -1 || i == free_raw )
975 PairInfo tmp(i, free_raw, indexes.index[i], free_idx);
976 iterator it2 = Find(list, tmp, list.begin());
981 it2 = Find(list, tmp, it2);
988 if( find == list.end()
989 || (overlap < max_overlap) )
992 max_overlap = overlap;
996 if( find != list.end() )
1001 typedef typename ::std::vector< ParamIndexes<N> >::iterator iterator;
1002 for( iterator it = start, end=list.end(); it != end; ++it )
1004 ParamIndexes<N>& indexes = *it;
1005 if( indexes.index[pair_info.raw1] == -1 && indexes.index[pair_info.raw2] == -1 )
1014 #if IUTEST_HAS_VARIADIC_PAIRWISE
1016 template<
typename... Args>
1017 class iuPairwiseGenerator :
public iuPairwiseGeneratorBase
1019 typedef tuples::tuple< Args... > ParamType;
1020 typedef tuples::tuple< iuParamGenerator<Args>... > GeneratorTuple;
1021 static const int kRAW_COUNT =
sizeof...(Args);
1023 typedef ParamIndexes<kRAW_COUNT> _MyParamIndexes;
1024 typedef ::std::vector< _MyParamIndexes > ParamIndexesList;
1026 typedef tuples::tuple< ::std::vector<Args>... > ParamsTuple;
1029 static iuIParamGenerator< ParamType >* Create(GeneratorTuple& generators)
1031 ParamIndexesList list;
1032 ParamVecotrs param_vectors(generators);
1034 MakeIndexList(list, param_vectors.count_list);
1036 ::std::vector<ParamType> params;
1037 for(
typename ParamIndexesList::const_iterator it=list.begin(), end=list.end(); it != end; ++it )
1039 const _MyParamIndexes& indexes = *it;
1040 params.push_back(MakeParam<0, Args...>(param_vectors.params_list, indexes));
1043 return new iuValuesInParamsGenerator< ParamType >(params);
1046 template<
int N,
typename T1,
typename... TArgs>
1047 static tuples::tuple<T1, TArgs...> MakeParam(ParamsTuple& list,
const _MyParamIndexes& indexes
1048 ,
typename detail::disable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1050 return ::std::tuple_cat( tuples::tuple<T1>(GetParam(tuples::get<N>(list), indexes, N))
1051 , MakeParam<N+1, TArgs...>(list, indexes) );
1053 template<
int N,
typename T1,
typename... TArgs>
1054 static tuples::tuple<T1> MakeParam(ParamsTuple& list,
const _MyParamIndexes& indexes
1055 ,
typename detail::enable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1057 return tuples::tuple<T1>( GetParam( tuples::get<N>(list), indexes, N) );
1062 ParamsTuple params_list;
1063 int count_list[kRAW_COUNT];
1066 void MakeParamVecotrs(GeneratorTuple& generators
1067 ,
typename detail::disable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1069 MakeParamVector(tuples::get<N>(params_list), tuples::get<N>(generators));
1070 count_list[N] =
static_cast<int>(tuples::get<N>(params_list).size());
1071 MakeParamVecotrs<N+1>(generators);
1074 void MakeParamVecotrs(GeneratorTuple& generators
1075 ,
typename detail::enable_if<N == kRAW_COUNT -1, void>::type*& = detail::enabler::value)
1077 MakeParamVector(tuples::get<N>(params_list), tuples::get<N>(generators));
1078 count_list[N] =
static_cast<int>(tuples::get<N>(params_list).size());
1081 explicit ParamVecotrs(GeneratorTuple& generators)
1083 MakeParamVecotrs<0>(generators);
1088 template<
typename... Generator>
1089 class iuPairwiseHolder
1091 typedef iuPairwiseHolder<Generator...> _Myt;
1092 typedef tuples::tuple<
const Generator...> _MyTuple;
1095 explicit iuPairwiseHolder(
const Generator&... generators)
1096 : v(generators...) {}
1099 template<
typename... Args>
1100 operator iuIParamGenerator< tuples::tuple<Args...> >* ()
const
1102 tuples::tuple< iuParamGenerator<Args>... > generators;
1103 tuples::tuple_cast_copy(generators, v);
1104 return iuPairwiseGenerator<Args...>::Create(generators);
1108 #if IUTEST_HAS_CONCAT
1109 template<
typename Other>
1110 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
1112 return iuConcatParamHolder<_Myt, Other>(*
this, g);
1124 template<
typename T1,
typename T2>
1125 class iuPairwiseGenerator2 :
public iuIParamGenerator< tuples::tuple<T1, T2> >
1127 typedef iuParamGenerator<T1> Generator1;
1128 typedef iuParamGenerator<T2> Generator2;
1130 typedef tuples::tuple<T1, T2> ParamType;
1133 iuPairwiseGenerator2(
const Generator1& g1,
const Generator2& g2)
1134 : m_g1(g1), m_g2(g2)
1137 static iuIParamGenerator< ParamType >* Create(
const Generator1& g1,
const Generator2& g2)
1139 return new iuPairwiseGenerator2<T1, T2>(g1, g2);
1165 return m_g1.IsEnd() && m_g2.IsEnd();
1169 return ParamType(this->m_g1.GetCurrent(), this->m_g2.GetCurrent());
1230 #define IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_(i, p1, p2) \
1231 p1<IUTEST_PP_CAT(T, i)> IUTEST_PP_CAT(p2, i);
1232 #define IIUT_DECL_PAIRWISE_GENERATOR_MAKEPARAM_VECTOR_(i, p1, p2) \
1233 MakeParamVector( IUTEST_PP_CAT(p1, i), IUTEST_PP_CAT(p2, i) );
1234 #define IIUT_DECL_PAIRWISE_GENERATOR_PARAM_SIZE_(i, param) \
1235 static_cast<int>( IUTEST_PP_CAT(param, i).size() )
1236 #define IIUT_DECL_PAIRWISE_GENERATOR_GETPARAM_(i, param) \
1237 GetParam( IUTEST_PP_CAT(param, i), indexes, i)
1239 #define IIUT_DECL_PAIRWISE_GENERATOR_(n) \
1240 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
1241 class IUTEST_PP_CAT(iuPairwiseGenerator, n) : public iuPairwiseGeneratorBase { \
1242 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_, typedef iuParamGenerator, Generator) \
1243 typedef ParamIndexes<n> _MyParamIndexes; \
1244 typedef ::std::vector< _MyParamIndexes > ParamIndexesList; \
1245 public: typedef tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > ParamType; \
1246 static iuIParamGenerator< ParamType >* Create( \
1247 IUTEST_PP_ENUM_BINARY_PARAMS(n, Generator, g) ) { \
1248 ParamIndexesList list; \
1249 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_, ::std::vector, params) \
1250 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_GENERATOR_MAKEPARAM_VECTOR_, params, g) \
1251 int count_list[] = { IUTEST_PP_ENUM(n, IIUT_DECL_PAIRWISE_GENERATOR_PARAM_SIZE_, params) }; \
1252 MakeIndexList(list, count_list); \
1253 ::std::vector<ParamType> params; \
1254 for( typename ParamIndexesList::const_iterator it=list.begin(), end=list.end(); it != end; ++it ) { \
1255 const _MyParamIndexes& indexes = *it; \
1256 params.push_back( ParamType( IUTEST_PP_ENUM(n, IIUT_DECL_PAIRWISE_GENERATOR_GETPARAM_, params) ) ); \
1258 return new iuValuesInParamsGenerator< ParamType >(params); \
1266 IIUT_DECL_PAIRWISE_GENERATOR_(3);
1267 IIUT_DECL_PAIRWISE_GENERATOR_(4);
1268 IIUT_DECL_PAIRWISE_GENERATOR_(5);
1269 IIUT_DECL_PAIRWISE_GENERATOR_(6);
1270 IIUT_DECL_PAIRWISE_GENERATOR_(7);
1271 IIUT_DECL_PAIRWISE_GENERATOR_(8);
1272 IIUT_DECL_PAIRWISE_GENERATOR_(9);
1274 #undef IIUT_DECL_PAIRWISE_GENERATOR_TEMPLATE_T_
1275 #undef IIUT_DECL_PAIRWISE_GENERATOR_MAKEPARAM_VECTOR_
1276 #undef IIUT_DECL_PAIRWISE_GENERATOR_PARAM_SIZE_
1277 #undef IIUT_DECL_PAIRWISE_GENERATOR_GETPARAM_
1278 #undef IIUT_DECL_PAIRWISE_GENERATOR_
1314 #define IIUT_DECL_PAIRWISE_HOLDER_CONSTRUCT_(i, p1, p2) IUTEST_PP_CAT(p1, i)(IUTEST_PP_CAT(p2, i))
1315 #define IIUT_DECL_PAIRWISE_HOLDER_STATICCAST_(i, p1, p2) \
1316 static_cast< iuIParamGenerator< IUTEST_PP_CAT(p1, i) >* >(IUTEST_PP_CAT(p2, i))
1317 #define IIUT_DECL_PAIRWISE_HOLDER_VARIABLE_(i, p1, p2) IUTEST_PP_CAT(p1, i) IUTEST_PP_CAT(p2, i);
1318 #if IUTEST_HAS_CONCAT
1319 # define IIUT_DECL_PAIRWISE_HOLDER_CONCAT_() \
1320 template<typename Other> iuConcatParamHolder<_Myt, Other> operator + (const Other& g) const { \
1321 return iuConcatParamHolder<_Myt, Other>(*this, g); }
1323 # define IIUT_DECL_PAIRWISE_HOLDER_CONCAT_()
1326 #define IIUT_DECL_PAIRWISE_HOLDER_(n) \
1327 template< IUTEST_PP_ENUM_PARAMS(n, typename Generator) > \
1328 class IUTEST_PP_CAT(iuPairwiseHolder, n) { \
1329 typedef IUTEST_PP_CAT(iuPairwiseHolder, n)< IUTEST_PP_ENUM_PARAMS(n, Generator) > _Myt; \
1330 public: IUTEST_PP_CAT(iuPairwiseHolder, n)( \
1331 IUTEST_PP_ENUM_BINARY_PARAMS(n, const Generator, &g) ) \
1332 : IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_PAIRWISE_HOLDER_CONSTRUCT_, m_g, g) {} \
1333 template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
1334 operator iuIParamGenerator< tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > >* () const { \
1335 return IUTEST_PP_CAT(iuPairwiseGenerator, n)< IUTEST_PP_ENUM_PARAMS(n, T) >::Create( \
1336 IUTEST_PP_ENUM_BINARY(n, IIUT_DECL_PAIRWISE_HOLDER_STATICCAST_, T, m_g) ); \
1338 IIUT_DECL_PAIRWISE_HOLDER_CONCAT_() \
1339 private: _Myt& operator = (const _Myt&); \
1340 IUTEST_PP_REPEAT_BINARY(n, IIUT_DECL_PAIRWISE_HOLDER_VARIABLE_, const Generator, m_g) \
1343 IIUT_DECL_PAIRWISE_HOLDER_(2);
1344 IIUT_DECL_PAIRWISE_HOLDER_(3);
1345 IIUT_DECL_PAIRWISE_HOLDER_(4);
1346 IIUT_DECL_PAIRWISE_HOLDER_(5);
1347 IIUT_DECL_PAIRWISE_HOLDER_(6);
1348 IIUT_DECL_PAIRWISE_HOLDER_(7);
1349 IIUT_DECL_PAIRWISE_HOLDER_(8);
1350 IIUT_DECL_PAIRWISE_HOLDER_(9);
1352 #undef IIUT_DECL_PAIRWISE_HOLDER_CONSTRUCT_
1353 #undef IIUT_DECL_PAIRWISE_HOLDER_STATICCAST_
1354 #undef IIUT_DECL_PAIRWISE_HOLDER_VARIABLE_
1355 #undef IIUT_DECL_PAIRWISE_HOLDER_CONCAT_
1356 #undef IIUT_DECL_PAIRWISE_HOLDER_
1362 #if IUTEST_HAS_VALUESGEN
1368 template<
typename StdGenerator>
1369 class iuValuesParamsGeneratorHolder
1371 typedef iuValuesParamsGeneratorHolder<StdGenerator> _Myt;
1373 iuValuesParamsGeneratorHolder(
size_t num,
const StdGenerator& g)
1374 : m_num(num), m_g(g)
1377 template<
typename T>
1378 operator iuIParamGenerator<T>* ()
const
1380 ::std::vector<T> params(m_num);
1381 ::std::generate(params.begin(), params.end(), m_g);
1382 return new iuValuesInParamsGenerator<T>( params );
1386 #if IUTEST_HAS_CONCAT
1387 template<
typename Other>
1388 iuConcatParamHolder<_Myt, Other> operator + (
const Other& g)
const
1390 return iuConcatParamHolder<_Myt, Other>(*
this, g);
1402 template<
typename T,
typename F>
1403 class iuRandomFilterParamGenerator
1407 iuRandomFilterParamGenerator(
const F& fn,
unsigned int seed)
1408 : m_fn(fn), m_rnd(seed) {}
1412 type val = m_rnd.genrand();
1413 for( ; !(m_fn)(val); val = m_rnd.genrand() ) {}
1418 iuTypedRandom<type> m_rnd;
1423 #if IUTEST_HAS_RANDOMVALUES
1428 class iuRandomParamsHolder
1432 : m_num(num), m_seed(seed) {}
1434 template<
typename T>
1435 operator iuIParamGenerator<T>* ()
const
1437 unsigned int seed = m_seed;
1440 seed = GetIndefiniteValue();
1442 iuValuesParamsGeneratorHolder< iuTypedRandom<T> > gen( m_num, iuTypedRandom<T>(seed) );
1447 #if IUTEST_HAS_CONCAT
1448 template<
typename Other>
1449 iuConcatParamHolder<iuRandomParamsHolder, Other> operator + (
const Other& g)
const
1451 return iuConcatParamHolder<iuRandomParamsHolder, Other>(*
this, g);
1457 unsigned int m_seed;
1467 #endif // INCG_IRIS_IUTEST_GENPARAMS_HPP_7845F59A_825C_426A_B451_573245408998_