1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

VariantConverter: Use FromVar and ToVar as a fallback

This commit is contained in:
reuk 2023-09-08 14:48:29 +01:00
parent 56195d1053
commit d8b71b4eef
No known key found for this signature in database
GPG key ID: FCB43929F012EE5C
2 changed files with 49 additions and 22 deletions

View file

@ -340,26 +340,4 @@ JUCE_API bool operator== (const var&, const String&);
JUCE_API bool operator!= (const var&, const String&);
JUCE_API bool operator== (const var&, const char*);
JUCE_API bool operator!= (const var&, const char*);
//==============================================================================
/** This template-overloaded class can be used to convert between var and custom types.
@tags{Core}
*/
template <typename Type>
struct VariantConverter
{
static Type fromVar (const var& v) { return static_cast<Type> (v); }
static var toVar (const Type& t) { return t; }
};
#ifndef DOXYGEN
template <>
struct VariantConverter<String>
{
static String fromVar (const var& v) { return v.toString(); }
static var toVar (const String& s) { return s; }
};
#endif
} // namespace juce

View file

@ -456,4 +456,53 @@ private:
};
};
//==============================================================================
/**
This template-overloaded class can be used to convert between var and custom types.
If not specialised, the variant converter will attempt to use serialisation functions
if they are detected for the given type.
For details of what this entails, see the docs for SerialisationTraits.
In short, the constant 'marshallingVersion', and either the single function 'serialise()', or
the function pair 'load()' and 'save()' must be defined for the type. These may be defined
as public members of the type T itself, or as public members of juce::SerialisationTraits<T>,
which is a specialisation of the SerialisationTraits template struct for the type T.
@see ToVar, FromVar
@tags{Core}
*/
template <typename Type>
struct VariantConverter
{
static Type fromVar (const var& v)
{
if constexpr (detail::serialisationKind<Type> != detail::SerialisationKind::none)
{
auto converted = FromVar::convert<Type> (v);
jassert (converted.has_value());
return std::move (converted).value_or (Type{});
}
else
{
return static_cast<Type> (v);
}
}
static var toVar (const Type& t)
{
if constexpr (detail::serialisationKind<Type> != detail::SerialisationKind::none)
{
auto converted = ToVar::convert<> (t);
jassert (converted.has_value());
return std::move (converted).value_or (var{});
}
else
{
return t;
}
}
};
} // namespace juce