12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040 |
- #ifndef OPENCV_CORE_CVSTD_HPP
- #define OPENCV_CORE_CVSTD_HPP
- #ifndef __cplusplus
- # error cvstd.hpp header must be compiled as C++
- #endif
- #include "opencv2/core/cvdef.h"
- #include <cstddef>
- #include <cstring>
- #include <cctype>
- #include <string>
- # include <algorithm>
- # include <utility>
- # include <cstdlib>
- # include <cmath>
- namespace cv
- {
- static inline uchar abs(uchar a) { return a; }
- static inline ushort abs(ushort a) { return a; }
- static inline unsigned abs(unsigned a) { return a; }
- static inline uint64 abs(uint64 a) { return a; }
- using std::min;
- using std::max;
- using std::abs;
- using std::swap;
- using std::sqrt;
- using std::exp;
- using std::pow;
- using std::log;
- }
- namespace cv {
- CV_EXPORTS void* fastMalloc(size_t bufSize);
- CV_EXPORTS void fastFree(void* ptr);
- template<typename _Tp> class Allocator
- {
- public:
- typedef _Tp value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- template<typename U> class rebind { typedef Allocator<U> other; };
- explicit Allocator() {}
- ~Allocator() {}
- explicit Allocator(Allocator const&) {}
- template<typename U>
- explicit Allocator(Allocator<U> const&) {}
-
- pointer address(reference r) { return &r; }
- const_pointer address(const_reference r) { return &r; }
- pointer allocate(size_type count, const void* =0) { return reinterpret_cast<pointer>(fastMalloc(count * sizeof (_Tp))); }
- void deallocate(pointer p, size_type) { fastFree(p); }
- void construct(pointer p, const _Tp& v) { new(static_cast<void*>(p)) _Tp(v); }
- void destroy(pointer p) { p->~_Tp(); }
- size_type max_size() const { return cv::max(static_cast<_Tp>(-1)/sizeof(_Tp), 1); }
- };
- namespace detail
- {
- template<typename T>
- struct RefOrVoid { typedef T& type; };
- template<>
- struct RefOrVoid<void>{ typedef void type; };
- template<>
- struct RefOrVoid<const void>{ typedef const void type; };
- template<>
- struct RefOrVoid<volatile void>{ typedef volatile void type; };
- template<>
- struct RefOrVoid<const volatile void>{ typedef const volatile void type; };
- struct PtrOwner;
- }
- template<typename Y>
- struct DefaultDeleter
- {
- void operator () (Y* p) const;
- };
- template<typename T>
- struct Ptr
- {
-
- typedef T element_type;
-
- Ptr();
-
- template<typename Y>
- #ifdef DISABLE_OPENCV_24_COMPATIBILITY
- explicit
- #endif
- Ptr(Y* p);
-
- template<typename Y, typename D>
- Ptr(Y* p, D d);
-
- Ptr(const Ptr& o);
-
- template<typename Y>
- Ptr(const Ptr<Y>& o);
-
- template<typename Y>
- Ptr(const Ptr<Y>& o, T* p);
-
- ~Ptr();
-
- Ptr& operator = (const Ptr& o);
-
- template<typename Y>
- Ptr& operator = (const Ptr<Y>& o);
-
- void release();
-
- template<typename Y>
- void reset(Y* p);
-
- template<typename Y, typename D>
- void reset(Y* p, D d);
-
- void swap(Ptr& o);
-
- T* get() const;
-
- typename detail::RefOrVoid<T>::type operator * () const;
-
- T* operator -> () const;
-
- operator T* () const;
-
- bool empty() const;
-
- template<typename Y>
- Ptr<Y> staticCast() const;
-
- template<typename Y>
- Ptr<Y> constCast() const;
-
- template<typename Y>
- Ptr<Y> dynamicCast() const;
- #ifdef CV_CXX_MOVE_SEMANTICS
- Ptr(Ptr&& o);
- Ptr& operator = (Ptr&& o);
- #endif
- private:
- detail::PtrOwner* owner;
- T* stored;
- template<typename Y>
- friend struct Ptr;
- };
- template<typename T>
- void swap(Ptr<T>& ptr1, Ptr<T>& ptr2);
- template<typename T>
- bool operator == (const Ptr<T>& ptr1, const Ptr<T>& ptr2);
- template<typename T>
- bool operator != (const Ptr<T>& ptr1, const Ptr<T>& ptr2);
- template<typename T>
- Ptr<T> makePtr();
- template<typename T, typename A1>
- Ptr<T> makePtr(const A1& a1);
- template<typename T, typename A1, typename A2>
- Ptr<T> makePtr(const A1& a1, const A2& a2);
- template<typename T, typename A1, typename A2, typename A3>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3);
- template<typename T, typename A1, typename A2, typename A3, typename A4>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4);
- template<typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5);
- template<typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6);
- template<typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7);
- template<typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8);
- template<typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9);
- template<typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
- Ptr<T> makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10);
- class CV_EXPORTS FileNode;
- class CV_EXPORTS String
- {
- public:
- typedef char value_type;
- typedef char& reference;
- typedef const char& const_reference;
- typedef char* pointer;
- typedef const char* const_pointer;
- typedef ptrdiff_t difference_type;
- typedef size_t size_type;
- typedef char* iterator;
- typedef const char* const_iterator;
- static const size_t npos = size_t(-1);
- String();
- String(const String& str);
- String(const String& str, size_t pos, size_t len = npos);
- String(const char* s);
- String(const char* s, size_t n);
- String(size_t n, char c);
- String(const char* first, const char* last);
- template<typename Iterator> String(Iterator first, Iterator last);
- explicit String(const FileNode& fn);
- ~String();
- String& operator=(const String& str);
- String& operator=(const char* s);
- String& operator=(char c);
- String& operator+=(const String& str);
- String& operator+=(const char* s);
- String& operator+=(char c);
- size_t size() const;
- size_t length() const;
- char operator[](size_t idx) const;
- char operator[](int idx) const;
- const char* begin() const;
- const char* end() const;
- const char* c_str() const;
- bool empty() const;
- void clear();
- int compare(const char* s) const;
- int compare(const String& str) const;
- void swap(String& str);
- String substr(size_t pos = 0, size_t len = npos) const;
- size_t find(const char* s, size_t pos, size_t n) const;
- size_t find(char c, size_t pos = 0) const;
- size_t find(const String& str, size_t pos = 0) const;
- size_t find(const char* s, size_t pos = 0) const;
- size_t rfind(const char* s, size_t pos, size_t n) const;
- size_t rfind(char c, size_t pos = npos) const;
- size_t rfind(const String& str, size_t pos = npos) const;
- size_t rfind(const char* s, size_t pos = npos) const;
- size_t find_first_of(const char* s, size_t pos, size_t n) const;
- size_t find_first_of(char c, size_t pos = 0) const;
- size_t find_first_of(const String& str, size_t pos = 0) const;
- size_t find_first_of(const char* s, size_t pos = 0) const;
- size_t find_last_of(const char* s, size_t pos, size_t n) const;
- size_t find_last_of(char c, size_t pos = npos) const;
- size_t find_last_of(const String& str, size_t pos = npos) const;
- size_t find_last_of(const char* s, size_t pos = npos) const;
- friend String operator+ (const String& lhs, const String& rhs);
- friend String operator+ (const String& lhs, const char* rhs);
- friend String operator+ (const char* lhs, const String& rhs);
- friend String operator+ (const String& lhs, char rhs);
- friend String operator+ (char lhs, const String& rhs);
- String toLowerCase() const;
- String(const std::string& str);
- String(const std::string& str, size_t pos, size_t len = npos);
- String& operator=(const std::string& str);
- String& operator+=(const std::string& str);
- operator std::string() const;
- friend String operator+ (const String& lhs, const std::string& rhs);
- friend String operator+ (const std::string& lhs, const String& rhs);
- private:
- char* cstr_;
- size_t len_;
- char* allocate(size_t len);
- void deallocate();
- String(int);
- };
- inline
- String::String()
- : cstr_(0), len_(0)
- {}
- inline
- String::String(const String& str)
- : cstr_(str.cstr_), len_(str.len_)
- {
- if (cstr_)
- CV_XADD(((int*)cstr_)-1, 1);
- }
- inline
- String::String(const String& str, size_t pos, size_t len)
- : cstr_(0), len_(0)
- {
- pos = min(pos, str.len_);
- len = min(str.len_ - pos, len);
- if (!len) return;
- if (len == str.len_)
- {
- CV_XADD(((int*)str.cstr_)-1, 1);
- cstr_ = str.cstr_;
- len_ = str.len_;
- return;
- }
- memcpy(allocate(len), str.cstr_ + pos, len);
- }
- inline
- String::String(const char* s)
- : cstr_(0), len_(0)
- {
- if (!s) return;
- size_t len = strlen(s);
- if (!len) return;
- memcpy(allocate(len), s, len);
- }
- inline
- String::String(const char* s, size_t n)
- : cstr_(0), len_(0)
- {
- if (!n) return;
- if (!s) return;
- memcpy(allocate(n), s, n);
- }
- inline
- String::String(size_t n, char c)
- : cstr_(0), len_(0)
- {
- if (!n) return;
- memset(allocate(n), c, n);
- }
- inline
- String::String(const char* first, const char* last)
- : cstr_(0), len_(0)
- {
- size_t len = (size_t)(last - first);
- if (!len) return;
- memcpy(allocate(len), first, len);
- }
- template<typename Iterator> inline
- String::String(Iterator first, Iterator last)
- : cstr_(0), len_(0)
- {
- size_t len = (size_t)(last - first);
- if (!len) return;
- char* str = allocate(len);
- while (first != last)
- {
- *str++ = *first;
- ++first;
- }
- }
- inline
- String::~String()
- {
- deallocate();
- }
- inline
- String& String::operator=(const String& str)
- {
- if (&str == this) return *this;
- deallocate();
- if (str.cstr_) CV_XADD(((int*)str.cstr_)-1, 1);
- cstr_ = str.cstr_;
- len_ = str.len_;
- return *this;
- }
- inline
- String& String::operator=(const char* s)
- {
- deallocate();
- if (!s) return *this;
- size_t len = strlen(s);
- if (len) memcpy(allocate(len), s, len);
- return *this;
- }
- inline
- String& String::operator=(char c)
- {
- deallocate();
- allocate(1)[0] = c;
- return *this;
- }
- inline
- String& String::operator+=(const String& str)
- {
- *this = *this + str;
- return *this;
- }
- inline
- String& String::operator+=(const char* s)
- {
- *this = *this + s;
- return *this;
- }
- inline
- String& String::operator+=(char c)
- {
- *this = *this + c;
- return *this;
- }
- inline
- size_t String::size() const
- {
- return len_;
- }
- inline
- size_t String::length() const
- {
- return len_;
- }
- inline
- char String::operator[](size_t idx) const
- {
- return cstr_[idx];
- }
- inline
- char String::operator[](int idx) const
- {
- return cstr_[idx];
- }
- inline
- const char* String::begin() const
- {
- return cstr_;
- }
- inline
- const char* String::end() const
- {
- return len_ ? cstr_ + len_ : NULL;
- }
- inline
- bool String::empty() const
- {
- return len_ == 0;
- }
- inline
- const char* String::c_str() const
- {
- return cstr_ ? cstr_ : "";
- }
- inline
- void String::swap(String& str)
- {
- cv::swap(cstr_, str.cstr_);
- cv::swap(len_, str.len_);
- }
- inline
- void String::clear()
- {
- deallocate();
- }
- inline
- int String::compare(const char* s) const
- {
- if (cstr_ == s) return 0;
- return strcmp(c_str(), s);
- }
- inline
- int String::compare(const String& str) const
- {
- if (cstr_ == str.cstr_) return 0;
- return strcmp(c_str(), str.c_str());
- }
- inline
- String String::substr(size_t pos, size_t len) const
- {
- return String(*this, pos, len);
- }
- inline
- size_t String::find(const char* s, size_t pos, size_t n) const
- {
- if (n == 0 || pos + n > len_) return npos;
- const char* lmax = cstr_ + len_ - n;
- for (const char* i = cstr_ + pos; i <= lmax; ++i)
- {
- size_t j = 0;
- while (j < n && s[j] == i[j]) ++j;
- if (j == n) return (size_t)(i - cstr_);
- }
- return npos;
- }
- inline
- size_t String::find(char c, size_t pos) const
- {
- return find(&c, pos, 1);
- }
- inline
- size_t String::find(const String& str, size_t pos) const
- {
- return find(str.c_str(), pos, str.len_);
- }
- inline
- size_t String::find(const char* s, size_t pos) const
- {
- if (pos >= len_ || !s[0]) return npos;
- const char* lmax = cstr_ + len_;
- for (const char* i = cstr_ + pos; i < lmax; ++i)
- {
- size_t j = 0;
- while (s[j] && s[j] == i[j])
- { if(i + j >= lmax) return npos;
- ++j;
- }
- if (!s[j]) return (size_t)(i - cstr_);
- }
- return npos;
- }
- inline
- size_t String::rfind(const char* s, size_t pos, size_t n) const
- {
- if (n > len_) return npos;
- if (pos > len_ - n) pos = len_ - n;
- for (const char* i = cstr_ + pos; i >= cstr_; --i)
- {
- size_t j = 0;
- while (j < n && s[j] == i[j]) ++j;
- if (j == n) return (size_t)(i - cstr_);
- }
- return npos;
- }
- inline
- size_t String::rfind(char c, size_t pos) const
- {
- return rfind(&c, pos, 1);
- }
- inline
- size_t String::rfind(const String& str, size_t pos) const
- {
- return rfind(str.c_str(), pos, str.len_);
- }
- inline
- size_t String::rfind(const char* s, size_t pos) const
- {
- return rfind(s, pos, strlen(s));
- }
- inline
- size_t String::find_first_of(const char* s, size_t pos, size_t n) const
- {
- if (n == 0 || pos + n > len_) return npos;
- const char* lmax = cstr_ + len_;
- for (const char* i = cstr_ + pos; i < lmax; ++i)
- {
- for (size_t j = 0; j < n; ++j)
- if (s[j] == *i)
- return (size_t)(i - cstr_);
- }
- return npos;
- }
- inline
- size_t String::find_first_of(char c, size_t pos) const
- {
- return find_first_of(&c, pos, 1);
- }
- inline
- size_t String::find_first_of(const String& str, size_t pos) const
- {
- return find_first_of(str.c_str(), pos, str.len_);
- }
- inline
- size_t String::find_first_of(const char* s, size_t pos) const
- {
- if (len_ == 0) return npos;
- if (pos >= len_ || !s[0]) return npos;
- const char* lmax = cstr_ + len_;
- for (const char* i = cstr_ + pos; i < lmax; ++i)
- {
- for (size_t j = 0; s[j]; ++j)
- if (s[j] == *i)
- return (size_t)(i - cstr_);
- }
- return npos;
- }
- inline
- size_t String::find_last_of(const char* s, size_t pos, size_t n) const
- {
- if (len_ == 0) return npos;
- if (pos >= len_) pos = len_ - 1;
- for (const char* i = cstr_ + pos; i >= cstr_; --i)
- {
- for (size_t j = 0; j < n; ++j)
- if (s[j] == *i)
- return (size_t)(i - cstr_);
- }
- return npos;
- }
- inline
- size_t String::find_last_of(char c, size_t pos) const
- {
- return find_last_of(&c, pos, 1);
- }
- inline
- size_t String::find_last_of(const String& str, size_t pos) const
- {
- return find_last_of(str.c_str(), pos, str.len_);
- }
- inline
- size_t String::find_last_of(const char* s, size_t pos) const
- {
- if (len_ == 0) return npos;
- if (pos >= len_) pos = len_ - 1;
- for (const char* i = cstr_ + pos; i >= cstr_; --i)
- {
- for (size_t j = 0; s[j]; ++j)
- if (s[j] == *i)
- return (size_t)(i - cstr_);
- }
- return npos;
- }
- inline
- String String::toLowerCase() const
- {
- if (!cstr_)
- return String();
- String res(cstr_, len_);
- for (size_t i = 0; i < len_; ++i)
- res.cstr_[i] = (char) ::tolower(cstr_[i]);
- return res;
- }
- inline
- String operator + (const String& lhs, const String& rhs)
- {
- String s;
- s.allocate(lhs.len_ + rhs.len_);
- if (lhs.len_) memcpy(s.cstr_, lhs.cstr_, lhs.len_);
- if (rhs.len_) memcpy(s.cstr_ + lhs.len_, rhs.cstr_, rhs.len_);
- return s;
- }
- inline
- String operator + (const String& lhs, const char* rhs)
- {
- String s;
- size_t rhslen = strlen(rhs);
- s.allocate(lhs.len_ + rhslen);
- if (lhs.len_) memcpy(s.cstr_, lhs.cstr_, lhs.len_);
- if (rhslen) memcpy(s.cstr_ + lhs.len_, rhs, rhslen);
- return s;
- }
- inline
- String operator + (const char* lhs, const String& rhs)
- {
- String s;
- size_t lhslen = strlen(lhs);
- s.allocate(lhslen + rhs.len_);
- if (lhslen) memcpy(s.cstr_, lhs, lhslen);
- if (rhs.len_) memcpy(s.cstr_ + lhslen, rhs.cstr_, rhs.len_);
- return s;
- }
- inline
- String operator + (const String& lhs, char rhs)
- {
- String s;
- s.allocate(lhs.len_ + 1);
- if (lhs.len_) memcpy(s.cstr_, lhs.cstr_, lhs.len_);
- s.cstr_[lhs.len_] = rhs;
- return s;
- }
- inline
- String operator + (char lhs, const String& rhs)
- {
- String s;
- s.allocate(rhs.len_ + 1);
- s.cstr_[0] = lhs;
- if (rhs.len_) memcpy(s.cstr_ + 1, rhs.cstr_, rhs.len_);
- return s;
- }
- static inline bool operator== (const String& lhs, const String& rhs) { return 0 == lhs.compare(rhs); }
- static inline bool operator== (const char* lhs, const String& rhs) { return 0 == rhs.compare(lhs); }
- static inline bool operator== (const String& lhs, const char* rhs) { return 0 == lhs.compare(rhs); }
- static inline bool operator!= (const String& lhs, const String& rhs) { return 0 != lhs.compare(rhs); }
- static inline bool operator!= (const char* lhs, const String& rhs) { return 0 != rhs.compare(lhs); }
- static inline bool operator!= (const String& lhs, const char* rhs) { return 0 != lhs.compare(rhs); }
- static inline bool operator< (const String& lhs, const String& rhs) { return lhs.compare(rhs) < 0; }
- static inline bool operator< (const char* lhs, const String& rhs) { return rhs.compare(lhs) > 0; }
- static inline bool operator< (const String& lhs, const char* rhs) { return lhs.compare(rhs) < 0; }
- static inline bool operator<= (const String& lhs, const String& rhs) { return lhs.compare(rhs) <= 0; }
- static inline bool operator<= (const char* lhs, const String& rhs) { return rhs.compare(lhs) >= 0; }
- static inline bool operator<= (const String& lhs, const char* rhs) { return lhs.compare(rhs) <= 0; }
- static inline bool operator> (const String& lhs, const String& rhs) { return lhs.compare(rhs) > 0; }
- static inline bool operator> (const char* lhs, const String& rhs) { return rhs.compare(lhs) < 0; }
- static inline bool operator> (const String& lhs, const char* rhs) { return lhs.compare(rhs) > 0; }
- static inline bool operator>= (const String& lhs, const String& rhs) { return lhs.compare(rhs) >= 0; }
- static inline bool operator>= (const char* lhs, const String& rhs) { return rhs.compare(lhs) <= 0; }
- static inline bool operator>= (const String& lhs, const char* rhs) { return lhs.compare(rhs) >= 0; }
- }
- namespace std
- {
- static inline void swap(cv::String& a, cv::String& b) { a.swap(b); }
- }
- #include "opencv2/core/ptr.inl.hpp"
- #endif
|