15 #include <daw/daw_arith_traits.h>
16 #include <daw/daw_cxmath.h>
17 #include <daw/daw_uint_buffer.h>
24 #ifdef DAW_ALLOW_SSE42
25 #include <emmintrin.h>
26 #include <smmintrin.h>
27 #include <tmmintrin.h>
28 #include <xmmintrin.h>
36 namespace json_details {
37 [[nodiscard]]
static inline constexpr
bool
42 std::byte
const buff[8]{
43 static_cast<std::byte
>( ptr[0] ),
static_cast<std::byte
>( ptr[1] ),
44 static_cast<std::byte
>( ptr[2] ),
static_cast<std::byte
>( ptr[3] ),
45 static_cast<std::byte
>( ptr[4] ),
static_cast<std::byte
>( ptr[5] ),
46 static_cast<std::byte
>( ptr[6] ),
static_cast<std::byte
>( ptr[7] ) };
48 UInt64 val = UInt64( );
49 for( std::size_t n = 0; n < 8; ++n ) {
50 val |= to_uint64( buff[n] ) << ( 8 * n );
52 return ( ( ( val & 0xF0F0'F0F0'F0F0'F0F0_u64 ) |
53 ( ( ( val + 0x0606'0606'0606'0606_u64 ) &
54 0xF0F0'F0F0'F0F0'F0F0_u64 ) >>
55 4U ) ) == 0x3333'3333'3333'3333_u64 );
59 typename MaxArithUnsigned>
61 std::disjunction<daw::is_integral<Unsigned>,
62 std::is_enum<Unsigned>>::value,
63 std::conditional_t<(
sizeof(
Unsigned ) >
sizeof( MaxArithUnsigned ) ),
64 Unsigned, MaxArithUnsigned>,
70 auto const chunk = daw::to_uint64_buffer( str );
72 auto const lower_digits =
73 ( chunk & 0x0F'00'0F'00'0F'00'0F'00_u64 ) >> 8U;
74 auto const upper_digits =
75 ( chunk & 0x00'0F'00'0F'00'0F'00'0F_u64 ) * 10U;
76 auto const chunk2 = lower_digits + upper_digits;
79 auto const lower_digits2 =
80 ( chunk2 & 0x00'FF'00'00'00'FF'00'00_u64 ) >> 16U;
81 auto const upper_digits2 =
82 ( chunk2 & 0x00'00'00'FF'00'00'00'FF_u64 ) * 100U;
83 auto const chunk3 = lower_digits2 + upper_digits2;
86 auto const lower_digits3 =
87 ( chunk3 & 0x00'00'FF'FF'00'00'00'00_u64 ) >> 32U;
88 auto const upper_digits3 =
89 ( chunk3 & 0x00'00'00'00'00'00'FF'FF_u64 ) * 10000U;
90 auto const chunk4 = lower_digits3 + upper_digits3;
92 return chunk4 & 0xFFFF'FFFF_u64;
95 "8 digit parser does not work on this platform" );
99 return upper * 100'000'000_u64 + lower;
102 1234567890123456_u64,
103 "16 digit parser does not work on this platform" );
107 std::enable_if_t<KnownBounds, std::nullptr_t> =
nullptr>
108 [[nodiscard]]
static constexpr
Unsigned
110 using CharT =
typename ParseState::CharT;
114 not
static_cast<bool>( RangeChecked ) or
115 std::is_same<result_t, UInt64>::value,
116 "Range checking is only supported for std integral types" );
120 result_t result = result_t( );
122 while( last - first >= 16 ) {
123 result *=
static_cast<result_t
>( 10'000'000'000'000'000ULL );
127 if( last - first >= 8 ) {
128 result *=
static_cast<result_t
>( 100'000'000ULL );
132 if constexpr( ParseState::is_zero_terminated_string ) {
141 while( first < last ) {
148 auto const count = ( daw::numeric_limits<result_t>::digits10 + 1U ) -
151 ( ( result <= daw::numeric_limits<result_t>::max( ) ) &
157 return daw::construct_a<Unsigned>(
static_cast<Unsigned>( result ) );
159 return daw::construct_a<Unsigned>(
160 daw::narrow_cast<Unsigned>( result ) );
167 std::enable_if_t<not KnownBounds, std::nullptr_t> =
nullptr>
168 [[nodiscard]]
static constexpr
Unsigned
170 using CharT =
typename ParseState::CharT;
172 using result_t = max_unsigned_t<RangeChecked, Unsigned, UInt64>;
174 not
static_cast<bool>( RangeChecked ) or
175 std::is_same<result_t, UInt64>::value,
176 "Range checking is only supported for std integral types" );
180 CharT *
const orig_first = first;
183 result_t result = result_t( );
186 if( has_eight & ( last - first >= 16 ) ) {
188 while( has_sixteen ) {
189 result *=
static_cast<result_t
>( 10'000'000'000'000'000ULL );
201 result *=
static_cast<result_t
>( 100'000'000ULL );
205 if constexpr( ParseState::is_zero_terminated_string ) {
215 while( first < last and dig < 10U ) {
224 auto const count =
static_cast<std::ptrdiff_t
>(
225 daw::numeric_limits<Unsigned>::digits10 + 1 ) -
226 ( first - orig_first );
233 return daw::construct_a<Unsigned>(
static_cast<Unsigned>( result ) );
235 return daw::construct_a<Unsigned>(
236 daw::narrow_cast<Unsigned>( result ) );
240 #ifdef DAW_ALLOW_SSE42
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:178
ParseState & parse_state
Definition: daw_json_parse_class.h:201
static constexpr Unsigned unsigned_parser(constexpr_exec_tag, ParseState &parse_state)
Definition: daw_json_parse_unsigned_int.h:109
constexpr UInt64 parse_8_digits(const char *const str)
Definition: daw_json_parse_unsigned_int.h:69
std::conditional_t< std::disjunction< daw::is_integral< Unsigned >, std::is_enum< Unsigned > >::value, std::conditional_t<(sizeof(Unsigned) > sizeof(MaxArithUnsigned)), Unsigned, MaxArithUnsigned >, Unsigned > max_unsigned_t
Definition: daw_json_parse_unsigned_int.h:65
constexpr UInt64 parse_16_digits(const char *const str)
Definition: daw_json_parse_unsigned_int.h:96
static constexpr bool is_made_of_eight_digits_cx(const char *ptr)
Definition: daw_json_parse_unsigned_int.h:38
static constexpr DAW_ATTRIB_FLATINLINE unsigned parse_digit(char c)
Definition: daw_json_parse_digit.h:19
JsonRangeCheck
Definition: daw_json_type_options.h:52
Definition: daw_from_json.h:22
Definition: daw_json_exec_modes.h:19
#define DAW_JSON_VER
Definition: version.h:11