This commit is contained in:
Claudius Holeksa 2021-12-18 14:24:06 +01:00
commit 7238863776
2 changed files with 40 additions and 31 deletions

View File

@ -375,21 +375,31 @@ public:
}
};
class MessageReader {
template<class Schema, class Container = MessageContainer<Schema>>
class HeapMessageRoot {
private:
Own<Message<Schema, Container>> root;
public:
virtual ~MessageReader() = default;
};
HeapMessageRoot(Own<Message<Schema,Container>> r):root{std::move(r)}{}
class MessageBuilder {
public:
virtual ~MessageBuilder() = default;
typename Message<Schema, Container>::Builder build(){
assert(root);
return root->build();
}
template <class > typename MessageRoot::Builder initRoot() {
root_message = std::make_unique<MessageRoot>();
MessageRoot &msg_ref = root_message->as<MessageRoot>();
return typename MessageRoot::Builder{msg_ref};
typename Message<Schema, Container>::Reader read(){
assert(root);
return root->read();
}
};
inline MessageBuilder messageBuilder() { return MessageBuilder{}; }
/*
* Minor helper for creating a message root
*/
template<class Schema, class Container = MessageContainer<Schema>>
inline HeapMessageRoot heapMessageRoot() {
Own<Message<Schema, Container>> root = heap<Message<Schema, Container>>();
return HeapMessageRoot<Schema, Container>{std::move(root)};
}
} // namespace gin

View File

@ -4,20 +4,16 @@
#include <string>
#include "source/kelgin/message.h"
using gin::MessageList;
using gin::MessageStruct;
using gin::MessageStructMember;
using gin::MessagePrimitive;
using gin::heapMessageBuilder;
namespace {
typedef MessageList<MessagePrimitive<uint32_t>, MessagePrimitive<std::string> > TestList;
using TestTuple = schema::Tuple<schema::UInt32, schema::String>;
GIN_TEST("MessageList"){
std::string test_string_1 = "banana";
auto builder = heapMessageBuilder();
auto root = builder.initRoot<TestList>();
auto root = builder.initRoot<TestTuple>();
auto uint = root.init<0>();
uint.set(10);
auto string = root.init<1>();
@ -30,14 +26,14 @@ GIN_TEST("MessageList"){
GIN_EXPECT( uint_reader.get() == 10 && string_reader.get() == test_string_1, "wrong values");
}
typedef MessageList<MessageList<MessagePrimitive<uint32_t>, MessagePrimitive<std::string>>, MessagePrimitive<std::string> > NestedTestList;
using NestedTestTuple = schema::Tuple<schema::Tuple<schema::UInt32, schema::String>, schema::String>;
GIN_TEST("MessageList nested"){
std::string test_string_1 = "banana";
std::string test_string_2 = "bat";
auto builder = heapMessageBuilder();
auto root = builder.initRoot<NestedTestList>();
auto root = builder.initRoot<NestedTestTuple>();
auto inner_list = root.init<0>();
auto uint = inner_list.init<0>();
uint.set(20);
@ -56,30 +52,33 @@ GIN_TEST("MessageList nested"){
GIN_EXPECT(uint_reader.get() == 20 && inner_string_reader.get() == test_string_2 && string_reader.get() == test_string_1, "wrong values");
}
typedef MessageStruct<
MessageStructMember<MessagePrimitive<uint32_t>, decltype("test_uint"_t)>,
MessageStructMember<MessagePrimitive<std::string>, decltype("test_string"_t)>,
MessageStructMember<MessagePrimitive<std::string>, decltype("test_name"_t)>
> TestStruct;
using TestStruct = schema::Struct<
schema::NamedMember<schema::UInt32, "test_uint">,
schema::NamedMember<schema::String, "test_string">,
schema::NamedMember<schema::String, "test_name">
>;
GIN_TEST("MessageStruct"){
std::string test_string = "foo";
auto builder = heapMessageBuilder();
auto root = builder.initRoot<TestStruct>();
auto uint = root.init<decltype("test_uint"_t)>();
auto uint = root.init<"test_uint">();
uint.set(23);
auto string = root.init<decltype("test_string"_t)>();
auto string = root.init<"test_string">();
string.set(test_string);
auto string_name = root.init<decltype("test_name"_t)>();
auto string_name = root.init<"test_name">();
string_name.set(&"test_name"_t.data[0]);
auto reader = root.asReader();
auto uint_reader = reader.get<decltype("test_uint"_t)>();
auto string_reader = reader.get<decltype("test_string"_t)>();
auto name_reader = reader.get<decltype("test_name"_t)>();
auto uint_reader = reader.get<"test_uint">();
auto string_reader = reader.get<"test_string">();
auto name_reader = reader.get<"test_name">();
/*
* Set string to another value to guarantee no changes
*/
test_string = "foo2";
GIN_EXPECT(uint_reader.get() == 23 && string_reader.get() != test_string && string_reader.get() == "foo" && name_reader.get() == "test_name", "wrong values");
}
}
}