DAW JSON Link
daw_json_serialize_policy.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
15#include "version.h"
16
17#include <daw/daw_move.h>
18
19#include <cstddef>
20#include <iterator>
21
22namespace daw::json {
23 inline namespace DAW_JSON_VER {
24 /***
25 * Create the parser options flag for BasicParsePolicy
26 * @tparam Policies Policy types that satisfy the `is_policy_flag` trait.
27 * @param policies A list of parser options to change from the defaults.
28 * @return A json_options_t that encodes the options for the parser
29 */
30 template<typename... Policies>
32 serialize_options( Policies... policies ) {
33 static_assert( ( json_details::is_option_flag<Policies> and ... ),
34 "Only registered policy types are allowed" );
36 if constexpr( sizeof...( Policies ) > 0 ) {
37 result |=
39 }
40 return result;
41 }
42
43 template<typename OutputIterator,
47 : json_details::iterator_wrapper<OutputIterator> {
49
50 std::size_t indentation_level = 0;
51
52 constexpr serialization_policy( OutputIterator it )
53 : json_details::iterator_wrapper<OutputIterator>{ DAW_MOVE( it ) } {}
54
56 json_details::serialization::get_bits_for<SerializationFormat>(
57 PolicyFlags );
58
60 json_details::serialization::get_bits_for<IndentationType>(
61 PolicyFlags );
62
64 json_details::serialization::get_bits_for<RestrictedStringOutput>(
65 PolicyFlags );
66
68 json_details::serialization::get_bits_for<NewLineDelimiter>(
69 PolicyFlags );
70
72 json_details::serialization::get_bits_for<OutputTrailingComma>(
73 PolicyFlags );
74
75 inline constexpr void add_indent( ) {
77 }
78
79 inline constexpr void del_indent( ) {
81 }
82
83 inline constexpr void output_indent( ) {
84 constexpr std::string_view ident =
87 for( std::size_t n = 0; n < indentation_level; ++n ) {
88 daw::algorithm::copy( std::data( ident ), daw::data_end( ident ),
89 this->raw_it( ) );
90 }
91 }
92
93 inline constexpr void output_newline( ) {
94 if constexpr( serialization_format != SerializationFormat::Minified ) {
95 if constexpr( newline_delimiter == NewLineDelimiter::n ) {
96 *( *this )++ = '\n';
97 } else {
98 *( *this )++ = '\r';
99 *( *this )++ = '\n';
100 }
101 }
102 }
103 inline constexpr void next_member( ) {
105 output_indent( );
106 }
107
108 inline constexpr void output_space( ) {
110 *( *this )++ = ' ';
111 }
112 }
113 };
114
115 struct use_default_serialization_policy;
116
117 template<typename, typename = void>
118 struct is_serialization_policy : std::false_type {};
119
120 template<typename OutputIterator, json_details::json_options_t PolicyFlags>
122 serialization_policy<OutputIterator, PolicyFlags>> : std::true_type {};
123 } // namespace DAW_JSON_VER
124} // 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 std::string_view generate_indent
Definition: daw_json_serialize_policy_details.h:250
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
constexpr json_details::json_options_t serialize_options(Policies... policies)
Definition: daw_json_serialize_policy.h:32
IndentationType
Definition: daw_json_serialize_policy_options.h:39
RestrictedStringOutput
Definition: daw_json_serialize_policy_options.h:70
Definition: daw_from_json.h:22
Definition: daw_json_serialize_policy.h:118
Definition: daw_json_serialize_policy_details.h:23
constexpr OutputIterator & raw_it()
Definition: daw_json_serialize_policy_details.h:35
Definition: daw_json_serialize_policy.h:47
constexpr void output_newline()
Definition: daw_json_serialize_policy.h:93
constexpr void output_space()
Definition: daw_json_serialize_policy.h:108
void i_am_a_serialization_policy
Definition: daw_json_serialize_policy.h:48
static constexpr OutputTrailingComma output_trailing_comma
Definition: daw_json_serialize_policy.h:71
static constexpr IndentationType indentation_type
Definition: daw_json_serialize_policy.h:59
constexpr void output_indent()
Definition: daw_json_serialize_policy.h:83
constexpr serialization_policy(OutputIterator it)
Definition: daw_json_serialize_policy.h:52
static constexpr SerializationFormat serialization_format
Definition: daw_json_serialize_policy.h:55
static constexpr NewLineDelimiter newline_delimiter
Definition: daw_json_serialize_policy.h:67
constexpr void del_indent()
Definition: daw_json_serialize_policy.h:79
constexpr void add_indent()
Definition: daw_json_serialize_policy.h:75
constexpr void next_member()
Definition: daw_json_serialize_policy.h:103
static constexpr RestrictedStringOutput restricted_string_output
Definition: daw_json_serialize_policy.h:63
std::size_t indentation_level
Definition: daw_json_serialize_policy.h:50
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16