@@ -37,6 +37,63 @@ using FloatType = double;
37
37
using ScalarType = Value;
38
38
using IdType = std::vector<uint8_t >;
39
39
40
+ template <typename ValueType>
41
+ struct ValueTypeTraits
42
+ {
43
+ // Set by r-value reference, get by const reference, and release by value. The only types
44
+ // that actually support all 3 methods are StringType and ScalarType, everything else
45
+ // overrides some subset of these types with a template specialization.
46
+ using set_type = ValueType &&;
47
+ using get_type = const ValueType &;
48
+ using release_type = ValueType;
49
+ };
50
+
51
+ template <>
52
+ struct ValueTypeTraits <MapType>
53
+ {
54
+ // Get by const reference and release by value.
55
+ using get_type = const MapType &;
56
+ using release_type = MapType;
57
+ };
58
+
59
+ template <>
60
+ struct ValueTypeTraits <ListType>
61
+ {
62
+ // Get by const reference and release by value.
63
+ using get_type = const ListType &;
64
+ using release_type = ListType;
65
+ };
66
+
67
+ template <>
68
+ struct ValueTypeTraits <BooleanType>
69
+ {
70
+ // Set and get by value.
71
+ using set_type = BooleanType;
72
+ using get_type = BooleanType;
73
+ };
74
+
75
+ template <>
76
+ struct ValueTypeTraits <IntType>
77
+ {
78
+ // Set and get by value.
79
+ using set_type = IntType;
80
+ using get_type = IntType;
81
+ };
82
+
83
+ template <>
84
+ struct ValueTypeTraits <FloatType>
85
+ {
86
+ // Set and get by value.
87
+ using set_type = FloatType;
88
+ using get_type = FloatType;
89
+ };
90
+
91
+ template <>
92
+ struct ValueTypeTraits <IdType>
93
+ {
94
+ // ID values are represented as a String, there's no separate handling of this type.
95
+ };
96
+
40
97
struct TypedData ;
41
98
42
99
// Represent a discriminated union of GraphQL response value types.
@@ -86,15 +143,15 @@ struct Value
86
143
87
144
// Specialized for all single-value Types.
88
145
template <typename ValueType>
89
- void set (ValueType&& value);
146
+ void set (typename ValueTypeTraits< ValueType>::set_type value);
90
147
91
148
// Specialized for all Types.
92
149
template <typename ValueType>
93
- ValueType get () const ;
150
+ typename ValueTypeTraits< ValueType>::get_type get () const ;
94
151
95
152
// Specialized for all Types which allocate extra memory.
96
153
template <typename ValueType>
97
- ValueType release ();
154
+ typename ValueTypeTraits< ValueType>::release_type release ();
98
155
99
156
private:
100
157
const Type _type;
0 commit comments