diff --git a/MSVC/1300/DataGenerators.h b/MSVC/1300/DataGenerators.h index 384e35b..9e479ed 100644 --- a/MSVC/1300/DataGenerators.h +++ b/MSVC/1300/DataGenerators.h @@ -9,8 +9,8 @@ //////////////////////////////////////////////////////////////////////////////// #include "TypeList.h" -#include "StreamTypes.h" +//MSVC7 version namespace Loki { //////////////////////////////////////////////////////////////////////////////// @@ -26,7 +26,14 @@ namespace Loki return typeid(T).name(); } }; - + template + struct sizeof_type + { + size_t operator()() + { + return sizeof(T); + } + }; template class UnitFunc> struct IterateTypes; @@ -83,13 +90,13 @@ namespace Loki { struct Result { - typedef GenFunc genfunc_t; + typedef GenFunc genfunc_t; template void operator()(II& ii) { - genfunc_t gen; - *ii = gen(); - ++ii; + genfunc_t gen; + *ii = gen(); + ++ii; } template void operator()(II& ii, P1 p1) @@ -190,6 +197,17 @@ namespace Loki this->tail.operator()(ii, p1); } }; + + //UnitFunc is really a template-template parameter, but MSVC7 + // chokes on the correct defintion. Oddly enough, it works correctly + // with the 'undecorated' template parameter declaraion! + //template class UnitFunc + template + void iterate_types(II &ii) + { + Loki::TL::IterateTypes it; + it(ii); + } }//ns TL }//ns Loki diff --git a/Reference/DataGenerators.h b/Reference/DataGenerators.h index 02243ff..fac5525 100644 --- a/Reference/DataGenerators.h +++ b/Reference/DataGenerators.h @@ -10,6 +10,8 @@ #include "TypeList.h" +//Reference version + /************************************************************************************ // class template GenData // Iteratates a TypeList, and invokes the functor GenFunc @@ -29,9 +31,9 @@ struct ExtractDataType } }; -Loki::GenData gen; -std::vector stuff; -gen(std::back_inserter(stuff)); +Loki::IterateTypes gendata; +std::vector stuff; +gendata(std::back_inserter(stuff)); *******************************************************************************/ namespace Loki { @@ -45,22 +47,29 @@ namespace Loki return typeid(T).name(); } }; - + template + struct sizeof_type + { + size_t operator()() + { + return sizeof(T); + } + }; template class GenFunc> struct IterateTypes; template class GenFunc> struct IterateTypes, GenFunc> - : public IterateTypes - , public IterateTypes { + typedef IterateTypes head_t; + head_t head; + typedef IterateTypes tail_t; + tail_t tail; template void operator()(II& ii) { - typedef IterateTypes head_t; - typedef IterateTypes tail_t; - head_t::operator()(ii); - tail_t::operator()(ii); + head.operator()(ii); + tail.operator()(ii); } }; @@ -70,8 +79,8 @@ namespace Loki template void operator()(II& ii) { - typedef GenFunc genfunc_t; - *ii = genfunc_t()(); + GenFunc genfunc; + *ii = genfunc(); ++ii; } }; @@ -83,6 +92,13 @@ namespace Loki void operator()(II& ii) {} }; + + template class UnitFunc, typename II> + void iterate_types(II &ii) + { + Loki::TL::IterateTypes it; + it(ii); + } }//ns TL }//ns Loki diff --git a/tools/RegressionTest2/DataGeneratorsTest.h b/tools/RegressionTest2/DataGeneratorsTest.h new file mode 100644 index 0000000..5db05f9 --- /dev/null +++ b/tools/RegressionTest2/DataGeneratorsTest.h @@ -0,0 +1,67 @@ +//DataGeneratorsTest.h + + +#ifndef DATAGENERATORSTEST_H +#define DATAGENERATORSTEST_H + +#include +#include +#include "UnitTest.h" + +template +T& remove_const(const T& t) + { + return const_cast(t); + } + + +struct DataGeneratorsTest : public Test + { + DataGeneratorsTest() : Test("DataGeneratorsTest.h") + {} + virtual void execute(TestResult& result) + { + this->printName(result); + + bool b; + typedef Loki::TL::MakeTypelist<>::Result null_tl; + typedef Loki::TL::MakeTypelist::Result char_types; + int n = Loki::TL::Length::value; + + std::vector names; + names.reserve(n); + Loki::TL::IterateTypes makenames; + //Some gcc fascist decided to make all temporaries /const/! + makenames(remove_const(std::back_inserter(names))); + b = names.size() == n; + testAssert("iterate_types - Check Length", b, result); + + std::vector sizes; + sizes.reserve(n); + typedef Loki::TL::MakeTypelist::Result some_types; + Loki::TL::iterate_types(remove_const(std::back_inserter(sizes))); + size_t apriori_size[] = {sizeof(char), sizeof(short), sizeof(int), sizeof(double)}; + b = true; + for(int i=0; i(sizes); + b = sizes.size() == 0; + testAssert("iterate_types - Degenerate Case 1 - Null List", b, result); + + sizes.resize(0); + Loki::TL::iterate_types(sizes); + b = sizes.size() == 0; + testAssert("iterate_types - Degenerate Case 2 - NullType", b, result); + } + }; + +#endif //DATAGENERATORSTEST_H