43 #ifndef OPENVOLUMEMESHPROPERTY_HH
44 #define OPENVOLUMEMESHPROPERTY_HH
55 #include "OpenVolumeMeshBaseProperty.hh"
57 #include "Serializers.hh"
74 template <
class PropT,
class HandleT>
friend class PropertyPtr;
77 typedef std::vector<T> vector_type;
79 typedef typename vector_type::reference reference;
80 typedef typename vector_type::const_reference const_reference;
103 data_.resize(_n, def_);
107 vector_type().swap(data_);
110 data_.push_back(def_);
112 virtual void swap(
size_t _i0,
size_t _i1) {
113 std::swap(data_[_i0], data_[_i1]);
115 virtual void copy(
size_t _src_idx,
size_t _dst_idx) {
116 data_[_dst_idx] = data_[_src_idx];
119 data_.erase(data_.begin() + _idx);
131 #ifndef DOXY_IGNORE_THIS
133 size_t operator ()(
size_t _b,
const T& ) {
134 return _b +
sizeof(T);
142 return std::accumulate(data_.begin(), data_.end(), size_t(0), plus());
145 virtual size_t size_of(
size_t _n_elem)
const {
150 virtual void serialize(std::ostream& _ostr)
const {
151 for(
typename vector_type::const_iterator it = data_.begin();
152 it != data_.end(); ++it) {
153 OpenVolumeMesh::serialize(_ostr, *it) << std::endl;
158 virtual void deserialize(std::istream& _istr) {
159 for(
unsigned int i = 0; i <
n_elements(); ++i) {
160 OpenVolumeMesh::deserialize(_istr, data_[i]);
184 assert(_idx < data_.size());
190 assert(_idx < data_.size());
200 typename vector_type::const_iterator begin()
const {
return data_.begin(); }
202 typename vector_type::iterator begin() {
return data_.begin(); }
204 typename vector_type::const_iterator end()
const {
return data_.end(); }
206 typename vector_type::iterator end() {
return data_.end(); }
213 assert(_tags.size() == data_.size());
214 vector_type new_data;
215 typename vector_type::iterator d_it = data_.begin();
216 std::vector<bool>::const_iterator t_it = _tags.begin();
217 std::vector<bool>::const_iterator t_end = _tags.end();
218 for(; t_it != t_end; ++t_it, ++d_it) {
220 new_data.push_back(*d_it);
223 data_.swap(new_data);
243 template <
class PropT,
class HandleT>
friend class PropertyPtr;
245 typedef std::vector<bool> vector_type;
246 typedef bool value_type;
247 typedef vector_type::reference reference;
248 typedef vector_type::const_reference const_reference;
264 data_.resize(_n, def_);
268 vector_type().swap(data_);
271 data_.push_back(def_);
273 virtual void swap(
size_t _i0,
size_t _i1) {
275 data_[_i0] = data_[_i1];
278 virtual void copy(
size_t _src_idx,
size_t _dst_idx) {
279 data_[_dst_idx] = data_[_src_idx];
283 data_.erase(data_.begin() + _idx);
297 virtual size_t size_of(
size_t _n_elem)
const {
298 return _n_elem / 8 + ((_n_elem % 8) != 0);
302 virtual void serialize(std::ostream& _ostr)
const {
303 for(vector_type::const_iterator it = data_.begin();
304 it != data_.end(); ++it) {
305 OpenVolumeMesh::serialize(_ostr, *it) << std::endl;
310 virtual void deserialize(std::istream& _istr) {
311 for(
unsigned int i = 0; i <
n_elements(); ++i) {
313 OpenVolumeMesh::deserialize(_istr, val);
322 assert(_idx < data_.size());
328 assert(_idx < data_.size());
339 vector_type::const_iterator begin()
const {
return data_.begin(); }
341 vector_type::iterator begin() {
return data_.begin(); }
343 vector_type::const_iterator end()
const {
return data_.end(); }
345 vector_type::iterator end() {
return data_.end(); }
352 assert(_tags.size() == data_.size());
353 vector_type new_data;
354 vector_type::iterator d_it = data_.begin();
355 std::vector<bool>::const_iterator t_it = _tags.begin();
356 std::vector<bool>::const_iterator t_end = _tags.end();
357 for(; t_it != t_end; ++t_it, ++d_it) {
359 new_data.push_back(*d_it);
362 data_.swap(new_data);
382 template <
class PropT,
class HandleT>
friend class PropertyPtr;
384 typedef std::string Value;
385 typedef std::vector<std::string> vector_type;
386 typedef std::string value_type;
387 typedef vector_type::reference reference;
388 typedef vector_type::const_reference const_reference;
404 data_.resize(_n, def_);
408 vector_type().swap(data_);
411 data_.push_back(def_);
413 virtual void swap(
size_t _i0,
size_t _i1) {
414 std::swap(data_[_i0], data_[_i1]);
416 virtual void copy(
size_t _src_idx,
size_t _dst_idx) {
417 data_[_dst_idx] = data_[_src_idx];
420 data_.erase(data_.begin() + _idx);
432 return sizeof(data_);
439 virtual void stats(std::ostream& _ostr)
const {
440 for(vector_type::const_iterator it = data_.begin();
441 it != data_.end(); ++it) {
447 virtual void serialize(std::ostream& _ostr)
const {
448 for(vector_type::const_iterator it = data_.begin();
449 it != data_.end(); ++it) {
450 OpenVolumeMesh::serialize(_ostr, *it) << std::endl;
455 virtual void deserialize(std::istream& _istr) {
456 for(
unsigned int i = 0; i <
n_elements(); ++i) {
457 OpenVolumeMesh::deserialize(_istr, data_[i]);
463 const value_type*
data()
const {
467 return (value_type*) &data_[0];
472 assert(_idx < data_.size());
473 return ((value_type*) &data_[0])[_idx];
478 assert(_idx < data_.size());
479 return ((value_type*) &data_[0])[_idx];
488 vector_type::const_iterator begin()
const {
return data_.begin(); }
490 vector_type::iterator begin() {
return data_.begin(); }
492 vector_type::const_iterator end()
const {
return data_.end(); }
494 vector_type::iterator end() {
return data_.end(); }
501 assert(_tags.size() == data_.size());
502 vector_type new_data;
503 vector_type::iterator d_it = data_.begin();
504 std::vector<bool>::const_iterator t_it = _tags.begin();
505 std::vector<bool>::const_iterator t_end = _tags.end();
506 for(; t_it != t_end; ++t_it, ++d_it) {
508 new_data.push_back(*d_it);
511 data_.swap(new_data);
518 const std::string def_;
524 #endif // OPENVOLUMEMESHPROPERTY_HH defined
virtual void clear()
Clear all elements and free memory.
virtual void reserve(size_t _n)
Reserve memory for n elements.
reference operator[](size_t _idx)
Access the i'th element. No range check is performed!
virtual void delete_multiple_entries(const std::vector< bool > &_tags)
Delete multiple entries in list.
OpenVolumeMeshPropertyT< T > * clone() const
Make a copy of self.
const_reference operator[](size_t _idx) const
Const access the i'th element. No range check is performed!
virtual size_t element_size() const
Size of one element in bytes or UnknownSize if not known.
virtual size_t size_of() const
Return size of property in bytes.
virtual size_t size_of() const
Return size of property in bytes.
virtual size_t size_of(size_t) const
virtual void delete_multiple_entries(const std::vector< bool > &_tags)
Delete multiple entries in list.
OpenVolumeMeshPropertyT(const std::string &_name="<unknown>", const T _def=T())
Default constructor.
virtual void resize(size_t _n)
Resize storage to hold n elements.
virtual void swap(size_t _i0, size_t _i1)
Let two elements swap their storage place.
virtual void clear()
Clear all elements and free memory.
reference operator[](size_t _idx)
Access the i'th element. No range check is performed!
void delete_element(size_t _idx)
Erase an element of the vector.
virtual size_t element_size() const
Size of one element in bytes or UnknownSize if not known.
virtual void swap(size_t _i0, size_t _i1)
Let two elements swap their storage place.
virtual size_t n_elements() const
Number of elements in property.
OpenVolumeMeshPropertyT(const OpenVolumeMeshPropertyT &_rhs)
Copy constructor.
const_reference operator[](size_t _idx) const
Const access to the i'th element. No range check is performed!
OpenVolumeMeshPropertyT< bool > * clone() const
Make a copy of self.
virtual size_t size_of(size_t _n_elem) const
OpenVolumeMeshPropertyT< value_type > * clone() const
Return a deep copy of self.
virtual size_t n_elements() const
Number of elements in property.
vector_type & data_vector()
Get reference to property vector (be careful, improper usage, e.g. resizing, may crash) ...
static const size_t UnknownSize
Indicates an error when a size is returned by a member.
virtual size_t size_of() const
Return size of property in bytes.
virtual void delete_multiple_entries(const std::vector< bool > &_tags)
Delete multiple entries in list.
virtual void reserve(size_t _n)
Reserve memory for n elements.
virtual size_t n_elements() const
Number of elements in property.
const_reference operator[](size_t _idx) const
Const access to the i'th element. No range check is performed!
Default property class for any type T.
virtual void push_back()
Extend the number of elements by one.
virtual void swap(size_t _i0, size_t _i1)
Let two elements swap their storage place.
virtual size_t size_of(size_t _n_elem) const
virtual void resize(size_t _n)
Resize storage to hold n elements.
virtual void reserve(size_t _n)
Reserve memory for n elements.
reference operator[](size_t _idx)
Access the i'th element. No range check is performed!
const T * data() const
Get pointer to array (does not work for T==bool)
virtual void resize(size_t _n)
Resize storage to hold n elements.
virtual size_t element_size() const
Size of one element in bytes or UnknownSize if not known.
virtual size_t size_of() const
Return size of property in bytes.
void delete_element(size_t _idx)
Erase an element of the vector.
virtual void push_back()
Extend the number of elements by one.
virtual void delete_element(size_t _idx)
Erase an element of the vector.
virtual void clear()
Clear all elements and free memory.
virtual void push_back()
Extend the number of elements by one.