📄 property.hh
字号:
reference operator[](int _idx) { assert( size_t(_idx) < data_.size() ); return data_[_idx]; } /// Const access to the i'th element. No range check is performed! const_reference operator[](int _idx) const { assert( size_t(_idx) < data_.size()); return data_[_idx]; } /// Make a copy of self. PropertyT<bool>* clone() const { PropertyT<bool>* p = new PropertyT<bool>( *this ); return p; }private: vector_type data_;};//-----------------------------------------------------------------------------/** \class PropertyT<std::string> Property.hh <OpenMesh/Core/Utils/PropertyT.hh> Property specialization for std::string type.*/template <>class PropertyT<std::string> : public BaseProperty{public: typedef std::string Value; typedef std::vector<std::string> vector_type; typedef std::string value_type; typedef vector_type::reference reference; typedef vector_type::const_reference const_reference;public: PropertyT(const std::string& _name = "<unknown>") : BaseProperty(_name) { } PropertyT(const PropertyT & _rhs) : BaseProperty( _rhs ), data_( _rhs.data_ ) {}public: // inherited from BaseProperty virtual void reserve(size_t _n) { data_.reserve(_n); } virtual void resize(size_t _n) { data_.resize(_n); } virtual void push_back() { data_.push_back(std::string()); } virtual void free_mem() { vector_type(data_).swap(data_); } virtual void swap(size_t _i0, size_t _i1) { std::swap(data_[_i0], data_[_i1]); }public: virtual void set_persistent( bool _yn ) { check_and_set_persistent<std::string>( _yn ); } virtual size_t n_elements() const { return data_.size(); } virtual size_t element_size() const { return UnknownSize; } virtual size_t size_of() const { return IO::size_of( data_ ); } virtual size_t size_of(size_t _n_elem) const { return UnknownSize; } /// Store self as one binary block. Max. length of a string is 65535 bytes. size_t store( std::ostream& _ostr, bool _swap ) const { return IO::store( _ostr, data_, _swap ); } size_t restore( std::istream& _istr, bool _swap ) { return IO::restore( _istr, data_, _swap ); }public: const value_type* data() const { return (value_type*) &data_[0]; } /// Access the i'th element. No range check is performed! reference operator[](int _idx) { assert( size_t(_idx) < data_.size()); return ((value_type*) &data_[0])[_idx]; } /// Const access the i'th element. No range check is performed! const_reference operator[](int _idx) const { assert( size_t(_idx) < data_.size()); return ((value_type*) &data_[0])[_idx]; } PropertyT<value_type>* clone() const { PropertyT<value_type>* p = new PropertyT<value_type>( *this ); return p; }private: vector_type data_;};//== CLASS DEFINITION =========================================================/// Base property handle.template <class T>struct BasePropHandleT : public BaseHandle{ typedef T Value; typedef std::vector<T> vector_type; typedef T value_type; typedef typename vector_type::reference reference; typedef typename vector_type::const_reference const_reference; explicit BasePropHandleT(int _idx=-1) : BaseHandle(_idx) {}};/** \ingroup mesh_property_handle_group * Handle representing a vertex property */template <class T>struct VPropHandleT : public BasePropHandleT<T>{ typedef T Value; typedef T value_type; explicit VPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {} explicit VPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}};/** \ingroup mesh_property_handle_group * Handle representing a halfedge property */template <class T>struct HPropHandleT : public BasePropHandleT<T>{ typedef T Value; typedef T value_type; explicit HPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {} explicit HPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}};/** \ingroup mesh_property_handle_group * Handle representing an edge property */template <class T>struct EPropHandleT : public BasePropHandleT<T>{ typedef T Value; typedef T value_type; explicit EPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {} explicit EPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}};/** \ingroup mesh_property_handle_group * Handle representing a face property */template <class T>struct FPropHandleT : public BasePropHandleT<T>{ typedef T Value; typedef T value_type; explicit FPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {} explicit FPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}};/** \ingroup mesh_property_handle_group * Handle representing a mesh property */template <class T>struct MPropHandleT : public BasePropHandleT<T>{ typedef T Value; typedef T value_type; explicit MPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {} explicit MPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}};//-----------------------------------------------------------------------------/// A a container for properties.class PropertyContainer{public: //-------------------------------------------------- constructor / destructor PropertyContainer() {} virtual ~PropertyContainer() { clear(); } //------------------------------------------------------------- info / access typedef std::vector<BaseProperty*> Properties; const Properties& properties() const { return properties_; } size_t size() const { return properties_.size(); } //--------------------------------------------------------- copy / assignment PropertyContainer(const PropertyContainer& _rhs) { operator=(_rhs); } PropertyContainer& operator=(const PropertyContainer& _rhs) { clear(); properties_ = _rhs.properties_; Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); for (; p_it!=p_end; ++p_it) if (*p_it) *p_it = (*p_it)->clone(); return *this; } //--------------------------------------------------------- manage properties template <class T> BasePropHandleT<T> add(const T&, const std::string& _name="<unknown>") { Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); int idx=0; for (; p_it!=p_end && *p_it!=NULL; ++p_it, ++idx); if (p_it==p_end) properties_.push_back(NULL); properties_[idx] = new PropertyT<T>(_name); return BasePropHandleT<T>(idx); } template <class T> BasePropHandleT<T> handle(const T&, const std::string& _name) const { Properties::const_iterator p_it = properties_.begin(); for (int idx=0; p_it != properties_.end(); ++p_it, ++idx) { if (*p_it != NULL && (*p_it)->name() == _name && //skip deleted properties dynamic_cast<PropertyT<T>*>(properties_[idx]) != NULL)//check type { return BasePropHandleT<T>(idx); } } return BasePropHandleT<T>(); } BaseProperty* property( const std::string& _name ) const { Properties::const_iterator p_it = properties_.begin(); for (int idx=0; p_it != properties_.end(); ++p_it, ++idx) { if (*p_it != NULL && (*p_it)->name() == _name) //skip deleted properties { return *p_it; } } return NULL; } template <class T> PropertyT<T>& property(BasePropHandleT<T> _h) { assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size()); assert(properties_[_h.idx()] != NULL);#ifdef NDEBUG return *static_cast <PropertyT<T>*> (properties_[_h.idx()]);#else PropertyT<T>* p = dynamic_cast<PropertyT<T>*>(properties_[_h.idx()]); assert(p != NULL); return *p;#endif } template <class T> const PropertyT<T>& property(BasePropHandleT<T> _h) const { assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size()); assert(properties_[_h.idx()] != NULL);#ifdef NDEBUG return *static_cast<PropertyT<T>*>(properties_[_h.idx()]);#else PropertyT<T>* p = dynamic_cast<PropertyT<T>*>(properties_[_h.idx()]); assert(p != NULL); return *p;#endif } template <class T> void remove(BasePropHandleT<T> _h) { assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size()); delete properties_[_h.idx()]; properties_[_h.idx()] = NULL; } void clear() { std::for_each(properties_.begin(), properties_.end(), Delete()); } //---------------------------------------------------- synchronize properties void reserve(size_t _n) const { std::for_each(properties_.begin(), properties_.end(), Reserve(_n)); } void resize(size_t _n) const { std::for_each(properties_.begin(), properties_.end(), Resize(_n)); } void free_mem() const { std::for_each(properties_.begin(), properties_.end(), FreeMem()); } void swap(size_t _i0, size_t _i1) const { std::for_each(properties_.begin(), properties_.end(), Swap(_i0, _i1)); }protected: // generic add/get size_t _add( BaseProperty* _bp ) { Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); size_t idx=0; for (; p_it!=p_end && *p_it!=NULL; ++p_it, ++idx); if (p_it==p_end) properties_.push_back(NULL); properties_[idx] = _bp; return idx; } BaseProperty& _property( size_t _idx ) { assert( _idx < properties_.size()); assert( properties_[_idx] != NULL); BaseProperty *p = properties_[_idx]; assert( p != NULL ); return *p; } const BaseProperty& _property( size_t _idx ) const { assert( _idx < properties_.size()); assert( properties_[_idx] != NULL); BaseProperty *p = properties_[_idx]; assert( p != NULL ); return *p; } typedef Properties::iterator iterator; typedef Properties::const_iterator const_iterator; iterator begin() { return properties_.begin(); } iterator end() { return properties_.end(); } const_iterator begin() const { return properties_.begin(); } const_iterator end() const { return properties_.end(); } friend class BaseKernel;private: //-------------------------------------------------- synchronization functors#ifndef DOXY_IGNORE_THIS struct Reserve { Reserve(size_t _n) : n_(_n) {} void operator()(BaseProperty* _p) const { if (_p) _p->reserve(n_); } size_t n_; }; struct Resize { Resize(size_t _n) : n_(_n) {} void operator()(BaseProperty* _p) const { if (_p) _p->resize(n_); } size_t n_; }; struct FreeMem { FreeMem() {} void operator()(BaseProperty* _p) const { if (_p) _p->free_mem(); } }; struct Swap { Swap(size_t _i0, size_t _i1) : i0_(_i0), i1_(_i1) {} void operator()(BaseProperty* _p) const { if (_p) _p->swap(i0_, i1_); } size_t i0_, i1_; }; struct Delete { Delete() {} void operator()(BaseProperty* _p) const { if (_p) delete _p; _p=NULL; } };#endif Properties properties_;};//=============================================================================} // namespace OpenMesh//=============================================================================#endif // OPENMESH_PROPERTY_HH defined//=============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -