1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
template<typename... Ts>
std::wstring API::Tuple::toString(std::tuple<Ts...> const& value)
{
std::wstring str = g_BeginKeyWord;
std::apply([&str](auto&&... tuple_args)
{
std::size_t n{0};
// expression repliée
((
str += (API::IsRepresentedByString<decltype(tuple_args)>() ? LR"#(")#"s + API::toString(tuple_args) + LR"#(")#"s : API::toString(tuple_args))
+ (++n != sizeof...(Ts) ? std::wstring{g_SeparatorKeyWord + L" "s} : std::wstring{L""s})
), ...);
}, value);
str += g_EndKeyWord;
return str;
}
template<typename T_Tuple, std::size_t index>
void API::Tuple::FromNode(T_Tuple& in_tuple, const API::Serialization::Node::Nodes::const_iterator& begin, const API::Serialization::Node::Nodes::const_iterator& end)
{
constexpr size_t tuple_size{std::tuple_size_v<T_Tuple>};
if constexpr (index < tuple_size)
{
MA_ASSERT(begin != end,
L"begin == end"s,
std::invalid_argument);
std::get<index>(in_tuple) = API::FromNode<typename std::tuple_element<index, T_Tuple>::type>(*begin);
if constexpr (index + 1u < tuple_size)
API::Tuple::FromNode<T_Tuple, index + 1u>(in_tuple, begin + 1u, end);
}
}
template <class... Ts>
std::wstring API::toString(const std::tuple<Ts...>& value)
{
return API::Tuple::toString(value);
}
template <class T_Tuple>
T_Tuple API::FromNode(const MA_SFINAE_NODE_TUPLE& node)
{
MA_ASSERT(node->m_Type == API::Serialization::Node::Struct,
L"Le nud n'est pas une structure.",
std::invalid_argument);
T_Tuple result{};
const size_t tuple_size{std::tuple_size_v<T_Tuple>};
MA_ASSERT(node->m_Nodes.size() <= tuple_size,
L"Le nud a plus d'enfants que ne le permet le tuple: " +
API::toString(tuple_size),
std::invalid_argument);
MA_ASSERT(tuple_size > 0,
L"Le tuple doit avoir au moins un paramètre.",
std::invalid_argument);
API::Tuple::FromNode<T_Tuple, 0>(result, node->m_Nodes.begin(), node->m_Nodes.end());
return result;
} |
Partager