1 #ifndef __DALI_COMMON_H__
2 #define __DALI_COMMON_H__
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
27 * Definitions for shared library support
29 * If a library is configured with --enable-exportall or --enable-debug
30 * then HIDE_DALI_INTERNALS is not defined, and nothing is hidden.
31 * If it is configured without these options (the default), then HIDE_INTERNALS
32 * is defined when building the library, visibility is automatically hidden, and the explicit
33 * defines below come into use.
34 * When building a library that uses DALI, HIDE_DALI_INTERNALS
37 # ifndef HIDE_DALI_INTERNALS
38 # define DALI_EXPORT_API
39 # define DALI_IMPORT_API
40 # define DALI_INTERNAL
42 # define DALI_EXPORT_API __attribute__ ((visibility ("default")))
43 # define DALI_IMPORT_API __attribute__ ((visibility ("default")))
44 # define DALI_INTERNAL __attribute__ ((visibility ("hidden")))
47 /** Visibility attribute to show method definitions */
48 # define DALI_EXPORT_API
49 /** Visibility attribute to show declarations */
50 # define DALI_IMPORT_API
51 /** Visibility attribute to hide declarations */
52 # define DALI_INTERNAL
55 #if defined (__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
59 // C++0x not supported
68 // clang cpp11 check is per feature
69 #if !__has_feature(cxx_constexpr)
70 # error constexpr needed for compile-time-math. Use --std=c11
78 * @brief The DALi namespace
84 * @brief Method to log assertion message in DALI_ASSERT_ALWAYS macro below.
86 * @param[in] condition The assertion condition
87 * @param[in] file The file in which the assertion occurred
88 * @param[in] line The line number at which the assertion occured
90 DALI_IMPORT_API void DaliAssertMessage(const char* condition, const char* file, int line);
93 * @brief Exception class for Dali Core library - Raised by assertions in codebase.
95 class DALI_IMPORT_API DaliException
101 * Will always display a backtrace when raised in a debug build.
103 * @param[in] location - the location of the assertion
104 * @param[in] condition - The assertion condition
106 DALI_IMPORT_API DaliException(const char *location, const char* condition);
108 std::string mLocation; ///< Location in code of the assertion
109 std::string mCondition; ///< The assertion string
115 * @brief An invariant concurrent assertion to ensure its argument always evaluates TRUE.
117 * Use this for rules that must always be true regardless of build options.
118 * For example, Actor must only ever have one parent.
119 * To be clear, this test remains compiled into release builds that are deployed
121 * Semantically, a failure of this test is signalling that dali is giving up and
123 * Since we don't catch the exception, a failure on any thread other than event
124 * will propagate up the call stack and kill that thread.
125 * A failure on the event thread may give the application an opportunity to
126 * recover if there is an application-written exception handler on the call
127 * stack between the throw site and the thread root and the application is built
128 * with a compatible ABI.
129 * Handle this macro with care at the level you would if it expanded to:
130 * if(!cond) { exit(EXIT_FAILURE); }
131 * (which it is often equivalent to in effect).
132 * It should not be used for simple parameter validation for instance.
134 #define DALI_ASSERT_ALWAYS(cond) \
137 Dali::DaliAssertMessage(#cond, __FILE__, __LINE__); \
138 throw Dali::DaliException(__PRETTY_FUNCTION__, #cond); \
142 * @brief An invariant concurrent assertion to ensure its argument evaluates TRUE in debug builds.
144 * Use this to sanity check algorithms and prevent internal programming errors
146 #if defined(DEBUG_ENABLED)
147 #define DALI_ASSERT_DEBUG(cond) DALI_ASSERT_ALWAYS(cond)
149 #define DALI_ASSERT_DEBUG(cond)
152 #endif // __DALI_COMMON_H__