42 #ifndef OPENMESH_PROPERTY_HH
43 #define OPENMESH_PROPERTY_HH
49 #include <OpenMesh/Core/System/config.h>
50 #include <OpenMesh/Core/Mesh/Handles.hh>
51 #include <OpenMesh/Core/Utils/BaseProperty.hh>
92 typedef std::vector<T> vector_type;
94 typedef typename vector_type::reference reference;
95 typedef typename vector_type::const_reference const_reference;
110 virtual void reserve(
size_t _n) { data_.reserve(_n); }
111 virtual void resize(
size_t _n) { data_.resize(_n); }
112 virtual void clear() { data_.clear(); vector_type().swap(data_); }
114 virtual void swap(
size_t _i0,
size_t _i1)
120 { check_and_set_persistent<T>( _yn ); }
125 #ifndef DOXY_IGNORE_THIS
127 size_t operator () (
size_t _b,
const T& _v )
128 {
return _b + IO::size_of<T>(_v); }
136 return std::accumulate(data_.begin(), data_.end(), 0,
plus());
142 virtual size_t store( std::ostream& _ostr,
bool _swap )
const
144 if ( IO::is_streamable<vector_type>() )
148 bytes += IO::store( _ostr, data_[i], _swap );
152 virtual size_t restore( std::istream& _istr,
bool _swap )
154 if ( IO::is_streamable<vector_type>() )
158 bytes += IO::restore( _istr, data_[i], _swap );
182 assert(
size_t(_idx) < data_.size() );
189 assert(
size_t(_idx) < data_.size());
218 typedef std::vector<bool> vector_type;
219 typedef bool value_type;
220 typedef vector_type::reference reference;
221 typedef vector_type::const_reference const_reference;
225 PropertyT(
const std::string& _name =
"<unknown>")
231 virtual void reserve(
size_t _n) { data_.reserve(_n); }
232 virtual void resize(
size_t _n) { data_.resize(_n); }
233 virtual void clear() { data_.clear(); vector_type().swap(data_); }
235 virtual void swap(
size_t _i0,
size_t _i1)
236 {
bool t(data_[_i0]); data_[_i0]=data_[_i1]; data_[_i1]=t; }
242 check_and_set_persistent<bool>( _yn );
250 return _n_elem / 8 + ((_n_elem % 8)!=0);
253 size_t store( std::ostream& _ostr,
bool )
const
257 size_t N = data_.size() / 8;
258 size_t R = data_.size() % 8;
264 for (bidx=idx=0; idx < N; ++idx, bidx+=8)
267 | (!!data_[bidx+1] << 1)
268 | (!!data_[bidx+2] << 2)
269 | (!!data_[bidx+3] << 3)
270 | (!!data_[bidx+4] << 4)
271 | (!!data_[bidx+5] << 5)
272 | (!!data_[bidx+6] << 6)
273 | (!!data_[bidx+7] << 7);
281 for (idx=0; idx < R; ++idx)
282 bits |= !!data_[bidx+idx] << idx;
287 std::cout << std::endl;
298 size_t N = data_.size() / 8;
299 size_t R = data_.size() % 8;
305 for (bidx=idx=0; idx < N; ++idx, bidx+=8)
308 data_[bidx+0] = !!(bits & 0x01);
309 data_[bidx+1] = !!(bits & 0x02);
310 data_[bidx+2] = !!(bits & 0x04);
311 data_[bidx+3] = !!(bits & 0x08);
312 data_[bidx+4] = !!(bits & 0x10);
313 data_[bidx+5] = !!(bits & 0x20);
314 data_[bidx+6] = !!(bits & 0x40);
315 data_[bidx+7] = !!(bits & 0x80);
322 for (idx=0; idx < R; ++idx)
323 data_[bidx+idx] = !!(bits & (1<<idx));
327 std::cout << std::endl;
344 assert(
size_t(_idx) < data_.size() );
351 assert(
size_t(_idx) < data_.size());
379 typedef std::string Value;
380 typedef std::vector<std::string> vector_type;
381 typedef std::string value_type;
382 typedef vector_type::reference reference;
383 typedef vector_type::const_reference const_reference;
387 PropertyT(
const std::string& _name =
"<unknown>")
393 virtual void reserve(
size_t _n) { data_.reserve(_n); }
394 virtual void resize(
size_t _n) { data_.resize(_n); }
395 virtual void clear() { data_.clear(); vector_type().swap(data_); }
396 virtual void push_back() { data_.push_back(std::string()); }
397 virtual void swap(
size_t _i0,
size_t _i1) {
404 { check_and_set_persistent<std::string>( _yn ); }
415 size_t store( std::ostream& _ostr,
bool _swap )
const
416 {
return IO::store( _ostr, data_, _swap ); }
418 size_t restore( std::istream& _istr,
bool _swap )
423 const value_type*
data()
const {
427 return (value_type*) &data_[0];
432 assert(
size_t(_idx) < data_.size());
433 return ((value_type*) &data_[0])[_idx];
438 assert(
size_t(_idx) < data_.size());
439 return ((value_type*) &data_[0])[_idx];
459 typedef std::vector<T> vector_type;
460 typedef T value_type;
461 typedef typename vector_type::reference reference;
462 typedef typename vector_type::const_reference const_reference;
475 typedef T value_type;
489 typedef T value_type;
503 typedef T value_type;
517 typedef T value_type;
531 typedef T value_type;
539 #endif // OPENMESH_PROPERTY_HH defined