fixed bad template argument pass
parent
11fef8f56d
commit
d734b0b5ad
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue