diff --git a/libs/pcg/include/psemek/pcg/fractal.hpp b/libs/pcg/include/psemek/pcg/fractal.hpp index 3d478edf..446f8732 100644 --- a/libs/pcg/include/psemek/pcg/fractal.hpp +++ b/libs/pcg/include/psemek/pcg/fractal.hpp @@ -4,6 +4,7 @@ #include #include +#include namespace psemek::pcg { @@ -17,6 +18,9 @@ namespace psemek::pcg template fractal(std::vector args, std::vector weights); + template + fractal(std::piecewise_construct_t, std::vector> args, std::vector weights); + template value_type operator ()(Args const & ... args) const { @@ -41,6 +45,34 @@ namespace psemek::pcg octaves.emplace_back(std::move(args[i])); } + namespace detail + { + + template + void emplace_back_from_tuple_impl(C & c, Tuple && tuple, std::index_sequence) + { + c.emplace_back(std::get(tuple)...); + } + + template + void emplace_back_from_tuple(C & c, Tuple && tuple) + { + emplace_back_from_tuple_impl(c, std::forward(tuple), std::make_index_sequence>{}); + } + + } + + template + template + fractal::fractal(std::piecewise_construct_t, std::vector> args, std::vector weights) + { + assert(args.size() == weights.size()); + this->weights = std::move(weights); + octaves.reserve(args.size()); + for (std::size_t i = 0; i < args.size(); ++i) + detail::emplace_back_from_tuple(octaves, std::forward>(args[i])); + } + template typename fractal::value_type fractal::operator()(geom::vector const & p) const {