diff --git a/func_pattern.cxx b/func_pattern.cxx index a04ecf76a14d0e2ca2a0eb3c5ccdedb53d18b460..3621ddf80e2bb33a2872675340d08e25d6fe714c 100644 --- a/func_pattern.cxx +++ b/func_pattern.cxx @@ -222,6 +222,16 @@ namespace func { } // namespace func + +struct XYZ_vec { + double x = 0.0; + double y = 0.0; + double z = 0.0; +}; + +template <typename Tag> +using Vec_Var = NamedType<XYZ_vec, Tag>; + int main() { using namespace func; @@ -236,8 +246,13 @@ int main() { using E_coord = Var<struct E_coord_tag>; using F_coord = Var<struct F_coord_tag>; + using XYZ_coord = Vec_Var<struct test_vector_variable_tag>; + + // X_coord and Y_coord are the independent variables that must be provided + // to compute all the subsquently defined variables. auto vars0 = make_independent_vars<X_coord, Y_coord>(); + // Add Z_coord = x+y auto vars1 = vars0.add<Z_coord>([](const auto& v) constexpr { const auto& x = std::get<X_coord>(v); const auto& y = std::get<Y_coord>(v); @@ -264,20 +279,7 @@ int main() { return 1.0/(x * y * z); }); - //auto values1 = vars1.ComputeValues(std::make_tuple(X_coord{2.0}, Y_coord{3.0})); - //std::cout << std::get<0>(values1) << "\n"; - //std::cout << std::get<1>(values1) << "\n"; - //std::cout << std::get<2>(values1) << "\n"; - - //auto values2 = vars2.ComputeValues(std::make_tuple(X_coord{2.0}, Y_coord{3.0})); - - //std::cout << std::get<0>(values2) << "\n"; - //std::cout << std::get<1>(values2) << "\n"; - //std::cout << std::get<2>(values2) << "\n"; - //std::cout << " A_coord " << std::get<A_coord>(values2) << "\n"; - //std::cout << " B_coord " << std::get<B_coord>(values2) << "\n"; - //std::cout << " C_coord " << std::get<C_coord>(values2) << "\n"; auto vars3 = vars2.add<D_coord, E_coord, F_coord>( [](const auto& v) constexpr { @@ -308,6 +310,7 @@ int main() { return c/(x * y * z); }); + auto values3 = vars3.ComputeValues(std::make_tuple(X_coord{2.0}, Y_coord{77.0})); //std::cout << std::get<0>(values3) << "\n"; @@ -322,5 +325,19 @@ int main() { std::cout << std::get<D_coord>(values3) << "\n"; std::cout << std::get<E_coord>(values3) << "\n"; std::cout << std::get<F_coord>(values3) << "\n"; + + auto vars4 = vars3.add<XYZ_coord>( + [](const auto& v) constexpr { + const auto& x = std::get<X_coord>(v); + const auto& y = std::get<Y_coord>(v); + const auto& z = std::get<Z_coord>(v); + return XYZ_vec{x, y, z}; + }); + + auto values4 = vars4.ComputeValues(std::make_tuple(X_coord{2.0}, Y_coord{77.0})); + std::cout << std::get<XYZ_coord>(values4).get().x << "\n"; + std::cout << std::get<XYZ_coord>(values4).get().y << "\n"; + std::cout << std::get<XYZ_coord>(values4).get().z << "\n"; + }