diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 05f45360b7..30a1231a03 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -185,11 +185,13 @@ const char* gce_ErrorStatusText(gce_ErrorType et) // --------------------------------------------------------------- TYPESYSTEM_SOURCE_ABSTRACT(Part::GeometryExtension,Base::Persistence) +GeometryExtension::GeometryExtension() +{ +} GeometryExtension::~GeometryExtension() { } - // --------------------------------------------------------------- TYPESYSTEM_SOURCE_ABSTRACT(Part::Geometry,Base::Persistence) @@ -202,8 +204,8 @@ Geometry::Geometry() Geometry::~Geometry() { - for(std::map::iterator it = extensions.begin(); it != extensions.end(); it++) - delete it->second; + for(std::vector>::iterator it = extensions.begin(); it != extensions.end(); it++) + (*it).reset(); } // Persistence implementer @@ -221,7 +223,7 @@ void Geometry::Save(Base::Writer &writer) const writer.Stream() << writer.ind() << "" << endl; for(auto att:extensions) { - att.second->Save(writer); + att->Save(writer); } writer.decInd(); @@ -247,7 +249,7 @@ void Geometry::Restore(Base::XMLReader &reader) GeometryExtension *newE = (GeometryExtension *)type.createInstance(); newE->Restore(reader); - extensions[type] = newE; + extensions.push_back(std::shared_ptr(newE)); } reader.readEndElement("GeoExtensions"); @@ -267,31 +269,54 @@ boost::uuids::uuid Geometry::getTag() const return tag; } -std::map & Geometry::getExtensions() +const std::vector> Geometry::getExtensions() const { - return this->extensions; -} + std::vector> wp; -void Geometry::setExtensions(std::map exts) -{ - this->extensions=exts; + wp.reserve(extensions.size()); + + for(size_t i=0; iextensions.find(type) != extensions.end(); + for( auto ext : extensions) { + if(ext->getTypeId() == type) + return true; + } + + return false; } -GeometryExtension * Geometry::getExtension(Base::Type type) +const std::weak_ptr Geometry::getExtension(Base::Type type) const { - return this->extensions[type]; + for( auto ext : extensions) { + if(ext->getTypeId() == type) + return ext; + } + + throw Base::ValueError("No geometry extension of the requested type."); } -void Geometry::setExtension(GeometryExtension *geo) +void Geometry::setExtension(std::unique_ptr geo) { - this->extensions[geo->getTypeId()]=geo; + bool hasext=false; + + for( auto ext : extensions) { + if(ext->getTypeId() == geo->getTypeId()){ + ext = std::move(geo); + hasext = true; + } + } + + if(!hasext) + extensions.push_back(std::move(geo)); } + void Geometry::createNewTag() { // Initialize a random number generator, to avoid Valgrind false positives. @@ -319,7 +344,10 @@ Geometry *Geometry::clone(void) const { Geometry* cpy = this->copy(); cpy->tag = this->tag; - cpy->extensions = this->extensions; + + for(auto & ext: extensions) + cpy->extensions.push_back(std::move(ext->copy())); + return cpy; } diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h index f64e2cf5c7..58e79d0ef0 100644 --- a/src/Mod/Part/App/Geometry.h +++ b/src/Mod/Part/App/Geometry.h @@ -63,6 +63,15 @@ #include #include +namespace std { +template +std::unique_ptr make_unique(Args&&... args) +{ + return std::unique_ptr(new T(std::forward(args)...)); +} +} + + namespace Part { class PartExport GeometryExtension: public Base::Persistence @@ -76,7 +85,11 @@ public: virtual void Save(Base::Writer &/*writer*/) const = 0; virtual void Restore(Base::XMLReader &/*reader*/) = 0; + virtual std::unique_ptr copy(void) const = 0; + virtual PyObject *getPyObject(void) = 0; +protected: + GeometryExtension(); }; class PartExport Geometry: public Base::Persistence @@ -109,12 +122,11 @@ public: /// returns the tag of the geometry object boost::uuids::uuid getTag() const; - std::map &getExtensions(); - void setExtensions(std::map exts); + const std::vector> getExtensions() const; bool hasExtension(Base::Type type) const; - GeometryExtension * getExtension(Base::Type type); - void setExtension(GeometryExtension *geo); + const std::weak_ptr getExtension(Base::Type type) const; + void setExtension(std::unique_ptr geo); protected: /// create a new tag for the geometry object @@ -127,7 +139,7 @@ protected: protected: boost::uuids::uuid tag; - std::map extensions; + std::vector> extensions; private: Geometry(const Geometry&);