From 0766d839fe52eb12ac7ecd34bc39a76399cfde41 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Mon, 23 Sep 2024 16:34:23 +0800 Subject: [PATCH] [struct_json][feat]support custom optional(struct_pack compatible) (#781) --- include/ylt/standalone/iguana/dynamic.hpp | 7 +++++++ include/ylt/standalone/iguana/json_writer.hpp | 10 ++++++---- include/ylt/standalone/iguana/util.hpp | 3 +-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/ylt/standalone/iguana/dynamic.hpp b/include/ylt/standalone/iguana/dynamic.hpp index 47cf20154..5b134baf6 100644 --- a/include/ylt/standalone/iguana/dynamic.hpp +++ b/include/ylt/standalone/iguana/dynamic.hpp @@ -159,6 +159,13 @@ struct base_impl : public base { virtual ~base_impl() {} mutable size_t cache_size = 0; + + private: + virtual void dummy() { + // make sure init T before main, and can register_type before main. + [[maybe_unused]] static auto t = + ylt::reflection::internal::wrapper::value; + } }; IGUANA_INLINE std::shared_ptr create_instance(std::string_view name) { diff --git a/include/ylt/standalone/iguana/json_writer.hpp b/include/ylt/standalone/iguana/json_writer.hpp index 1901d565b..75d4a70e9 100644 --- a/include/ylt/standalone/iguana/json_writer.hpp +++ b/include/ylt/standalone/iguana/json_writer.hpp @@ -12,8 +12,9 @@ template , int> = 0> IGUANA_INLINE void to_json(T &&t, Stream &s); namespace detail { -template -IGUANA_INLINE void to_json_impl(Stream &ss, const std::optional &val); +template , int> = 0> +IGUANA_INLINE void to_json_impl(Stream &ss, const T &val); template , int> = 0> @@ -151,8 +152,9 @@ IGUANA_INLINE void to_json_impl(Stream &ss, T val) { } } -template -IGUANA_INLINE void to_json_impl(Stream &ss, const std::optional &val) { +template , int>> +IGUANA_INLINE void to_json_impl(Stream &ss, const T &val) { if (!val) { ss.append("null"); } diff --git a/include/ylt/standalone/iguana/util.hpp b/include/ylt/standalone/iguana/util.hpp index 614040cc0..8c3fca9e2 100644 --- a/include/ylt/standalone/iguana/util.hpp +++ b/include/ylt/standalone/iguana/util.hpp @@ -47,8 +47,7 @@ template inline constexpr bool enum_v = std::is_enum_v>; template -constexpr inline bool optional_v = - is_template_instant_of>::value; +constexpr inline bool optional_v = ylt::reflection::optional; template struct is_container : std::false_type {};