123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- #ifndef OPENCV_CORE_TRAITS_HPP
- #define OPENCV_CORE_TRAITS_HPP
- #include "opencv2/core/cvdef.h"
- namespace cv
- {
- template<typename _Tp> class DataType
- {
- public:
- #ifdef OPENCV_TRAITS_ENABLE_DEPRECATED
- typedef _Tp value_type;
- typedef value_type work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 1,
- depth = -1,
- channels = 1,
- fmt = 0,
- type = CV_MAKETYPE(depth, channels)
- };
- #endif
- };
- template<> class DataType<bool>
- {
- public:
- typedef bool value_type;
- typedef int work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_8U,
- channels = 1,
- fmt = (int)'u',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<uchar>
- {
- public:
- typedef uchar value_type;
- typedef int work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_8U,
- channels = 1,
- fmt = (int)'u',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<schar>
- {
- public:
- typedef schar value_type;
- typedef int work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_8S,
- channels = 1,
- fmt = (int)'c',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<char>
- {
- public:
- typedef schar value_type;
- typedef int work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_8S,
- channels = 1,
- fmt = (int)'c',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<ushort>
- {
- public:
- typedef ushort value_type;
- typedef int work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_16U,
- channels = 1,
- fmt = (int)'w',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<short>
- {
- public:
- typedef short value_type;
- typedef int work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_16S,
- channels = 1,
- fmt = (int)'s',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<int>
- {
- public:
- typedef int value_type;
- typedef value_type work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_32S,
- channels = 1,
- fmt = (int)'i',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<float>
- {
- public:
- typedef float value_type;
- typedef value_type work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_32F,
- channels = 1,
- fmt = (int)'f',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<> class DataType<double>
- {
- public:
- typedef double value_type;
- typedef value_type work_type;
- typedef value_type channel_type;
- typedef value_type vec_type;
- enum { generic_type = 0,
- depth = CV_64F,
- channels = 1,
- fmt = (int)'d',
- type = CV_MAKETYPE(depth, channels)
- };
- };
- template<typename _Tp> class DataDepth
- {
- public:
- enum
- {
- value = DataType<_Tp>::depth,
- fmt = DataType<_Tp>::fmt
- };
- };
- #ifdef OPENCV_TRAITS_ENABLE_DEPRECATED
- template<int _depth> class TypeDepth
- {
- #ifdef OPENCV_TRAITS_ENABLE_LEGACY_DEFAULTS
- enum { depth = CV_USRTYPE1 };
- typedef void value_type;
- #endif
- };
- template<> class TypeDepth<CV_8U>
- {
- enum { depth = CV_8U };
- typedef uchar value_type;
- };
- template<> class TypeDepth<CV_8S>
- {
- enum { depth = CV_8S };
- typedef schar value_type;
- };
- template<> class TypeDepth<CV_16U>
- {
- enum { depth = CV_16U };
- typedef ushort value_type;
- };
- template<> class TypeDepth<CV_16S>
- {
- enum { depth = CV_16S };
- typedef short value_type;
- };
- template<> class TypeDepth<CV_32S>
- {
- enum { depth = CV_32S };
- typedef int value_type;
- };
- template<> class TypeDepth<CV_32F>
- {
- enum { depth = CV_32F };
- typedef float value_type;
- };
- template<> class TypeDepth<CV_64F>
- {
- enum { depth = CV_64F };
- typedef double value_type;
- };
- #endif
- namespace traits {
- namespace internal {
- #define CV_CREATE_MEMBER_CHECK(X) \
- template<typename T> class CheckMember_##X { \
- struct Fallback { int X; }; \
- struct Derived : T, Fallback { }; \
- template<typename U, U> struct Check; \
- typedef char CV_NO[1]; \
- typedef char CV_YES[2]; \
- template<typename U> static CV_NO & func(Check<int Fallback::*, &U::X> *); \
- template<typename U> static CV_YES & func(...); \
- public: \
- typedef CheckMember_##X type; \
- enum { value = sizeof(func<Derived>(0)) == sizeof(CV_YES) }; \
- };
- CV_CREATE_MEMBER_CHECK(fmt)
- CV_CREATE_MEMBER_CHECK(type)
- }
- template<typename T>
- struct Depth
- { enum { value = DataType<T>::depth }; };
- template<typename T>
- struct Type
- { enum { value = DataType<T>::type }; };
- template<typename T, bool available = internal::CheckMember_type< DataType<T> >::value >
- struct SafeType {};
- template<typename T>
- struct SafeType<T, false>
- { enum { value = -1 }; };
- template<typename T>
- struct SafeType<T, true>
- { enum { value = Type<T>::value }; };
- template<typename T, bool available = internal::CheckMember_fmt< DataType<T> >::value >
- struct SafeFmt {};
- template<typename T>
- struct SafeFmt<T, false>
- { enum { fmt = 0 }; };
- template<typename T>
- struct SafeFmt<T, true>
- { enum { fmt = DataType<T>::fmt }; };
- }
- }
- #endif
|