Fix SINCE and DEPRECATED versions to be included in Tizen 5.5
[platform/core/uifw/dali-core.git] / dali / public-api / object / type-registry-helper.h
1 #ifndef __DALI_TYPE_REGISTRY_HELPER_H__
2 #define __DALI_TYPE_REGISTRY_HELPER_H__
3
4 /*
5  * Copyright (c) 2017 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 // INTERNAL INCLUDES
22 #include <dali/public-api/common/compile-time-assert.h>
23 #include <dali/public-api/object/type-registry.h>
24
25 /**
26  * @brief Definition for macros that are used internally by the property macros.
27  * Use the the property macros in the section below this one (without the _INTERNAL postfix) when defining properties.
28  * These internal macros exist as to perform the compile-time check on the enumeration order, the __COUNTER__ macro is used twice.
29  * Using it twice within the same macro would result in two different values.
30  */
31 #define DALI_TOKEN_PASTE_EXPAND( x, y ) x ## y
32 #define DALI_TOKEN_PASTE( x, y ) DALI_TOKEN_PASTE_EXPAND(x, y)
33
34 #define DALI_PROPERTY_REGISTRATION_INTERNAL( count, typeRegistrationObject, objectNamespace, objectType, text, valueType, enumIndex ) \
35   Dali::PropertyRegistration DALI_TOKEN_PASTE( property, count ) ( typeRegistrationObject, text, objectNamespace::objectType::Property::enumIndex, Dali::Property::valueType, &objectType::SetProperty, &objectType::GetProperty ); \
36   DALI_COMPILE_TIME_ASSERT( ( objectNamespace::objectType::Property::enumIndex - objectNamespace::objectType::PROPERTY_START_INDEX ) == count );
37
38 #define DALI_PROPERTY_REGISTRATION_INTERNAL_READ_ONLY( count, typeRegistrationObject, objectNamespace, objectType, text, valueType, enumIndex ) \
39   Dali::PropertyRegistration DALI_TOKEN_PASTE( property, count ) ( typeRegistrationObject, text, objectNamespace::objectType::Property::enumIndex, Dali::Property::valueType, NULL, &objectType::GetProperty ); \
40   DALI_COMPILE_TIME_ASSERT( ( objectNamespace::objectType::Property::enumIndex - objectNamespace::objectType::PROPERTY_START_INDEX ) == count );
41
42 #define DALI_ANIMATABLE_PROPERTY_REGISTRATION_INTERNAL( count, typeRegistrationObject, objectNamespace, objectType, text, valueType, enumIndex) \
43   Dali::AnimatablePropertyRegistration DALI_TOKEN_PASTE( property, count ) ( typeRegistrationObject, text, objectNamespace::objectType::Property::enumIndex, Dali::Property::valueType );
44
45 #define DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT_INTERNAL( count, typeRegistrationObject, objectNamespace, objectType, text, value, enumIndex) \
46   Dali::AnimatablePropertyRegistration DALI_TOKEN_PASTE( property, count ) ( typeRegistrationObject, text, objectNamespace::objectType::Property::enumIndex, value );
47
48 #define DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION_INTERNAL( count, typeRegistrationObject, objectNamespace, objectType, text, enumIndex, baseEnumIndex, componentIndex) \
49   Dali::AnimatablePropertyComponentRegistration DALI_TOKEN_PASTE( property, count ) ( typeRegistrationObject, text, objectNamespace::objectType::Property::enumIndex, objectNamespace::objectType::Property::baseEnumIndex, componentIndex );
50
51 #define DALI_CHILD_PROPERTY_REGISTRATION_INTERNAL( count, typeRegistrationObject, objectNamespace, objectType, text, valueType, enumIndex ) \
52   Dali::ChildPropertyRegistration DALI_TOKEN_PASTE( property, count ) ( typeRegistrationObject, text, objectNamespace::objectType::ChildProperty::enumIndex, Property::valueType );
53
54 #define DALI_SIGNAL_REGISTRATION_INTERNAL( count, typeRegistrationObject, objectNamespace, objectType, text, textVariable ) \
55   const char* const textVariable = text; \
56   Dali::SignalConnectorType DALI_TOKEN_PASTE( signalConnector, count ) ( typeRegistrationObject, text, &objectNamespace::Internal::objectType::DoConnectSignal );
57
58 #define DALI_ACTION_REGISTRATION_INTERNAL( count, typeRegistrationObject, objectNamespace, objectType, text, textVariable ) \
59   const char* const textVariable = text; \
60   Dali::TypeAction DALI_TOKEN_PASTE( signalConnector, count ) ( typeRegistrationObject, text, &objectNamespace::Internal::objectType::DoAction );
61
62
63 /**
64  * @brief These macros are used to define properties for implementations of CustomActor.
65  * @SINCE_1_1.36
66  *
67  * These macros should be used when defining properties, signals and actions.
68  * They provide the following benefits:
69  * - A standard and consistent way to define properties.
70  * - Concise definition promotes readability, especially with large numbers of properties.
71  * - Provides a built-in compile-time check. This checks the order of the properties within the enumeration match the order of the property macros. Note: This check is not performed for animatable properties.
72  * - Enforces how properties are enumerated in the object handles header file.
73  *
74  * Note: The compile-type check will produce the following message on failure:
75  *       error: invalid application of 'sizeof' to incomplete type 'Dali::CompileTimeAssertBool<false>'
76  *
77  * Macro usage example:
78  *
79  * Within the your object's implementation cpp:
80  * @code
81  * #include <dali/public-api/object/type-registry-helper.h>
82  * ...
83  * DALI_TYPE_REGISTRATION_BEGIN( MyApp::MyCustomActor, Dali::CustomActor, Create )
84  * DALI_PROPERTY_REGISTRATION( MyApp, MyCustomActor, "myProperty", INTEGER, MY_PROPERTY )
85  * DALI_TYPE_REGISTRATION_END()
86  * @endcode
87  *
88  * Within your handle's header:
89  *
90  * @code
91  * #include <dali/public-api/common/dali-common.h>
92  *
93  *
94  * ///< @brief The start and end property ranges for this control.
95  * enum PropertyRange
96  * {
97  *   PROPERTY_START_INDEX = Dali::PROPERTY_REGISTRATION_START_INDEX,
98  *   PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000
99  * };
100  *
101  * ///< @brief Enumeration for the instance of properties belonging to the Button class.
102  * struct Property
103  * {
104  *   enum
105  *   {
106  *     MY_PROPERTY = PROPERTY_START_INDEX    ///< @brief name "myProperty", type Integer
107  *   };
108  * };
109  * @endcode
110  *
111  * Using these macros have certain prerequisites on how the property enumeration is defined.
112  * Please see the Programming Guide (within the generated Doxygen) for full details.
113  */
114 #define DALI_TYPE_REGISTRATION_BEGIN( thisType, baseType, createFunction ) \
115   Dali::TypeRegistration typeRegistration( typeid( thisType ), typeid( baseType ), createFunction );
116
117 #define DALI_TYPE_REGISTRATION_BEGIN_CREATE( thisType, baseType, createFunction, createAtStartup ) \
118   Dali::TypeRegistration typeRegistration( typeid( thisType ), typeid( baseType ), createFunction, createAtStartup );
119
120 #define DALI_PROPERTY_REGISTRATION( objectNamespace, objectType, text, valueType, enumIndex ) \
121   DALI_PROPERTY_REGISTRATION_INTERNAL( __COUNTER__, typeRegistration, objectNamespace, objectType, text, valueType, enumIndex )
122
123 #define DALI_PROPERTY_REGISTRATION_READ_ONLY( objectNamespace, objectType, text, valueType, enumIndex ) \
124   DALI_PROPERTY_REGISTRATION_INTERNAL_READ_ONLY( __COUNTER__, typeRegistration, objectNamespace, objectType, text, valueType, enumIndex )
125
126 #define DALI_ANIMATABLE_PROPERTY_REGISTRATION( objectNamespace, objectType, text, valueType, enumIndex ) \
127   DALI_ANIMATABLE_PROPERTY_REGISTRATION_INTERNAL( __COUNTER__, typeRegistration, objectNamespace, objectType, text, valueType, enumIndex )
128
129 #define DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT( objectNamespace, objectType, text, value, enumIndex ) \
130   DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT_INTERNAL( __COUNTER__, typeRegistration, objectNamespace, objectType, text, value, enumIndex )
131
132 #define DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( objectNamespace, objectType, text, enumIndex, baseEnumIndex, componentIndex ) \
133   DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION_INTERNAL( __COUNTER__, typeRegistration, objectNamespace, objectType, text, enumIndex, baseEnumIndex, componentIndex )
134
135 #define DALI_CHILD_PROPERTY_REGISTRATION( objectNamespace, objectType, text, valueType, enumIndex ) \
136   DALI_CHILD_PROPERTY_REGISTRATION_INTERNAL( __COUNTER__, typeRegistration, objectNamespace, objectType, text, valueType, enumIndex )
137
138 #define DALI_SIGNAL_REGISTRATION( objectNamespace, objectType, text, textVariable ) \
139   DALI_SIGNAL_REGISTRATION_INTERNAL( __COUNTER__, typeRegistration, objectNamespace, objectType, text, textVariable )
140
141 #define DALI_ACTION_REGISTRATION( objectNamespace, objectType, text, textVariable ) \
142   DALI_ACTION_REGISTRATION_INTERNAL( __COUNTER__, typeRegistration, objectNamespace, objectType, text, textVariable )
143
144 #define DALI_TYPE_REGISTRATION_END( ) // This macro exists for consistency and readability.
145
146
147 #endif // __DALI_TYPE_REGISTRY_HELPER_H__