diff --git a/include/tao/json/contrib/traits.hpp b/include/tao/json/contrib/traits.hpp index 54ebe44e..eeb416ab 100644 --- a/include/tao/json/contrib/traits.hpp +++ b/include/tao/json/contrib/traits.hpp @@ -116,12 +116,18 @@ namespace tao::json template< typename T > struct traits< std::shared_ptr< T > > : shared_ptr_traits< T > - {}; + { + template< template< typename... > class Traits > + using default_key = typename Traits< T >::template default_key< Traits >; + }; template< typename T > struct traits< std::unique_ptr< T > > : unique_ptr_traits< T > - {}; + { + template< template< typename... > class Traits > + using default_key = typename Traits< T >::template default_key< Traits >; + }; } // namespace tao::json diff --git a/src/test/json/contrib_traits.cpp b/src/test/json/contrib_traits.cpp index 019264e6..76bdece7 100644 --- a/src/test/json/contrib_traits.cpp +++ b/src/test/json/contrib_traits.cpp @@ -2,6 +2,8 @@ // Please see LICENSE for license or visit https://github.com/taocpp/json/ #include +#include +#include #include "test.hpp" #include "test_events.hpp" @@ -101,6 +103,38 @@ namespace tao::json TEST_ASSERT( n != v ); } + struct default_type + : std::string + { + using std::string::string; + }; + + template<> + struct traits< default_type > + : traits< std::string > + { + TAO_JSON_DEFAULT_KEY( "default_key" ); + }; + + void test_default() + { + const default_type a = "a"; + const value v1 = { a }; + TEST_ASSERT( v1.get_object().size() == 1 ); + TEST_ASSERT( v1.get_object().begin()->first == "default_key" ); + TEST_ASSERT( v1.get_object().begin()->second == "a" ); + const auto b = std::make_unique< default_type >( "b" ); + const value v2 = { b }; + TEST_ASSERT( v2.get_object().size() == 1 ); + TEST_ASSERT( v2.get_object().begin()->first == "default_key" ); + TEST_ASSERT( v2.get_object().begin()->second == "b" ); + const auto c = std::make_shared< default_type >( "c" ); + const value v3 = { c }; + TEST_ASSERT( v3.get_object().size() == 1 ); + TEST_ASSERT( v3.get_object().begin()->first == "default_key" ); + TEST_ASSERT( v3.get_object().begin()->second == "c" ); + } + void test_deque() { const std::deque< std::uint64_t > f = { 1, 2, 3, 4 }; @@ -284,6 +318,7 @@ namespace tao::json test_shared(); test_unique(); + test_default(); test_deque(); test_list();