mirror of
https://github.com/boostorg/json.git
synced 2025-05-12 14:11:40 +00:00
UDT serialization of described enums
This commit is contained in:
parent
42576b096a
commit
097a3da7d2
@ -10,6 +10,7 @@
|
|||||||
#ifndef BOOST_JSON_IMPL_SERIALIZER_HPP
|
#ifndef BOOST_JSON_IMPL_SERIALIZER_HPP
|
||||||
#define BOOST_JSON_IMPL_SERIALIZER_HPP
|
#define BOOST_JSON_IMPL_SERIALIZER_HPP
|
||||||
|
|
||||||
|
#include <boost/describe/enum_to_string.hpp>
|
||||||
#include <boost/json/conversion.hpp>
|
#include <boost/json/conversion.hpp>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
@ -585,6 +586,58 @@ do_obj6:
|
|||||||
return w.suspend(writer::state::obj6, cur, pt);
|
return w.suspend(writer::state::obj6, cur, pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T, bool StackEmpty>
|
||||||
|
BOOST_FORCEINLINE
|
||||||
|
bool
|
||||||
|
write_impl(described_enum_conversion_tag, writer& w, stream& ss)
|
||||||
|
{
|
||||||
|
#ifdef BOOST_DESCRIBE_CXX14
|
||||||
|
using Integer = typename std::underlying_type<T>::type;
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# pragma warning( push )
|
||||||
|
# pragma warning( disable : 4127 )
|
||||||
|
#endif
|
||||||
|
if(StackEmpty || w.st_.empty())
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# pragma warning( pop )
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
BOOST_ASSERT( w.p_ );
|
||||||
|
T const* pt = reinterpret_cast<T const*>(w.p_);
|
||||||
|
char const* const name = describe::enum_to_string(*pt, nullptr);
|
||||||
|
if( name )
|
||||||
|
{
|
||||||
|
string_view const sv = name;
|
||||||
|
w.cs0_ = { sv.data(), sv.size() };
|
||||||
|
return write_string(w, ss);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Integer n = static_cast<Integer>(*pt);
|
||||||
|
w.p_ = &n;
|
||||||
|
return write_impl<Integer, true>(w, ss);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writer::state st;
|
||||||
|
w.st_.peek(st);
|
||||||
|
if( st == writer::state::lit )
|
||||||
|
return write_impl<Integer, false>(w, ss);
|
||||||
|
else
|
||||||
|
return resume_string(w, ss);
|
||||||
|
}
|
||||||
|
#else // BOOST_DESCRIBE_CXX14
|
||||||
|
(void)w;
|
||||||
|
(void)ss;
|
||||||
|
static_assert(
|
||||||
|
!std::is_same<T, T>::value,
|
||||||
|
"described enums require C++14 support");
|
||||||
|
return false;
|
||||||
|
#endif // BOOST_DESCRIBE_CXX14
|
||||||
|
}
|
||||||
|
|
||||||
template<class T, bool StackEmpty>
|
template<class T, bool StackEmpty>
|
||||||
bool
|
bool
|
||||||
write_impl(writer& w, stream& ss)
|
write_impl(writer& w, stream& ss)
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <boost/json/serializer.hpp>
|
#include <boost/json/serializer.hpp>
|
||||||
|
|
||||||
#include <boost/describe/class.hpp>
|
#include <boost/describe/class.hpp>
|
||||||
|
#include <boost/describe/enum.hpp>
|
||||||
#include <boost/json/detail/stack.hpp>
|
#include <boost/json/detail/stack.hpp>
|
||||||
#include <boost/json/serialize.hpp>
|
#include <boost/json/serialize.hpp>
|
||||||
#include <boost/json/null_resource.hpp>
|
#include <boost/json/null_resource.hpp>
|
||||||
@ -36,6 +37,15 @@ struct my_struct
|
|||||||
};
|
};
|
||||||
BOOST_DESCRIBE_STRUCT(my_struct, (), (s, n, d));
|
BOOST_DESCRIBE_STRUCT(my_struct, (), (s, n, d));
|
||||||
|
|
||||||
|
enum class my_enum
|
||||||
|
{
|
||||||
|
option_one,
|
||||||
|
option_two,
|
||||||
|
option_three,
|
||||||
|
option_four,
|
||||||
|
};
|
||||||
|
BOOST_DESCRIBE_ENUM(my_enum, option_one, option_two, option_three);
|
||||||
|
|
||||||
} // namespace serializer_test_ns
|
} // namespace serializer_test_ns
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT( std::is_nothrow_destructible<serializer>::value );
|
BOOST_STATIC_ASSERT( std::is_nothrow_destructible<serializer>::value );
|
||||||
@ -821,12 +831,18 @@ public:
|
|||||||
"a string", {12, true}),
|
"a string", {12, true}),
|
||||||
R"(["a string",[12,true]])");
|
R"(["a string",[12,true]])");
|
||||||
}
|
}
|
||||||
{
|
|
||||||
#ifdef BOOST_DESCRIBE_CXX14
|
#ifdef BOOST_DESCRIBE_CXX14
|
||||||
|
{
|
||||||
serializer_test_ns::my_struct s{"some string", 1424, 12.4};
|
serializer_test_ns::my_struct s{"some string", 1424, 12.4};
|
||||||
check_udt(s, R"({"s":"some string","n":1424,"d":1.24E1})");
|
check_udt(s, R"({"s":"some string","n":1424,"d":1.24E1})");
|
||||||
#endif // BOOST_DESCRIBE_CXX14
|
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
check_udt(
|
||||||
|
serializer_test_ns::my_enum::option_three,
|
||||||
|
R"("option_three")");
|
||||||
|
check_udt( serializer_test_ns::my_enum(100), "100" );
|
||||||
|
}
|
||||||
|
#endif // BOOST_DESCRIBE_CXX14
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user