Geometry Extension based on smart pointers

This commit is contained in:
Abdullah Tahiri
2019-01-14 17:05:44 +01:00
committed by wmayer
parent f977f47de3
commit aedfb6a6a3
2 changed files with 62 additions and 22 deletions

View File

@@ -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<Base::Type, GeometryExtension *>::iterator it = extensions.begin(); it != extensions.end(); it++)
delete it->second;
for(std::vector<std::shared_ptr<GeometryExtension>>::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() << "<GeoExtensions count=\"" << extensions.size() << "\">" << 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<GeometryExtension>(newE));
}
reader.readEndElement("GeoExtensions");
@@ -267,31 +269,54 @@ boost::uuids::uuid Geometry::getTag() const
return tag;
}
std::map<Base::Type, GeometryExtension *> & Geometry::getExtensions()
const std::vector<std::weak_ptr<GeometryExtension>> Geometry::getExtensions() const
{
return this->extensions;
}
std::vector<std::weak_ptr<GeometryExtension>> wp;
void Geometry::setExtensions(std::map<Base::Type, GeometryExtension *> exts)
{
this->extensions=exts;
wp.reserve(extensions.size());
for(size_t i=0; i<extensions.size(); i++)
wp[i]=extensions[i];
return wp;
}
bool Geometry::hasExtension(Base::Type type) const
{
return this->extensions.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<GeometryExtension> 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<GeometryExtension> 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;
}