Skip to content

Commit f4c36e7

Browse files
Implemented most of the reader and writer
1 parent bda6306 commit f4c36e7

File tree

3 files changed

+54
-69
lines changed

3 files changed

+54
-69
lines changed

include/rfl/avro/Reader.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include "../Result.hpp"
1515
#include "../always_false.hpp"
1616

17-
namespace rfl ::avro {
17+
namespace rfl::avro {
1818

1919
/// Please refer to https://intel.github.io/tinyavro/current/index.html
2020
struct Reader {

include/rfl/avro/Writer.hpp

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,22 @@ namespace avro {
2626
class Writer {
2727
public:
2828
struct AVROOutputArray {
29-
AvroEncoder* encoder_;
30-
AvroEncoder* parent_;
29+
avro_value_t val_;
3130
};
3231

3332
struct AVROOutputObject {
34-
AvroEncoder* encoder_;
35-
AvroEncoder* parent_;
33+
avro_value_t val_;
3634
};
3735

38-
struct AVROOutputVar {};
36+
struct AVROOutputVar {
37+
avro_value_t val_;
38+
};
3939

4040
using OutputArrayType = AVROOutputArray;
4141
using OutputObjectType = AVROOutputObject;
4242
using OutputVarType = AVROOutputVar;
4343

44-
Writer(AvroEncoder* _encoder);
44+
Writer(avro_value_t* _root) : root_(_root){};
4545

4646
~Writer();
4747

@@ -53,7 +53,8 @@ class Writer {
5353

5454
template <class T>
5555
OutputVarType value_as_root(const T& _var) const noexcept {
56-
return new_value(_var, encoder_);
56+
set_value(_var, root_);
57+
return OutputVarType{*root_};
5758
}
5859

5960
OutputArrayType add_array_to_array(const size_t _size,
@@ -73,15 +74,20 @@ class Writer {
7374
template <class T>
7475
OutputVarType add_value_to_array(const T& _var,
7576
OutputArrayType* _parent) const noexcept {
76-
return new_value(_var, _parent->encoder_);
77+
avro_value_t new_value;
78+
avro_value_append(&_parent->val_, &new_value, nullptr);
79+
set_value(_var, &new_value);
80+
return OutputVarType{new_value};
7781
}
7882

7983
template <class T>
8084
OutputVarType add_value_to_object(const std::string_view& _name,
8185
const T& _var,
8286
OutputObjectType* _parent) const noexcept {
83-
avro_encode_text_string(_parent->encoder_, _name.data(), _name.size());
84-
return new_value(_var, _parent->encoder_);
87+
avro_value_t new_value;
88+
avro_value_get_by_name(&_parent->val_, _name.c_str(), &new_value, nullptr);
89+
set_value(_var, &new_value);
90+
return OutputVarType{new_value};
8591
}
8692

8793
OutputVarType add_null_to_array(OutputArrayType* _parent) const noexcept;
@@ -94,38 +100,26 @@ class Writer {
94100
void end_object(OutputObjectType* _obj) const noexcept;
95101

96102
private:
97-
OutputArrayType new_array(const size_t _size,
98-
AvroEncoder* _parent) const noexcept;
99-
100-
OutputObjectType new_object(const size_t _size,
101-
AvroEncoder* _parent) const noexcept;
102-
103103
template <class T>
104-
OutputVarType new_value(const T& _var, AvroEncoder* _parent) const noexcept {
104+
void set_value(const T& _var, avro_value_t* _val) const noexcept {
105105
if constexpr (std::is_same<std::remove_cvref_t<T>, std::string>()) {
106-
avro_encode_text_string(_parent, _var.c_str(), _var.size());
106+
avro_value_set_string_len(_val, _var.c_str(), _var.size());
107107
} else if constexpr (std::is_same<std::remove_cvref_t<T>,
108108
rfl::Bytestring>()) {
109-
avro_encode_byte_string(
110-
_parent, std::bit_cast<const uint8_t*>(_var.c_str()), _var.size());
109+
avro_value_set_bytes(_val, _var.c_str(), _var.size());
111110
} else if constexpr (std::is_same<std::remove_cvref_t<T>, bool>()) {
112-
avro_encode_boolean(_parent, _var);
111+
avro_value_set_boolean(_val, _var);
113112
} else if constexpr (std::is_floating_point<std::remove_cvref_t<T>>()) {
114-
avro_encode_double(_parent, static_cast<double>(_var));
113+
avro_value_set_double(_val, static_cast<double>(_var));
115114
} else if constexpr (std::is_integral<std::remove_cvref_t<T>>()) {
116-
avro_encode_int(_parent, static_cast<std::int64_t>(_var));
115+
avro_value_set_long(_val, static_cast<std::int64_t>(_var));
117116
} else {
118117
static_assert(rfl::always_false_v<T>, "Unsupported type.");
119118
}
120-
return OutputVarType{};
121119
}
122120

123121
private:
124-
/// The underlying TinyAVRO encoder.
125-
AvroEncoder* const encoder_;
126-
127-
/// Contain all of the subobjects and subarrays.
128-
const rfl::Box<std::vector<rfl::Box<AvroEncoder>>> subencoders_;
122+
avro_value_t* root_;
129123
};
130124

131125
} // namespace avro

src/rfl/avro/Writer.cpp

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,74 @@
1-
#include "rfl/cbor/Writer.hpp"
1+
#include "rfl/avro/Writer.hpp"
22

3-
namespace rfl::cbor {
3+
namespace rfl::avro {
44

5-
Writer::Writer(CborEncoder* _encoder) : encoder_(_encoder) {}
5+
Writer::Writer() {}
66

77
Writer::~Writer() = default;
88

99
Writer::OutputArrayType Writer::array_as_root(
1010
const size_t _size) const noexcept {
11-
return new_array(_size, encoder_);
11+
return OutputArrayType{*root_};
1212
}
1313

1414
Writer::OutputObjectType Writer::object_as_root(
1515
const size_t _size) const noexcept {
16-
return new_object(_size, encoder_);
16+
return OutputObjectType{*root_};
1717
}
1818

1919
Writer::OutputVarType Writer::null_as_root() const noexcept {
20-
cbor_encode_null(encoder_);
21-
return OutputVarType{};
20+
avro_value_set_null(root_);
21+
return OutputVarType{*root_};
2222
}
2323

2424
Writer::OutputArrayType Writer::add_array_to_array(
2525
const size_t _size, OutputArrayType* _parent) const noexcept {
26-
return new_array(_size, _parent->encoder_);
26+
avro_value_t new_array;
27+
avro_value_append(&_parent->val_, &new_array, nullptr);
28+
return OutputArrayType{new_array};
2729
}
2830

2931
Writer::OutputArrayType Writer::add_array_to_object(
3032
const std::string_view& _name, const size_t _size,
3133
OutputObjectType* _parent) const noexcept {
32-
cbor_encode_text_string(_parent->encoder_, _name.data(), _name.size());
33-
return new_array(_size, _parent->encoder_);
34+
avro_value_t new_array;
35+
avro_value_get_by_name(&_parent->val_, _name.c_str(), &new_array, nullptr);
36+
return OutputArrayType{new_array};
3437
}
3538

3639
Writer::OutputObjectType Writer::add_object_to_array(
3740
const size_t _size, OutputArrayType* _parent) const noexcept {
38-
return new_object(_size, _parent->encoder_);
41+
avro_value_t new_object;
42+
avro_value_append(&_parent->val_, &new_object, nullptr);
43+
return OutputArrayType{new_object};
3944
}
4045

4146
Writer::OutputObjectType Writer::add_object_to_object(
4247
const std::string_view& _name, const size_t _size,
4348
OutputObjectType* _parent) const noexcept {
44-
cbor_encode_text_string(_parent->encoder_, _name.data(), _name.size());
45-
return new_object(_size, _parent->encoder_);
49+
avro_value_t new_object;
50+
avro_value_get_by_name(&_parent->val_, _name.c_str(), &new_object, nullptr);
51+
return OutputObjectType{new_object};
4652
}
4753

4854
Writer::OutputVarType Writer::add_null_to_array(
4955
OutputArrayType* _parent) const noexcept {
50-
cbor_encode_null(_parent->encoder_);
51-
return OutputVarType{};
56+
avro_value_t new_null;
57+
avro_value_append(&_parent->val_, &new_null, nullptr);
58+
avro_value_set_null(&new_null);
59+
return OutputArrayType{new_object};
5260
}
5361

5462
Writer::OutputVarType Writer::add_null_to_object(
5563
const std::string_view& _name, OutputObjectType* _parent) const noexcept {
56-
cbor_encode_text_string(_parent->encoder_, _name.data(), _name.size());
57-
cbor_encode_null(_parent->encoder_);
58-
return OutputVarType{};
64+
avro_value_t new_null;
65+
avro_value_get_by_name(&_parent->val_, _name.c_str(), &new_object, nullptr);
66+
avro_value_set_null(&new_null);
67+
return OutputVarType{new_null};
5968
}
6069

61-
void Writer::end_array(OutputArrayType* _arr) const noexcept {
62-
cbor_encoder_close_container(_arr->parent_, _arr->encoder_);
63-
}
64-
65-
void Writer::end_object(OutputObjectType* _obj) const noexcept {
66-
cbor_encoder_close_container(_obj->parent_, _obj->encoder_);
67-
}
70+
void Writer::end_array(OutputArrayType* _arr) const noexcept {}
6871

69-
Writer::OutputArrayType Writer::new_array(const size_t _size,
70-
CborEncoder* _parent) const noexcept {
71-
subencoders_->emplace_back(rfl::Box<CborEncoder>::make());
72-
cbor_encoder_create_array(_parent, subencoders_->back().get(), _size);
73-
return OutputArrayType{subencoders_->back().get(), _parent};
74-
}
75-
76-
Writer::OutputObjectType Writer::new_object(
77-
const size_t _size, CborEncoder* _parent) const noexcept {
78-
subencoders_->emplace_back(rfl::Box<CborEncoder>::make());
79-
cbor_encoder_create_map(_parent, subencoders_->back().get(), _size);
80-
return OutputObjectType{subencoders_->back().get(), _parent};
81-
}
72+
void Writer::end_object(OutputObjectType* _obj) const noexcept {}
8273

83-
} // namespace rfl::cbor
74+
} // namespace rfl::avro

0 commit comments

Comments
 (0)