18 #include <daw/daw_move.h>
19 #include <daw/daw_uint_buffer.h>
23 #include <string_view>
29 namespace json_details {
30 template<
typename ParseState>
42 [[nodiscard]] constexpr
bool is_match( daw::string_view Name )
const {
46 [[nodiscard]] constexpr
bool is_match( daw::string_view Name,
47 daw::UInt32 hash )
const {
61 :
name( std::data( Name ), std::size( Name ) )
70 template<
typename ParseState>
73 std::vector<json_details::basic_stateful_json_value_state<ParseState>>
83 std::size_t
const Sz = std::size( m_locs );
84 for( ; pos < Sz; ++pos ) {
91 if( m_locs.empty( ) ) {
92 return m_value.
begin( );
94 auto res = m_locs.back( ).location;
98 auto const last = m_value.
end( );
100 auto name =
it.name( );
102 auto const &new_loc = m_locs.emplace_back(
103 daw::string_view( std::data( *name ), std::size( *name ) ),
it );
104 if( new_loc.is_match( member.
name ) ) {
110 return std::size( m_locs );
118 [[nodiscard]] constexpr std::size_t move_to( std::size_t index ) {
119 if( index < std::size( m_locs ) ) {
123 if( m_locs.empty( ) ) {
124 return m_value.
begin( );
126 auto res = m_locs.back( ).location;
130 auto last = m_value.
end( );
131 std::size_t pos = std::size( m_locs );
132 while(
it != last ) {
133 auto name =
it.name( );
136 daw::string_view( std::data( *name ), std::size( *name ) ),
it );
138 m_locs.emplace_back( daw::string_view( ),
it );
146 return std::size( m_locs );
151 : m_value( DAW_MOVE( val ) ) {
154 auto t = m_value.
type( );
158 ErrorReason::ExpectedArrayOrClassStart,
173 m_value = DAW_MOVE( val );
187 ErrorReason::UnknownMember );
188 return m_locs[pos].location->value;
199 std::size_t pos = move_to( member );
201 ErrorReason::UnknownMember );
202 return m_locs[pos].location->value;
213 at( std::string_view key ) {
214 auto const k = std::string_view( std::data( key ), std::size( key ) );
215 std::size_t pos = move_to( k );
216 if( pos < std::size( m_locs ) ) {
217 return m_locs[pos].location->value;
228 [[nodiscard]] std::size_t
size( ) {
230 switch( current_type ) {
233 return move_to( daw::numeric_limits<std::size_t>::max( ) );
246 [[nodiscard]] std::size_t
index_of( std::string_view key ) {
247 auto const k = std::string_view( std::data( key ), std::size( key ) );
257 [[nodiscard]] constexpr
bool contains( std::string_view key ) {
259 std::string_view( std::data( key ), std::size( key ) );
260 return move_to( k ) < std::size( m_locs );
269 [[nodiscard]] constexpr
bool contains( std::size_t index ) {
270 return move_to( index ) <
size( m_locs );
280 template<
typename Integer,
281 std::enable_if_t<std::is_integral<Integer>::value,
282 std::nullptr_t> =
nullptr>
283 [[nodiscard]] std::optional<std::string_view>
name_of( Integer index ) {
284 if constexpr( std::is_signed<Integer>::value ) {
288 if(
static_cast<std::size_t
>( index ) >= sz ) {
291 sz -=
static_cast<std::size_t
>( index );
292 return std::string_view( std::data( m_locs[sz].name( ) ),
293 std::size( m_locs[sz].name( ) ) );
296 std::size_t pos = move_to(
static_cast<std::size_t
>( index ) );
297 if( pos < std::size( m_locs ) ) {
298 return std::string_view( std::data( m_locs[pos].name( ) ),
299 std::size( m_locs[pos].name( ) ) );
312 template<
typename Integer,
313 std::enable_if_t<std::is_integral<Integer>::value,
314 std::nullptr_t> =
nullptr>
317 if constexpr( std::is_signed<Integer>::value ) {
322 ErrorReason::UnknownMember );
323 sz -=
static_cast<std::size_t
>( index );
324 return m_locs[sz].location->value;
327 std::size_t pos = move_to(
static_cast<std::size_t
>( index ) );
329 ErrorReason::UnknownMember );
330 return m_locs[pos].location->value;
340 template<
typename Integer,
341 std::enable_if_t<std::is_integral<Integer>::value,
342 std::nullptr_t> =
nullptr>
343 [[nodiscard]] constexpr std::optional<basic_json_value<ParseState>>
344 at( Integer index ) {
345 if constexpr( std::is_signed<Integer>::value ) {
349 if(
static_cast<std::size_t
>( index ) >= sz ) {
352 sz -=
static_cast<std::size_t
>( index );
353 return m_locs[sz].location->value( );
356 std::size_t pos = move_to(
static_cast<std::size_t
>( index ) );
357 if( pos < std::size( m_locs ) ) {
358 return m_locs[pos].location->value( );
Definition: daw_json_value.h:316
constexpr ParseState get_raw_state() const
Definition: daw_json_value.h:361
JsonBaseParseTypes type() const
Definition: daw_json_value.h:391
constexpr iterator begin() const
Definition: daw_json_value.h:370
constexpr iterator end() const
Definition: daw_json_value.h:382
Definition: daw_json_value_state.h:71
std::optional< std::string_view > name_of(Integer index)
Definition: daw_json_value_state.h:283
constexpr std::optional< basic_json_value< ParseState > > at(Integer index)
Definition: daw_json_value_state.h:344
constexpr basic_json_value< ParseState > operator[](std::string_view key)
Definition: daw_json_value_state.h:184
constexpr basic_stateful_json_value()
Definition: daw_json_value_state.h:162
constexpr bool contains(std::string_view key)
Definition: daw_json_value_state.h:257
constexpr basic_json_value< ParseState > at(std::string_view key)
Definition: daw_json_value_state.h:213
std::size_t size()
Definition: daw_json_value_state.h:228
constexpr basic_json_value< ParseState > operator[](json_member_name member)
Definition: daw_json_value_state.h:198
constexpr void reset(basic_json_value< ParseState > val)
Definition: daw_json_value_state.h:172
constexpr basic_stateful_json_value(basic_json_value< ParseState > val)
Definition: daw_json_value_state.h:150
constexpr basic_stateful_json_value(std::string_view json_data)
Definition: daw_json_value_state.h:165
constexpr basic_json_value< ParseState > operator[](Integer index)
Definition: daw_json_value_state.h:316
constexpr bool contains(std::size_t index)
Definition: daw_json_value_state.h:269
constexpr basic_json_value< ParseState > get_json_value() const
Definition: daw_json_value_state.h:367
std::size_t index_of(std::string_view key)
Definition: daw_json_value_state.h:246
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
Iterator & it
Definition: daw_json_traits.h:231
JsonBaseParseTypes
Definition: daw_json_enums.h:40
Definition: daw_from_json.h:22
Definition: daw_from_json.h:22
constexpr UInt32 name_hash(StringView const &key, std::uint32_t seed=0)
Definition: daw_murmur3.h:45
Definition: daw_json_value.h:105
Definition: daw_json_value_state.h:31
constexpr basic_stateful_json_value_state(daw::string_view Name, basic_json_value_iterator< ParseState > val)
Definition: daw_json_value_state.h:36
basic_json_value_iterator< ParseState > location
Definition: daw_json_value_state.h:34
constexpr bool is_match(daw::string_view Name) const
Definition: daw_json_value_state.h:42
daw::string_view name
Definition: daw_json_value_state.h:32
daw::UInt32 hash_value
Definition: daw_json_value_state.h:33
constexpr bool is_match(daw::string_view Name, daw::UInt32 hash) const
Definition: daw_json_value_state.h:46
Definition: daw_json_value_state.h:56
daw::string_view name
Definition: daw_json_value_state.h:57
daw::UInt32 hash_value
Definition: daw_json_value_state.h:58
constexpr json_member_name(std::string_view Name)
Definition: daw_json_value_state.h:60
#define DAW_JSON_VER
Definition: version.h:11