static assert
authormarina.kolpakova <marina.kolpakova@itseez.com>
Wed, 13 Mar 2013 23:28:48 +0000 (03:28 +0400)
committermarina.kolpakova <marina.kolpakova@itseez.com>
Sun, 24 Mar 2013 20:29:12 +0000 (00:29 +0400)
modules/core/include/opencv2/core/operations.hpp

index dd09f41..8c73349 100644 (file)
 # pragma warning(disable:4127) //conditional expression is constant
 #endif
 
+//////////////// static assert /////////////////
+
+#define CVAUX_CONCAT_EXP(a, b) a##b
+#define CVAUX_CONCAT(a, b) CVAUX_CONCAT_EXP(a,b)
+
+#ifdef __cplusplus
+#  if defined(__clang__)
+#    ifndef __has_extension
+#      define __has_extension __has_feature /* compatibility, for older versions of clang */
+#    endif
+#    if __has_extension(cxx_static_assert)
+#      define CV_StaticAssert(condition, reason)    static_assert((condition), reason " " #condition)
+#    endif
+#  elif defined(__GNUC__)
+#    if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)
+#      define CV_StaticAssert(condition, reason)    static_assert((condition), reason " " #condition)
+#    endif
+#  elif defined(_MSC_VER)
+#    if _MSC_VER >= 1600 /* MSVC 10 */
+#      define CV_StaticAssert(condition, reason)    static_assert((condition), reason " " #condition)
+#    endif
+#  endif
+#  ifndef CV_StaticAssert
+#    if defined(__GNUC__) && (__GNUC__ > 3) && (__GNUC_MINOR__ > 2)
+#      define CV_StaticAssert(condition, reason) ({ extern int __attribute__((error("CV_StaticAssert: " reason " " #condition))) CV_StaticAssert(); ((condition) ? 0 : CV_StaticAssert()), 0; })
+#    else
+       namespace cv {
+         template <bool x> struct CV_StaticAssert_failed;
+         template <> struct CV_StaticAssert_failed<true> { enum { val = 1 }; };
+         template<int x> struct CV_StaticAssert_test{};
+       }
+#      define CV_StaticAssert(condition, reason)\
+         typedef cv::CV_StaticAssert_test< sizeof(cv::CV_StaticAssert_failed< static_cast<bool>(condition) >) > CVAUX_CONCAT(CV_StaticAssert_failed_at_, __LINE__)
+#    endif
+#  endif
+#endif
+
 namespace cv
 {