fixes to EEC: avoid duplicated clones, fix a possible memory leak

chained_path_from now chain if called with no second parameter
This commit is contained in:
supermerill 2020-07-31 04:34:01 +02:00
parent 2c33dc9cc8
commit 4359c2a4f8
2 changed files with 12 additions and 16 deletions

View File

@ -26,10 +26,9 @@ ExtrusionEntityCollection::ExtrusionEntityCollection(const ExtrusionPaths &paths
ExtrusionEntityCollection& ExtrusionEntityCollection::operator= (const ExtrusionEntityCollection &other)
{
this->entities = other.entities;
for (size_t i = 0; i < this->entities.size(); ++i)
this->entities[i] = this->entities[i]->clone();
this->no_sort = other.no_sort;
this->no_sort = other.no_sort;
clear();
this->append(other.entities);
return *this;
}
@ -56,14 +55,6 @@ ExtrusionEntityCollection::operator ExtrusionPaths() const
return paths;
}
ExtrusionEntityCollection* ExtrusionEntityCollection::clone() const
{
ExtrusionEntityCollection* coll = new ExtrusionEntityCollection(*this);
for (size_t i = 0; i < coll->entities.size(); ++i)
coll->entities[i] = this->entities[i]->clone();
return coll;
}
void ExtrusionEntityCollection::reverse()
{
for (ExtrusionEntity *ptr : this->entities)
@ -118,7 +109,7 @@ ExtrusionEntityCollection ExtrusionEntityCollection::chained_path_from(const Ext
ExtrusionEntityCollection out;
out.entities = filter_by_extrusion_role(extrusion_entities, role);
// Clone the extrusion entities.
for (auto &ptr : out.entities)
for (ExtrusionEntity* &ptr : out.entities)
ptr = ptr->clone();
chain_and_reorder_extrusion_entities(out.entities, &start_near);
return out;

View File

@ -24,7 +24,7 @@ inline ExtrusionEntitiesPtr filter_by_extrusion_role(const ExtrusionEntitiesPtr
class ExtrusionEntityCollection : public ExtrusionEntity
{
public:
virtual ExtrusionEntityCollection* clone() const override;
virtual ExtrusionEntityCollection* clone() const override { return new ExtrusionEntityCollection(*this); }
// Create a new object, initialize it with this object using the move semantics.
virtual ExtrusionEntityCollection* clone_move() override { return new ExtrusionEntityCollection(std::move(*this)); }
@ -86,8 +86,13 @@ public:
void replace(size_t i, const ExtrusionEntity &entity);
void remove(size_t i);
static ExtrusionEntityCollection chained_path_from(const ExtrusionEntitiesPtr &extrusion_entities, const Point &start_near, ExtrusionRole role = erMixed);
ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = erMixed) const
{ return (this->no_sort || (role == erMixed) )? *this : chained_path_from(this->entities, start_near, role); }
ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = erNone) const {
if (role == erNone) role = this->role();
if( this->no_sort || (role == erMixed) )
return *this;
else
return chained_path_from(this->entities, start_near, role);
}
void reverse() override;
const Point& first_point() const override { return this->entities.front()->first_point(); }
const Point& last_point() const override { return this->entities.back()->last_point(); }