forstio/source/kelgin/message_container.h

49 lines
1.3 KiB
C
Raw Normal View History

2021-11-29 15:08:18 +01:00
#pragma once
#include "schema.h"
namespace gin {
2021-12-05 16:17:23 +01:00
template <class T> class MessageContainer;
2021-11-29 15:08:18 +01:00
template <class T, class Container> class Message;
2021-12-05 16:17:23 +01:00
template <size_t N, class... T> struct MessageParameterPackType;
2021-11-29 15:08:18 +01:00
2021-12-05 16:17:23 +01:00
template <class TN, class... T> struct MessageParameterPackType<0, TN, T...> {
2021-11-29 15:08:18 +01:00
using Type = T;
};
2021-12-05 16:17:23 +01:00
template <size_t N, class TN, class... T>
struct MessageParameterPackType<N, TN, T...> {
using Type = typename MessageParameterPackType<N - 1, T...>::Type;
2021-11-29 15:08:18 +01:00
};
2021-12-05 16:17:23 +01:00
template <class T, class... TL> struct MessageParameterPackIndex;
2021-11-29 15:08:18 +01:00
2021-12-05 16:17:23 +01:00
template <class T, class... TL> struct MessageParameterPackIndex<T, T, TL...> {
2021-11-29 15:08:18 +01:00
static constexpr size_t Value = 0u;
};
2021-12-05 16:17:23 +01:00
template <class T, class TL0, class... TL>
struct MessageParameterPackIndex<T, TL0, TL...> {
static constexpr size_t Value =
1u + MessageParameterPackIndex<T, TL...>::Value;
2021-11-29 15:08:18 +01:00
};
2021-12-05 16:17:23 +01:00
template <class... V, class... K>
class MessageContainer<schema::Struct<schema::NamedMember<V, K>...>> {
2021-11-29 15:08:18 +01:00
private:
using ValueType = std::tuple<Message<V, MessageContainer<V>>...>;
ValueType values;
2021-12-05 16:17:23 +01:00
2021-11-29 15:08:18 +01:00
public:
2021-12-05 16:17:23 +01:00
using SchemaType = schema::Struct<schema::NamedMember<V, K>...>;
2021-11-29 15:08:18 +01:00
2021-12-05 16:17:23 +01:00
template <size_t i>
using Element =
MessageParameterPackType<N, Message<V, MessageContainer<V>>...>;
2021-11-29 15:08:18 +01:00
2021-12-05 16:17:23 +01:00
template <size_t i> Element<i> &get() { return std::get<i>(values); }
2021-11-29 15:08:18 +01:00
};
2021-12-05 16:17:23 +01:00
} // namespace gin