%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/src/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/src/blob_serializer_deserializer.h |
#ifndef SRC_BLOB_SERIALIZER_DESERIALIZER_H_ #define SRC_BLOB_SERIALIZER_DESERIALIZER_H_ #include <string> #include <vector> #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS // This is related to the blob that is used in snapshots and single executable // applications and has nothing to do with `node_blob.h`. namespace node { class BlobSerializerDeserializer { public: explicit BlobSerializerDeserializer(bool is_debug_v) : is_debug(is_debug_v) {} template <typename... Args> void Debug(const char* format, Args&&... args) const; template <typename T> std::string ToStr(const T& arg) const; template <typename T> std::string GetName() const; bool is_debug = false; }; enum class StringLogMode { kAddressOnly, // Can be used when the string contains binary content. kAddressAndContent, }; // Child classes are expected to implement T Read<T>() where // !std::is_arithmetic_v<T> && !std::is_same_v<T, std::string> template <typename Impl> class BlobDeserializer : public BlobSerializerDeserializer { public: explicit BlobDeserializer(bool is_debug_v, std::string_view s) : BlobSerializerDeserializer(is_debug_v), sink(s) {} ~BlobDeserializer() = default; size_t read_total = 0; std::string_view sink; Impl* impl() { return static_cast<Impl*>(this); } const Impl* impl() const { return static_cast<const Impl*>(this); } // Helper for reading numeric types. template <typename T> T ReadArithmetic(); // Layout of vectors: // [ 4/8 bytes ] count // [ ... ] contents (count * size of individual elements) template <typename T> std::vector<T> ReadVector(); // ReadString() creates a copy of the data. ReadStringView() doesn't. std::string ReadString(); std::string_view ReadStringView(StringLogMode mode); // Helper for reading an array of numeric types. template <typename T> void ReadArithmetic(T* out, size_t count); // Helper for reading numeric vectors. template <typename Number> std::vector<Number> ReadArithmeticVector(size_t count); private: // Helper for reading non-numeric vectors. template <typename T> std::vector<T> ReadNonArithmeticVector(size_t count); template <typename T> T ReadElement(); }; // Child classes are expected to implement size_t Write<T>(const T&) where // !std::is_arithmetic_v<T> && !std::is_same_v<T, std::string> template <typename Impl> class BlobSerializer : public BlobSerializerDeserializer { public: explicit BlobSerializer(bool is_debug_v) : BlobSerializerDeserializer(is_debug_v) {} ~BlobSerializer() = default; Impl* impl() { return static_cast<Impl*>(this); } const Impl* impl() const { return static_cast<const Impl*>(this); } std::vector<char> sink; // Helper for writing numeric types. template <typename T> size_t WriteArithmetic(const T& data); // Layout of vectors: // [ 4/8 bytes ] count // [ ... ] contents (count * size of individual elements) template <typename T> size_t WriteVector(const std::vector<T>& data); // The layout of a written string: // [ 4/8 bytes ] length // [ |length| bytes ] contents size_t WriteStringView(std::string_view data, StringLogMode mode); size_t WriteString(const std::string& data); // Helper for writing an array of numeric types. template <typename T> size_t WriteArithmetic(const T* data, size_t count); // Helper for writing numeric vectors. template <typename Number> size_t WriteArithmeticVector(const std::vector<Number>& data); private: // Helper for writing non-numeric vectors. template <typename T> size_t WriteNonArithmeticVector(const std::vector<T>& data); template <typename T> size_t WriteElement(const T& data); }; } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #endif // SRC_BLOB_SERIALIZER_DESERIALIZER_H_