Change Property::Value::Get methods to return bool so developer can check if conversi...
[platform/core/uifw/dali-core.git] / dali / public-api / object / property-value.h
1 #ifndef __DALI_PROPERTY_VALUE_H__
2 #define __DALI_PROPERTY_VALUE_H__
3
4 /*
5  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <iosfwd>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/object/property.h>
26 #include <dali/public-api/math/rect.h>
27
28 namespace Dali
29 {
30
31 struct AngleAxis;
32 class Quaternion;
33 struct Vector2;
34 struct Vector3;
35 struct Vector4;
36 class Matrix3;
37 class Matrix;
38
39 /**
40  * @brief A value-type representing a property value.
41  */
42 class DALI_IMPORT_API Property::Value
43 {
44 public:
45
46   /**
47    * @brief Default constructor.
48    *
49    * This creates a property with type Property::NONE.
50    */
51   Value();
52
53   /**
54    * @brief Create a boolean property value.
55    *
56    * @param [in] boolValue A boolean value.
57    */
58   Value( bool boolValue );
59
60   /**
61    * @brief Create an integer property value.
62    *
63    * @param [in] integerValue An integer value.
64    */
65   Value( int integerValue );
66
67   /**
68    * @brief Create an unsigned integer property value.
69    *
70    * @param [in] unsignedIntegerValue An unsigned integer value.
71    */
72   Value( unsigned int unsignedIntegerValue );
73
74   /**
75    * @brief Create a float property value.
76    *
77    * @param [in] floatValue A floating-point value.
78    */
79   Value( float floatValue );
80
81   /**
82    * @brief Create a Vector2 property value.
83    *
84    * @param [in] vectorValue A vector of 2 floating-point values.
85    */
86   Value( const Vector2& vectorValue );
87
88   /**
89    * @brief Create a Vector3 property value.
90    *
91    * @param [in] vectorValue A vector of 3 floating-point values.
92    */
93   Value( const Vector3& vectorValue );
94
95   /**
96    * @brief Create a Vector4 property value.
97    *
98    * @param [in] vectorValue A vector of 4 floating-point values.
99    */
100   Value( const Vector4& vectorValue );
101
102   /**
103    * @brief Create a Matrix3 property value.
104    *
105    * @param [in] matrixValue A matrix of 3x3 floating-point values.
106    */
107   Value( const Matrix3& matrixValue );
108
109   /**
110    * @brief Create a Matrix property value.
111    *
112    * @param [in] matrixValue A matrix of 4x4 floating-point values.
113    */
114   Value( const Matrix& matrixValue );
115
116   /**
117    * @brief Create a Vector4 property value.
118    *
119    * @param [in] vectorValue A vector of 4 integer values.
120    */
121   Value( const Rect<int>& vectorValue );
122
123   /**
124    * @brief Create an orientation property value.
125    *
126    * @param [in] angleAxis An angle-axis representing the rotation.
127    */
128   Value( const AngleAxis& angleAxis );
129
130   /**
131    * @brief Create an orientation property value.
132    *
133    * @param [in] quaternion A quaternion representing the rotation.
134    */
135   Value( const Quaternion& quaternion );
136
137   /**
138    * @brief Create an string property value.
139    *
140    * @param [in] stringValue A string.
141    */
142   Value( const std::string& stringValue );
143
144   /**
145    * @brief Create an string property value.
146    *
147    * @param [in] stringValue A string.
148    */
149   Value( const char* stringValue );
150
151   /**
152    * @brief Create an array property value.
153    *
154    * @param [in] arrayValue An array
155    */
156   Value( Property::Array& arrayValue );
157
158   /**
159    * @brief Create a map property value.
160    *
161    * @param [in] mapValue An array
162    */
163   Value( Property::Map& mapValue );
164
165   /**
166    * @brief Explicitly set a type and initialize it.
167    *
168    * @param [in] type The property value type.
169    */
170   explicit Value( Type type );
171
172   /**
173    * @brief Copy constructor
174    *
175    * @param [in] value The property value to copy.
176    */
177   Value( const Value& value );
178
179   /**
180    * @brief Assign a property value.
181    *
182    * @param [in] value The property value to assign from.
183    * @return a reference to this
184    */
185   Value& operator=( const Value& value );
186
187   /**
188    * @brief Non-virtual destructor.
189    *
190    * This class is not a base class.
191    */
192   ~Value();
193
194   /**
195    * @brief Query the type of this property value.
196    *
197    * @return The type ID.
198    */
199   Type GetType() const;
200
201   /**
202    * @brief Retrieve a specific value.
203    *
204    * Works on a best-effort approach; if value type is not convertible returns a default value of the type
205    *
206    * @return A value of type T.
207    */
208   template <typename T>
209   T DALI_INTERNAL Get() const
210   {
211     T temp = T(); // value (zero) initialize
212     Get( temp );
213     return temp;
214   }
215
216   /**
217    * @brief Retrieve a boolean value.
218    *
219    * @pre GetType() returns Property::BOOLEAN.
220    * @param [out] boolValue On return, a boolean value.
221    * @return true if the value is successfully retrieved, false if the type is not convertible
222    */
223   bool Get( bool& boolValue ) const;
224
225   /**
226    * @brief Retrieve a floating-point value.
227    *
228    * @pre GetType() returns Property::FLOAT.
229    * @param [out] floatValue On return, a floating-point value.
230    * @return true if the value is successfully retrieved, false if the type is not convertible
231    */
232   bool Get( float& floatValue ) const;
233
234   /**
235    * @brief Retrieve an integer value.
236    *
237    * @pre GetType() returns Property::INTEGER.
238    * @param [out] integerValue On return, an integer value.
239    * @return true if the value is successfully retrieved, false if the type is not convertible
240    */
241   bool Get( int& integerValue ) const;
242
243   /**
244    * @brief Retrieve an unsigned integer value.
245    *
246    * @pre GetType() returns Property::UNSIGNED_INTEGER.
247    * @param [out] unsignedIntegerValue On return, an unsigned integer value.
248    * @return true if the value is successfully retrieved, false if the type is not convertible
249    */
250   bool Get( unsigned int& unsignedIntegerValue ) const;
251
252   /**
253    * @brief Retrieve an integer rectangle.
254    *
255    * @pre GetType() returns Property::RECTANGLE.
256    * @param [out] rect On return, an integer rectangle.
257    * @return true if the value is successfully retrieved, false if the type is not convertible
258    */
259   bool Get( Rect<int>& rect ) const;
260
261   /**
262    * @brief Retrieve a vector value.
263    *
264    * @pre GetType() returns Property::VECTOR2.
265    * @param [out] vectorValue On return, a vector value.
266    * @return true if the value is successfully retrieved, false if the type is not convertible
267    */
268   bool Get( Vector2& vectorValue ) const;
269
270   /**
271    * @brief Retrieve a vector value.
272    *
273    * @pre GetType() returns Property::VECTOR3.
274    * @param [out] vectorValue On return, a vector value.
275    * @return true if the value is successfully retrieved, false if the type is not convertible
276    */
277   bool Get( Vector3& vectorValue ) const;
278
279   /**
280    * @brief Retrieve a vector value.
281    *
282    * @pre GetType() returns Property::VECTOR4.
283    * @param [out] vectorValue On return, a vector value.
284    * @return true if the value is successfully retrieved, false if the type is not convertible
285    */
286   bool Get( Vector4& vectorValue ) const;
287
288   /**
289    * @brief Retrieve a matrix3 value.
290    *
291    * @pre GetType() returns Property::MATRIX3.
292    * @param [out] matrixValue On return, a matrix3 value.
293    * @return true if the value is successfully retrieved, false if the type is not convertible
294    */
295   bool Get( Matrix3& matrixValue ) const;
296
297   /**
298    * @brief Retrieve a matrix value.
299    *
300    * @pre GetType() returns Property::MATRIX.
301    * @param [out] matrixValue On return, a matrix value.
302    * @return true if the value is successfully retrieved, false if the type is not convertible
303    */
304   bool Get( Matrix& matrixValue ) const;
305
306   /**
307    * @brief Retrieve an angle-axis value.
308    *
309    * @pre GetType() returns Property::ROTATION.
310    * @param [out] angleAxisValue On return, a angle-axis value.
311    * @return true if the value is successfully retrieved, false if the type is not convertible
312    */
313   bool Get( AngleAxis& angleAxisValue ) const;
314
315   /**
316    * @brief Retrieve a quaternion value.
317    *
318    * @pre GetType() returns Property::ROTATION.
319    * @param [out] quaternionValue On return, a quaternion value.
320    * @return true if the value is successfully retrieved, false if the type is not convertible
321    */
322   bool Get( Quaternion& quaternionValue ) const;
323
324   /**
325    * @brief Retrieve an string property value.
326    *
327    * @pre GetType() returns Property::STRING.
328    * @param [out] stringValue A string.
329    * @return true if the value is successfully retrieved, false if the type is not convertible
330    */
331   bool Get( std::string& stringValue ) const;
332
333   /**
334    * @brief Retrieve an array property value.
335    *
336    * @pre GetType() returns Property::ARRAY.
337    * @param [out] arrayValue The array as a vector Property Values
338    * @return true if the value is successfully retrieved, false if the type is not convertible
339    */
340   bool Get( Property::Array& arrayValue ) const;
341
342   /**
343    * @brief Retrieve an map property value.
344    *
345    * @pre GetType() returns Property::MAP.
346    * @param [out] mapValue The map as vector of string and Property Value pairs
347    * @return true if the value is successfully retrieved, false if the type is not convertible
348    */
349   bool Get( Property::Map& mapValue ) const;
350
351   /**
352    * @brief Retrieve the Array API of the Property::Value without copying the contents of the map
353    *
354    * @return the Array API of the Property::Value or NULL if not a Property::Array
355    */
356   Property::Array* GetArray() const;
357
358   /**
359    * @brief Retrieve the Map API of the Property::Value without copying the contents of the map
360    *
361    * @return  the Map API of the Property::Value or NULL if not a Property::Map
362    */
363   Property::Map* GetMap() const;
364
365   /**
366    * output to stream
367    */
368   friend std::ostream& operator<<( std::ostream& ouputStream, const Property::Value& value );
369
370 private:
371
372   struct DALI_INTERNAL Impl;
373   Impl* mImpl; ///< Pointer to the implementation
374
375 };
376
377 /**
378  * @brief Convert the value of the property into a string and append to an output stream.
379  *
380  * @param [in] ouputStream The output stream operator.
381  * @param [in] value The value to insert
382  * @return The output stream operator.
383  */
384 DALI_IMPORT_API std::ostream& operator<<( std::ostream& ouputStream, const Property::Value& value );
385
386 } // namespace Dali
387
388 #endif // __DALI_PROPERTY_VALUE_H__