#pragma once #include #include namespace saw { namespace schema { // NOLINTBEGIN template struct Member {}; template struct Struct { static_assert( always_false, "This schema template doesn't support this type of template argument"); }; template struct Struct...> {}; template struct Union { static_assert( always_false, "This schema template doesn't support this type of template argument"); }; template struct Union...> {}; template struct Array {}; template struct FixedArray {}; template 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 * >; * * data ex_data; */ template class Wrapper {}; struct String {}; struct SignedInteger {}; struct UnsignedInteger {}; struct FloatingPoint {}; template struct Primitive { static_assert(((std::is_same_v || std::is_same_v)&&(N == 1 || N == 2 || N == 4 || N == 8)) || (std::is_same_v && (N == 4 || N == 8)), "Primitive Type is not supported"); }; using Int8 = Primitive; using Int16 = Primitive; using Int32 = Primitive; using Int64 = Primitive; using UInt8 = Primitive; using UInt16 = Primitive; using UInt32 = Primitive; using UInt64 = Primitive; using Float32 = Primitive; using Float64 = Primitive; /** * Classes allowing to distinguish Ints from VarInts */ template struct VariableLengthPrimitive {}; using VarInt = VariableLengthPrimitive; using VarLong = VariableLengthPrimitive; /** * Classes enabling Rpc calls */ template struct Function {}; template struct Interface { static_assert( always_false, "This schema template doesn't support this type of template argument"); }; template struct Interface,Names>...> {}; // NOLINTEND } // namespace schema template struct is_struct { constexpr static bool value = false; }; template struct is_struct...>> { constexpr static bool value = true; }; template struct is_string { constexpr static bool value = false; }; template <> struct is_string { constexpr static bool value = true; }; template struct is_tuple { constexpr static bool value = false; }; template struct is_tuple> { constexpr static bool value = true; }; template struct is_array { constexpr static bool value = false; }; template struct is_array> { constexpr static bool value = true; }; template struct is_primitive { constexpr static bool value = false; }; template struct is_primitive> { constexpr static bool value = true; }; } // namespace saw