diff --git a/toml/visit.hpp b/toml/visit.hpp index fe0cc7c..0c2ae90 100644 --- a/toml/visit.hpp +++ b/toml/visit.hpp @@ -78,5 +78,57 @@ visit(Visitor&& visitor, toml::basic_value&& v) "does not have any valid basic_value.", v, "here")); } + +namespace detail +{ +template +struct visitor +{ + template + Result operator()(Ts&& ... args) + { + return vis(value, args ...); + } + Visitor vis; + Value value; +}; + +template +visitor make_visitor(Visitor&& vis, Value&& val) +{ + return visitor{ + std::forward(vis), std::forward(val) + }; +} +} // detail + +template +auto visit(Visitor&& visitor, Value&& v, Values&& ... vs) + -> detail::enable_if_t, detail::is_basic_value ... + >::value, decltype(visitor(std::forward(v ).as_boolean(), + std::forward(vs).as_boolean()...))> +{ + using result_t = decltype(visitor(v.as_boolean(), vs.as_boolean()...)); + using detail::make_visitor; + switch(v.type()) + { + case value_t::boolean : {return visit(make_visitor(std::forward(visitor), v.as_boolean ()), std::forward(vs)...);} + case value_t::integer : {return visit(make_visitor(std::forward(visitor), v.as_integer ()), std::forward(vs)...);} + case value_t::floating : {return visit(make_visitor(std::forward(visitor), v.as_floating ()), std::forward(vs)...);} + case value_t::string : {return visit(make_visitor(std::forward(visitor), v.as_string ()), std::forward(vs)...);} + case value_t::offset_datetime: {return visit(make_visitor(std::forward(visitor), v.as_offset_datetime()), std::forward(vs)...);} + case value_t::local_datetime : {return visit(make_visitor(std::forward(visitor), v.as_local_datetime ()), std::forward(vs)...);} + case value_t::local_date : {return visit(make_visitor(std::forward(visitor), v.as_local_date ()), std::forward(vs)...);} + case value_t::local_time : {return visit(make_visitor(std::forward(visitor), v.as_local_time ()), std::forward(vs)...);} + case value_t::array : {return visit(make_visitor(std::forward(visitor), v.as_array ()), std::forward(vs)...);} + case value_t::table : {return visit(make_visitor(std::forward(visitor), v.as_table ()), std::forward(vs)...);} + case value_t::empty : break; + default: break; + } + throw std::runtime_error(format_error("[error] toml::visit: toml::basic_value " + "does not have any valid basic_value.", v, "here")); +} + } // toml #endif// TOML11_VISIT_HPP