#endif
#define __CV_VA_NUM_ARGS_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
-#define __CV_VA_NUM_ARGS(...) __CV_VA_NUM_ARGS_HELPER(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+#define __CV_VA_NUM_ARGS(...) __CV_EXPAND(__CV_VA_NUM_ARGS_HELPER(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
#ifdef CV_Func
// keep current value (through OpenCV port file)
#define CV_UNUSED(name) (void)name
-#if defined __GNUC__ && !defined __EXCEPTIONS
-#define CV_TRY
-#define CV_CATCH(A, B) for (A B; false; )
-#define CV_CATCH_ALL if (false)
-#define CV_THROW(A) abort()
-#define CV_RETHROW() abort()
-#else
-#define CV_TRY try
-#define CV_CATCH(A, B) catch(const A & B)
-#define CV_CATCH_ALL catch(...)
-#define CV_THROW(A) throw A
-#define CV_RETHROW() throw
-#endif
-
//! @endcond
// undef problematic defines sometimes defined by system headers (windows.h in particular)
#define CV_CPU_VSX 200
#define CV_CPU_VSX3 201
+#define CV_CPU_RVV 210
+
// CPU features groups
#define CV_CPU_AVX512_SKX 256
#define CV_CPU_AVX512_COMMON 257
CPU_VSX = 200,
CPU_VSX3 = 201,
+ CPU_RVV = 210,
+
CPU_AVX512_SKX = 256, //!< Skylake-X with AVX-512F/CD/BW/DQ/VL
CPU_AVX512_COMMON = 257, //!< Common instructions AVX-512F/CD for all CPUs that support AVX-512
CPU_AVX512_KNL = 258, //!< Knights Landing with AVX-512F/CD/ER/PF
}
Cv64suf;
-#define OPENCV_ABI_COMPATIBILITY 300
+#define OPENCV_ABI_COMPATIBILITY 400
#ifdef __OPENCV_BUILD
-# define DISABLE_OPENCV_24_COMPATIBILITY
+# define DISABLE_OPENCV_3_COMPATIBILITY
# define OPENCV_DISABLE_DEPRECATED_COMPATIBILITY
#endif
#define CV_PROP_RW
#define CV_WRAP
#define CV_WRAP_AS(synonym)
+#define CV_WRAP_MAPPABLE(mappable)
+#define CV_WRAP_PHANTOM(phantom_header)
+#define CV_WRAP_DEFAULT(val)
/****************************************************************************************\
* Matrix type (Mat) *
#define CV_IS_SUBMAT(flags) ((flags) & CV_MAT_SUBMAT_FLAG)
/** Size of each channel item,
- 0x8442211 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
-#define CV_ELEM_SIZE1(type) \
- ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
+ 0x28442211 = 0010 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
+#define CV_ELEM_SIZE1(type) ((0x28442211 >> CV_MAT_DEPTH(type)*4) & 15)
-/** 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */
-#define CV_ELEM_SIZE(type) \
- (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
+#define CV_ELEM_SIZE(type) (CV_MAT_CN(type)*CV_ELEM_SIZE1(type))
#ifndef MIN
# define MIN(a,b) ((a) > (b) ? (b) : (a))
# define MAX(a,b) ((a) < (b) ? (b) : (a))
#endif
+///////////////////////////////////////// Enum operators ///////////////////////////////////////
+
+/**
+
+Provides compatibility operators for both classical and C++11 enum classes,
+as well as exposing the C++11 enum class members for backwards compatibility
+
+@code
+ // Provides operators required for flag enums
+ CV_ENUM_FLAGS(AccessFlag)
+
+ // Exposes the listed members of the enum class AccessFlag to the current namespace
+ CV_ENUM_CLASS_EXPOSE(AccessFlag, ACCESS_READ [, ACCESS_WRITE [, ...] ]);
+@endcode
+*/
+
+#define __CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST) \
+static const EnumType MEMBER_CONST = EnumType::MEMBER_CONST; \
+
+#define __CV_ENUM_CLASS_EXPOSE_2(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_1(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_CLASS_EXPOSE_3(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_2(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_CLASS_EXPOSE_4(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_3(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_CLASS_EXPOSE_5(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_4(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_CLASS_EXPOSE_6(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_5(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_CLASS_EXPOSE_7(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_6(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_CLASS_EXPOSE_8(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_7(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_CLASS_EXPOSE_9(EnumType, MEMBER_CONST, ...) \
+__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \
+__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_8(EnumType, __VA_ARGS__)); \
+
+#define __CV_ENUM_FLAGS_LOGICAL_NOT(EnumType) \
+static inline bool operator!(const EnumType& val) \
+{ \
+ typedef std::underlying_type<EnumType>::type UnderlyingType; \
+ return !static_cast<UnderlyingType>(val); \
+} \
+
+#define __CV_ENUM_FLAGS_LOGICAL_NOT_EQ(Arg1Type, Arg2Type) \
+static inline bool operator!=(const Arg1Type& a, const Arg2Type& b) \
+{ \
+ return static_cast<int>(a) != static_cast<int>(b); \
+} \
+
+#define __CV_ENUM_FLAGS_LOGICAL_EQ(Arg1Type, Arg2Type) \
+static inline bool operator==(const Arg1Type& a, const Arg2Type& b) \
+{ \
+ return static_cast<int>(a) == static_cast<int>(b); \
+} \
+
+#define __CV_ENUM_FLAGS_BITWISE_NOT(EnumType) \
+static inline EnumType operator~(const EnumType& val) \
+{ \
+ typedef std::underlying_type<EnumType>::type UnderlyingType; \
+ return static_cast<EnumType>(~static_cast<UnderlyingType>(val)); \
+} \
+
+#define __CV_ENUM_FLAGS_BITWISE_OR(EnumType, Arg1Type, Arg2Type) \
+static inline EnumType operator|(const Arg1Type& a, const Arg2Type& b) \
+{ \
+ typedef std::underlying_type<EnumType>::type UnderlyingType; \
+ return static_cast<EnumType>(static_cast<UnderlyingType>(a) | static_cast<UnderlyingType>(b)); \
+} \
+
+#define __CV_ENUM_FLAGS_BITWISE_AND(EnumType, Arg1Type, Arg2Type) \
+static inline EnumType operator&(const Arg1Type& a, const Arg2Type& b) \
+{ \
+ typedef std::underlying_type<EnumType>::type UnderlyingType; \
+ return static_cast<EnumType>(static_cast<UnderlyingType>(a) & static_cast<UnderlyingType>(b)); \
+} \
+
+#define __CV_ENUM_FLAGS_BITWISE_XOR(EnumType, Arg1Type, Arg2Type) \
+static inline EnumType operator^(const Arg1Type& a, const Arg2Type& b) \
+{ \
+ typedef std::underlying_type<EnumType>::type UnderlyingType; \
+ return static_cast<EnumType>(static_cast<UnderlyingType>(a) ^ static_cast<UnderlyingType>(b)); \
+} \
+
+#define __CV_ENUM_FLAGS_BITWISE_OR_EQ(EnumType, Arg1Type) \
+static inline EnumType& operator|=(EnumType& _this, const Arg1Type& val) \
+{ \
+ _this = static_cast<EnumType>(static_cast<int>(_this) | static_cast<int>(val)); \
+ return _this; \
+} \
+
+#define __CV_ENUM_FLAGS_BITWISE_AND_EQ(EnumType, Arg1Type) \
+static inline EnumType& operator&=(EnumType& _this, const Arg1Type& val) \
+{ \
+ _this = static_cast<EnumType>(static_cast<int>(_this) & static_cast<int>(val)); \
+ return _this; \
+} \
+
+#define __CV_ENUM_FLAGS_BITWISE_XOR_EQ(EnumType, Arg1Type) \
+static inline EnumType& operator^=(EnumType& _this, const Arg1Type& val) \
+{ \
+ _this = static_cast<EnumType>(static_cast<int>(_this) ^ static_cast<int>(val)); \
+ return _this; \
+} \
+
+#define CV_ENUM_CLASS_EXPOSE(EnumType, ...) \
+__CV_EXPAND(__CV_CAT(__CV_ENUM_CLASS_EXPOSE_, __CV_VA_NUM_ARGS(__VA_ARGS__))(EnumType, __VA_ARGS__)); \
+
+#define CV_ENUM_FLAGS(EnumType) \
+__CV_ENUM_FLAGS_LOGICAL_NOT (EnumType) \
+__CV_ENUM_FLAGS_LOGICAL_EQ (EnumType, int) \
+__CV_ENUM_FLAGS_LOGICAL_NOT_EQ (EnumType, int) \
+ \
+__CV_ENUM_FLAGS_BITWISE_NOT (EnumType) \
+__CV_ENUM_FLAGS_BITWISE_OR (EnumType, EnumType, EnumType) \
+__CV_ENUM_FLAGS_BITWISE_AND (EnumType, EnumType, EnumType) \
+__CV_ENUM_FLAGS_BITWISE_XOR (EnumType, EnumType, EnumType) \
+ \
+__CV_ENUM_FLAGS_BITWISE_OR_EQ (EnumType, EnumType) \
+__CV_ENUM_FLAGS_BITWISE_AND_EQ (EnumType, EnumType) \
+__CV_ENUM_FLAGS_BITWISE_XOR_EQ (EnumType, EnumType) \
+
/****************************************************************************************\
* static analysys *
\****************************************************************************************/
# undef CV_CXX11
# endif
#endif
-
-
-/****************************************************************************************\
-* C++ Move semantics *
-\****************************************************************************************/
-
-#ifndef CV_CXX_MOVE_SEMANTICS
-# if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(_MSC_VER) && _MSC_VER >= 1600)
-# define CV_CXX_MOVE_SEMANTICS 1
-# elif defined(__clang)
-# if __has_feature(cxx_rvalue_references)
-# define CV_CXX_MOVE_SEMANTICS 1
-# endif
-# endif
-#else
-# if CV_CXX_MOVE_SEMANTICS == 0
-# undef CV_CXX_MOVE_SEMANTICS
-# endif
+#ifndef CV_CXX11
+# error "OpenCV 4.x+ requires enabled C++11 support"
#endif
-#ifdef CV_CXX_MOVE_SEMANTICS
+#define CV_CXX_MOVE_SEMANTICS 1
#define CV_CXX_MOVE(x) std::move(x)
-#else
-#define CV_CXX_MOVE(x) (x)
-#endif
-
-
-/****************************************************************************************\
-* C++11 std::array *
-\****************************************************************************************/
-
-#ifndef CV_CXX_STD_ARRAY
-# if __cplusplus >= 201103L || (defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/)
-# define CV_CXX_STD_ARRAY 1
-# include <array>
-# endif
-#else
-# if CV_CXX_STD_ARRAY == 0
-# undef CV_CXX_STD_ARRAY
-# endif
-#endif
-
-
-/****************************************************************************************\
-* C++11 override / final *
-\****************************************************************************************/
-
-#ifndef CV_OVERRIDE
-# ifdef CV_CXX11
-# define CV_OVERRIDE override
-# endif
-#endif
+#define CV_CXX_STD_ARRAY 1
+#include <array>
#ifndef CV_OVERRIDE
-# define CV_OVERRIDE
+# define CV_OVERRIDE override
#endif
-
#ifndef CV_FINAL
-# ifdef CV_CXX11
-# define CV_FINAL final
-# endif
-#endif
-#ifndef CV_FINAL
-# define CV_FINAL
+# define CV_FINAL final
#endif
-/****************************************************************************************\
-* C++11 noexcept *
-\****************************************************************************************/
-
#ifndef CV_NOEXCEPT
# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/)
# define CV_NOEXCEPT noexcept
# define CV_NOEXCEPT
#endif
-
+#ifndef CV_CONSTEXPR
+# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/)
+# define CV_CONSTEXPR constexpr
+# endif
+#endif
+#ifndef CV_CONSTEXPR
+# define CV_CONSTEXPR
+#endif
// Integer types portatibility
#ifdef OPENCV_STDINT_HEADER
public:
#if CV_FP16_TYPE
- float16_t() {}
+ float16_t() : h(0) {}
explicit float16_t(float x) { h = (__fp16)x; }
operator float() const { return (float)h; }
static float16_t fromBits(ushort w)
__fp16 h;
#else
- float16_t() {}
+ float16_t() : w(0) {}
explicit float16_t(float x)
{
#if CV_FP16
out.u = t + (1 << 23);
out.u = (e >= 0x7c00 ? t + 0x38000000 :
- e == 0 ? (out.f -= 6.103515625e-05f, out.u) : t) | sign;
+ e == 0 ? (static_cast<void>(out.f -= 6.103515625e-05f), out.u) : t) | sign;
return out.f;
#endif
}