1#ifndef ZEN_TRANSFORMER_HPP
2#define ZEN_TRANSFORMER_HPP
6#include "zen/config.hpp"
7#include "zen/concepts.hpp"
17 t.transform(std::declval<transformer&>());
23 virtual void transform(
bool&
value) = 0;
24 virtual void transform(
char&
value) = 0;
25 virtual void transform(
short&
value) = 0;
26 virtual void transform(
int&
value) = 0;
27 virtual void transform(
long&
value) = 0;
28 virtual void transform(
long long&
value) = 0;
29 virtual void transform(
unsigned char&
value) = 0;
30 virtual void transform(
unsigned short&
value) = 0;
31 virtual void transform(
unsigned int&
value) = 0;
32 virtual void transform(
unsigned long&
value) = 0;
33 virtual void transform(
unsigned long long&
value) = 0;
34 virtual void transform(
float&
value) = 0;
35 virtual void transform(
double&
value) = 0;
36 virtual void transform(std::string&
value) = 0;
38 virtual void start_transform_optional() = 0;
39 virtual void transform_nil() = 0;
40 virtual void end_transform_optional() = 0;
42 virtual void start_transform_object(
const std::string& tag_name) = 0;
43 virtual void start_transform_field(
const std::string& name) = 0;
44 virtual void end_transform_field() = 0;
45 virtual void end_transform_object() = 0;
47 virtual void start_transform_sequence() = 0;
48 virtual void transform_size(std::size_t size) = 0;
49 virtual void start_transform_element() = 0;
50 virtual void end_transform_element() = 0;
51 virtual void end_transform_sequence() = 0;
54 void transform(std::optional<T>&
value);
56 template<
typename T1,
typename T2>
57 void transform(std::pair<T1, T2>&
value);
60 void transform(T&
value);
63 void transform(T&
value);
65 template<can_transform T>
66 void transform(T&
value);
75class object_transformer {
80 bool has_finalized =
false;
89 void transform_field(std::string name, T
value) {
90 parent.start_transform_field(name);
91 parent.transform(
value);
92 parent.end_transform_field();
96 parent.end_transform_object();
103 ~object_transformer() {
104 if (!has_finalized) {
105 ZEN_PANIC(
"detected a missing call to zen::object_transformer::finalize()");
113 start_transform_object(tag_name);
117class sequence_transformer {
122 bool has_finalized =
false;
131 void transform(T
value) {
132 parent.start_transform_element();
133 parent.transform(
value);
134 parent.end_transform_element();
138 parent.end_transform_sequence();
140 has_finalized =
true;
145 ~sequence_transformer() {
146 if (!has_finalized) {
147 ZEN_PANIC(
"detected a missing call to zen::sequence_transformer::finalize()");
155 start_transform_sequence();
156 transform_size(size);
161void transformer::transform(std::optional<T>&
value) {
162 start_transform_optional();
163 if (value.has_value()) {
168 end_transform_optional();
171template<
typename T1,
typename T2>
172void transformer::transform(std::pair<T1, T2>&
value) {
173 start_transform_sequence();
174 start_transform_element();
175 transform(value.first);
176 end_transform_element();
177 start_transform_element();
178 transform(value.second);
179 end_transform_element();
180 end_transform_sequence();
184void transformer::transform(T&
value) {
185 start_transform_sequence();
186 transform_size(value.size());
187 for (
const auto& element: value) {
188 start_transform_element();
190 end_transform_element();
192 end_transform_sequence();
196void transformer::transform(T&
value) {
197 start_transform_optional();
198 if (value ==
nullptr) {
203 end_transform_optional();
206template<can_transform T>
207void transformer::transform(T&
value) {
208 value.transform(*
this);
214 auto s = decoder.transform_object(
"");
215 value.transform_fields(s);