Skip to content

Commit de56743

Browse files
committed
Default keys for smart pointers.
1 parent 3301293 commit de56743

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

include/tao/json/contrib/traits.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,18 @@ namespace tao::json
116116
template< typename T >
117117
struct traits< std::shared_ptr< T > >
118118
: shared_ptr_traits< T >
119-
{};
119+
{
120+
template< template< typename... > class Traits >
121+
using default_key = typename Traits< T >::template default_key< Traits >;
122+
};
120123

121124
template< typename T >
122125
struct traits< std::unique_ptr< T > >
123126
: unique_ptr_traits< T >
124-
{};
127+
{
128+
template< template< typename... > class Traits >
129+
using default_key = typename Traits< T >::template default_key< Traits >;
130+
};
125131

126132
} // namespace tao::json
127133

src/test/json/contrib_traits.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Please see LICENSE for license or visit https://github.com/taocpp/json/
33

44
#include <limits>
5+
#include <memory>
6+
#include <string>
57

68
#include "test.hpp"
79
#include "test_events.hpp"
@@ -101,6 +103,38 @@ namespace tao::json
101103
TEST_ASSERT( n != v );
102104
}
103105

106+
struct default_type
107+
: std::string
108+
{
109+
using std::string::string;
110+
};
111+
112+
template<>
113+
struct traits< default_type >
114+
: traits< std::string >
115+
{
116+
TAO_JSON_DEFAULT_KEY( "default_key" );
117+
};
118+
119+
void test_default()
120+
{
121+
const default_type a = "a";
122+
const value v1 = { a };
123+
TEST_ASSERT( v1.get_object().size() == 1 );
124+
TEST_ASSERT( v1.get_object().begin()->first == "default_key" );
125+
TEST_ASSERT( v1.get_object().begin()->second == "a" );
126+
const auto b = std::make_unique< default_type >( "b" );
127+
const value v2 = { b };
128+
TEST_ASSERT( v2.get_object().size() == 1 );
129+
TEST_ASSERT( v2.get_object().begin()->first == "default_key" );
130+
TEST_ASSERT( v2.get_object().begin()->second == "b" );
131+
const auto c = std::make_shared< default_type >( "c" );
132+
const value v3 = { c };
133+
TEST_ASSERT( v3.get_object().size() == 1 );
134+
TEST_ASSERT( v3.get_object().begin()->first == "default_key" );
135+
TEST_ASSERT( v3.get_object().begin()->second == "c" );
136+
}
137+
104138
void test_deque()
105139
{
106140
const std::deque< std::uint64_t > f = { 1, 2, 3, 4 };
@@ -284,6 +318,7 @@ namespace tao::json
284318

285319
test_shared();
286320
test_unique();
321+
test_default();
287322

288323
test_deque();
289324
test_list();

0 commit comments

Comments
 (0)