diff options
-rw-r--r-- | src/codec/data.h | 10 | ||||
-rw-r--r-- | src/core/templates.h | 16 |
2 files changed, 23 insertions, 3 deletions
diff --git a/src/codec/data.h b/src/codec/data.h index 96345af..442fa26 100644 --- a/src/codec/data.h +++ b/src/codec/data.h @@ -1,6 +1,10 @@ #pragma once #include <forstio/core/common.h> +#include <forstio/core/templates.h> + +#include <vector> + #include "schema.h" namespace saw { @@ -69,14 +73,14 @@ private: static_assert(always_false<T>, "Type not supported"); }; -template<typename... T, string_literal... literal> -class data<schema::Struct<Member<T, literal>...>, encode::Native> { +template<typename... T, string_literal... literals> +class data<schema::Struct<schema::Member<T, literals>...>, encode::Native> { private: std::tuple<data<T,encode::Native>...> value_; public: template<string_literal literal> data<T, encode::Native>& get(){ - + return std::get<parameter_packe_index<literal, literals...>::value>(value_); } constexpr size_t size() const { diff --git a/src/core/templates.h b/src/core/templates.h new file mode 100644 index 0000000..833bb5b --- /dev/null +++ b/src/core/templates.h @@ -0,0 +1,16 @@ +#pragma once + +namespace saw { + +template <class T, class... TL> struct parameter_pack_index; + +template <class T, class... TL> struct parameter_pack_index<T, T, TL...> { + static constexpr size_t value = 0u; +}; + +template <class T, class TL0, class... TL> +struct parameter_pack_index<T, TL0, TL...> { + static constexpr size_t value = + 1u + parameter_pack_index<T, TL...>::value; +}; +} |