Merge "[dali-core] add libhyphen-dev library to dali-env" into devel/master
[platform/core/uifw/dali-core.git] / dali / public-api / common / dali-common.h
index b119bdf..a32e4a8 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __DALI_COMMON_H__
-#define __DALI_COMMON_H__
+#ifndef DALI_COMMON_H
+#define DALI_COMMON_H
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 // EXTERNAL INCLUDES
 
-#ifdef EMSCRIPTEN
-#include <emscripten/emscripten.h>
-#endif
-
 /*
- * Definitions for shared library support
+ * Definitions for shared library support.
  *
- * If a library is configured with --enable-exportall or --enable-debug
+ * If a library is built with -DENABLE_EXPORTALL=ON or -DENABLE_DEBUG=ON
  * then HIDE_DALI_INTERNALS is not defined, and nothing is hidden.
- * If it is configured without these options (the default), then HIDE_INTERNALS
+ * If it is built without these options (the default), then HIDE_INTERNALS
  * is defined when building the library, visibility is automatically hidden, and the explicit
  * defines below come into use.
- * When building a library that uses DALI, HIDE_DALI_INTERNALS
+ * When building a library that uses DALI, HIDE_DALI_INTERNALS.
  */
 #if __GNUC__ >= 4
-#  ifndef HIDE_DALI_INTERNALS
-#    define DALI_EXPORT_API
-#    define DALI_IMPORT_API
-#    define DALI_INTERNAL
-#  else
-#    define DALI_EXPORT_API __attribute__ ((visibility ("default")))
-#    define DALI_IMPORT_API __attribute__ ((visibility ("default")))
-#    define DALI_INTERNAL   __attribute__ ((visibility ("hidden")))
-#  endif
+#ifndef HIDE_DALI_INTERNALS
+#define DALI_EXPORT_API
+#define DALI_NO_EXPORT_API
+#define DALI_IMPORT_API
+#define DALI_CORE_API
+#define DALI_INTERNAL
+#else
+#define DALI_EXPORT_API __attribute__((visibility("default")))
+#define DALI_NO_EXPORT_API __attribute__((visibility("hidden")))
+#define DALI_IMPORT_API __attribute__((visibility("default")))
+#define DALI_CORE_API __attribute__((visibility("default")))
+#define DALI_INTERNAL __attribute__((visibility("hidden")))
+#endif
 #else
-/** Visibility attribute to show method definitions */
-#  define DALI_EXPORT_API
+#ifdef WIN32
 /** Visibility attribute to show declarations */
-#  define DALI_IMPORT_API
+#define DALI_EXPORT_API __declspec(dllexport)
+
+#ifdef BUILDING_DALI_CORE
+/** Visibility attribute to hide declarations */
+#define DALI_CORE_API __declspec(dllexport)
+#else
 /** Visibility attribute to hide declarations */
-#  define DALI_INTERNAL
+#define DALI_CORE_API __declspec(dllimport)
 #endif
 
-#if defined (__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
-// C++0x support
-#define _CPP11
 #else
-// C++0x not supported
+/** Visibility attribute to show declarations */
+#define DALI_EXPORT_API
+/** Visibility attribute to show declarations */
+#define DALI_IMPORT_API
+/** Visibility attribute to show declarations */
+#define DALI_CORE_API
 #endif
-
-#ifdef EMSCRIPTEN
-
-#ifndef __clang__
-# error not clang?
+/** Visibility attribute to hide declarations */
+#define DALI_INTERNAL
+#define DALI_NO_EXPORT_API
 #endif
 
-// clang cpp11 check is per feature
-#if !__has_feature(cxx_constexpr)
-# error constexpr needed for compile-time-math. Use -std=c+11
+#ifdef DEPRECATION_WARNING
+#define DALI_DEPRECATED_API __attribute__((__visibility__("default"), deprecated))
+#else
+#define DALI_DEPRECATED_API
 #endif
 
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
+// C++0x support
 #define _CPP11
-
+#else
+// C++0x not supported
 #endif
 
 /**
  * @brief Two macros to provide branch predictor information.
  * DALI_LIKELY should be used when a branch is taken in almost all cases so the
- * branch predictor can avoid pre-fetching the code for else branch
- * DALI_UNLIKELY should be used when a branch is almost never taken
+ * branch predictor can avoid pre-fetching. The code for else branch
+ * DALI_UNLIKELY should be used when a branch is almost never taken.
  * @SINCE_1_0.0
  */
