From 838e29f4823d6ffb41eaa905880f39a17d5d4b17 Mon Sep 17 00:00:00 2001 From: miloyip Date: Thu, 7 May 2015 10:26:13 +0800 Subject: [PATCH] Remove polymorphism in schema --- include/rapidjson/schema.h | 82 +++++++++++++------------------------- 1 file changed, 28 insertions(+), 54 deletions(-) diff --git a/include/rapidjson/schema.h b/include/rapidjson/schema.h index 5b78f19..c5fe93b 100644 --- a/include/rapidjson/schema.h +++ b/include/rapidjson/schema.h @@ -54,34 +54,8 @@ enum SchemaType { template class BaseSchema; -template -class ISchemaValidator { -public: - typedef typename Encoding::Ch Ch; - - virtual ~ISchemaValidator() {}; - virtual bool IsValid() = 0; - virtual bool Null() = 0; - virtual bool Bool(bool) = 0; - virtual bool Int(int) = 0; - virtual bool Uint(unsigned) = 0; - virtual bool Int64(int64_t) = 0; - virtual bool Uint64(uint64_t) = 0; - virtual bool Double(double) = 0; - virtual bool String(const Ch*, SizeType, bool) = 0; - virtual bool StartObject() = 0; - virtual bool Key(const Ch*, SizeType, bool) = 0; - virtual bool EndObject(SizeType) = 0; - virtual bool StartArray() = 0; - virtual bool EndArray(SizeType) = 0; -}; - -template -class ISchemaValidatorFactory { -public: - virtual ~ISchemaValidatorFactory() {} - virtual ISchemaValidator* CreateSchemaValidator(const BaseSchema& root) = 0; -}; +template +class GenericSchemaValidator; template struct SchemaValidatorArray { @@ -94,7 +68,7 @@ struct SchemaValidatorArray { } } - ISchemaValidator** validators; + GenericSchemaValidator, CrtAllocator>** validators; SizeType count; }; @@ -115,8 +89,8 @@ struct BaseSchemaArray { template struct SchemaValidationContext { - SchemaValidationContext(ISchemaValidatorFactory* factory, const BaseSchema* s) : - schemaValidatorFactory(factory), schema(s), valueSchema(), multiTypeSchema(), notValidator(), objectDependencies(), inArray(false) + SchemaValidationContext(/*ISchemaValidatorFactory* factory, */const BaseSchema* s) : + /*schemaValidatorFactory(factory), */schema(s), valueSchema(), multiTypeSchema(), notValidator(), objectDependencies(), inArray(false) { } @@ -125,14 +99,14 @@ struct SchemaValidationContext { delete[] objectDependencies; } - ISchemaValidatorFactory* schemaValidatorFactory; + //ISchemaValidatorFactory* schemaValidatorFactory; const BaseSchema* schema; const BaseSchema* valueSchema; const BaseSchema* multiTypeSchema; SchemaValidatorArray allOfValidators; SchemaValidatorArray anyOfValidators; SchemaValidatorArray oneOfValidators; - ISchemaValidator* notValidator; + GenericSchemaValidator, CrtAllocator>* notValidator; SizeType objectRequiredCount; SizeType arrayElementIndex; bool* objectDependencies; @@ -781,15 +755,15 @@ protected: if (anyOf_.schemas) CreateSchemaValidators(context, context.anyOfValidators, anyOf_); if (oneOf_.schemas) CreateSchemaValidators(context, context.oneOfValidators, oneOf_); if (not_ && !context.notValidator) - context.notValidator = context.schemaValidatorFactory->CreateSchemaValidator(*not_); + context.notValidator = new GenericSchemaValidator(*not_);//context.schemaValidatorFactory->CreateSchemaValidator(*not_); } void CreateSchemaValidators(Context& context, SchemaValidatorArray& validators, const BaseSchemaArray& schemas) const { if (!validators.validators) { - validators.validators = new ISchemaValidator*[schemas.count]; + validators.validators = new GenericSchemaValidator*[schemas.count]; validators.count = schemas.count; for (SizeType i = 0; i < schemas.count; i++) - validators.validators[i] = context.schemaValidatorFactory->CreateSchemaValidator(*schemas.schemas[i]); + validators.validators[i] = new GenericSchemaValidator(*schemas.schemas[i]); } } @@ -919,10 +893,11 @@ private: typedef GenericSchema > Schema; template , typename Allocator = CrtAllocator > -class GenericSchemaValidator : public ISchemaValidator, public ISchemaValidatorFactory { +class GenericSchemaValidator { public: typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. typedef GenericSchema SchemaT; + friend class BaseSchema; GenericSchemaValidator( const SchemaT& schema, @@ -964,8 +939,7 @@ public: valid_ = true; }; - // Implementation of ISchemaValidator - virtual bool IsValid() { return valid_; } + bool IsValid() { return valid_; } #define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ if (!valid_) return false; \ @@ -994,43 +968,43 @@ public: RAPIDJSON_SCHEMA_HANDLE_LOGIC_(method, arg2);\ RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) - virtual bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext() ), ( )); } - virtual bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } - virtual bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } - virtual bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } - virtual bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } - virtual bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } - virtual bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } - virtual bool String(const Ch* str, SizeType length, bool copy) + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext() ), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool String(const Ch* str, SizeType length, bool copy) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } - virtual bool StartObject() { + bool StartObject() { RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); RAPIDJSON_SCHEMA_HANDLE_LOGIC_(StartObject, ()); return valid_ = outputHandler_.StartObject(); } - virtual bool Key(const Ch* str, SizeType len, bool copy) { + bool Key(const Ch* str, SizeType len, bool copy) { if (!valid_) return false; if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; RAPIDJSON_SCHEMA_HANDLE_LOGIC_(Key, (str, len, copy)); return valid_ = outputHandler_.Key(str, len, copy); } - virtual bool EndObject(SizeType memberCount) { + bool EndObject(SizeType memberCount) { if (!valid_) return false; if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; RAPIDJSON_SCHEMA_HANDLE_LOGIC_(EndObject, (memberCount)); RAPIDJSON_SCHEMA_HANDLE_END_ (EndObject, (memberCount)); } - virtual bool StartArray() { + bool StartArray() { RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); RAPIDJSON_SCHEMA_HANDLE_LOGIC_(StartArray, ()); return valid_ = outputHandler_.StartArray(); } - virtual bool EndArray(SizeType elementCount) { + bool EndArray(SizeType elementCount) { if (!valid_) return false; if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; RAPIDJSON_SCHEMA_HANDLE_LOGIC_(EndArray, (elementCount)); @@ -1042,7 +1016,7 @@ public: #undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ // Implementation of ISchemaValidatorFactory - virtual ISchemaValidator* CreateSchemaValidator(const BaseSchema& root) { + GenericSchemaValidator* CreateSchemaValidator(const BaseSchema& root) { return new GenericSchemaValidator(root); } @@ -1088,7 +1062,7 @@ private: return true; } - void PushSchema(const BaseSchemaType& schema) { *schemaStack_.template Push() = Context(this, &schema); } + void PushSchema(const BaseSchemaType& schema) { *schemaStack_.template Push() = Context(&schema); } void PopSchema() { schemaStack_.template Pop(1)->~Context(); } const BaseSchemaType& CurrentSchema() { return *schemaStack_.template Top()->schema; } Context& CurrentContext() { return *schemaStack_.template Top(); }