DAW JSON Link
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
14#include "version.h"
15
16#include <cstddef>
17#include <iterator>
18
19namespace daw::json {
20 inline namespace DAW_JSON_VER {
21 namespace json_details {
22 template<typename OutputIterator>
23 struct iterator_wrapper : OutputIterator {
24 inline constexpr OutputIterator get( ) const {
25 return *this;
26 }
27
28 static constexpr bool is_pointer = false;
29
30 inline constexpr void set( OutputIterator it ) {
31 *static_cast<OutputIterator *>( this ) = it;
32 }
33
34 protected:
35 inline constexpr OutputIterator &raw_it( ) {
36 return *this;
37 }
38 };
39
40 template<typename CharT>
41 struct iterator_wrapper<CharT *> {
42 using difference_type = std::ptrdiff_t;
43 using size_type = std::size_t;
44 using value_type = CharT;
45 using pointer = CharT *;
46 using reference = CharT &;
47 using iterator_category = std::random_access_iterator_tag;
48
49 CharT *ptr;
50
51 static constexpr bool is_pointer = true;
52
53 protected:
54 inline constexpr CharT *raw_it( ) {
55 return ptr;
56 }
57
58 public:
59 inline constexpr CharT *get( ) const {
60 return ptr;
61 }
62
63 inline constexpr void set( CharT *p ) {
64 ptr = p;
65 }
66
67 inline constexpr reference operator*( ) {
68 return *ptr;
69 }
70
71 inline constexpr pointer operator->( ) {
72 return ptr;
73 }
74
75 inline constexpr iterator_wrapper &operator++( ) {
76 ++ptr;
77 return *this;
78 }
79
80 inline constexpr iterator_wrapper operator++( int ) {
81 auto result = *this;
82 ++ptr;
83 return result;
84 }
85
86 inline constexpr iterator_wrapper &operator--( ) {
87 --ptr;
88 return *this;
89 }
90
91 inline constexpr iterator_wrapper operator--( int ) {
92 auto result = *this;
93 --ptr;
94 return result;
95 }
96
98 ptr += n;
99 return *this;
100 }
101
103 ptr -= n;
104 return *this;
105 }
106
107 inline constexpr iterator_wrapper
108 operator+( difference_type n ) const noexcept {
109 iterator_wrapper result = *this;
110 ptr += n;
111 return result;
112 }
113
114 inline constexpr iterator_wrapper
115 operator-( difference_type n ) const noexcept {
116 iterator_wrapper result = *this;
117 ptr -= n;
118 return result;
119 }
120
121 inline constexpr reference operator[]( size_type n ) noexcept {
122 return *( ptr + static_cast<difference_type>( n ) );
123 }
124
125 explicit inline constexpr operator bool( ) const {
126 return static_cast<bool>( ptr );
127 }
128
129 friend inline constexpr bool operator==( iterator_wrapper const &lhs,
130 iterator_wrapper const &rhs ) {
131 return lhs.ptr == rhs.ptr;
132 }
133
134 friend inline constexpr bool operator!=( iterator_wrapper const &lhs,
135 iterator_wrapper const &rhs ) {
136 return lhs.ptr != rhs.ptr;
137 }
138
139 friend inline constexpr bool operator<( iterator_wrapper const &lhs,
140 iterator_wrapper const &rhs ) {
141 return lhs.ptr < rhs.ptr;
142 }
143
144 friend inline constexpr bool operator<=( iterator_wrapper const &lhs,
145 iterator_wrapper const &rhs ) {
146 return lhs.ptr <= rhs.ptr;
147 }
148
149 friend inline constexpr bool operator>( iterator_wrapper const &lhs,
150 iterator_wrapper const &rhs ) {
151 return lhs.ptr > rhs.ptr;
152 }
153
154 friend inline constexpr bool operator>=( iterator_wrapper const &lhs,
155 iterator_wrapper const &rhs ) {
156 return lhs.ptr >= rhs.ptr;
157 }
158 };
159
160 } // namespace json_details
161
162 namespace json_details::serialization {
166 OutputTrailingComma>::type;
167
168 template<typename Policy, typename Policies>
169 inline constexpr unsigned basic_policy_bits_start =
171 std::make_index_sequence<pack_size_v<Policies>>{ } );
172
173 template<typename Policy>
174 inline constexpr unsigned policy_bits_start =
175 basic_policy_bits_start<Policy, policy_list>;
176
177 template<typename Policy>
178 constexpr void set_bits_in( json_options_t &value, Policy e ) {
179 static_assert( is_option_flag<Policy>,
180 "Only registered policy types are allowed" );
181 auto new_bits = static_cast<unsigned>( e );
182 constexpr unsigned mask = (1U << json_option_bits_width<Policy>)-1U;
183 new_bits &= mask;
184 new_bits <<= policy_bits_start<Policy>;
185 value &= ~mask;
186 value |= new_bits;
187 }
188
189 template<typename Policy, typename... Policies>
190 constexpr json_options_t set_bits( json_options_t value, Policy pol,
191 Policies... pols ) {
192 static_assert( ( is_option_flag<Policies> and ... ),
193 "Only registered policy types are allowed" );
194
195 auto new_bits = static_cast<unsigned>( pol );
196 constexpr unsigned mask = ( (1U << json_option_bits_width<Policy>)-1U );
197 new_bits &= mask;
198 new_bits <<= policy_bits_start<Policy>;
199 value &= ~( mask << policy_bits_start<Policy> );
200 value |= new_bits;
201 if constexpr( sizeof...( Policies ) > 0 ) {
202 if constexpr( sizeof...( pols ) > 0 ) {
203 return set_bits( value, pols... );
204 } else {
205 return value;
206 }
207 } else {
208 return value;
209 }
210 }
211
212 template<typename Policy>
213 constexpr json_options_t set_bits_for( Policy e ) {
214 static_assert( is_option_flag<Policy>,
215 "Only registered policy types are allowed" );
216 auto new_bits = static_cast<json_options_t>( e );
217 new_bits <<= policy_bits_start<Policy>;
218 return new_bits;
219 }
220
221 template<typename>
223
224 template<typename... Policies>
225 struct default_policy_flag_t<pack_list<Policies...>> {
226 static constexpr json_options_t value =
227 ( set_bits_for<Policies>( default_json_option_value<Policies> ) |
228 ... );
229 };
230
231 /***
232 * The defaults for all known policies encoded as a json_options_t
233 */
234 inline static constexpr json_options_t default_policy_flag =
236
237 template<typename Policy, typename Result = Policy>
238 constexpr Result get_bits_for( json_options_t value ) {
239 static_assert( is_option_flag<Policy>,
240 "Only registered policy types are allowed" );
241 constexpr unsigned mask = ( 1U << (policy_bits_start<Policy> +
242 json_option_bits_width<Policy>)) -
243 1U;
244 value &= mask;
245 value >>= policy_bits_start<Policy>;
246 return static_cast<Result>( Policy{ value } );
247 }
248
249 template<SerializationFormat, IndentationType>
250 inline constexpr std::string_view generate_indent{ };
251
252 template<>
253 inline constexpr std::string_view
254 generate_indent<SerializationFormat::Pretty, IndentationType::Tab> =
255 "\t";
256
257 template<>
258 inline constexpr std::string_view
259 generate_indent<SerializationFormat::Pretty, IndentationType::Space1> =
260 " ";
261
262 template<>
263 inline constexpr std::string_view
264 generate_indent<SerializationFormat::Pretty, IndentationType::Space2> =
265 " ";
266
267 template<>
268 inline constexpr std::string_view
269 generate_indent<SerializationFormat::Pretty, IndentationType::Space3> =
270 " ";
271
272 template<>
273 inline constexpr std::string_view
274 generate_indent<SerializationFormat::Pretty, IndentationType::Space4> =
275 " ";
276
277 template<>
278 inline constexpr std::string_view
279 generate_indent<SerializationFormat::Pretty, IndentationType::Space5> =
280 " ";
281
282 template<>
283 inline constexpr std::string_view
284 generate_indent<SerializationFormat::Pretty, IndentationType::Space8> =
285 " ";
286
287 } // namespace json_details::serialization
288 } // namespace DAW_JSON_VER
289} // namespace daw::json
Iterator & it
Definition: daw_json_traits.h:251
static constexpr json_options_t default_policy_flag
Definition: daw_json_serialize_policy_details.h:234
constexpr json_options_t set_bits_for(Policy e)
Definition: daw_json_serialize_policy_details.h:213
constexpr unsigned policy_bits_start
Definition: daw_json_serialize_policy_details.h:174
constexpr Result get_bits_for(json_options_t value)
Definition: daw_json_serialize_policy_details.h:238
constexpr unsigned basic_policy_bits_start
Definition: daw_json_serialize_policy_details.h:169
constexpr std::string_view generate_indent
Definition: daw_json_serialize_policy_details.h:250
constexpr json_options_t set_bits(json_options_t value, Policy pol, Policies... pols)
Definition: daw_json_serialize_policy_details.h:190
constexpr void set_bits_in(json_options_t &value, Policy e)
Definition: daw_json_serialize_policy_details.h:178
typename option_list_impl< SerializationFormat, IndentationType, RestrictedStringOutput, NewLineDelimiter, OutputTrailingComma >::type policy_list
Definition: daw_json_serialize_policy_details.h:166
std::uint32_t json_options_t
Definition: daw_json_option_bits.h:23
SerializationFormat
Definition: daw_json_serialize_policy_options.h:19
NewLineDelimiter
Definition: daw_json_serialize_policy_options.h:90
OutputTrailingComma
Definition: daw_json_serialize_policy_options.h:101
IndentationType
Definition: daw_json_serialize_policy_options.h:39
RestrictedStringOutput
Definition: daw_json_serialize_policy_options.h:70
Definition: daw_from_json.h:22
std::size_t size_type
Definition: daw_json_serialize_policy_details.h:43
constexpr iterator_wrapper & operator-=(difference_type n)
Definition: daw_json_serialize_policy_details.h:102
constexpr pointer operator->()
Definition: daw_json_serialize_policy_details.h:71
constexpr CharT * raw_it()
Definition: daw_json_serialize_policy_details.h:54
std::ptrdiff_t difference_type
Definition: daw_json_serialize_policy_details.h:42
CharT * pointer
Definition: daw_json_serialize_policy_details.h:45
constexpr friend bool operator>=(iterator_wrapper const &lhs, iterator_wrapper const &rhs)
Definition: daw_json_serialize_policy_details.h:154
constexpr friend bool operator!=(iterator_wrapper const &lhs, iterator_wrapper const &rhs)
Definition: daw_json_serialize_policy_details.h:134
constexpr reference operator*()
Definition: daw_json_serialize_policy_details.h:67
CharT value_type
Definition: daw_json_serialize_policy_details.h:44
constexpr void set(CharT *p)
Definition: daw_json_serialize_policy_details.h:63
constexpr reference operator[](size_type n) noexcept
Definition: daw_json_serialize_policy_details.h:121
constexpr friend bool operator<=(iterator_wrapper const &lhs, iterator_wrapper const &rhs)
Definition: daw_json_serialize_policy_details.h:144
constexpr friend bool operator==(iterator_wrapper const &lhs, iterator_wrapper const &rhs)
Definition: daw_json_serialize_policy_details.h:129
constexpr iterator_wrapper operator++(int)
Definition: daw_json_serialize_policy_details.h:80
std::random_access_iterator_tag iterator_category
Definition: daw_json_serialize_policy_details.h:47
constexpr friend bool operator>(iterator_wrapper const &lhs, iterator_wrapper const &rhs)
Definition: daw_json_serialize_policy_details.h:149
constexpr friend bool operator<(iterator_wrapper const &lhs, iterator_wrapper const &rhs)
Definition: daw_json_serialize_policy_details.h:139
constexpr iterator_wrapper operator--(int)
Definition: daw_json_serialize_policy_details.h:91
CharT * ptr
Definition: daw_json_serialize_policy_details.h:49
constexpr iterator_wrapper & operator+=(difference_type n)
Definition: daw_json_serialize_policy_details.h:97
constexpr iterator_wrapper operator-(difference_type n) const noexcept
Definition: daw_json_serialize_policy_details.h:115
constexpr iterator_wrapper & operator--()
Definition: daw_json_serialize_policy_details.h:86
CharT & reference
Definition: daw_json_serialize_policy_details.h:46
constexpr iterator_wrapper & operator++()
Definition: daw_json_serialize_policy_details.h:75
constexpr CharT * get() const
Definition: daw_json_serialize_policy_details.h:59
constexpr iterator_wrapper operator+(difference_type n) const noexcept
Definition: daw_json_serialize_policy_details.h:108
Definition: daw_json_serialize_policy_details.h:23
static constexpr bool is_pointer
Definition: daw_json_serialize_policy_details.h:28
constexpr void set(OutputIterator it)
Definition: daw_json_serialize_policy_details.h:30
constexpr OutputIterator & raw_it()
Definition: daw_json_serialize_policy_details.h:35
constexpr OutputIterator get() const
Definition: daw_json_serialize_policy_details.h:24
Definition: daw_json_option_bits.h:58
Definition: daw_json_serialize_policy_details.h:222
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16