fixed bad template argument pass

fb-doc-catchup^2
Claudius Holeksa 2021-12-27 22:29:07 +01:00
parent 11fef8f56d
commit d734b0b5ad
3 changed files with 122 additions and 10 deletions

View File

@ -13,6 +13,7 @@ namespace gin {
* bigger than uint32_t max. At least I hope noone would do this
*/
using msg_union_id_t = uint32_t;
using msg_array_length_t = uint64_t;
using msg_packet_length_t = uint64_t;
class ProtoKelCodec {
@ -271,6 +272,48 @@ struct ProtoKelEncodeImpl<
return sizeof(msg_union_id_t) + sizeMembers<0>(reader);
}
};
template <class T, class Container>
struct ProtoKelEncodeImpl<Message<schema::Array<T>, Container>> {
static Error
encode(typename Message<schema::Array<T>, Container>::Reader data,
Buffer &buffer) {
msg_array_length_t array_length = data.size();
{
Error error =
StreamValue<msg_array_length_t>::encode(array_length, buffer);
if (error.failed()) {
return error;
}
}
for (size_t i = 0; i < array_length; ++i) {
Error error =
ProtoKelEncodeImpl<typename Container::ElementType>::encode(
data.get(i), buffer);
if (error.failed()) {
return error;
}
}
return noError();
}
/*
*
*/
static size_t
size(typename Message<schema::Array<T>, Container>::Reader data) {
size_t members = sizeof(msg_array_length_t);
for (size_t i = 0; i < data.size(); ++i) {
members +=
ProtoKelEncodeImpl<typename Container::ElementType>::size(
data.get(i));
}
return members;
}
};
/*
* Decode Implementations
*/
@ -436,6 +479,32 @@ struct ProtoKelDecodeImpl<
}
};
template <class T, class Container>
struct ProtoKelDecodeImpl<Message<schema::Array<T>, Container>> {
static Error
decode(typename Message<schema::Array<T>, Container>::Builder data,
Buffer &buffer) {
msg_array_length_t array_length = 0;
{
Error error =
StreamValue<msg_array_length_t>::decode(array_length, buffer);
if (error.failed()) {
return error;
}
}
for (size_t i = 0; i < array_length; ++i) {
Error error =
ProtoKelDecodeImpl<typename Container::ElementType>::decode(
data.init(i), buffer);
if (error.failed()) {
return error;
}
}
return noError();
}
};
template <class Schema, class Container>
Error ProtoKelCodec::encode(typename Message<Schema, Container>::Reader reader,
Buffer &buffer) {

View File

@ -88,15 +88,7 @@ GIN_TEST("Message Struct"){
using TestArray = schema::Array<schema::UInt32>;
using TestArrayStruct = schema::Struct<
schema::NamedMember<TestArray, "array">
>;
GIN_TEST("Message Array"){
auto root = gin::heapMessageRoot<TestArray>();
auto builder = root.build(3);
void arrayCheck(gin::Message<TestArray>::Builder builder){
auto one = builder.init(0);
auto two = builder.init(1);
auto three = builder.init(2);
@ -105,8 +97,30 @@ GIN_TEST("Message Array"){
two.set(45);
three.set(1230);
auto reader = root.read();
auto reader = builder.asReader();
GIN_EXPECT(reader.get(0).get() == 24 && reader.get(1).get() == 45 && reader.get(2).get(), "Wrong values");
}
GIN_TEST("Message Array"){
auto root = gin::heapMessageRoot<TestArray>();
auto builder = root.build(3);
arrayCheck(builder);
}
using TestArrayStruct = schema::Struct<
schema::NamedMember<TestArray, "array">
>;
GIN_TEST("Message Array in Struct"){
auto root = gin::heapMessageRoot<TestArrayStruct>();
auto builder = root.build();
auto array = builder.init<"array">(3);
arrayCheck(array);
}
}

View File

@ -195,4 +195,33 @@ GIN_TEST("Union Decoding"){
auto str_rd = reader.get<"test_string">();
GIN_EXPECT(str_rd.get() == "foo", "Wrong value: " + std::string{str_rd.get()});
}
using TestArrayStruct = schema::Array<
TestStruct
>;
GIN_TEST("Array Encoding"){
using namespace gin;
ProtoKelCodec codec;
auto root = heapMessageRoot<TestArrayStruct>();
auto builder = root.build(2);
auto one = builder.init(0);
auto two = builder.init(1);
one.init<"test_uint">().set(4);
one.init<"test_string">().set("foo");
one.init<"test_name">().set("Fedor");
two.init<"test_uint">().set(9);
two.init<"test_string">().set("bar");
two.init<"test_name">().set("Bravo");
RingBuffer buffer;
Error error = codec.encode<TestArrayStruct>(root.read(), buffer);
GIN_EXPECT(!error.failed(), "Error occured");
}
}