.. _program_listing_file__tmp_ws_src_data_tamer_data_tamer_cpp_include_data_tamer_custom_types.hpp: Program Listing for File custom_types.hpp ========================================= |exhale_lsh| :ref:`Return to documentation for file ` (``/tmp/ws/src/data_tamer/data_tamer_cpp/include/data_tamer/custom_types.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include #include #include "data_tamer/types.hpp" #include "data_tamer/contrib/SerializeMe.hpp" namespace DataTamer { template struct TypeDefinition { std::string typeName() const; template void typeDef(const T& obj, Function& addField); }; class CustomSerializer { public: using Ptr = std::shared_ptr; virtual ~CustomSerializer() = default; // name of the type, to be written in the schema string. virtual const std::string& typeName() const = 0; // optional custom schema of the type virtual std::optional typeSchema() const { return std::nullopt; } // size in bytes of the serialized object. // Needed to pre-allocate memory in the buffer virtual size_t serializedSize(const void* instance) const = 0; // true if the method serializedSize will ALWAYS return the same value virtual bool isFixedSize() const = 0; // serialize an object into a buffer. virtual void serialize(const void* instance, SerializeMe::SpanBytes&) const = 0; }; //------------------------------------------------------------------ // This derived class is used automatically by all the types // that have a template specialization of TypeDefinition template class CustomSerializerT : public CustomSerializer { public: CustomSerializerT(const std::string& type_name = TypeDefinition().typeName()); const std::string& typeName() const override; size_t serializedSize(const void* src_instance) const override; bool isFixedSize() const override; void serialize(const void* src_instance, SerializeMe::SpanBytes& dst_buffer) const override; private: std::string _name; size_t _fixed_size = 0; }; class TypesRegistry { public: template CustomSerializer::Ptr addType(const std::string& type_name, bool skip_if_present = false); template [[nodiscard]] CustomSerializer::Ptr getSerializer(); private: std::unordered_map _types; std::recursive_mutex _mutex; }; //------------------------------------------------------------------ //------------------------------------------------------------------ //------------------------------------------------------------------ template