-#define DALI_LIKELY(expression)   __builtin_expect( !!(expression), 1 )
-#define DALI_UNLIKELY(expression) __builtin_expect( !!(expression), 0 )
+#ifdef __GNUC
+#define DALI_LIKELY(expression) __builtin_expect(!!(expression), 1)
+#define DALI_UNLIKELY(expression) __builtin_expect(!!(expression), 0)
+#else
+#define DALI_LIKELY(expression) !!(expression)
+#define DALI_UNLIKELY(expression) !!(expression)
+#endif
 
 /**
- * @brief The DALi namespace
+ * @brief The DALi namespace.
  * @SINCE_1_0.0
  */
 namespace Dali
@@ -103,13 +116,13 @@ namespace Dali
  * @param[in] location Where the assertion occurred
  * @param[in] condition The assertion condition
  */
-DALI_IMPORT_API void DaliAssertMessage( const char* location, const char* condition );
+DALI_CORE_API void DaliAssertMessage(const char* location, const char* condition);
 
 /**
  * @brief Exception class for Dali Core library - Raised by assertions in codebase.
  * @SINCE_1_0.0
  */
-class DALI_IMPORT_API DaliException
+class DALI_CORE_API DaliException
 {
 public:
   /**
@@ -118,10 +131,10 @@ public:
    * Will always display a backtrace when raised in a debug build.
    *
    * @SINCE_1_0.0
-   * @param[in] location  - the location of the assertion
-   * @param[in] condition The assertion condition
+   * @param[in] location The location of the assertion
+   * @param[in] condition The assertion condition
    */
-  DaliException( const char* location, const char* condition );
+  DaliException(const char* location, const char* condition);
 
   const char* location;
   const char* condition;
@@ -130,7 +143,7 @@ public:
 /**
  * @}
  */
-}// Dali
+} // namespace Dali
 
 /**
  * @brief An invariant concurrent assertion to ensure its argument always evaluates TRUE.
@@ -154,39 +167,37 @@ public:
  */
 
 /**
- * @brief Strip assert location for release builds, assert text is descriptive enough
- * This is to save space for low spec devices
+ * @brief Strip assert location for release builds, assert text is descriptive enough.
+ * This is to save space for low spec devices.
  * @SINCE_1_0.0
  */
 #if defined(DEBUG_ENABLED)
+#if defined(WIN32)
+#define ASSERT_LOCATION __FUNCSIG__
+#else
 #define ASSERT_LOCATION __PRETTY_FUNCTION__
+#endif
 #else
 #define ASSERT_LOCATION NULL
 #endif
 
-#ifdef EMSCRIPTEN
-
-#define DALI_ASSERT_ALWAYS(cond)                \
-  if(DALI_UNLIKELY(!(cond))) \
-  { \
-    Dali::DaliAssertMessage( ASSERT_LOCATION, #cond );   \
-    throw Dali::DaliException( ASSERT_LOCATION, #cond );  \
-    EM_ASM(print(new Error().stack)); \
+#define DALI_ASSERT_ALWAYS(cond)                       \
+  if(DALI_UNLIKELY(!(cond)))                           \
+  {                                                    \
+    Dali::DaliAssertMessage(ASSERT_LOCATION, #cond);   \
+    throw Dali::DaliException(ASSERT_LOCATION, #cond); \
   }
-#else
 
-#define DALI_ASSERT_ALWAYS(cond)                \
-  if(DALI_UNLIKELY(!(cond))) \
-  { \
-    Dali::DaliAssertMessage( ASSERT_LOCATION, #cond );   \
-    throw Dali::DaliException( ASSERT_LOCATION, #cond );  \
+#define DALI_ABORT(message)                              \
+  {                                                      \
+    Dali::DaliAssertMessage(ASSERT_LOCATION, message);   \
+    throw Dali::DaliException(ASSERT_LOCATION, message); \
   }
-#endif
 
 /**
  * @brief An invariant concurrent assertion to ensure its argument evaluates TRUE in debug builds.
  *
- * Use this to sanity check algorithms and prevent internal programming errors
+ * Use this to sanity check algorithms and prevent internal programming errors.
  * @SINCE_1_0.0
  */
 #if defined(DEBUG_ENABLED)
@@ -195,4 +206,13 @@ public:
 #define DALI_ASSERT_DEBUG(cond)
 #endif
 
-#endif // __DALI_COMMON_H__
+/// Use DALI_FALLTHROUGH in switch statements where one case is supposed to fall through into another case
+#define DALI_FALLTHROUGH
+#if __GNUC__
+#if __has_cpp_attribute(fallthrough)
+#undef DALI_FALLTHROUGH
+#define DALI_FALLTHROUGH [[fallthrough]]
+#endif
+#endif
+
+#endif // DALI_COMMON_H