diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2023-12-04 17:01:04 +0100 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2023-12-04 17:01:04 +0100 |
commit | a863f9af9fff0ecb276c6769149d9672961b7533 (patch) | |
tree | 9f7bc499df30e651ae0cc6c2ffca0dd64b4e3769 /modules/codec/c++/schema.h | |
parent | 8da0229a7e172a86c023edc6bb25ba803c68f5d3 (diff) |
codec: Moving structure around
Diffstat (limited to 'modules/codec/c++/schema.h')
-rw-r--r-- | modules/codec/c++/schema.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/modules/codec/c++/schema.h b/modules/codec/c++/schema.h new file mode 100644 index 0000000..a8494fe --- /dev/null +++ b/modules/codec/c++/schema.h @@ -0,0 +1,109 @@ +#pragma once + +#include <forstio/core/common.h> +#include <forstio/core/string_literal.h> + +namespace saw { +namespace schema { +// NOLINTBEGIN +template <typename T, string_literal Literal> struct Member {}; + +template <typename... T> struct Struct { + static_assert( + always_false<T...>, + "This schema template doesn't support this type of template argument"); +}; + +template <typename... V, string_literal... K> +struct Struct<Member<V, K>...> {}; + +template <typename... T> struct Union { + static_assert( + always_false<T...>, + "This schema template doesn't support this type of template argument"); +}; + +template <typename... V, string_literal... K> +struct Union<Member<V, K>...> {}; + +template <typename T, size_t Dim = 1> struct Array {}; + +template <class T> struct is_array { + constexpr static bool value = false; +}; + +template <class T, size_t Dim> struct is_array<schema::Array<T,Dim>> { + constexpr static bool value = true; +}; + +template<typename T, size_t... S> struct FixedArray {}; + +template <typename... T> struct Tuple {}; + +/** + * This acts as a separator of different encodings being mashed together + * For example we can transport any base64 encodings in JSON + * + * using WrappedExample = schema::Tuple< + * schema::Wrapper<schema::String, encode::Base64> + * >; + * + * data<WrappedExample, encode::Json> ex_data; + */ +template <typename T, typename Enc> +class Wrapper {}; + +struct String {}; + +struct SignedInteger {}; +struct UnsignedInteger {}; +struct FloatingPoint {}; + +template <class T, size_t N> struct Primitive { + static_assert(((std::is_same_v<T, SignedInteger> || + std::is_same_v<T, UnsignedInteger>)&&(N == 1 || N == 2 || + N == 4 || N == 8)) || + (std::is_same_v<T, FloatingPoint> && (N == 4 || N == 8)), + "Primitive Type is not supported"); +}; + +using Int8 = Primitive<SignedInteger, 1>; +using Int16 = Primitive<SignedInteger, 2>; +using Int32 = Primitive<SignedInteger, 4>; +using Int64 = Primitive<SignedInteger, 8>; + +using UInt8 = Primitive<UnsignedInteger, 1>; +using UInt16 = Primitive<UnsignedInteger, 2>; +using UInt32 = Primitive<UnsignedInteger, 4>; +using UInt64 = Primitive<UnsignedInteger, 8>; + +using Float32 = Primitive<FloatingPoint, 4>; +using Float64 = Primitive<FloatingPoint, 8>; + +/** + * Classes allowing to distinguish Ints from VarInts + */ +template<typename T, std::size_t MaxLen> +struct VariableLengthPrimitive {}; + +using VarInt = VariableLengthPrimitive<SignedInteger, 5>; +using VarLong = VariableLengthPrimitive<SignedInteger, 10>; + +/** + * Classes enabling Rpc calls + */ +template <class Request, class Response> +struct Function {}; + +template <class... T> struct Interface { + static_assert( + always_false<T...>, + "This schema template doesn't support this type of template argument"); +}; + +template <class... Requests, class... Responses, string_literal... Names> +struct Interface<Member<Function<Requests, Responses>,Names>...> {}; + +// NOLINTEND +} // namespace schema +} // namespace saw |