Skip to content

Commit

Permalink
Added very rudimentary first draft of the Writer
Browse files Browse the repository at this point in the history
  • Loading branch information
liuzicheng1987 committed Dec 23, 2024
1 parent da8db50 commit c8afdf6
Show file tree
Hide file tree
Showing 4 changed files with 250 additions and 39 deletions.
8 changes: 4 additions & 4 deletions include/rfl/capnproto/Reader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ struct Reader {
capnp::DynamicList::Reader val_;
};

struct CapNProtoInputObject {
capnp::DynamicStruct::Reader val_;
};

struct CapNProtoInputMap {
capnp::DynamicList::Reader val_;
};

struct CapNProtoInputObject {
capnp::DynamicStruct::Reader val_;
};

struct CapNProtoInputUnion {
// TODO: Is this right?
capnp::DynamicStruct::Reader val_;
Expand Down
73 changes: 38 additions & 35 deletions include/rfl/capnproto/Writer.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef RFL_CAPNPROTO_WRITER_HPP_
#define RFL_CAPNPROTO_WRITER_HPP_

#include <capnproto.h>
#include <capnp/dynamic.h>

#include <bit>
#include <cstdint>
Expand All @@ -26,33 +26,34 @@ namespace rfl::capnproto {

class Writer {
public:
struct CAPNPROTOOutputArray {
capnproto_value_t val_;
struct CapnProtoOutputArray {
capnp::DynamicList::Builder val_;
};

struct CAPNPROTOOutputMap {
capnproto_value_t val_;
struct CapnProtoOutputMap {
capnp::DynamicList::Builder val_;
};

struct CAPNPROTOOutputObject {
capnproto_value_t val_;
struct CapnProtoOutputObject {
capnp::DynamicStruct::Builder val_;
};

struct CAPNPROTOOutputUnion {
capnproto_value_t val_;
struct CapnProtoOutputUnion {
// TODO: Is this right?
capnp::DynamicStruct::Builder val_;
};

struct CAPNPROTOOutputVar {
capnproto_value_t val_;
struct CapnProtoOutputVar {
capnp::DynamicValue::Builder val_;
};

using OutputArrayType = CAPNPROTOOutputArray;
using OutputMapType = CAPNPROTOOutputMap;
using OutputObjectType = CAPNPROTOOutputObject;
using OutputUnionType = CAPNPROTOOutputUnion;
using OutputVarType = CAPNPROTOOutputVar;
using OutputArrayType = CapnProtoOutputArray;
using OutputMapType = CapnProtoOutputMap;
using OutputObjectType = CapnProtoOutputObject;
using OutputUnionType = CapnProtoOutputUnion;
using OutputVarType = CapnProtoOutputVar;

Writer(capnproto_value_t* _root);
Writer(capnp::DynamicValue::Builder* _root);

~Writer();

Expand Down Expand Up @@ -139,38 +140,40 @@ class Writer {
template <class T>
OutputVarType add_value_to_array(const T& _var,
OutputArrayType* _parent) const noexcept {
capnproto_value_t new_value;
capnproto_value_append(&_parent->val_, &new_value, nullptr);
set_value(_var, &new_value);
return OutputVarType{new_value};
// TODO
/*capnproto_value_t new_value;
capnproto_value_append(&_parent->val_, &new_value, nullptr);
set_value(_var, &new_value);
return OutputVarType{new_value};*/
}

template <class T>
OutputVarType add_value_to_map(const std::string_view& _name, const T& _var,
OutputMapType* _parent) const noexcept {
capnproto_value_t new_value;
capnproto_value_add(&_parent->val_, _name.data(), &new_value, nullptr, nullptr);
set_value(_var, &new_value);
return OutputVarType{new_value};
// TODO
/*capnproto_value_t new_value;
capnproto_value_add(&_parent->val_, _name.data(), &new_value, nullptr,
nullptr);
set_value(_var, &new_value);
return OutputVarType{new_value};*/
}

template <class T>
OutputVarType add_value_to_object(const std::string_view& _name,
const T& _var,
OutputObjectType* _parent) const noexcept {
capnproto_value_t new_value;
capnproto_value_get_by_name(&_parent->val_, _name.data(), &new_value, nullptr);
set_value(_var, &new_value);
return OutputVarType{new_value};
_parent->val_.set(_name, _var);
return OutputVarType{};
}

template <class T>
OutputVarType add_value_to_union(const size_t _index, const T& _var,
OutputUnionType* _parent) const noexcept {
capnproto_value_t new_value;
capnproto_value_set_branch(&_parent->val_, static_cast<int>(_index), &new_value);
/*capnproto_value_t new_value;
capnproto_value_set_branch(&_parent->val_, static_cast<int>(_index),
&new_value);
set_value(_var, &new_value);
return OutputVarType{new_value};
return OutputVarType{new_value};*/
}

void end_array(OutputArrayType* _arr) const noexcept {}
Expand All @@ -180,7 +183,7 @@ class Writer {
void end_object(OutputObjectType* _obj) const noexcept {}

private:
template <class T>
/*template <class T>
void set_value(const T& _var, capnproto_value_t* _val) const noexcept {
if constexpr (std::is_same<std::remove_cvref_t<T>, std::string>()) {
capnproto_value_set_string_len(_val, _var.c_str(), _var.size() + 1);
Expand All @@ -205,10 +208,10 @@ class Writer {
} else {
static_assert(rfl::always_false_v<T>, "Unsupported type.");
}
}
}*/

private:
capnproto_value_t* root_;
capnp::DynamicValue::Builder* root_;
};

} // namespace rfl::capnproto
Expand Down
1 change: 1 addition & 0 deletions src/reflectcpp_capnproto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,5 @@ SOFTWARE.
#include "rfl/avro/to_schema.cpp"*/
#include "rfl/capnproto/Reader.cpp"
#include "rfl/capnproto/SchemaImpl.cpp"
#include "rfl/capnproto/Writer.cpp"

207 changes: 207 additions & 0 deletions src/rfl/capnproto/Writer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
#include "rfl/capnproto/Writer.hpp"

#include "rfl/parsing/schemaful/IsSchemafulWriter.hpp"

namespace rfl::capnproto {

static_assert(parsing::schemaful::IsSchemafulWriter<Writer>,
"This must be a schemaful writer.");

Writer::Writer(capnp::DynamicValue::Builder* _root) : root_(_root){};

Writer::~Writer() = default;

Writer::OutputArrayType Writer::array_as_root(
const size_t _size) const noexcept {
return OutputArrayType{root_->as<capnp::DynamicList>()};
}

Writer::OutputMapType Writer::map_as_root(const size_t _size) const noexcept {
return OutputMapType{root_->as<capnp::DynamicList>()};
}

Writer::OutputObjectType Writer::object_as_root(
const size_t _size) const noexcept {
return OutputObjectType{root_->as<capnp::DynamicStruct>()};
}

Writer::OutputVarType Writer::null_as_root() const noexcept {
// TODO
// avro_value_set_null(root_);
return OutputVarType{root_};
}

Writer::OutputUnionType Writer::union_as_root() const noexcept {
return OutputUnionType{root_->as<capnp::DynamicStruct>()};
}

Writer::OutputArrayType Writer::add_array_to_array(
const size_t _size, OutputArrayType* _parent) const noexcept {
// TODO
/*avro_value_t new_array;
avro_value_append(&_parent->val_, &new_array, nullptr);
return OutputArrayType{new_array};*/
}

Writer::OutputArrayType Writer::add_array_to_map(
const std::string_view& _name, const size_t _size,
OutputMapType* _parent) const noexcept {
// TODO
/*avro_value_t new_array;
avro_value_add(&_parent->val_, _name.data(), &new_array, nullptr, nullptr);
return OutputArrayType{new_array};*/
}

Writer::OutputArrayType Writer::add_array_to_object(
const std::string_view& _name, const size_t _size,
OutputObjectType* _parent) const noexcept {
return OutputArrayType{
_parent->val_.init(_name.data(), _size).as<capnp::DynamicList>()};
}

Writer::OutputArrayType Writer::add_array_to_union(
const size_t _index, const size_t _size,
OutputUnionType* _parent) const noexcept {
/*avro_value_t new_array;
avro_value_set_branch(&_parent->val_, static_cast<int>(_index), &new_array);
return OutputArrayType{new_array};*/
}

Writer::OutputMapType Writer::add_map_to_array(
const size_t _size, OutputArrayType* _parent) const noexcept {
// TODO
/*avro_value_t new_map;
avro_value_append(&_parent->val_, &new_map, nullptr);
return OutputMapType{new_map};*/
}

Writer::OutputMapType Writer::add_map_to_map(
const std::string_view& _name, const size_t _size,
OutputMapType* _parent) const noexcept {
// TODO
/*avro_value_t new_map;
avro_value_add(&_parent->val_, _name.data(), &new_map, nullptr, nullptr);
return OutputMapType{new_map};*/
}

Writer::OutputMapType Writer::add_map_to_object(
const std::string_view& _name, const size_t _size,
OutputObjectType* _parent) const noexcept {
return OutputMapType{
_parent->val_.init(_name.data(), _size).as<capnp::DynamicList>()};
}

Writer::OutputMapType Writer::add_map_to_union(
const size_t _index, const size_t _size,
OutputUnionType* _parent) const noexcept {
// TODO
/*avro_value_t new_map;
avro_value_set_branch(&_parent->val_, static_cast<int>(_index), &new_map);
return OutputMapType{new_map};*/
}

Writer::OutputObjectType Writer::add_object_to_array(
const size_t _size, OutputArrayType* _parent) const noexcept {
// TODO
/*avro_value_t new_object;
avro_value_append(&_parent->val_, &new_object, nullptr);
return OutputObjectType{new_object};*/
}

Writer::OutputObjectType Writer::add_object_to_map(
const std::string_view& _name, const size_t _size,
OutputMapType* _parent) const noexcept {
// TODO
/*avro_value_t new_object;
avro_value_add(&_parent->val_, _name.data(), &new_object, nullptr, nullptr);
return OutputObjectType{new_object};*/
}

Writer::OutputObjectType Writer::add_object_to_object(
const std::string_view& _name, const size_t _size,
OutputObjectType* _parent) const noexcept {
// TODO
/*avro_value_t new_object;
avro_value_get_by_name(&_parent->val_, _name.data(), &new_object, nullptr);
return OutputObjectType{new_object};*/
}

Writer::OutputObjectType Writer::add_object_to_union(
const size_t _index, const size_t _size,
OutputUnionType* _parent) const noexcept {
// TODO
/*avro_value_t new_object;
avro_value_set_branch(&_parent->val_, static_cast<int>(_index), &new_object);
return OutputObjectType{new_object};
*/
}

Writer::OutputUnionType Writer::add_union_to_array(
OutputArrayType* _parent) const noexcept {
// TODO
/*avro_value_t new_union;
avro_value_append(&_parent->val_, &new_union, nullptr);
return OutputUnionType{new_union};*/
}

Writer::OutputUnionType Writer::add_union_to_map(
const std::string_view& _name, OutputMapType* _parent) const noexcept {
// TODO
/*avro_value_t new_union;
avro_value_add(&_parent->val_, _name.data(), &new_union, nullptr, nullptr);
return OutputUnionType{new_union};*/
}

Writer::OutputUnionType Writer::add_union_to_object(
const std::string_view& _name, OutputObjectType* _parent) const noexcept {
// TODO
/*avro_value_t new_union;
avro_value_get_by_name(&_parent->val_, _name.data(), &new_union, nullptr);
return OutputUnionType{new_union};*/
}

Writer::OutputUnionType Writer::add_union_to_union(
const size_t _index, OutputUnionType* _parent) const noexcept {
// TODO
/*avro_value_t new_union;
avro_value_set_branch(&_parent->val_, static_cast<int>(_index), &new_union);
return OutputUnionType{new_union};*/
}

Writer::OutputVarType Writer::add_null_to_array(
OutputArrayType* _parent) const noexcept {
// TODO
/*avro_value_t new_null;
avro_value_append(&_parent->val_, &new_null, nullptr);
avro_value_set_null(&new_null);
return OutputVarType{new_null};*/
}

Writer::OutputVarType Writer::add_null_to_map(
const std::string_view& _name, OutputMapType* _parent) const noexcept {
// TODO
/*avro_value_t new_null;
avro_value_add(&_parent->val_, _name.data(), &new_null, nullptr, nullptr);
avro_value_set_null(&new_null);
return OutputVarType{new_null};*/
}

Writer::OutputVarType Writer::add_null_to_object(
const std::string_view& _name, OutputObjectType* _parent) const noexcept {
// TODO
/*avro_value_t new_null;
avro_value_get_by_name(&_parent->val_, _name.data(), &new_null, nullptr);
avro_value_set_null(&new_null);
return OutputVarType{new_null};*/
}

Writer::OutputVarType Writer::add_null_to_union(
const size_t _index, OutputUnionType* _parent) const noexcept {
// TODO
/*avro_value_t new_null;
avro_value_set_branch(&_parent->val_, static_cast<int>(_index), &new_null);
avro_value_set_null(&new_null);
return OutputVarType{new_null};*/
}

} // namespace rfl::capnproto

0 comments on commit c8afdf6

Please sign in to comment.