Skip to content

Commit

Permalink
Merge pull request #435 from beached/v3
Browse files Browse the repository at this point in the history
Fix for #433
  • Loading branch information
beached authored Aug 4, 2024
2 parents 62a1bf5 + 4cb4523 commit c98d54f
Show file tree
Hide file tree
Showing 5 changed files with 511 additions and 330 deletions.
25 changes: 12 additions & 13 deletions include/daw/json/daw_json_link_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ namespace daw::json {
"The method to_json_data in the json_data_contract does not match "
"the mapping. The number of members is not the same." );
static_assert(
( (not std::is_rvalue_reference_v<Ts>)and... ),
( ( not std::is_rvalue_reference_v<Ts> ) and ... ),
"The Tuple contains rvalue references. The values "
"passed are now dangling. daw::forward_nonrvalue_as_tuple in "
"<daw/daw_tuple_forward.h> can forward only non-rvalue refs and "
Expand All @@ -87,11 +87,10 @@ namespace daw::json {
* @param parse_state JSON data to parse
* @return A T object
*/
template<typename JsonClass, typename ParseState>
template<typename JsonClass, bool /*KnownBounds*/, typename ParseState>
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
json_result_t<JsonClass>
parse_to_class( ParseState &parse_state,
template_param<JsonClass> = template_arg<JsonClass> ) {
parse_to_class( ParseState &parse_state ) {

static_assert( json_details::is_no_name_v<JsonClass> );
static_assert( json_details::is_a_json_type_v<JsonClass> );
Expand Down Expand Up @@ -179,10 +178,10 @@ namespace daw::json {
using result_type =
json_details::json_class_parse_result_t<Constructor, json_member>;

template<typename JsonClass, typename ParseState>
template<typename JsonClass, bool KnownBounds, typename ParseState>
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
json_result_t<JsonClass>
parse_to_class( ParseState &parse_state, template_param<JsonClass> ) {
parse_to_class( ParseState &parse_state ) {
static_assert( json_details::is_a_json_type_v<JsonClass> );
static_assert( json_details::has_json_data_contract_trait_v<
json_details::json_result_t<JsonClass>>,
Expand All @@ -194,7 +193,7 @@ namespace daw::json {
template_args<JsonClass, daw::construct_a_t<
json_details::json_result_t<JsonClass>>>,
parse_state,
json_details::parse_value<json_member, false>(
json_details::parse_value<json_member, KnownBounds>(
parse_state, ParseTag<json_member::expected_type>{ } ) );
}
};
Expand Down Expand Up @@ -321,10 +320,10 @@ namespace daw::json {
* @param parse_state JSON data to parse
* @return A T object
*/
template<typename JsonClass, typename ParseState>
template<typename JsonClass, bool /*KnownBounds*/, typename ParseState>
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
json_result_t<JsonClass>
parse_to_class( ParseState &parse_state, template_param<JsonClass> ) {
parse_to_class( ParseState &parse_state ) {
static_assert( json_details::is_a_json_type_v<JsonClass> );
static_assert( json_details::has_json_data_contract_trait_v<
json_details::json_base_type_t<JsonClass>>,
Expand Down Expand Up @@ -394,10 +393,10 @@ namespace daw::json {
* @param parse_state JSON data to parse
* @return A T object
*/
template<typename JsonClass, typename ParseState>
template<typename JsonClass, bool /*KnownBounds*/, typename ParseState>
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_details::
from_json_result_t<JsonClass>
parse_to_class( ParseState &parse_state, template_param<JsonClass> ) {
parse_to_class( ParseState &parse_state ) {
static_assert( json_details::is_a_json_type_v<JsonClass> );
static_assert( json_details::has_json_data_contract_trait_v<
json_details::json_base_type_t<JsonClass>>,
Expand All @@ -406,8 +405,8 @@ namespace daw::json {

std::size_t const idx = [parse_state]( ) mutable {
return Switcher{ }( std::get<0>(
json_details::parse_value_class<json_base::json_class<tag_class_t>>(
parse_state )
json_details::parse_value_class<json_base::json_class<tag_class_t>,
false>( parse_state )
.members ) );
}( );
daw_json_assert_weak( idx < sizeof...( JsonClasses ),
Expand Down
23 changes: 11 additions & 12 deletions include/daw/json/impl/daw_json_parse_value.h
Original file line number Diff line number Diff line change
Expand Up @@ -485,10 +485,10 @@ namespace daw::json {
can_single_allocation_string_v<json_base_type_t<JsonMember>>;

DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_NT( has_json_member_constructor_v,
json_constructor_t<T> );
json_constructor_t<T> );

DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_NT( has_json_member_parse_to_v,
json_result_t<T> );
json_result_t<T> );

template<typename JsonMember, bool KnownBounds = false,
typename ParseState>
Expand Down Expand Up @@ -556,8 +556,7 @@ namespace daw::json {
std::data( str ), std::size( str ) );
}

template<typename JsonMember, bool KnownBounds = false,
typename ParseState>
template<typename JsonMember, bool KnownBounds, typename ParseState>
[[nodiscard]] static constexpr json_result_t<JsonMember>
parse_value_custom( ParseState &parse_state ) {

Expand Down Expand Up @@ -603,8 +602,7 @@ namespace daw::json {
std::string_view( std::data( str ), std::size( str ) ) );
}

template<typename JsonMember, bool KnownBounds = false,
typename ParseState>
template<typename JsonMember, bool KnownBounds, typename ParseState>
[[nodiscard]] DAW_ATTRIB_INLINE static constexpr json_result_t<JsonMember>
parse_value_class( ParseState &parse_state ) {

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

if constexpr( KnownBounds ) {
return json_data_contract_trait_t<element_t>::parse_to_class(
parse_state, template_arg<JsonMember> );
return json_data_contract_trait_t<element_t>::template parse_to_class<
JsonMember, KnownBounds>( parse_state );
} else if constexpr( is_pinned_type_v<element_t> ) {
auto const run_after_parse = daw::on_exit_success( [&] {
parse_state.trim_left_checked( );
} );
(void)run_after_parse;
return json_data_contract_trait_t<element_t>::parse_to_class(
parse_state, template_arg<JsonMember> );
return json_data_contract_trait_t<element_t>::template parse_to_class<
JsonMember, KnownBounds>( parse_state );
} else if constexpr( is_deduced_empty_class_v<JsonMember> ) {
parse_state.trim_left_checked( );
return json_result_t<JsonMember>{ };
} else {
auto result = json_data_contract_trait_t<element_t>::parse_to_class(
parse_state, template_arg<JsonMember> );
auto result =
json_data_contract_trait_t<element_t>::template parse_to_class<
JsonMember, KnownBounds>( parse_state );
parse_state.trim_left_checked( );
return result;
}
Expand Down
Loading

0 comments on commit c98d54f

Please sign in to comment.