HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OBaseProperty.h
Go to the documentation of this file.
1 //-*****************************************************************************
2 //
3 // Copyright (c) 2009-2013,
4 // Sony Pictures Imageworks, Inc. and
5 // Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd.
6 //
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are
11 // met:
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above
15 // copyright notice, this list of conditions and the following disclaimer
16 // in the documentation and/or other materials provided with the
17 // distribution.
18 // * Neither the name of Sony Pictures Imageworks, nor
19 // Industrial Light & Magic nor the names of their contributors may be used
20 // to endorse or promote products derived from this software without specific
21 // prior written permission.
22 //
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 //
35 //-*****************************************************************************
36 
37 #ifndef Alembic_Abc_OBaseProperty_h
38 #define Alembic_Abc_OBaseProperty_h
39 
40 #include <Alembic/Abc/Foundation.h>
41 #include <Alembic/Abc/Base.h>
42 #include <Alembic/Abc/Argument.h>
43 #include <Alembic/Abc/OObject.h>
44 #include <Alembic/Abc/OArchive.h>
45 
46 namespace Alembic {
47 namespace Abc {
48 namespace ALEMBIC_VERSION_NS {
49 
50 //-*****************************************************************************
51 //! Most of the functionality of properties (getting information about the
52 //! properties and so on) is common to all property types, so we create
53 //! a base class to contain all that functionality.
54 //! This is purely a base class for other properties to derive from,
55 //! it will never be created directly.
56 template <class PROP_PTR>
57 class OBasePropertyT : public Base
58 {
59 public:
60  //! By convention we always define this_type in Abc classes
61  //! Used by unspecified-bool-type conversion below
64 
65 protected:
66  friend class OCompoundProperty;
67 
68  //-*************************************************************************
69  // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
70  //-*************************************************************************
71 
72  //! The default constructor creates an empty OBaseProperty function set.
73  //! ...
75 
76  //! This attaches an OBaseProperty wrapper around an existing
77  //! PROP_PTR, with the given error handler policy
79 
80  //! The pointer
81  //! ...
82  PROP_PTR iPtr,
83 
84  //! The error handling.
85  //! ...
86  ErrorHandler::Policy iPolicy );
87 
88  //! Default copy constructor used
89  //! Default assignment operator used.
90 
91 public:
92  //-*************************************************************************
93  // PROPERTY WRITER FUNCTIONALITY
94  //-*************************************************************************
95 
96  //! Return the property's header.
97  //! ...
98  const AbcA::PropertyHeader & getHeader() const;
99 
100  //! This function returns the property's local name
101  //! ...
102  const std::string &getName() const
103  { return getHeader().getName(); }
104 
105  //! This function returns the property's type
106  //! ...
108  { return getHeader().getPropertyType(); }
109 
110  //! Convenience to return whether the property is scalar.
111  //! Same as getPropertyType() == kScalarProperty
112  bool isScalar() const { return getPropertyType() == AbcA::kScalarProperty; }
113 
114  //! Convenience to return whether the property is array.
115  //! Same as getPropertyType() == kArrayProperty
116  bool isArray() const { return getPropertyType() == AbcA::kArrayProperty; }
117 
118  //! Convenience to return whether the property is compound.
119  //! Same as getPropertyType() == kCompoundProperty
120  bool isCompound() const { return getPropertyType() ==
122 
123  //! Convenience to return whether the property is simple (non-compound)
124  //! Same as getPropertyType() != kCompoundProperty
125  bool isSimple() const { return !isCompound(); }
126 
127  //! All properties have MetaData. This just returns the
128  //! MetaData portion of the header that was used in creation.
130  { return getHeader().getMetaData(); }
131 
132  //! Non-compound properties have a DataType. It is an error
133  //! to call this function for CompoundProperties, and an exception will
134  //! be thrown. This is a convenience function which just returns the
135  //! DataType from the header that was used in creation.
137  { return getHeader().getDataType(); }
138 
139  //! Non-compound properties have a TimeSamplingPtr. It is an error
140  //! to call this function for CompoundProperties, and an exception will
141  //! be thrown. This is a convenience function which just returns the
142  //! TimeSamplingPtr from the header that was used in creation.
144  { return getHeader().getTimeSampling(); }
145 
146  //! This function returns the property's object, handily
147  //! wrapped in an OObject wrapper.
148  OObject getObject() const;
149 
150  //! Can't wrap
151  //! OCompoundProperty getParent();
152 
153  //-*************************************************************************
154  // ABC BASE MECHANISMS
155  // These functions are used by Abc to deal with errors, rewrapping,
156  // and so on.
157  //-*************************************************************************
158 
159  //! getPtr, as usual, returns a shared ptr to the
160  //! underlying AbcCoreAbstract object, in this case the
161  //! PROP_PTR.
162  PROP_PTR getPtr() const { return m_property; }
163 
164  //! Reset returns this function set to an empty, default
165  //! state.
166  void reset() { m_property.reset(); Base::reset(); }
167 
168  //! Valid returns whether this function set is
169  //! valid.
170  bool valid() const
171  {
172  return ( Base::valid() && m_property );
173  }
174 
175  //! The unspecified-bool-type operator casts the object to "true"
176  //! if it is valid, and "false" otherwise.
178 
179 protected:
180  PROP_PTR m_property;
181 };
182 
183 //-*****************************************************************************
185 
186 //-*****************************************************************************
187 // TEMPLATE AND INLINE FUNCTIONS
188 //-*****************************************************************************
189 
190 //-*****************************************************************************
191 template <class PROP_PTR>
193 (
194  PROP_PTR iPtr,
195  ErrorHandler::Policy iPolicy )
196  : m_property( iPtr )
197 {
198  getErrorHandler().setPolicy( iPolicy );
199 }
200 
201 namespace {
202 
203 const AbcA::PropertyHeader g_phd;
204 
205 }
206 
207 //-*****************************************************************************
208 //-*****************************************************************************
209 //-*****************************************************************************
210 template <class PROP_PTR>
212 {
213  ALEMBIC_ABC_SAFE_CALL_BEGIN( "OBaseProperty::getHeader()" );
214 
215  return m_property->getHeader();
216 
218 
219  // Not all error handlers throw, so have a default behavior.
220  return g_phd;
221 };
222 
223 //-*****************************************************************************
224 template <class PROP_PTR>
226 {
227  ALEMBIC_ABC_SAFE_CALL_BEGIN( "OBaseProperty::getObject()" );
228 
229  return OObject( m_property->getObject(),
231  getErrorHandlerPolicy() );
232 
234 
235  // Not all error handlers throw. Have a default.
236  return OObject();
237 }
238 
239 } // End namespace ALEMBIC_VERSION_NS
240 
241 using namespace ALEMBIC_VERSION_NS;
242 
243 } // End namespace Abc
244 } // End namespace Alembic
245 
246 #endif
AbcA::TimeSamplingPtr getTimeSampling() const
GLsizei const GLchar *const * string
Definition: glcorearb.h:814
const AbcA::MetaData & getMetaData() const
Alembic::Util::shared_ptr< TimeSampling > TimeSamplingPtr
Definition: TimeSampling.h:137
OBasePropertyT< AbcA::BasePropertyWriterPtr > OBaseProperty
const AbcA::DataType & getDataType() const
#define ALEMBIC_ABC_SAFE_CALL_BEGIN(CONTEXT)
Definition: ErrorHandler.h:172
const AbcA::PropertyHeader & getHeader() const
#define ALEMBIC_ABC_SAFE_CALL_END()
Definition: ErrorHandler.h:198
OBasePropertyT< PROP_PTR > operator_bool_base_type
Definition: OBaseProperty.h:63
#define ALEMBIC_VERSION_NS
Definition: Foundation.h:88