array preparation

fb-doc-catchup^2
Claudius Holeksa 2021-12-27 18:15:42 +01:00
parent f1cec42d10
commit 39cfdc608f
2 changed files with 149 additions and 34 deletions

View File

@ -73,7 +73,11 @@ public:
* Initialize a member by index
*/
template <size_t i>
typename Container::template ElementType<i>::Builder init() {
typename std::enable_if<
!SchemaIsArray<
typename MessageParameterPackType<i, V...>::Type>::Value,
typename Container::template ElementType<i>::Builder>::type
init() {
return typename Container::template ElementType<i>::Builder{
message.container.template get<i>()};
}
@ -83,14 +87,49 @@ public:
* This is the preferred method for schema::Struct messages
*/
template <StringLiteral Literal>
typename Container::template ElementType<
MessageParameterKeyPackIndex<Literal, Keys...>::Value>::Builder
typename std::enable_if<
!SchemaIsArray<typename MessageParameterPackType<
MessageParameterKeyPackIndex<Literal, Keys...>::Value,
V...>::Type>::Value,
typename Container::template ElementType<
MessageParameterKeyPackIndex<Literal,
Keys...>::Value>::Builder>::type
init() {
constexpr size_t i =
MessageParameterKeyPackIndex<Literal, Keys...>::Value;
return init<i>();
}
template <size_t i>
typename std::enable_if<
SchemaIsArray<
typename MessageParameterPackType<i, V...>::Type>::Value,
typename Container::template ElementType<i>::Builder>::type
init(size_t size) {
auto array_builder =
typename Container::template ElementType<i>::Builder{
message.container.template get<i>(), size};
return array_builder;
}
/*
* Version for array schema type
*/
template <StringLiteral Literal>
typename std::enable_if<
SchemaIsArray<typename MessageParameterPackType<
MessageParameterKeyPackIndex<Literal, Keys...>::Value,
V...>::Type>::Value,
typename Container::template ElementType<
MessageParameterKeyPackIndex<Literal,
Keys...>::Value>::Builder>::type
init(size_t size) {
constexpr size_t i =
MessageParameterKeyPackIndex<Literal, Keys...>::Value;
return init<i>(size);
}
};
class Reader {
@ -162,20 +201,58 @@ public:
Reader asReader() { return Reader{message}; }
template <size_t i>
typename Container::template ElementType<i>::Builder init() {
typename std::enable_if<
!SchemaIsArray<
typename MessageParameterPackType<i, V...>::Type>::Value,
typename Container::template ElementType<i>::Builder>::type
init() {
return typename Container::template ElementType<i>::Builder{
message.container.template get<i>()};
}
template <StringLiteral Literal>
typename Container::template ElementType<
MessageParameterKeyPackIndex<Literal, Keys...>::Value>::Builder
typename std::enable_if<
!SchemaIsArray<typename MessageParameterPackType<
MessageParameterKeyPackIndex<Literal, Keys...>::Value,
V...>::Type>::Value,
typename Container::template ElementType<
MessageParameterKeyPackIndex<Literal,
Keys...>::Value>::Builder>::type
init() {
constexpr size_t i =
MessageParameterKeyPackIndex<Literal, Keys...>::Value;
return init<i>();
}
/*
* If Schema is Array
*/
template <size_t i>
typename std::enable_if<
SchemaIsArray<
typename MessageParameterPackType<i, V...>::Type>::Value,
typename Container::template ElementType<i>::Builder>::type
init(size_t size) {
return typename Container::template ElementType<i>::Builder{
message.container.template get<i>(), size};
}
template <StringLiteral Literal>
typename std::enable_if<
SchemaIsArray<typename MessageParameterPackType<
MessageParameterKeyPackIndex<Literal, Keys...>::Value,
V...>::Type>::Value,
typename Container::template ElementType<
MessageParameterKeyPackIndex<Literal,
Keys...>::Value>::Builder>::type
init(size_t size) {
constexpr size_t i =
MessageParameterKeyPackIndex<Literal, Keys...>::Value;
return init<i>(size);
}
};
class Reader {
@ -219,11 +296,8 @@ public:
/*
* Array message class. Wrapper around an array schema element
* @todo Array class needs either a resize function or each message class has an
* individual call for Array children
*/
/*
template<class T, class Container>
template <class T, class Container>
class Message<schema::Array<T>, Container> final : public MessageBase {
private:
using SchemaType = schema::Array<T>;
@ -241,35 +315,42 @@ public:
class Reader;
class Builder {
private:
MessageType & message;
MessageType &message;
public:
Builder(MessageType& msg):message{msg}{}
Reader asReader(){return Reader{message};}
template<size_t i>
typename Container::MessageType::Builder init(){
return typename
Container::MessageType::Builder{message.container.get<i>()};
Builder(MessageType &msg, size_t size) : message{msg} {
if (size > 0) {
message.container.resize(size);
}
}
Reader asReader() { return Reader{message}; }
typename Container::ElementType::Builder init(size_t i) {
return typename Container::MessageType::Builder{
message.container.get(i)};
}
size_t size() const { return message.container.size(); }
};
class Reader {
private:
MessageType& message;
MessageType &message;
public:
Reader(MessageType& msg):message{msg}{}
Reader(MessageType &msg) : message{msg} {}
Builder asBuilder(){return Builder{message};}
Builder asBuilder() { return Builder{message, 0}; }
template<size_t i>
typename Container::MessageType::Reader get(){
return typename
Container::MessageType::Reader{message.container.get<i>()};
typename Container::ElementType::Reader get(size_t i) {
return typename Container::ElementType::Reader{
message.container.get(i)};
}
size_t size() const { return message.container.size(); }
};
};
*/
/*
* Tuple message class. Wrapper around a tuple schema
@ -432,6 +513,28 @@ public:
}
};
template <class T, class Container>
class HeapMessageRoot<schema::Array<T>, Container> {
public:
using Schema = schema::Array<T>;
private:
Own<Message<Schema, Container>> root;
public:
HeapMessageRoot(Own<Message<Schema, Container>> r) : root{std::move(r)} {}
typename Message<Schema, Container>::Builder build(size_t size) {
assert(root);
return typename Message<Schema, Container>::Builder{*root, size};
}
typename Message<Schema, Container>::Reader read() {
assert(root);
return typename Message<Schema, Container>::Reader{*root};
}
};
/*
* Minor helper for creating a message root
*/

View File

@ -57,6 +57,14 @@ struct MessageParameterKeyPackIndex {
"Provided StringLiteral doesn't exist in searched list");
};
template <class T> struct SchemaIsArray {
constexpr static bool Value = false;
};
template <class T> struct SchemaIsArray<schema::Array<T>> {
constexpr static bool Value = true;
};
template <class... V, StringLiteral... Keys>
class MessageContainer<schema::Struct<schema::NamedMember<V, Keys>...>> {
private:
@ -104,20 +112,24 @@ public:
* Array storage
*/
/*
template<class T>
class MessageContainer<schema::Array> {
template <class T> class MessageContainer<schema::Array<T>> {
private:
using ValueType = std::vector<Message<T,MessageContainer<T>>>;
using ValueType = std::vector<Message<T, MessageContainer<T>>>;
ValueType values;
public:
using SchemaType = schema::Array<T>;
template<size_t i> Message<T,MessageContainer<T>>& get(){
return values.at(i);
using ElementType = Message<T, MessageContainer<T>>;
Message<T, MessageContainer<T>> &get(size_t index) {
return values.at(index);
}
void resize(size_t size) { values.resize(size); }
size_t size() const { return values.size(); }
};
*/
/*
* Tuple storage