DAW JSON Link
Loading...
Searching...
No Matches
daw_json_serialize_policy_details.h
Go to the documentation of this file.
1// Copyright (c) Darrell Wright
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
5//
6// Official repository: https://github.com/beached/daw_json_link
7//
8
9#pragma once
10
12
16
17#include <daw/daw_constant.h>
18
19#include <cstddef>
20#include <string_view>
21#include <utility>
22
23namespace daw::json {
24 inline namespace DAW_JSON_VER {
25 namespace json_details::serialization {
26 using policy_list = typename option_list_impl<
27 options::SerializationFormat, options::IndentationType,
28 options::RestrictedStringOutput, options::NewLineDelimiter,
29 options::OutputTrailingComma>::type;
30
31 template<typename Policy, typename Policies>
32 inline constexpr unsigned basic_policy_bits_start =
33 option_bits_start_impl<Policy, Policies>::template calc<>(
34 std::make_index_sequence<pack_size_v<Policies>>{ } );
35
36 template<typename Policy>
37 inline constexpr unsigned policy_bits_start =
38 basic_policy_bits_start<Policy, policy_list>;
39
40 template<typename Policy>
41 static constexpr void set_bits_in( json_options_t &value, Policy e ) {
42 static_assert( is_option_flag<Policy>,
43 "Only registered policy types are allowed" );
44 auto new_bits = static_cast<unsigned>( e );
45 using mask = daw::constant<(1U << json_option_bits_width<Policy>)-1U>;
46 new_bits &= mask::value;
47 new_bits <<= policy_bits_start<Policy>;
48 value &= ~mask::value;
49 value |= new_bits;
50 }
51
52 template<typename Policy, typename... Policies>
53 static constexpr json_options_t set_bits( json_options_t value,
54 Policy pol, Policies... pols ) {
55 static_assert( are_option_flags<Policies...>,
56 "Only registered policy types are allowed" );
57
58 auto new_bits = static_cast<unsigned>( pol );
59 using mask =
60 daw::constant<( (1U << json_option_bits_width<Policy>)-1U )>;
61 new_bits &= mask::value;
62 new_bits <<= policy_bits_start<Policy>;
63 value &= ~( mask::value << policy_bits_start<Policy> );
64 value |= new_bits;
65 if constexpr( sizeof...( Policies ) > 0 ) {
66 if constexpr( sizeof...( pols ) > 0 ) {
67 return set_bits( value, pols... );
68 } else {
69 return value;
70 }
71 } else {
72 return value;
73 }
74 }
75
76 template<typename Policy>
77 static constexpr json_options_t set_bits_for( Policy e ) {
78 static_assert( is_option_flag<Policy>,
79 "Only registered policy types are allowed" );
80 auto new_bits = static_cast<json_options_t>( e );
81 new_bits <<= policy_bits_start<Policy>;
82 return new_bits;
83 }
84
85 template<typename>
86 struct default_policy_flag_t;
87
88 template<typename... Policies>
89 struct default_policy_flag_t<pack_list<Policies...>> {
90 static constexpr json_options_t value =
91 ( set_bits_for<Policies>( default_json_option_value<Policies> ) |
92 ... );
93 };
94
95 /***
96 * The defaults for all known policies encoded as a json_options_t
97 */
98 inline constexpr json_options_t default_policy_flag =
99 default_policy_flag_t<policy_list>::value;
100
101 template<typename Policy, typename Result = Policy>
102 static constexpr Result get_bits_for( json_options_t value ) {
103 static_assert( is_option_flag<Policy>,
104 "Only registered policy types are allowed" );
105 using mask = daw::constant<( 1U << (policy_bits_start<Policy> +
106 json_option_bits_width<Policy>)) -
107 1U>;
108 value &= mask::value;
109 value >>= policy_bits_start<Policy>;
110 return static_cast<Result>( Policy{ value } );
111 }
112
113 template<options::SerializationFormat, options::IndentationType>
114 inline constexpr std::string_view generate_indent{ };
115
116 template<>
117 inline constexpr std::string_view generate_indent<
118 options::SerializationFormat::Pretty, options::IndentationType::Tab> =
119 "\t";
120
121 template<>
122 inline constexpr std::string_view
123 generate_indent<options::SerializationFormat::Pretty,
124 options::IndentationType::Space1> = " ";
125
126 template<>
127 inline constexpr std::string_view
128 generate_indent<options::SerializationFormat::Pretty,
129 options::IndentationType::Space2> = " ";
130
131 template<>
132 inline constexpr std::string_view
133 generate_indent<options::SerializationFormat::Pretty,
134 options::IndentationType::Space3> = " ";
135
136 template<>
137 inline constexpr std::string_view
138 generate_indent<options::SerializationFormat::Pretty,
139 options::IndentationType::Space4> = " ";
140
141 template<>
142 inline constexpr std::string_view
143 generate_indent<options::SerializationFormat::Pretty,
144 options::IndentationType::Space5> = " ";
145
146 template<>
147 inline constexpr std::string_view
148 generate_indent<options::SerializationFormat::Pretty,
149 options::IndentationType::Space8> = " ";
150
151 template<>
152 inline constexpr std::string_view
153 generate_indent<options::SerializationFormat::Pretty,
154 options::IndentationType::Space10> = " ";
155 } // namespace json_details::serialization
156 } // namespace DAW_JSON_VER
157} // namespace daw::json
Customization point traits.
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition version.h:20