Loading...
Searching...
No Matches
Property.hh
/* ========================================================================= *
* *
* OpenMesh *
* Copyright (c) 2001-2022, RWTH-Aachen University *
* Department of Computer Graphics and Multimedia *
* All rights reserved. *
* www.openmesh.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenMesh. *
*---------------------------------------------------------------------------*
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, *
* this list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
* ========================================================================= */
//#ifndef OPENMESH_PROPERTY_HH
//#define OPENMESH_PROPERTY_HH
#pragma once
//== INCLUDES =================================================================
#include <OpenMesh/Core/System/config.h>
#include <OpenMesh/Core/Mesh/Handles.hh>
#include <OpenMesh/Core/Utils/BaseProperty.hh>
#include <vector>
#include <string>
#include <algorithm>
#include <OpenMesh/Core/IO/SR_store.hh>
#include <iostream>
//== NAMESPACES ===============================================================
namespace OpenMesh {
//== CLASS DEFINITION =========================================================
// TODO: it might be possible to define Property using kind of a runtime info
// structure holding the size of T. Then reserve, swap, resize, etc can be written
// in pure malloc() style w/o virtual overhead. Template member function proved per
// element access to the properties, asserting dynamic_casts in debug
template <class T>
class PropertyT : public BaseProperty
{
public:
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;
public:
explicit PropertyT(
const std::string& _name = "<unknown>",
const std::string& _internal_type_name = "<unknown>")
: BaseProperty(_name, _internal_type_name)
{}
PropertyT(const PropertyT & _rhs)
: BaseProperty( _rhs ), data_( _rhs.data_ ) {}
public: // inherited from BaseProperty
virtual void reserve(size_t _n) override { data_.reserve(_n); }
virtual void resize(size_t _n) override { data_.resize(_n); }
virtual void clear() override { data_.clear(); vector_type().swap(data_); }
virtual void push_back() override { data_.push_back(T()); }
virtual void swap(size_t _i0, size_t _i1) override
{ std::swap(data_[_i0], data_[_i1]); }
virtual void copy(size_t _i0, size_t _i1) override
{ data_[_i1] = data_[_i0]; }
public:
virtual void set_persistent( bool _yn ) override
{ check_and_set_persistent<T>( _yn ); }
virtual size_t n_elements() const override { return data_.size(); }
virtual size_t element_size() const override { return IO::size_of<T>(); }
#ifndef DOXY_IGNORE_THIS
struct plus {
size_t operator () ( size_t _b, const T& _v )
{ return _b + IO::size_of<T>(_v); }
};
#endif
virtual size_t size_of(void) const override
{
if (element_size() != IO::UnknownSize)
return this->BaseProperty::size_of(n_elements());
return std::accumulate(data_.begin(), data_.end(), size_t(0), plus());
}
virtual size_t size_of(size_t _n_elem) const override
{ return this->BaseProperty::size_of(_n_elem); }
virtual size_t store( std::ostream& _ostr, bool _swap ) const override
{
if (IO::is_streamable<vector_type>() && element_size() != IO::UnknownSize)
return IO::store(_ostr, data_, _swap, false); //does not need to store its length
size_t bytes = 0;
for (size_t i=0; i<n_elements(); ++i)
bytes += IO::store( _ostr, data_[i], _swap);
return bytes;
}
virtual size_t restore( std::istream& _istr, bool _swap ) override
{
if ( IO::is_streamable<vector_type>() && element_size() != IO::UnknownSize)
return IO::restore(_istr, data_, _swap, false); //does not need to restore its length
size_t bytes = 0;
for (size_t i=0; i<n_elements(); ++i)
bytes += IO::restore( _istr, data_[i], _swap);
return bytes;
}
public: // data access interface
const T* data() const {
if( data_.empty() )
return 0;
return &data_[0];
}
vector_type& data_vector() {
return data_;
}
const vector_type& data_vector() const {
return data_;
}
reference operator[](int _idx)
{
assert( size_t(_idx) < data_.size() );
return data_[_idx];
}
const_reference operator[](int _idx) const
{
assert( size_t(_idx) < data_.size());
return data_[_idx];
}
PropertyT<T>* clone() const override
{
PropertyT<T>* p = new PropertyT<T>( *this );
return p;
}
std::string get_storage_name() const override
{
return OpenMesh::IO::binary<T>::type_identifier();
}
private:
vector_type data_;
};
//-----------------------------------------------------------------------------
template <>
class PropertyT<bool> : public BaseProperty
{
public:
typedef std::vector<bool> vector_type;
typedef bool value_type;
typedef vector_type::reference reference;
typedef vector_type::const_reference const_reference;
public:
explicit PropertyT(const std::string& _name = "<unknown>", const std::string& _internal_type_name="" )
: BaseProperty(_name, _internal_type_name)
{ }
public: // inherited from BaseProperty
virtual void reserve(size_t _n) override { data_.reserve(_n); }
virtual void resize(size_t _n) override { data_.resize(_n); }
virtual void clear() override { data_.clear(); vector_type().swap(data_); }
virtual void push_back() override { data_.push_back(bool()); }
virtual void swap(size_t _i0, size_t _i1) override
{ bool t(data_[_i0]); data_[_i0]=data_[_i1]; data_[_i1]=t; }
virtual void copy(size_t _i0, size_t _i1) override
{ data_[_i1] = data_[_i0]; }
public:
virtual void set_persistent( bool _yn ) override
{
check_and_set_persistent<bool>( _yn );
}
virtual size_t n_elements() const override { return data_.size(); }
virtual size_t element_size() const override { return UnknownSize; }
virtual size_t size_of() const override { return size_of( n_elements() ); }
virtual size_t size_of(size_t _n_elem) const override
{
return _n_elem / 8 + ((_n_elem % 8)!=0);
}
size_t store( std::ostream& _ostr, bool /* _swap */ ) const override
{
size_t bytes = 0;
size_t N = data_.size() / 8;
size_t R = data_.size() % 8;
size_t idx; // element index
size_t bidx;
unsigned char bits; // bitset
for (bidx=idx=0; idx < N; ++idx, bidx+=8)
{
bits = static_cast<unsigned char>(data_[bidx])
| (static_cast<unsigned char>(data_[bidx+1]) << 1)
| (static_cast<unsigned char>(data_[bidx+2]) << 2)
| (static_cast<unsigned char>(data_[bidx+3]) << 3)
| (static_cast<unsigned char>(data_[bidx+4]) << 4)
| (static_cast<unsigned char>(data_[bidx+5]) << 5)
| (static_cast<unsigned char>(data_[bidx+6]) << 6)
| (static_cast<unsigned char>(data_[bidx+7]) << 7);
_ostr << bits;
}
bytes = N;
if (R)
{
bits = 0;
for (idx=0; idx < R; ++idx)
bits |= static_cast<unsigned char>(data_[bidx+idx]) << idx;
_ostr << bits;
++bytes;
}
assert( bytes == size_of() );
return bytes;
}
size_t restore( std::istream& _istr, bool /* _swap */ ) override
{
size_t bytes = 0;
size_t N = data_.size() / 8;
size_t R = data_.size() % 8;
size_t idx; // element index
size_t bidx; //
unsigned char bits; // bitset
for (bidx=idx=0; idx < N; ++idx, bidx+=8)
{
_istr >> bits;
data_[bidx+0] = (bits & 0x01) != 0;
data_[bidx+1] = (bits & 0x02) != 0;
data_[bidx+2] = (bits & 0x04) != 0;
data_[bidx+3] = (bits & 0x08) != 0;
data_[bidx+4] = (bits & 0x10) != 0;
data_[bidx+5] = (bits & 0x20) != 0;
data_[bidx+6] = (bits & 0x40) != 0;
data_[bidx+7] = (bits & 0x80) != 0;
}
bytes = N;
if (R)
{
_istr >> bits;
for (idx=0; idx < R; ++idx)
data_[bidx+idx] = (bits & (1<<idx)) != 0;
++bytes;
}
return bytes;
}
public:
vector_type& data_vector() {
return data_;
}
const vector_type& data_vector() const {
return data_;
}
reference operator[](int _idx)
{
assert( size_t(_idx) < data_.size() );
return data_[_idx];
}
const_reference operator[](int _idx) const
{
assert( size_t(_idx) < data_.size());
return data_[_idx];
}
PropertyT<bool>* clone() const override
{
PropertyT<bool>* p = new PropertyT<bool>( *this );
return p;
}
std::string get_storage_name() const override
{
return OpenMesh::IO::binary<bool>::type_identifier();
}
private:
vector_type data_;
};
//-----------------------------------------------------------------------------
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) {}
};
template <class T>
struct VPropHandleT : public BasePropHandleT<T>
{
typedef T Value;
typedef T value_type;
typedef VertexHandle Handle;
explicit VPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}
explicit VPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}
};
template <class T>
struct HPropHandleT : public BasePropHandleT<T>
{
typedef T Value;
typedef T value_type;
typedef HalfedgeHandle Handle;
explicit HPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}
explicit HPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}
};
template <class T>
struct EPropHandleT : public BasePropHandleT<T>
{
typedef T Value;
typedef T value_type;
typedef EdgeHandle Handle;
explicit EPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}
explicit EPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}
};
template <class T>
struct FPropHandleT : public BasePropHandleT<T>
{
typedef T Value;
typedef T value_type;
typedef FaceHandle Handle;
explicit FPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}
explicit FPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}
};
template <class T>
struct MPropHandleT : public BasePropHandleT<T>
{
typedef T Value;
typedef T value_type;
typedef MeshHandle Handle;
explicit MPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}
explicit MPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}
};
template <typename HandleT>
struct PropHandle;
template <>
struct PropHandle<VertexHandle> {
template <typename T>
using type = VPropHandleT<T>;
};
template <>
struct PropHandle<HalfedgeHandle> {
template <typename T>
using type = HPropHandleT<T>;
};
template <>
struct PropHandle<EdgeHandle> {
template <typename T>
using type = EPropHandleT<T>;
};
template <>
struct PropHandle<FaceHandle> {
template <typename T>
using type = FPropHandleT<T>;
};
template <>
struct PropHandle<MeshHandle> {
template <typename T>
using type = MPropHandleT<T>;
};
} // namespace OpenMesh
//=============================================================================
//#endif // OPENMESH_PROPERTY_HH defined
//=============================================================================
OpenMesh
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
OpenMesh::IO::binary::type_identifier
static std::string type_identifier(void)
A string that identifies the type of T.
Definition SR_binary.hh:114
OpenMesh::BaseHandle
Base class for all handle types.
Definition Handles.hh:63
OpenMesh::VertexHandle
Handle for a vertex entity.
Definition Handles.hh:121
OpenMesh::HalfedgeHandle
Handle for a halfedge entity.
Definition Handles.hh:128
OpenMesh::EdgeHandle
Handle for a edge entity.
Definition Handles.hh:135
OpenMesh::FaceHandle
Handle for a face entity.
Definition Handles.hh:142
OpenMesh::MeshHandle
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
OpenMesh::BaseProperty
Abstract class defining the basic interface of a dynamic property.
Definition BaseProperty.hh:61
OpenMesh::BaseProperty::size_of
virtual size_t size_of() const
Return size of property in bytes.
Definition BaseProperty.hh:147
OpenMesh::BaseProperty::UnknownSize
static const size_t UnknownSize
Indicates an error when a size is returned by a member.
Definition BaseProperty.hh:65
OpenMesh::PropertyT
Default property class for any type T.
Definition Property.hh:93
OpenMesh::PropertyT::push_back
virtual void push_back() override
Extend the number of elements by one.
Definition Property.hh:120
OpenMesh::PropertyT::restore
virtual size_t restore(std::istream &_istr, bool _swap) override
Restore self from a binary block.
Definition Property.hh:162
OpenMesh::PropertyT::copy
virtual void copy(size_t _i0, size_t _i1) override
Copy one element to another.
Definition Property.hh:123
OpenMesh::PropertyT::set_persistent
virtual void set_persistent(bool _yn) override
Enable or disable persistency.
Definition Property.hh:128
OpenMesh::PropertyT::operator[]
reference operator[](int _idx)
Access the i'th element. No range check is performed!
Definition Property.hh:195
OpenMesh::PropertyT::element_size
virtual size_t element_size() const override
Size of one element in bytes or UnknownSize if not known.
Definition Property.hh:132
OpenMesh::PropertyT::data
const T * data() const
Get pointer to array (does not work for T==bool)
Definition Property.hh:176
OpenMesh::PropertyT::clear
virtual void clear() override
Clear all elements and free memory.
Definition Property.hh:119
OpenMesh::PropertyT::data_vector
const vector_type & data_vector() const
Const access to property vector.
Definition Property.hh:190
OpenMesh::PropertyT::reserve
virtual void reserve(size_t _n) override
Reserve memory for n elements.
Definition Property.hh:117
OpenMesh::PropertyT::clone
PropertyT< T > * clone() const override
Make a copy of self.
Definition Property.hh:209
OpenMesh::PropertyT::size_of
virtual size_t size_of(void) const override
Return size of property in bytes.
Definition Property.hh:141
OpenMesh::PropertyT::resize
virtual void resize(size_t _n) override
Resize storage to hold n elements.
Definition Property.hh:118
OpenMesh::PropertyT::swap
virtual void swap(size_t _i0, size_t _i1) override
Let two elements swap their storage place.
Definition Property.hh:121
OpenMesh::PropertyT::PropertyT
PropertyT(const PropertyT &_rhs)
Copy constructor.
Definition Property.hh:112
OpenMesh::PropertyT::size_of
virtual size_t size_of(size_t _n_elem) const override
Estimated size of property if it has _n_elem elements.
Definition Property.hh:148
OpenMesh::PropertyT::n_elements
virtual size_t n_elements() const override
Number of elements in property.
Definition Property.hh:131
OpenMesh::PropertyT::data_vector
vector_type & data_vector()
Get reference to property vector (be careful, improper usage, e.g. resizing, may crash OpenMesh!...
Definition Property.hh:185
OpenMesh::PropertyT::PropertyT
PropertyT(const std::string &_name="<unknown>", const std::string &_internal_type_name="<unknown>")
Default constructor.
Definition Property.hh:105
OpenMesh::PropertyT::get_storage_name
std::string get_storage_name() const override
returns a unique string for the type of the elements
Definition Property.hh:215
OpenMesh::PropertyT::store
virtual size_t store(std::ostream &_ostr, bool _swap) const override
Store self as one binary block.
Definition Property.hh:151
OpenMesh::PropertyT::operator[]
const_reference operator[](int _idx) const
Const access to the i'th element. No range check is performed!
Definition Property.hh:202
OpenMesh::PropertyT< bool >::push_back
virtual void push_back() override
Extend the number of elements by one.
Definition Property.hh:253
OpenMesh::PropertyT< bool >::set_persistent
virtual void set_persistent(bool _yn) override
Enable or disable persistency.
Definition Property.hh:261
OpenMesh::PropertyT< bool >::data_vector
const vector_type & data_vector() const
Const access to property vector.
Definition Property.hh:358
OpenMesh::PropertyT< bool >::operator[]
reference operator[](int _idx)
Access the i'th element. No range check is performed!
Definition Property.hh:363
OpenMesh::PropertyT< bool >::copy
virtual void copy(size_t _i0, size_t _i1) override
Copy one element to another.
Definition Property.hh:256
OpenMesh::PropertyT< bool >::data_vector
vector_type & data_vector()
Get reference to property vector (be careful, improper usage, e.g. resizing, may crash OpenMesh!...
Definition Property.hh:353
OpenMesh::PropertyT< bool >::operator[]
const_reference operator[](int _idx) const
Const access to the i'th element. No range check is performed!
Definition Property.hh:370
OpenMesh::PropertyT< bool >::restore
size_t restore(std::istream &_istr, bool) override
Restore self from a binary block.
Definition Property.hh:313
OpenMesh::PropertyT< bool >::clone
PropertyT< bool > * clone() const override
Make a copy of self.
Definition Property.hh:377
OpenMesh::PropertyT< bool >::get_storage_name
std::string get_storage_name() const override
returns a unique string for the type of the elements
Definition Property.hh:383
OpenMesh::PropertyT< bool >::clear
virtual void clear() override
Clear all elements and free memory.
Definition Property.hh:252
OpenMesh::PropertyT< bool >::size_of
virtual size_t size_of() const override
Return size of property in bytes.
Definition Property.hh:268
OpenMesh::PropertyT< bool >::n_elements
virtual size_t n_elements() const override
Number of elements in property.
Definition Property.hh:266
OpenMesh::PropertyT< bool >::size_of
virtual size_t size_of(size_t _n_elem) const override
Estimated size of property if it has _n_elem elements.
Definition Property.hh:269
OpenMesh::PropertyT< bool >::reserve
virtual void reserve(size_t _n) override
Reserve memory for n elements.
Definition Property.hh:250
OpenMesh::PropertyT< bool >::resize
virtual void resize(size_t _n) override
Resize storage to hold n elements.
Definition Property.hh:251
OpenMesh::PropertyT< bool >::swap
virtual void swap(size_t _i0, size_t _i1) override
Let two elements swap their storage place.
Definition Property.hh:254
OpenMesh::PropertyT< bool >::store
size_t store(std::ostream &_ostr, bool) const override
Store self as one binary block.
Definition Property.hh:274
OpenMesh::PropertyT< bool >::element_size
virtual size_t element_size() const override
Size of one element in bytes or UnknownSize if not known.
Definition Property.hh:267
OpenMesh::BasePropHandleT
Base property handle.
Definition Property.hh:401
OpenMesh::VPropHandleT
Handle representing a vertex property.
Definition Property.hh:417
OpenMesh::HPropHandleT
Handle representing a halfedge property.
Definition Property.hh:432
OpenMesh::EPropHandleT
Handle representing an edge property.
Definition Property.hh:447
OpenMesh::FPropHandleT
Handle representing a face property.
Definition Property.hh:462
OpenMesh::MPropHandleT
Handle representing a mesh property.
Definition Property.hh:477
OpenMesh::PropHandle
Definition Property.hh:487