1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#pragma once
#include "data.hpp"
#include <iostream>
namespace saw {
namespace impl {
struct data_print_tab_helper {
static void apply(std::ostream& o, uint64_t tabs){
for(uint64_t i = 0u; i < tabs; ++i){
o<<'\t';
}
}
};
template<typename Schema, typename Encode>
struct data_print_std_helper {
static void apply(std::ostream& o, const data<Schema,Encode>& dat){
// Blueprint
(void)o;
(void)dat;
}
};
template<typename T, uint64_t N, typename Encode>
struct data_print_std_helper<schema::Primitive<T,N>, Encode> {
static void apply(std::ostream& o, const data<schema::Primitive<T,N>,Encode>& dat, uint64_t tabs){
(void) tabs;
// Blueprint
o<<dat.get();
}
};
template<typename Encode>
struct data_print_std_helper<schema::String, Encode> {
static void apply(std::ostream& o, const data<schema::String,Encode>& dat, uint64_t tabs){
(void) tabs;
// Blueprint
auto size = dat.size();
o<<"\"";
for(saw::data<schema::UInt64> i{0u}; i < size; ++i){
o<<dat.at(i);
}
o<<"\"";
}
};
template<typename T, uint64_t N, typename Encode>
struct data_print_std_helper<schema::Array<T,N>, Encode> {
static void apply(std::ostream& o, const data<schema::Array<T,N>,Encode>& dat, uint64_t tabs){
(void) tabs;
// Blueprint
auto size = dat.size();
o<<"\"";
for(saw::data<schema::UInt64> i{0u}; i < size; ++i){
o<<dat.at(i);
}
o<<"\"";
}
};
template<typename... Members, typename Encode>
struct data_print_std_helper<schema::Struct<Members...>, Encode> {
template<uint64_t i>
static void apply(std::ostream& o, const data<schema::Struct<Members...>,Encode>& dat, uint64_t tabs){
if constexpr (i < sizeof...(Members)){
using Memb = parameter_pack_type<i,Members...>::type;
data_print_tab_helper::apply(o,tabs);
o<<"- \""<<Memb::KeyLiteral.view()<<"\" : ";
data_print_std_helper<typename Memb::ValueType,Encode>::apply(o,dat.template get<Memb::KeyLiteral>(), tabs);
o<<"\n";
apply<i+1u>(o,dat,tabs);
}
}
static void apply(std::ostream& o, const data<schema::Struct<Members...>,Encode>& dat, uint64_t tabs){
data_print_tab_helper::apply(o,tabs);
apply<0u>(o,dat,tabs+1u);
}
};
}
}
namespace std {
template<typename Schema, typename Encode>
inline ostream& operator<<(ostream& o, const saw::data<Schema, Encode>& dat){
saw::impl::data_print_std_helper<Schema,Encode>::apply(o, dat, 0u);
return o;
}
}
|