11#include <daw/cpp_17.h>
12#include <daw/daw_attributes.h>
13#include <daw/daw_traits.h>
22 namespace json_details {
30 struct unknown_policy {};
31 return unknown_policy{ };
34 template<
typename Policy,
typename Options>
37 template<
typename Policy,
typename... Options>
39 static constexpr auto idx = traits::pack_index_of_v<Policy, Options...>;
40 static_assert( idx >= 0,
"Policy is not registered" );
43 template<std::
size_t Pos,
int End>
45 if constexpr( Pos >=
static_cast<std::size_t
>( End ) ) {
48 return json_option_bits_width<pack_element_t<Pos, tp_policies>>;
51 template<std::size_t... Is>
52 static constexpr unsigned calc( std::index_sequence<Is...> ) {
53 return ( do_step<Is, idx>( ) + ... );
57 template<
typename... Options>
59 using type = pack_list<Options...>;
62 ( json_option_bits_width<Options> + ... ) <=
64 "The size of json_options_t is not large enough "
65 "to safely hold all the bits of state. Use a larger size." );
68 template<
typename Option>
71 template<
typename Option,
typename Options>
74 std::make_index_sequence<pack_size_v<Options>>{ } );
76 template<
typename... JsonOptions>
77 struct JsonOptionList;
79 template<
typename... OptionList,
typename Option>
83 template<
typename... JsonOptions>
87 template<
typename Option>
89 basic_option_bits_start<Option, OptionList>;
91 template<
typename...
OptionList,
typename Option>
93 static_assert( is_option_flag<Option>,
94 "Only registered policy types are allowed" );
96 new_bits <<= option_bits_start<Option>;
101 ( set_bits_for<JsonOptions>(
102 default_json_option_value<JsonOptions> ) |
111 template<
typename... Options>
113 static_assert( ( json_details::is_option_flag<Options> and ... ),
114 "Only registered option types are allowed" );
116 if constexpr(
sizeof...( Options ) > 0 ) {
123 template<
typename... OptionList,
typename Option>
126 static_assert( is_option_flag<Option>,
127 "Only registered policy types are allowed" );
128 auto new_bits =
static_cast<unsigned>( e );
129 constexpr unsigned mask = (1U << json_option_bits_width<Option>)-1U;
132 JsonOptionList<OptionList...>::template option_bits_start<Option>;
137 template<
typename... OptionList,
typename Option,
typename... Options>
141 static_assert( ( is_option_flag<Options> and ... ),
142 "Only registered policy types are allowed" );
144 auto new_bits =
static_cast<unsigned>( pol );
145 constexpr unsigned mask = ( (1U << json_option_bits_width<Option>)-1U );
148 JsonOptionList<OptionList...>::template option_bits_start<Option>;
150 OptionList...>::template option_bits_start<Option> );
152 if constexpr(
sizeof...( Options ) > 0 ) {
159 template<
typename... OptionList,
typename Option>
165 template<
typename Option,
typename Result = Option,
166 typename... OptionList>
169 static_assert( std::is_enum_v<Option>,
170 "Only enum options are allowed" );
171 static_assert( std::is_same_v<unsigned, std::underlying_type_t<Option>>,
172 "Looks like option was no specified correctly. "
173 "Underlying type should be unsigned" );
174 static_assert( is_option_flag<Option>,
175 "Only registered option types are allowed" );
176 constexpr unsigned mask =
177 ( 1U << (
JsonOptionList<OptionList...>::template option_bits_start<
179 json_option_bits_width<Option>)) -
183 JsonOptionList<OptionList...>::template option_bits_start<Option>;
184 return static_cast<Result
>( Option{ value } );
187 template<
typename... OptionList,
typename... Options>
189 Options... options ) {
190 return JsonOptionList<OptionList...>::template options( options... );
196 template<
template<
class...>
class OptionList,
typename... Options>
199 ( OptionList<Options...>::template set_bits_for<Options>(
200 default_json_option_value<Options> ) |
207 template<
typename OptionList>
static constexpr json_options_t set_bits_for(JsonOptionList< OptionList... >, Option e)
Definition: daw_json_option_bits.h:161
constexpr json_options_t set_bits(JsonOptionList< OptionList... >, json_options_t value, Option pol, Options... pols)
Definition: daw_json_option_bits.h:138
constexpr unsigned json_option_bits_width
Definition: daw_json_option_bits.h:26
std::uint32_t json_options_t
Definition: daw_json_option_bits.h:23
static constexpr json_options_t default_option_flag
Definition: daw_json_option_bits.h:208
constexpr void set_bits_in(JsonOptionList< OptionList... >, json_options_t &value, Option e)
Definition: daw_json_option_bits.h:124
constexpr Result get_bits_for(JsonOptionList< OptionList... >, json_options_t value)
Definition: daw_json_option_bits.h:167
constexpr bool is_option_flag
Definition: daw_json_option_bits.h:69
constexpr auto default_json_option_value
Definition: daw_json_option_bits.h:29
constexpr json_options_t json_option(JsonOptionList< OptionList... >, Options... options)
Definition: daw_json_option_bits.h:188
constexpr unsigned basic_option_bits_start
Definition: daw_json_option_bits.h:72
Definition: daw_from_json.h:22
Definition: daw_json_option_bits.h:84
static constexpr unsigned option_bits_start
Definition: daw_json_option_bits.h:88
static constexpr json_options_t default_option_flag
Definition: daw_json_option_bits.h:100
static constexpr json_options_t options(Options... options)
Definition: daw_json_option_bits.h:112
static constexpr json_options_t set_bits_for(Option e)
Definition: daw_json_option_bits.h:92
typename option_list_impl< JsonOptions... >::type OptionList
Definition: daw_json_option_bits.h:85
Definition: daw_json_option_bits.h:194
static constexpr unsigned do_step()
Definition: daw_json_option_bits.h:44
pack_list< Options... > tp_policies
Definition: daw_json_option_bits.h:41
static constexpr unsigned calc(std::index_sequence< Is... >)
Definition: daw_json_option_bits.h:52
Definition: daw_json_option_bits.h:35
Definition: daw_json_option_bits.h:58
pack_list< Options... > type
Definition: daw_json_option_bits.h:59
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16