From 1e4a3818ed1b483d1e5b58d7622e39d46dbbaad2 Mon Sep 17 00:00:00 2001 From: miloyip Date: Sat, 9 May 2015 09:19:22 +0800 Subject: [PATCH] Centralise schema ownership to SchemaDocument --- include/rapidjson/schema.h | 44 ++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/include/rapidjson/schema.h b/include/rapidjson/schema.h index 28bd18c..5b56b45 100644 --- a/include/rapidjson/schema.h +++ b/include/rapidjson/schema.h @@ -91,8 +91,6 @@ template struct SchemaArray { SchemaArray() : schemas(), count() {} ~SchemaArray() { - for (SizeType i = 0; i < count; i++) - delete schemas[i]; delete[] schemas; } @@ -376,14 +374,8 @@ public: } ~Schema() { - delete not_; delete [] properties_; - delete additionalPropertiesSchema_; delete [] patternProperties_; - delete additionalItemsSchema_; - delete itemsList_; - for (SizeType i = 0; i < itemsTupleCount_; i++) - delete itemsTuple_[i]; delete [] itemsTuple_; #if RAPIDJSON_SCHEMA_USE_STDREGEX delete pattern_; @@ -803,12 +795,7 @@ private: struct Property { Property() : schema(), dependenciesSchema(), dependencies(), required(false), typeless(true) {} - ~Property() { - delete schema; - delete dependenciesSchema; - delete[] dependencies; - } - + ~Property() { delete[] dependencies; } GenericValue name; const SchemaType* schema; const SchemaType* dependenciesSchema; @@ -819,11 +806,7 @@ private: struct PatternProperty { PatternProperty() : schema(), pattern() {} - ~PatternProperty() { - delete schema; - delete pattern; - } - + ~PatternProperty() { delete pattern; } SchemaType* schema; RegexType* pattern; }; @@ -875,17 +858,25 @@ public: friend class Schema; template - GenericSchemaDocument(const DocumentType& document, Allocator* allocator = 0) : root_(), schemaMap(allocator, kInitialSchemaMapSize) { + GenericSchemaDocument(const DocumentType& document, Allocator* allocator = 0) : root_(), schemas_(), schemaCount_(), schemaMap_(allocator, kInitialSchemaMapSize) { typedef typename DocumentType::ValueType ValueType; root_ = CreateSchema(GenericPointer(), static_cast(document)); - while (!schemaMap.Empty()) - schemaMap.template Pop > (1)->~SchemaEntry(); + // Copy to schemas and destroy the map + schemas_ = new SchemaType*[schemaCount_]; + size_t i = schemaCount_; + while (!schemaMap_.Empty()) { + SchemaEntry* e = schemaMap_.template Pop > (1); + schemas_[--i] = e->schema; + e->~SchemaEntry(); + } } ~GenericSchemaDocument() { - delete root_; + for (size_t i = 0; i < schemaCount_; i++) + delete schemas_[i]; + delete [] schemas_; } const SchemaType& GetRoot() const { return *root_; } @@ -901,14 +892,17 @@ private: template SchemaType* CreateSchema(const GenericPointer& pointer, const ValueType& v) { SchemaType* schema = new SchemaType(this, pointer, v); - new (schemaMap.template Push >()) SchemaEntry(pointer, schema); + new (schemaMap_.template Push >()) SchemaEntry(pointer, schema); + schemaCount_++; return schema; } static const size_t kInitialSchemaMapSize = 1024; SchemaType* root_; - internal::Stack schemaMap; // Stores SchemaEntry + SchemaType** schemas_; + size_t schemaCount_; + internal::Stack schemaMap_; // Stores SchemaEntry }; typedef GenericSchemaDocument > SchemaDocument;