merge
This commit is contained in:
commit
7238863776
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue