31 constexpr daw::string_view
to_string( ExecModeTypes mode ) {
33 case ExecModeTypes::default_mode:
34 return "default_mode";
35 case ExecModeTypes::compile_time:
36 return "compile_time";
37 case ExecModeTypes::runtime:
39 case ExecModeTypes::simd:
46 namespace json_details {
48 inline constexpr unsigned json_option_bits_width<options::ExecModeTypes> =
52 inline constexpr auto default_json_option_value<options::ExecModeTypes> =
53 options::ExecModeTypes::default_mode;
56 inline constexpr unsigned
57 json_option_bits_width<options::ZeroTerminatedString> = 1;
61 default_json_option_value<options::ZeroTerminatedString> =
62 options::ZeroTerminatedString::no;
65 inline constexpr unsigned
66 json_option_bits_width<options::AllowStringMutation> = 1;
70 default_json_option_value<options::AllowStringMutation> =
71 options::AllowStringMutation::no;
74 inline constexpr unsigned
75 json_option_bits_width<options::PolicyCommentTypes> = 2;
79 default_json_option_value<options::PolicyCommentTypes> =
80 options::PolicyCommentTypes::none;
83 inline constexpr unsigned
84 json_option_bits_width<options::CheckedParseMode> = 1;
88 default_json_option_value<options::CheckedParseMode> =
89 options::CheckedParseMode::yes;
92 inline constexpr unsigned
93 json_option_bits_width<options::MinifiedDocument> = 1;
97 default_json_option_value<options::MinifiedDocument> =
98 options::MinifiedDocument::no;
101 inline constexpr unsigned
102 json_option_bits_width<options::AllowEscapedNames> = 1;
105 inline constexpr auto
106 default_json_option_value<options::AllowEscapedNames> =
107 options::AllowEscapedNames::no;
110 inline constexpr unsigned
111 json_option_bits_width<options::IEEE754Precise> = 1;
114 inline constexpr auto default_json_option_value<options::IEEE754Precise> =
115 options::IEEE754Precise::yes;
118 inline constexpr unsigned
119 json_option_bits_width<options::ForceFullNameCheck> = 1;
122 inline constexpr auto
123 default_json_option_value<options::ForceFullNameCheck> =
124 options::ForceFullNameCheck::no;
127 inline constexpr unsigned
128 json_option_bits_width<options::UseExactMappingsByDefault> = 1;
131 inline constexpr auto
132 default_json_option_value<options::UseExactMappingsByDefault> =
133 options::UseExactMappingsByDefault::no;
136 inline constexpr unsigned
137 json_option_bits_width<options::MustVerifyEndOfDataIsValid> = 1;
140 inline constexpr auto
141 default_json_option_value<options::MustVerifyEndOfDataIsValid> =
142 options::MustVerifyEndOfDataIsValid::no;
145 inline constexpr unsigned
146 json_option_bits_width<options::ExpectLongNames> = 1;
149 inline constexpr auto
150 default_json_option_value<options::ExpectLongNames> =
151 options::ExpectLongNames::no;
165 inline constexpr unsigned
166 json_option_bits_width<options::ExcludeSpecialEscapes> = 1;
169 inline constexpr auto
170 default_json_option_value<options::ExcludeSpecialEscapes> =
171 options::ExcludeSpecialEscapes::no;
173 using policy_list =
typename option_list_impl<
174 options::ExecModeTypes, options::ZeroTerminatedString,
175 options::AllowStringMutation, options::PolicyCommentTypes,
176 options::CheckedParseMode, options::AllowEscapedNames,
177 options::IEEE754Precise, options::ForceFullNameCheck,
178 options::MinifiedDocument, options::UseExactMappingsByDefault,
179 options::MustVerifyEndOfDataIsValid, options::ExcludeSpecialEscapes,
180 options::ExpectLongNames>::type;
182 template<
typename Policy,
typename Policies>
183 inline constexpr unsigned basic_policy_bits_start =
184 option_bits_start_impl<Policy, Policies>::template calc<>(
185 std::make_index_sequence<pack_size_v<Policies>>{ } );
187 template<
typename Policy>
188 inline constexpr unsigned policy_bits_start =
189 basic_policy_bits_start<Policy, policy_list>;
195 template<
typename PolicyFlag,
196 typename... PolicyFlags DAW_ENABLEIF(
197 are_option_flags<PolicyFlag, PolicyFlags...> )>
198 DAW_REQUIRES( are_option_flags<PolicyFlag, PolicyFlags...> )
200 set_bits(
json_options_t value, PolicyFlag pol, PolicyFlags... pols ) {
201 static_assert( are_option_flags<PolicyFlags...>,
202 "Only registered policy types are allowed" );
204 auto new_bits =
static_cast<unsigned>( pol );
206 daw::constant<( (1U << json_option_bits_width<PolicyFlag>)-1U )>;
207 new_bits &= mask::value;
208 new_bits <<= policy_bits_start<PolicyFlag>;
209 value &= ~( mask::value << policy_bits_start<PolicyFlag> );
211 if constexpr(
sizeof...( PolicyFlags ) > 0 ) {
212 if constexpr(
sizeof...( pols ) > 0 ) {
213 return set_bits( value, pols... );
222 template<
typename Policy>
224 static_assert( is_option_flag<Policy>,
225 "Only registered policy types are allowed" );
227 new_bits <<= policy_bits_start<Policy>;
232 struct default_policy_flag_t;
234 template<
typename... Policies>
235 struct default_policy_flag_t<pack_list<Policies...>> {
237 ( set_bits_for<Policies>( default_json_option_value<Policies> ) |
245 default_policy_flag_t<policy_list>::value;
247 template<
typename Policy,
typename Result = Policy>
249 static_assert( is_option_flag<Policy>,
250 "Only registered policy types are allowed" );
251 using mask = daw::constant<( 1U << (policy_bits_start<Policy> +
252 json_option_bits_width<Policy>)) -
254 value &= mask::value;
255 value >>= policy_bits_start<Policy>;
256 return static_cast<Result
>( Policy{ value } );
267 template<
typename... Policies>
268 DAW_CONSTEVAL
json_options_t parse_options( Policies... policies ) {
269 static_assert( json_details::are_option_flags<Policies...>,
270 "Only registered policy types are allowed" );
271 return json_details::set_bits( json_details::default_policy_flag,