Add a parameter (number of __VA_ARGS__) to REFLECT_MEMBER_START

rapidjson StartArray StartObject do not need the number of fields, but msgpack-c does.
This commit is contained in:
Fangrui Song 2018-01-06 16:22:46 -08:00
parent d22f994d8a
commit fe0313f0b5
10 changed files with 61 additions and 56 deletions

View File

@ -43,7 +43,7 @@ struct RealCacheManager : ICacheManager {
return ReadContent(GetCachePath(path)); return ReadContent(GetCachePath(path));
} }
std::unique_ptr<IndexFile> RawCacheLoad(const std::string& path) { std::unique_ptr<IndexFile> RawCacheLoad(const std::string& path) override {
if (!config_->enableCacheRead) if (!config_->enableCacheRead)
return nullptr; return nullptr;
@ -102,7 +102,7 @@ struct FakeCacheManager : ICacheManager {
return nullopt; return nullopt;
} }
std::unique_ptr<IndexFile> RawCacheLoad(const std::string& path) { std::unique_ptr<IndexFile> RawCacheLoad(const std::string& path) override {
for (const FakeCacheEntry& entry : entries_) { for (const FakeCacheEntry& entry : entries_) {
if (entry.path == path) { if (entry.path == path) {
return Deserialize(SerializeFormat::Json, path, entry.json, nullopt); return Deserialize(SerializeFormat::Json, path, entry.json, nullopt);

View File

@ -64,7 +64,6 @@ bool operator!=(const Id<T>& a, const Id<T>& b) {
template <typename T> template <typename T>
void Reflect(Reader& visitor, Id<T>& id) { void Reflect(Reader& visitor, Id<T>& id) {
if (visitor.IsUint64())
id.id = visitor.GetUint64(); id.id = visitor.GetUint64();
} }
template <typename T> template <typename T>
@ -239,7 +238,7 @@ template <typename TVisitor,
typename Range> typename Range>
void Reflect(TVisitor& visitor, void Reflect(TVisitor& visitor,
TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& value) { TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(12);
REFLECT_MEMBER(short_name); REFLECT_MEMBER(short_name);
REFLECT_MEMBER(detailed_name); REFLECT_MEMBER(detailed_name);
REFLECT_MEMBER(kind); REFLECT_MEMBER(kind);
@ -338,7 +337,7 @@ template <typename TVisitor,
void Reflect( void Reflect(
TVisitor& visitor, TVisitor& visitor,
FuncDefDefinitionData<TypeId, FuncId, VarId, FuncRef, Range>& value) { FuncDefDefinitionData<TypeId, FuncId, VarId, FuncRef, Range>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(12);
REFLECT_MEMBER(short_name); REFLECT_MEMBER(short_name);
REFLECT_MEMBER(detailed_name); REFLECT_MEMBER(detailed_name);
REFLECT_MEMBER(kind); REFLECT_MEMBER(kind);
@ -452,7 +451,7 @@ template <typename TVisitor,
typename Range> typename Range>
void Reflect(TVisitor& visitor, void Reflect(TVisitor& visitor,
VarDefDefinitionData<TypeId, FuncId, VarId, Range>& value) { VarDefDefinitionData<TypeId, FuncId, VarId, Range>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(9);
REFLECT_MEMBER(short_name); REFLECT_MEMBER(short_name);
REFLECT_MEMBER(detailed_name); REFLECT_MEMBER(detailed_name);
REFLECT_MEMBER(kind); REFLECT_MEMBER(kind);

View File

@ -194,7 +194,7 @@ void lsResponseError::Write(Writer& visitor) {
auto& value = *this; auto& value = *this;
int code2 = static_cast<int>(this->code); int code2 = static_cast<int>(this->code);
visitor.StartObject(); visitor.StartObject(2 + !!data);
REFLECT_MEMBER2("code", code2); REFLECT_MEMBER2("code", code2);
REFLECT_MEMBER(message); REFLECT_MEMBER(message);
if (data) { if (data) {

View File

@ -226,7 +226,7 @@ struct lsCommand {
}; };
template <typename TVisitor, typename T> template <typename TVisitor, typename T>
void Reflect(TVisitor& visitor, lsCommand<T>& value) { void Reflect(TVisitor& visitor, lsCommand<T>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(3);
REFLECT_MEMBER(title); REFLECT_MEMBER(title);
REFLECT_MEMBER(command); REFLECT_MEMBER(command);
REFLECT_MEMBER(arguments); REFLECT_MEMBER(arguments);
@ -245,7 +245,7 @@ struct lsCodeLens {
}; };
template <typename TVisitor, typename TData, typename TCommandArguments> template <typename TVisitor, typename TData, typename TCommandArguments>
void Reflect(TVisitor& visitor, lsCodeLens<TData, TCommandArguments>& value) { void Reflect(TVisitor& visitor, lsCodeLens<TData, TCommandArguments>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(3);
REFLECT_MEMBER(range); REFLECT_MEMBER(range);
REFLECT_MEMBER(command); REFLECT_MEMBER(command);
REFLECT_MEMBER(data); REFLECT_MEMBER(data);
@ -979,7 +979,7 @@ struct Out_TextDocumentPublishDiagnostics
template <typename TVisitor> template <typename TVisitor>
void Reflect(TVisitor& visitor, Out_TextDocumentPublishDiagnostics& value) { void Reflect(TVisitor& visitor, Out_TextDocumentPublishDiagnostics& value) {
std::string method = "textDocument/publishDiagnostics"; std::string method = "textDocument/publishDiagnostics";
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(3);
REFLECT_MEMBER(jsonrpc); REFLECT_MEMBER(jsonrpc);
REFLECT_MEMBER2("method", method); REFLECT_MEMBER2("method", method);
REFLECT_MEMBER(params); REFLECT_MEMBER(params);
@ -1044,7 +1044,7 @@ struct Out_ShowLogMessage : public lsOutMessage<Out_ShowLogMessage> {
}; };
template <typename TVisitor> template <typename TVisitor>
void Reflect(TVisitor& visitor, Out_ShowLogMessage& value) { void Reflect(TVisitor& visitor, Out_ShowLogMessage& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(3);
REFLECT_MEMBER(jsonrpc); REFLECT_MEMBER(jsonrpc);
std::string method = value.method(); std::string method = value.method();
REFLECT_MEMBER2("method", method); REFLECT_MEMBER2("method", method);

View File

@ -18,7 +18,7 @@ struct lsCodeLensCommandArguments {
std::vector<lsLocation> locations; std::vector<lsLocation> locations;
}; };
void Reflect(Writer& visitor, lsCodeLensCommandArguments& value) { void Reflect(Writer& visitor, lsCodeLensCommandArguments& value) {
visitor.StartArray(); visitor.StartArray(3);
Reflect(visitor, value.uri); Reflect(visitor, value.uri);
Reflect(visitor, value.position); Reflect(visitor, value.position);
Reflect(visitor, value.locations); Reflect(visitor, value.locations);

View File

@ -58,7 +58,7 @@ struct Out_TextDocumentHover : public lsOutMessage<Out_TextDocumentHover> {
}; };
MAKE_REFLECT_STRUCT(Out_TextDocumentHover::Result, contents, range); MAKE_REFLECT_STRUCT(Out_TextDocumentHover::Result, contents, range);
void Reflect(Writer& visitor, Out_TextDocumentHover& value) { void Reflect(Writer& visitor, Out_TextDocumentHover& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(3);
REFLECT_MEMBER(jsonrpc); REFLECT_MEMBER(jsonrpc);
REFLECT_MEMBER(id); REFLECT_MEMBER(id);
if (value.result) if (value.result)

View File

@ -161,7 +161,7 @@ struct MergeableUpdate {
}; };
template <typename TVisitor, typename TId, typename TValue> template <typename TVisitor, typename TId, typename TValue>
void Reflect(TVisitor& visitor, MergeableUpdate<TId, TValue>& value) { void Reflect(TVisitor& visitor, MergeableUpdate<TId, TValue>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(3);
REFLECT_MEMBER(id); REFLECT_MEMBER(id);
REFLECT_MEMBER(to_add); REFLECT_MEMBER(to_add);
REFLECT_MEMBER(to_remove); REFLECT_MEMBER(to_remove);
@ -177,7 +177,7 @@ struct WithUsr {
}; };
template <typename TVisitor, typename T> template <typename TVisitor, typename T>
void Reflect(TVisitor& visitor, WithUsr<T>& value) { void Reflect(TVisitor& visitor, WithUsr<T>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(2);
REFLECT_MEMBER(usr); REFLECT_MEMBER(usr);
REFLECT_MEMBER(value); REFLECT_MEMBER(value);
REFLECT_MEMBER_END(); REFLECT_MEMBER_END();

View File

@ -2,7 +2,7 @@
// TODO Move Json* to serializers/json.cc // TODO Move Json* to serializers/json.cc
#include "serializers/json.h" #include "serializers/json.h"
//#include "serializers/msgpack.h" #include "serializers/msgpack.h"
#include "indexer.h" #include "indexer.h"
@ -31,7 +31,6 @@ void Reflect(Writer& visitor, int16_t& value) {
// int32_t // int32_t
void Reflect(Reader& visitor, int32_t& value) { void Reflect(Reader& visitor, int32_t& value) {
if (visitor.IsInt())
value = visitor.GetInt(); value = visitor.GetInt();
} }
void Reflect(Writer& visitor, int32_t& value) { void Reflect(Writer& visitor, int32_t& value) {
@ -40,7 +39,6 @@ void Reflect(Writer& visitor, int32_t& value) {
// int64_t // int64_t
void Reflect(Reader& visitor, int64_t& value) { void Reflect(Reader& visitor, int64_t& value) {
if (visitor.IsInt64())
value = visitor.GetInt64(); value = visitor.GetInt64();
} }
void Reflect(Writer& visitor, int64_t& value) { void Reflect(Writer& visitor, int64_t& value) {
@ -49,7 +47,6 @@ void Reflect(Writer& visitor, int64_t& value) {
// uint64_t // uint64_t
void Reflect(Reader& visitor, uint64_t& value) { void Reflect(Reader& visitor, uint64_t& value) {
if (visitor.IsUint64())
value = visitor.GetUint64(); value = visitor.GetUint64();
} }
void Reflect(Writer& visitor, uint64_t& value) { void Reflect(Writer& visitor, uint64_t& value) {
@ -58,7 +55,6 @@ void Reflect(Writer& visitor, uint64_t& value) {
// bool // bool
void Reflect(Reader& visitor, bool& value) { void Reflect(Reader& visitor, bool& value) {
if (visitor.IsBool())
value = visitor.GetBool(); value = visitor.GetBool();
} }
void Reflect(Writer& visitor, bool& value) { void Reflect(Writer& visitor, bool& value) {
@ -82,13 +78,13 @@ void ReflectMember(Writer& visitor, const char* name, std::string& value) {
// TODO: Move this to indexer.cc // TODO: Move this to indexer.cc
void Reflect(Reader& visitor, IndexInclude& value) { void Reflect(Reader& visitor, IndexInclude& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(2);
REFLECT_MEMBER(line); REFLECT_MEMBER(line);
REFLECT_MEMBER(resolved_path); REFLECT_MEMBER(resolved_path);
REFLECT_MEMBER_END(); REFLECT_MEMBER_END();
} }
void Reflect(Writer& visitor, IndexInclude& value) { void Reflect(Writer& visitor, IndexInclude& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(2);
REFLECT_MEMBER(line); REFLECT_MEMBER(line);
if (gTestOutputMode) { if (gTestOutputMode) {
std::string basename = GetBaseName(value.resolved_path); std::string basename = GetBaseName(value.resolved_path);
@ -103,7 +99,7 @@ void Reflect(Writer& visitor, IndexInclude& value) {
template <typename TVisitor> template <typename TVisitor>
void Reflect(TVisitor& visitor, IndexType& value) { void Reflect(TVisitor& visitor, IndexType& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(16);
REFLECT_MEMBER2("id", value.id); REFLECT_MEMBER2("id", value.id);
REFLECT_MEMBER2("usr", value.usr); REFLECT_MEMBER2("usr", value.usr);
REFLECT_MEMBER2("short_name", value.def.short_name); REFLECT_MEMBER2("short_name", value.def.short_name);
@ -125,7 +121,7 @@ void Reflect(TVisitor& visitor, IndexType& value) {
template <typename TVisitor> template <typename TVisitor>
void Reflect(TVisitor& visitor, IndexFunc& value) { void Reflect(TVisitor& visitor, IndexFunc& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(16);
REFLECT_MEMBER2("id", value.id); REFLECT_MEMBER2("id", value.id);
REFLECT_MEMBER2("is_operator", value.def.is_operator); REFLECT_MEMBER2("is_operator", value.def.is_operator);
REFLECT_MEMBER2("usr", value.usr); REFLECT_MEMBER2("usr", value.usr);
@ -147,7 +143,7 @@ void Reflect(TVisitor& visitor, IndexFunc& value) {
template <typename TVisitor> template <typename TVisitor>
void Reflect(TVisitor& visitor, IndexVar& value) { void Reflect(TVisitor& visitor, IndexVar& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(13);
REFLECT_MEMBER2("id", value.id); REFLECT_MEMBER2("id", value.id);
REFLECT_MEMBER2("usr", value.usr); REFLECT_MEMBER2("usr", value.usr);
REFLECT_MEMBER2("short_name", value.def.short_name); REFLECT_MEMBER2("short_name", value.def.short_name);
@ -165,7 +161,7 @@ void Reflect(TVisitor& visitor, IndexVar& value) {
} }
// IndexFile // IndexFile
bool ReflectMemberStart(Writer& visitor, IndexFile& value) { bool ReflectMemberStart(Writer& visitor, IndexFile& value, size_t n) {
auto it = value.id_cache.usr_to_type_id.find(""); auto it = value.id_cache.usr_to_type_id.find("");
if (it != value.id_cache.usr_to_type_id.end()) { if (it != value.id_cache.usr_to_type_id.end()) {
value.Resolve(it->second)->def.short_name = "<fundamental>"; value.Resolve(it->second)->def.short_name = "<fundamental>";
@ -173,12 +169,12 @@ bool ReflectMemberStart(Writer& visitor, IndexFile& value) {
} }
value.version = IndexFile::kCurrentVersion; value.version = IndexFile::kCurrentVersion;
DefaultReflectMemberStart(visitor); DefaultReflectMemberStart(visitor, n);
return true; return true;
} }
template <typename TVisitor> template <typename TVisitor>
void Reflect(TVisitor& visitor, IndexFile& value) { void Reflect(TVisitor& visitor, IndexFile& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START(5 + (gTestOutputMode ? 0 : 6));
if (!gTestOutputMode) { if (!gTestOutputMode) {
REFLECT_MEMBER(version); REFLECT_MEMBER(version);
REFLECT_MEMBER(last_modification_time); REFLECT_MEMBER(last_modification_time);

View File

@ -13,13 +13,14 @@ enum class SerializeFormat { Json, MessagePack };
class Reader { class Reader {
public: public:
virtual ~Reader() {} virtual ~Reader() {}
virtual SerializeFormat Format() const = 0;
virtual bool IsBool() = 0; //virtual bool IsBool() = 0;
virtual bool IsNull() = 0; virtual bool IsNull() = 0;
virtual bool IsArray() = 0; virtual bool IsArray() = 0;
virtual bool IsInt() = 0; virtual bool IsInt() = 0;
virtual bool IsInt64() = 0; //virtual bool IsInt64() = 0;
virtual bool IsUint64() = 0; //virtual bool IsUint64() = 0;
virtual bool IsString() = 0; virtual bool IsString() = 0;
virtual bool GetBool() = 0; virtual bool GetBool() = 0;
@ -38,6 +39,7 @@ class Reader {
class Writer { class Writer {
public: public:
virtual ~Writer() {} virtual ~Writer() {}
virtual SerializeFormat Format() const = 0;
virtual void Null() = 0; virtual void Null() = 0;
virtual void Bool(bool x) = 0; virtual void Bool(bool x) = 0;
@ -46,17 +48,17 @@ class Writer {
virtual void Uint64(uint64_t x) = 0; virtual void Uint64(uint64_t x) = 0;
virtual void String(const char* x) = 0; virtual void String(const char* x) = 0;
virtual void String(const char* x, size_t len) = 0; virtual void String(const char* x, size_t len) = 0;
virtual void StartArray() = 0; virtual void StartArray(size_t) = 0;
virtual void EndArray() = 0; virtual void EndArray() = 0;
virtual void StartObject() = 0; virtual void StartObject(size_t) = 0;
virtual void EndObject() = 0; virtual void EndObject() = 0;
virtual void Key(const char* name) = 0; virtual void Key(const char* name) = 0;
}; };
struct IndexFile; struct IndexFile;
#define REFLECT_MEMBER_START() \ #define REFLECT_MEMBER_START(n) \
if (!ReflectMemberStart(visitor, value)) \ if (!ReflectMemberStart(visitor, value, n)) \
return return
#define REFLECT_MEMBER_START1(value) \ #define REFLECT_MEMBER_START1(value) \
if (!ReflectMemberStart(visitor, value)) \ if (!ReflectMemberStart(visitor, value)) \
@ -74,19 +76,25 @@ struct IndexFile;
value = static_cast<type>(value0); \ value = static_cast<type>(value0); \
} }
// clang-format off
// Config has many fields, we need to support at least its number of fields.
#define NUM_VA_ARGS_IMPL(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,N,...) N
#define NUM_VA_ARGS(...) NUM_VA_ARGS_IMPL(__VA_ARGS__,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
// clang-format on
#define _MAPPABLE_REFLECT_MEMBER(name) REFLECT_MEMBER(name); #define _MAPPABLE_REFLECT_MEMBER(name) REFLECT_MEMBER(name);
#define MAKE_REFLECT_EMPTY_STRUCT(type, ...) \ #define MAKE_REFLECT_EMPTY_STRUCT(type, ...) \
template <typename TVisitor> \ template <typename TVisitor> \
void Reflect(TVisitor& visitor, type& value) { \ void Reflect(TVisitor& visitor, type& value) { \
REFLECT_MEMBER_START(); \ REFLECT_MEMBER_START(0); \
REFLECT_MEMBER_END(); \ REFLECT_MEMBER_END(); \
} }
#define MAKE_REFLECT_STRUCT(type, ...) \ #define MAKE_REFLECT_STRUCT(type, ...) \
template <typename TVisitor> \ template <typename TVisitor> \
void Reflect(TVisitor& visitor, type& value) { \ void Reflect(TVisitor& visitor, type& value) { \
REFLECT_MEMBER_START(); \ REFLECT_MEMBER_START(NUM_VA_ARGS(__VA_ARGS__)); \
MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \ MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
REFLECT_MEMBER_END(); \ REFLECT_MEMBER_END(); \
} }
@ -97,7 +105,7 @@ struct IndexFile;
// This currently only supports writers. // This currently only supports writers.
#define MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(type, ...) \ #define MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(type, ...) \
inline void Reflect(Writer& visitor, type& value) { \ inline void Reflect(Writer& visitor, type& value) { \
visitor.StartArray(); \ visitor.StartArray(NUM_VA_ARGS(__VA_ARGS__)); \
MACRO_MAP(_MAPPABLE_REFLECT_ARRAY, __VA_ARGS__) \ MACRO_MAP(_MAPPABLE_REFLECT_ARRAY, __VA_ARGS__) \
visitor.EndArray(); \ visitor.EndArray(); \
} }
@ -180,7 +188,7 @@ void Reflect(Reader& visitor, std::vector<T>& values) {
} }
template <typename T> template <typename T>
void Reflect(Writer& visitor, std::vector<T>& values) { void Reflect(Writer& visitor, std::vector<T>& values) {
visitor.StartArray(); visitor.StartArray(values.size());
for (auto& value : values) for (auto& value : values)
Reflect(visitor, value); Reflect(visitor, value);
visitor.EndArray(); visitor.EndArray();
@ -188,12 +196,12 @@ void Reflect(Writer& visitor, std::vector<T>& values) {
// Writer: // Writer:
inline void DefaultReflectMemberStart(Writer& visitor) { inline void DefaultReflectMemberStart(Writer& visitor, size_t n) {
visitor.StartObject(); visitor.StartObject(n);
} }
template <typename T> template <typename T>
bool ReflectMemberStart(Writer& visitor, T& value) { bool ReflectMemberStart(Writer& visitor, T& value, size_t n) {
visitor.StartObject(); visitor.StartObject(n);
return true; return true;
} }
template <typename T> template <typename T>
@ -208,7 +216,7 @@ void ReflectMember(Writer& visitor, const char* name, T& value) {
template <typename T> template <typename T>
void ReflectMember(Writer& visitor, const char* name, std::vector<T>& values) { void ReflectMember(Writer& visitor, const char* name, std::vector<T>& values) {
visitor.Key(name); visitor.Key(name);
visitor.StartArray(); visitor.StartArray(values.size());
for (auto& value : values) for (auto& value : values)
Reflect(visitor, value); Reflect(visitor, value);
visitor.EndArray(); visitor.EndArray();
@ -225,9 +233,9 @@ void ReflectMember(Writer& visitor, const char* name, std::string& value);
// Reader: // Reader:
inline void DefaultReflectMemberStart(Reader& visitor) {} inline void DefaultReflectMemberStart(Reader& visitor, size_t n) {}
template <typename T> template <typename T>
bool ReflectMemberStart(Reader& visitor, T& value) { bool ReflectMemberStart(Reader& visitor, T& value, size_t n) {
return true; return true;
} }
template <typename T> template <typename T>

View File

@ -10,13 +10,14 @@ class JsonReader : public Reader {
public: public:
JsonReader(rapidjson::GenericValue<rapidjson::UTF8<>>* m) : m_(m) {} JsonReader(rapidjson::GenericValue<rapidjson::UTF8<>>* m) : m_(m) {}
SerializeFormat Format() const override { return SerializeFormat::Json; }
bool IsBool() override { return m_->IsBool(); } //bool IsBool() override { return m_->IsBool(); }
bool IsNull() override { return m_->IsNull(); } bool IsNull() override { return m_->IsNull(); }
bool IsArray() override { return m_->IsArray(); } bool IsArray() override { return m_->IsArray(); }
bool IsInt() override { return m_->IsInt(); } bool IsInt() override { return m_->IsInt(); }
bool IsInt64() override { return m_->IsInt64(); } //bool IsInt64() override { return m_->IsInt64(); }
bool IsUint64() override { return m_->IsUint64(); } //bool IsUint64() override { return m_->IsUint64(); }
bool IsString() override { return m_->IsString(); } bool IsString() override { return m_->IsString(); }
bool GetBool() override { return m_->GetBool(); } bool GetBool() override { return m_->GetBool(); }
@ -52,6 +53,7 @@ class JsonWriter : public Writer {
public: public:
JsonWriter(rapidjson::Writer<rapidjson::StringBuffer>* m) : m_(m) {} JsonWriter(rapidjson::Writer<rapidjson::StringBuffer>* m) : m_(m) {}
SerializeFormat Format() const override { return SerializeFormat::Json; }
void Null() override { m_->Null(); } void Null() override { m_->Null(); }
void Bool(bool x) override { m_->Bool(x); } void Bool(bool x) override { m_->Bool(x); }
@ -60,9 +62,9 @@ class JsonWriter : public Writer {
void Uint64(uint64_t x) override { m_->Uint64(x); } void Uint64(uint64_t x) override { m_->Uint64(x); }
void String(const char* x) override { m_->String(x); } void String(const char* x) override { m_->String(x); }
void String(const char* x, size_t len) override { m_->String(x, len); } void String(const char* x, size_t len) override { m_->String(x, len); }
void StartArray() override { m_->StartArray(); } void StartArray(size_t) override { m_->StartArray(); }
void EndArray() override { m_->EndArray(); } void EndArray() override { m_->EndArray(); }
void StartObject() override { m_->StartObject(); } void StartObject(size_t) override { m_->StartObject(); }
void EndObject() override { m_->EndObject(); } void EndObject() override { m_->EndObject(); }
void Key(const char* name) override { m_->Key(name); } void Key(const char* name) override { m_->Key(name); }
}; };