1
0

Fixed Sequence Generator for IntGen

This commit is contained in:
Tycho 2015-03-10 22:19:03 +00:00
parent bdea6c92b3
commit ff785188f9
2 changed files with 24 additions and 12 deletions

View File

@ -1000,9 +1000,9 @@ public:
std::make_shared<cIntGenReplaceRandomly<6>> (a_Seed + 101, bgIce, bgTemperate, 150, std::make_shared<cIntGenReplaceRandomly<6>> (a_Seed + 101, bgIce, bgTemperate, 150,
std::make_shared<cIntGenAddIslands <6>> (a_Seed + 2000, 200, std::make_shared<cIntGenAddIslands <6>> (a_Seed + 2000, 200,
std::make_shared<cIntGenSetRandomly <6>> (a_Seed + 9, 50, bgOcean, std::make_shared<cIntGenSetRandomly <6>> (a_Seed + 9, 50, bgOcean,
std::make_shared<cIntGenZoom <6>> (a_Seed + 10, std::make_shared<cIntGenLandOcean <5>> (a_Seed + 100, 30)
std::make_shared<cIntGenLandOcean <5>> (a_Seed + 100, 30 >> MakeIntGen<cIntGenZoom <6>> (a_Seed + 10)
))))))))))))))))))))))))))))))); )))))))))))))))))))))))))))));
m_Gen = m_Gen =
std::make_shared<cIntGenSmooth <16>>(a_Seed, std::make_shared<cIntGenSmooth <16>>(a_Seed,

View File

@ -70,15 +70,20 @@ public:
}; };
template<size_t size, class... Args> // Code adapted from http://stackoverflow.com/questions/7858817/unpacking-a-tuple-to-call-a-matching-function-pointer
struct PackToInt
{ template<int ...>
enum struct seq { };
{
value = size - sizeof...(Args), template<int N, int ...S>
}; struct gens : gens<N-1, N-1, S...> { };
template<int ...S>
struct gens<0, S...> {
typedef seq<S...> type;
}; };
template<class Gen, class... Args> template<class Gen, class... Args>
class cIntGenFactory class cIntGenFactory
{ {
@ -95,12 +100,19 @@ public:
template <class LhsGen> template <class LhsGen>
std::shared_ptr<Gen> construct(LhsGen&& lhs) std::shared_ptr<Gen> construct(LhsGen&& lhs)
{ {
return std::make_shared<Gen>(std::get<PackToInt<sizeof...(Args), Args>::value>(m_args)..., std::forward<LhsGen>(lhs)); return construct_impl<LhsGen>(std::forward<LhsGen>(lhs), typename gens<sizeof...(Args)>::type());
} }
private: private:
std::tuple<Args...> m_args; std::tuple<Args...> m_args;
template <class LhsGen, int... S>
std::shared_ptr<Gen> construct_impl(LhsGen&& lhs, seq<S...>)
{
return std::make_shared<Gen>(std::get<S>(m_args)..., std::forward<LhsGen>(lhs));
}
}; };
template<class T, class RhsGen, class... Args> template<class T, class RhsGen, class... Args>