Skip to content

Commit 4cb4523

Browse files
committed
Fix for issue #433
Fix for issue #433 . The info on KnownBounds was being dropped when it should have been kept for custom classes
1 parent 248029b commit 4cb4523

File tree

4 files changed

+469
-305
lines changed

4 files changed

+469
-305
lines changed

include/daw/json/daw_json_link_types.h

+12-13
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ namespace daw::json {
6666
"The method to_json_data in the json_data_contract does not match "
6767
"the mapping. The number of members is not the same." );
6868
static_assert(
69-
( (not std::is_rvalue_reference_v<Ts>)and... ),
69+
( ( not std::is_rvalue_reference_v<Ts> ) and ... ),
7070
"The Tuple contains rvalue references. The values "
7171
"passed are now dangling. daw::forward_nonrvalue_as_tuple in "
7272
"<daw/daw_tuple_forward.h> can forward only non-rvalue refs and "
@@ -87,11 +87,10 @@ namespace daw::json {
8787
* @param parse_state JSON data to parse
8888
* @return A T object
8989
*/
90-
template<typename JsonClass, typename ParseState>
90+
template<typename JsonClass, bool /*KnownBounds*/, typename ParseState>
9191
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
9292
json_result_t<JsonClass>
93-
parse_to_class( ParseState &parse_state,
94-
template_param<JsonClass> = template_arg<JsonClass> ) {
93+
parse_to_class( ParseState &parse_state ) {
9594

9695
static_assert( json_details::is_no_name_v<JsonClass> );
9796
static_assert( json_details::is_a_json_type_v<JsonClass> );
@@ -179,10 +178,10 @@ namespace daw::json {
179178
using result_type =
180179
json_details::json_class_parse_result_t<Constructor, json_member>;
181180

182-
template<typename JsonClass, typename ParseState>
181+
template<typename JsonClass, bool KnownBounds, typename ParseState>
183182
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
184183
json_result_t<JsonClass>
185-
parse_to_class( ParseState &parse_state, template_param<JsonClass> ) {
184+
parse_to_class( ParseState &parse_state ) {
186185
static_assert( json_details::is_a_json_type_v<JsonClass> );
187186
static_assert( json_details::has_json_data_contract_trait_v<
188187
json_details::json_result_t<JsonClass>>,
@@ -194,7 +193,7 @@ namespace daw::json {
194193
template_args<JsonClass, daw::construct_a_t<
195194
json_details::json_result_t<JsonClass>>>,
196195
parse_state,
197-
json_details::parse_value<json_member, false>(
196+
json_details::parse_value<json_member, KnownBounds>(
198197
parse_state, ParseTag<json_member::expected_type>{ } ) );
199198
}
200199
};
@@ -321,10 +320,10 @@ namespace daw::json {
321320
* @param parse_state JSON data to parse
322321
* @return A T object
323322
*/
324-
template<typename JsonClass, typename ParseState>
323+
template<typename JsonClass, bool /*KnownBounds*/, typename ParseState>
325324
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
326325
json_result_t<JsonClass>
327-
parse_to_class( ParseState &parse_state, template_param<JsonClass> ) {
326+
parse_to_class( ParseState &parse_state ) {
328327
static_assert( json_details::is_a_json_type_v<JsonClass> );
329328
static_assert( json_details::has_json_data_contract_trait_v<
330329
json_details::json_base_type_t<JsonClass>>,
@@ -394,10 +393,10 @@ namespace daw::json {
394393
* @param parse_state JSON data to parse
395394
* @return A T object
396395
*/
397-
template<typename JsonClass, typename ParseState>
396+
template<typename JsonClass, bool /*KnownBounds*/, typename ParseState>
398397
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
399398
from_json_result_t<JsonClass>
400-
parse_to_class( ParseState &parse_state, template_param<JsonClass> ) {
399+
parse_to_class( ParseState &parse_state ) {
401400
static_assert( json_details::is_a_json_type_v<JsonClass> );
402401
static_assert( json_details::has_json_data_contract_trait_v<
403402
json_details::json_base_type_t<JsonClass>>,
@@ -406,8 +405,8 @@ namespace daw::json {
406405

407406
std::size_t const idx = [parse_state]( ) mutable {
408407
return Switcher{ }( std::get<0>(
409-
json_details::parse_value_class<json_base::json_class<tag_class_t>>(
410-
parse_state )
408+
json_details::parse_value_class<json_base::json_class<tag_class_t>,
409+
false>( parse_state )
411410
.members ) );
412411
}( );
413412
daw_json_assert_weak( idx < sizeof...( JsonClasses ),

include/daw/json/impl/daw_json_parse_value.h

+11-12
Original file line numberDiff line numberDiff line change
@@ -485,10 +485,10 @@ namespace daw::json {
485485
can_single_allocation_string_v<json_base_type_t<JsonMember>>;
486486

487487
DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_NT( has_json_member_constructor_v,
488-
json_constructor_t<T> );
488+
json_constructor_t<T> );
489489

490490
DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_NT( has_json_member_parse_to_v,
491-
json_result_t<T> );
491+
json_result_t<T> );
492492

493493
template<typename JsonMember, bool KnownBounds = false,
494494
typename ParseState>
@@ -556,8 +556,7 @@ namespace daw::json {
556556
std::data( str ), std::size( str ) );
557557
}
558558

559-
template<typename JsonMember, bool KnownBounds = false,
560-
typename ParseState>
559+
template<typename JsonMember, bool KnownBounds, typename ParseState>
561560
[[nodiscard]] static constexpr json_result_t<JsonMember>
562561
parse_value_custom( ParseState &parse_state ) {
563562

@@ -603,8 +602,7 @@ namespace daw::json {
603602
std::string_view( std::data( str ), std::size( str ) ) );
604603
}
605604

606-
template<typename JsonMember, bool KnownBounds = false,
607-
typename ParseState>
605+
template<typename JsonMember, bool KnownBounds, typename ParseState>
608606
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_result_t<JsonMember>
609607
parse_value_class( ParseState &parse_state ) {
610608

@@ -613,21 +611,22 @@ namespace daw::json {
613611
ErrorReason::UnexpectedEndOfData, parse_state );
614612

615613
if constexpr( KnownBounds ) {
616-
return json_data_contract_trait_t<element_t>::parse_to_class(
617-
parse_state, template_arg<JsonMember> );
614+
return json_data_contract_trait_t<element_t>::template parse_to_class<
615+
JsonMember, KnownBounds>( parse_state );
618616
} else if constexpr( is_pinned_type_v<element_t> ) {
619617
auto const run_after_parse = daw::on_exit_success( [&] {
620618
parse_state.trim_left_checked( );
621619
} );
622620
(void)run_after_parse;
623-
return json_data_contract_trait_t<element_t>::parse_to_class(
624-
parse_state, template_arg<JsonMember> );
621+
return json_data_contract_trait_t<element_t>::template parse_to_class<
622+
JsonMember, KnownBounds>( parse_state );
625623
} else if constexpr( is_deduced_empty_class_v<JsonMember> ) {
626624
parse_state.trim_left_checked( );
627625
return json_result_t<JsonMember>{ };
628626
} else {
629-
auto result = json_data_contract_trait_t<element_t>::parse_to_class(
630-
parse_state, template_arg<JsonMember> );
627+
auto result =
628+
json_data_contract_trait_t<element_t>::template parse_to_class<
629+
JsonMember, KnownBounds>( parse_state );
631630
parse_state.trim_left_checked( );
632631
return result;
633632
}

0 commit comments

Comments
 (0)