⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 property.hh

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 HH
📖 第 1 页 / 共 2 页
字号:
  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 + -