#pragma once #include #include #include #include "schema.h" namespace saw { namespace encode { struct Native {}; } /* * Helper for the basic message container, so the class doesn't have to be * specialized 10 times. */ template struct native_data_type; template <> struct native_data_type> { using type = int8_t; }; template <> struct native_data_type> { using type = int16_t; }; template <> struct native_data_type> { using type = int32_t; }; template <> struct native_data_type> { using type = int64_t; }; template <> struct native_data_type> { using type = uint8_t; }; template <> struct native_data_type> { using type = uint16_t; }; template <> struct native_data_type> { using type = uint32_t; }; template <> struct native_data_type> { using type = uint64_t; }; template <> struct native_data_type> { using type = float; }; template <> struct native_data_type> { using type = double; }; template class data { private: static_assert(always_false, "Type not supported"); }; template class data...>, encode::Native> { private: std::tuple...> value_; public: template data< typename parameter_pack_type< parameter_key_pack_index< literal, literals... >::value , T...>::type , encode::Native>& get(){ return std::get::value>(value_); } constexpr size_t size() const { return sizeof...(T); } }; template class data { private: std::tuple> value_; public: template data::type, encode::Native>& get(){ return std::get(); } constexpr size_t size() const { return sizeof...(T); } }; template class data, encode::Native> { private: std::vector> value_; public: data(size_t size_){ value_.resize(size_); } data& at(size_t i){ return value_.at(i); } size_t size() const { return value_;} }; template<> class data { private: std::string value_; public: SAW_FORBID_COPY(data); data() = default; data(std::string value__):value_{std::move(value__)}{} std::size_t size() const { return value_.size(); } char get_at(size_t i) const{ return value_.at(i); } void set_at(size_t i, char val){ value_.at(i) = val; } bool operator==(const data& data){ return value_ == data.value_; } }; template class data, encode::Native> { private: typename native_data_type>::type value_; public: SAW_FORBID_COPY(data); data(typename native_data_type>::type value__): value_{std::move(value__)}{} void set(typename native_data_type>::type val){ value_ = val; } typename native_data_type>::type get() const {return value_;} }; }