Developer Documentation
AutoPropertyHandleT.hh
1 /* ========================================================================= *
2  * *
3  * OpenMesh *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openmesh.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenMesh. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40  * ========================================================================= */
41 
42 
43 
44 #ifndef OPENMESH_AutoPropertyHandleT_HH
45 #define OPENMESH_AutoPropertyHandleT_HH
46 
47 //== INCLUDES =================================================================
48 #include <assert.h>
49 #include <string>
50 
51 //== NAMESPACES ===============================================================
52 
53 namespace OpenMesh {
54 
55 //== CLASS DEFINITION =========================================================
56 
57 template <class Mesh_, class PropertyHandle_>
58 class AutoPropertyHandleT : public PropertyHandle_
59 {
60 public:
61  typedef Mesh_ Mesh;
62  typedef PropertyHandle_ PropertyHandle;
63  typedef PropertyHandle Base;
64  typedef typename PropertyHandle::Value Value;
66  Self;
67 protected:
68  Mesh* m_;
69  bool own_property_;//ref counting?
70 
71 public:
73  : m_(nullptr), own_property_(false)
74  {}
75 
76  AutoPropertyHandleT(const Self& _other)
77  : Base(_other.idx()), m_(_other.m_), own_property_(false)
78  {}
79 
80  explicit AutoPropertyHandleT(Mesh& _m, const std::string& _pp_name = std::string())
81  { add_property(_m, _pp_name); }
82 
83  AutoPropertyHandleT(Mesh& _m, PropertyHandle _pph)
84  : Base(_pph.idx()), m_(&_m), own_property_(false)
85  {}
86 
88  {
89  if (own_property_)
90  {
91  m_->remove_property(*this);
92  }
93  }
94 
95  inline void add_property(Mesh& _m, const std::string& _pp_name = std::string())
96  {
97  assert(!is_valid());
98  m_ = &_m;
99  own_property_ = _pp_name.empty() || !m_->get_property_handle(*this, _pp_name);
100  if (own_property_)
101  {
102  m_->add_property(*this, _pp_name);
103  }
104  }
105 
106  inline void remove_property()
107  {
108  assert(own_property_);//only the owner can delete the property
109  m_->remove_property(*this);
110  own_property_ = false;
111  invalidate();
112  }
113 
114  template <class _Handle>
115  inline Value& operator [] (_Handle _hnd)
116  { return m_->property(*this, _hnd); }
117 
118  template <class _Handle>
119  inline const Value& operator [] (_Handle _hnd) const
120  { return m_->property(*this, _hnd); }
121 
122  inline bool own_property() const
123  { return own_property_; }
124 
125  inline void free_property()
126  { own_property_ = false; }
127 };
128 
129 //=============================================================================
130 } // namespace OpenMesh
131 //=============================================================================
132 #endif // OPENMESH_AutoPropertyHandleT_HH defined
133 //=============================================================================