mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
PR-URL: https://github.com/nodejs/node/pull/48735 Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
133 lines
3.8 KiB
C++
133 lines
3.8 KiB
C++
#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_
|