Add methods to easily transfer properties from one point set to another

This commit is contained in:
Simon Giraudot 2018-08-14 12:21:43 +02:00
parent 237d7fcd30
commit f778e5e151
2 changed files with 86 additions and 13 deletions

View File

@ -238,15 +238,6 @@ public:
return *this;
}
/// \cond SKIP_IN_MANUAL
Point_set_3 (const Point_set_3& ps)
{
*this = ps;
}
/// \endcond
/// @}
/// \cond SKIP_IN_MANUAL
@ -476,6 +467,15 @@ public:
return out;
}
iterator insert (const Point_set_3& other, const Index& idx)
{
iterator out = insert();
Index new_idx = *out;
m_base.transfer(other.base(), idx, new_idx);
*out = new_idx; // Do not copy index from other point set
return out;
}
/// @}
/// \name Accessors and Iterators
@ -840,6 +840,16 @@ public:
return m_points;
}
/// \cond SKIP_IN_MANUAL
void copy_properties (const Point_set_3& other)
{
m_base.copy_properties (other.base());
m_normals = this->property_map<Vector> ("normal").first; // In case normal was added
}
/// \endcond
/*!
\brief Returns a vector with all strings that describe properties.
*/

View File

@ -70,6 +70,7 @@ public:
virtual void reset(size_t idx) = 0;
virtual bool transfer(const Base_property_array& other) = 0;
virtual bool transfer(const Base_property_array& other, std::size_t from, std::size_t to) = 0;
/// Let two elements swap their storage place.
virtual void swap(size_t i0, size_t i1) = 0;
@ -77,12 +78,19 @@ public:
/// Return a deep copy of self.
virtual Base_property_array* clone () const = 0;
/// Return a empty copy of self.
virtual Base_property_array* empty_clone () const = 0;
/// Return the type_info of the property
virtual const std::type_info& type() = 0;
virtual const std::type_info& type() const = 0;
/// Return the name of the property
const std::string& name() const { return name_; }
bool is_same (const Base_property_array& other)
{
return (name() == other.name() && type() == other.type());
}
protected:
@ -142,6 +150,18 @@ public: // virtual interface of Base_property_array
return false;
}
bool transfer(const Base_property_array& other, std::size_t from, std::size_t to)
{
const Property_array<T>* pa = dynamic_cast<const Property_array*>(&other);
if (pa != NULL)
{
data_[to] = (*pa)[from];
return true;
}
return false;
}
virtual void shrink_to_fit()
{
vector_type(data_).swap(data_);
@ -161,7 +181,13 @@ public: // virtual interface of Base_property_array
return p;
}
virtual const std::type_info& type() { return typeid(T); }
virtual Base_property_array* empty_clone() const
{
Property_array<T>* p = new Property_array<T>(this->name_, this->value_);
return p;
}
virtual const std::type_info& type() const { return typeid(T); }
public:
@ -241,11 +267,11 @@ public:
return *this;
}
void transfer(const Property_container& _rhs)
bool transfer(const Property_container& _rhs)
{
for(std::size_t i=0; i<parrays_.size(); ++i){
for (std::size_t j=0; j<_rhs.parrays_.size(); ++j){
if(parrays_[i]->name() == _rhs.parrays_[j]->name()){
if(parrays_[i]->is_same (*(_rhs.parrays_[j]))){
parrays_[i]->transfer(* _rhs.parrays_[j]);
break;
}
@ -253,6 +279,38 @@ public:
}
}
// Copy properties that don't already exist from another container
void copy_properties (const Property_container& _rhs)
{
for (std::size_t i = 0; i < _rhs.parrays_.size(); ++ i)
{
bool property_already_exists = false;
for (std::size_t j = 0; j < parrays_.size(); ++ j)
if (_rhs.parrays_[i]->is_same (*(parrays_[j])))
{
property_already_exists = true;
break;
}
if (property_already_exists)
continue;
parrays_.push_back (_rhs.parrays_[i]->empty_clone());
parrays_.back()->resize(size_);
}
}
// Transfer one element with all properties
// WARNING: properties must be the same in the two containers
bool transfer(const Property_container& _rhs, std::size_t from, std::size_t to)
{
bool out = true;
for(std::size_t i=0; i<parrays_.size(); ++i)
if (!(parrays_[i]->transfer(* _rhs.parrays_[i], from, to)))
out = false;
return out;
}
// returns the current size of the property arrays
size_t size() const { return size_; }
@ -529,6 +587,11 @@ public:
return parray_->transfer(*(other.parray_));
}
bool transfer (const Property_map_base& other, std::size_t from, std::size_t to)
{
return parray_->transfer(*(other.parray_), from, to);
}
/// Allows access to the underlying storage of the property. This
/// is useful when the key associated with the properties is
/// unimportant and only the properties are of interest