3e93d2f0bdb34dfd55a84d4207a48b4e33a8e65f
[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 a float property value.
69    *
70    * @param [in] floatValue A floating-point value.
71    */
72   Value( float floatValue );
73
74   /**
75    * @brief Create a Vector2 property value.
76    *
77    * @param [in] vectorValue A vector of 2 floating-point values.
78    */
79   Value( const Vector2& vectorValue );
80
81   /**
82    * @brief Create a Vector3 property value.
83    *
84    * @param [in] vectorValue A vector of 3 floating-point values.
85    */
86   Value( const Vector3& vectorValue );
87
88   /**
89    * @brief Create a Vector4 property value.
90    *
91    * @param [in] vectorValue A vector of 4 floating-point values.
92    */
93   Value( const Vector4& vectorValue );
94
95   /**
96    * @brief Create a Matrix3 property value.
97    *
98    * @param [in] matrixValue A matrix of 3x3 floating-point values.
99    */
100   Value( const Matrix3& matrixValue );
101
102   /**
103    * @brief Create a Matrix property value.
104    *
105    * @param [in] matrixValue A matrix of 4x4 floating-point values.
106    */
107   Value( const Matrix& matrixValue );
108
109   /**
110    * @brief Create a Vector4 property value.
111    *
112    * @param [in] vectorValue A vector of 4 integer values.
113    */
114   Value( const Rect<int>& vectorValue );
115
116   /**
117    * @brief Create an orientation property value.
118    *
119    * @param [in] angleAxis An angle-axis representing the rotation.
120    */
121   Value( const AngleAxis& angleAxis );
122
123   /**
124    * @brief Create an orientation property value.
125    *
126    * @param [in] quaternion A quaternion representing the rotation.
127    */
128   Value( const Quaternion& quaternion );
129
130   /**
131    * @brief Create an string property value.
132    *
133    * @param [in] stringValue A string.
134    */
135   Value( const std::string& stringValue );
136
137   /**
138    * @brief Create an string property value.
139    *
140    * @param [in] stringValue A string.
141    */
142   Value( const char* stringValue );
143
144   /**
145    * @brief Create an array property value.
146    *
147    * @param [in] arrayValue An array
148    */
149   Value( Property::Array& arrayValue );
150
151   /**
152    * @brief Create a map property value.
153    *
154    * @param [in] mapValue An array
155    */
156   Value( Property::Map& mapValue );
157
158   /**
159    * @brief Explicitly set a type and initialize it.
160    *
161    * @param [in] type The property value type.
162    */
163   explicit Value( Type type );
164
165   /**
166    * @brief Copy constructor
167    *
168    * @param [in] value The property value to copy.
169    */
170   Value( const Value& value );
171
172   /**
173    * @brief Assign a property value.
174    *
175    * @param [in] value The property value to assign from.
176    * @return a reference to this
177    */
178   Value& operator=( const Value& value );
179
180   /**
181    * @brief Non-virtual destructor.
182    *
183    * This class is not a base class.
184    */
185   ~Value();
186
187   /**
188    * @brief Query the type of this property value.
189    *
190    * @return The type ID.
191    */
192   Type GetType() const;
193
194   /**
195    * @brief Retrieve a specific value.
196    *
197    * Works on a best-effort approach; if value type is not convertible returns a default value of the type
198    *
199    * @return A value of type T.
200    */
201   template <typename T>
202   T DALI_INTERNAL Get() const
203   {
204     T temp = T(); // value (zero) initialize
205     Get( temp );
206     return temp;
207   }
208
209   /**
210    * @brief Retrieve a boolean value.
211    *
212    * @pre GetType() returns Property::BOOLEAN.
213    * @param [out] boolValue On return, a boolean value.
214    * @return true if the value is successfully retrieved, false if the type is not convertible
215    */
216   bool Get( bool& boolValue ) const;
217
218   /**
219    * @brief Retrieve a floating-point value.
220    *
221    * @pre GetType() returns Property::FLOAT.
222    * @param [out] floatValue On return, a floating-point value.
223    * @return true if the value is successfully retrieved, false if the type is not convertible
224    */
225   bool Get( float& floatValue ) const;
226
227   /**
228    * @brief Retrieve an integer value.
229    *
230    * @pre GetType() returns Property::INTEGER.
231    * @param [out] integerValue On return, an integer value.
232    * @return true if the value is successfully retrieved, false if the type is not convertible
233    */
234   bool Get( int& integerValue ) const;
235
236   /**
237    * @brief Retrieve an integer rectangle.
238    *
239    * @pre GetType() returns Property::RECTANGLE.
240    * @param [out] rect On return, an integer rectangle.
241    * @return true if the value is successfully retrieved, false if the type is not convertible
242    */
243   bool Get( Rect<int>& rect ) const;
244
245   /**
246    * @brief Retrieve a vector value.
247    *
248    * @pre GetType() returns Property::VECTOR2.
249    * @param [out] vectorValue On return, a vector value.
250    * @return true if the value is successfully retrieved, false if the type is not convertible
251    */
252   bool Get( Vector2& vectorValue ) const;
253
254   /**
255    * @brief Retrieve a vector value.
256    *
257    * @pre GetType() returns Property::VECTOR3.
258    * @param [out] vectorValue On return, a vector value.
259    * @return true if the value is successfully retrieved, false if the type is not convertible
260    */
261   bool Get( Vector3& vectorValue ) const;
262
263   /**
264    * @brief Retrieve a vector value.
265    *
266    * @pre GetType() returns Property::VECTOR4.
267    * @param [out] vectorValue On return, a vector value.
268    * @return true if the value is successfully retrieved, false if the type is not convertible
269    */
270   bool Get( Vector4& vectorValue ) const;
271
272   /**
273    * @brief Retrieve a matrix3 value.
274    *
275    * @pre GetType() returns Property::MATRIX3.
276    * @param [out] matrixValue On return, a matrix3 value.
277    * @return true if the value is successfully retrieved, false if the type is not convertible
278    */
279   bool Get( Matrix3& matrixValue ) const;
280
281   /**
282    * @brief Retrieve a matrix value.
283    *
284    * @pre GetType() returns Property::MATRIX.
285    * @param [out] matrixValue On return, a matrix value.
286    * @return true if the value is successfully retrieved, false if the type is not convertible
287    */
288   bool Get( Matrix& matrixValue ) const;
289
290   /**
291    * @brief Retrieve an angle-axis value.
292    *
293    * @pre GetType() returns Property::ROTATION.
294    * @param [out] angleAxisValue On return, a angle-axis value.
295    * @return true if the value is successfully retrieved, false if the type is not convertible
296    */
297   bool Get( AngleAxis& angleAxisValue ) const;
298
299   /**
300    * @brief Retrieve a quaternion value.
301    *
302    * @pre GetType() returns Property::ROTATION.
303    * @param [out] quaternionValue On return, a quaternion value.
304    * @return true if the value is successfully retrieved, false if the type is not convertible
305    */
306   bool Get( Quaternion& quaternionValue ) const;
307
308   /**
309    * @brief Retrieve an string property value.
310    *
311    * @pre GetType() returns Property::STRING.
312    * @param [out] stringValue A string.
313    * @return true if the value is successfully retrieved, false if the type is not convertible
314    */
315   bool Get( std::string& stringValue ) const;
316
317   /**
318    * @brief Retrieve an array property value.
319    *
320    * @pre GetType() returns Property::ARRAY.
321    * @param [out] arrayValue The array as a vector Property Values
322    * @return true if the value is successfully retrieved, false if the type is not convertible
323    */
324   bool Get( Property::Array& arrayValue ) const;
325
326   /**
327    * @brief Retrieve an map property value.
328    *
329    * @pre GetType() returns Property::MAP.
330    * @param [out] mapValue The map as vector of string and Property Value pairs
331    * @return true if the value is successfully retrieved, false if the type is not convertible
332    */
333   bool Get( Property::Map& mapValue ) const;
334
335   /**
336    * @brief Retrieve the Array API of the Property::Value without copying the contents of the map
337    *
338    * @return the Array API of the Property::Value or NULL if not a Property::Array
339    */
340   Property::Array* GetArray() const;
341
342   /**
343    * @brief Retrieve the Map API of the Property::Value without copying the contents of the map
344    *
345    * @return  the Map API of the Property::Value or NULL if not a Property::Map
346    */
347   Property::Map* GetMap() const;
348
349   /**
350    * output to stream
351    */
352   friend std::ostream& operator<<( std::ostream& ouputStream, const Property::Value& value );
353
354 private:
355
356   struct DALI_INTERNAL Impl;
357   Impl* mImpl; ///< Pointer to the implementation
358
359 };
360
361 /**
362  * @brief Convert the value of the property into a string and append to an output stream.
363  *
364  * @param [in] ouputStream The output stream operator.
365  * @param [in] value The value to insert
366  * @return The output stream operator.
367  */
368 DALI_IMPORT_API std::ostream& operator<<( std::ostream& ouputStream, const Property::Value& value );
369
370 } // namespace Dali
371
372 #endif // __DALI_PROPERTY_VALUE_H__