-template<typename _Tp> static inline
-Mat_<_Tp>& operator += (const Mat_<_Tp>& a, const MatExpr& b)
-{
- b.op->augAssignAdd(b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator -= (const Mat& a, const Mat& b)
-{
- subtract(a, b, (Mat&)a);
- return (Mat&)a;
-}
-
-static inline Mat& operator -= (const Mat& a, const Scalar& s)
-{
- subtract(a, s, (Mat&)a);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator -= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
-{
- subtract(a, b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator -= (const Mat_<_Tp>& a, const Scalar& s)
-{
- subtract(a, s, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator -= (const Mat& a, const MatExpr& b)
-{
- b.op->augAssignSubtract(b, (Mat&)a);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator -= (const Mat_<_Tp>& a, const MatExpr& b)
-{
- b.op->augAssignSubtract(b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator *= (const Mat& a, const Mat& b)
-{
- gemm(a, b, 1, Mat(), 0, (Mat&)a, 0);
- return (Mat&)a;
-}
-
-static inline Mat& operator *= (const Mat& a, double s)
-{
- a.convertTo((Mat&)a, -1, s);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator *= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
-{
- gemm(a, b, 1, Mat(), 0, (Mat&)a, 0);
- return (Mat_<_Tp>&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator *= (const Mat_<_Tp>& a, double s)
-{
- a.convertTo((Mat&)a, -1, s);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator *= (const Mat& a, const MatExpr& b)
-{
- b.op->augAssignMultiply(b, (Mat&)a);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator *= (const Mat_<_Tp>& a, const MatExpr& b)
-{
- b.op->augAssignMultiply(b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator /= (const Mat& a, const Mat& b)
-{
- divide(a, b, (Mat&)a);
- return (Mat&)a;
-}
-
-static inline Mat& operator /= (const Mat& a, double s)
-{
- a.convertTo((Mat&)a, -1, 1./s);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
-{
- divide(a, b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, double s)
-{
- a.convertTo((Mat&)a, -1, 1./s);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator /= (const Mat& a, const MatExpr& b)
-{
- b.op->augAssignDivide(b, (Mat&)a);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline
-Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, const MatExpr& b)
-{
- b.op->augAssignDivide(b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-////////////////////////////// Logical operations ///////////////////////////////
-
-static inline Mat& operator &= (const Mat& a, const Mat& b)
-{
- bitwise_and(a, b, (Mat&)a);
- return (Mat&)a;
-}
-
-static inline Mat& operator &= (const Mat& a, const Scalar& s)
-{
- bitwise_and(a, s, (Mat&)a);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline Mat_<_Tp>&
-operator &= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
-{
- bitwise_and(a, b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-template<typename _Tp> static inline Mat_<_Tp>&
-operator &= (const Mat_<_Tp>& a, const Scalar& s)
-{
- bitwise_and(a, s, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator |= (const Mat& a, const Mat& b)
-{
- bitwise_or(a, b, (Mat&)a);
- return (Mat&)a;
-}
-
-static inline Mat& operator |= (const Mat& a, const Scalar& s)
-{
- bitwise_or(a, s, (Mat&)a);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline Mat_<_Tp>&
-operator |= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
-{
- bitwise_or(a, b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-template<typename _Tp> static inline Mat_<_Tp>&
-operator |= (const Mat_<_Tp>& a, const Scalar& s)
-{
- bitwise_or(a, s, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-static inline Mat& operator ^= (const Mat& a, const Mat& b)
-{
- bitwise_xor(a, b, (Mat&)a);
- return (Mat&)a;
-}
-
-static inline Mat& operator ^= (const Mat& a, const Scalar& s)
-{
- bitwise_xor(a, s, (Mat&)a);
- return (Mat&)a;
-}
-
-template<typename _Tp> static inline Mat_<_Tp>&
-operator ^= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
-{
- bitwise_xor(a, b, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-template<typename _Tp> static inline Mat_<_Tp>&
-operator ^= (const Mat_<_Tp>& a, const Scalar& s)
-{
- bitwise_xor(a, s, (Mat&)a);
- return (Mat_<_Tp>&)a;
-}
-
-/////////////////////////////// Miscellaneous operations //////////////////////////////
-
-template<typename _Tp> void split(const Mat& src, vector<Mat_<_Tp> >& mv)
-{ split(src, (vector<Mat>&)mv ); }
-
-//////////////////////////////////////////////////////////////
-
-template<typename _Tp> inline MatExpr Mat_<_Tp>::zeros(int rows, int cols)
-{
- return Mat::zeros(rows, cols, DataType<_Tp>::type);
-}
-
-template<typename _Tp> inline MatExpr Mat_<_Tp>::zeros(Size sz)
-{
- return Mat::zeros(sz, DataType<_Tp>::type);
-}
-
-template<typename _Tp> inline MatExpr Mat_<_Tp>::ones(int rows, int cols)
-{
- return Mat::ones(rows, cols, DataType<_Tp>::type);
-}
-
-template<typename _Tp> inline MatExpr Mat_<_Tp>::ones(Size sz)
-{
- return Mat::ones(sz, DataType<_Tp>::type);
-}
-
-template<typename _Tp> inline MatExpr Mat_<_Tp>::eye(int rows, int cols)
-{
- return Mat::eye(rows, cols, DataType<_Tp>::type);
-}
-
-template<typename _Tp> inline MatExpr Mat_<_Tp>::eye(Size sz)
-{
- return Mat::eye(sz, DataType<_Tp>::type);
-}
-
-//////////////////////////////// Iterators & Comma initializers //////////////////////////////////
-
-inline MatConstIterator::MatConstIterator()
- : m(0), elemSize(0), ptr(0), sliceStart(0), sliceEnd(0) {}
-
-inline MatConstIterator::MatConstIterator(const Mat* _m)
- : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0)
-{
- if( m && m->isContinuous() )
- {
- sliceStart = m->data;
- sliceEnd = sliceStart + m->total()*elemSize;
- }
- seek((const int*)0);
-}
-
-inline MatConstIterator::MatConstIterator(const Mat* _m, int _row, int _col)
- : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0)
-{
- CV_Assert(m && m->dims <= 2);
- if( m->isContinuous() )
- {
- sliceStart = m->data;
- sliceEnd = sliceStart + m->total()*elemSize;
- }
- int idx[]={_row, _col};
- seek(idx);
-}
-
-inline MatConstIterator::MatConstIterator(const Mat* _m, Point _pt)
- : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0)
-{
- CV_Assert(m && m->dims <= 2);
- if( m->isContinuous() )
- {
- sliceStart = m->data;
- sliceEnd = sliceStart + m->total()*elemSize;
- }
- int idx[]={_pt.y, _pt.x};
- seek(idx);
-}
-
-inline MatConstIterator::MatConstIterator(const MatConstIterator& it)
- : m(it.m), elemSize(it.elemSize), ptr(it.ptr), sliceStart(it.sliceStart), sliceEnd(it.sliceEnd)
-{}
-
-inline MatConstIterator& MatConstIterator::operator = (const MatConstIterator& it )
-{
- m = it.m; elemSize = it.elemSize; ptr = it.ptr;
- sliceStart = it.sliceStart; sliceEnd = it.sliceEnd;
- return *this;
-}
-
-inline uchar* MatConstIterator::operator *() const { return ptr; }
-
-inline MatConstIterator& MatConstIterator::operator += (ptrdiff_t ofs)
-{
- if( !m || ofs == 0 )
- return *this;
- ptrdiff_t ofsb = ofs*elemSize;
- ptr += ofsb;
- if( ptr < sliceStart || sliceEnd <= ptr )
- {
- ptr -= ofsb;
- seek(ofs, true);
- }
- return *this;
-}
-
-inline MatConstIterator& MatConstIterator::operator -= (ptrdiff_t ofs)
-{ return (*this += -ofs); }
-
-inline MatConstIterator& MatConstIterator::operator --()
-{
- if( m && (ptr -= elemSize) < sliceStart )
- {
- ptr += elemSize;
- seek(-1, true);
- }
- return *this;
-}
-
-inline MatConstIterator MatConstIterator::operator --(int)
-{
- MatConstIterator b = *this;
- *this += -1;
- return b;
-}
-
-inline MatConstIterator& MatConstIterator::operator ++()
-{
- if( m && (ptr += elemSize) >= sliceEnd )
- {
- ptr -= elemSize;
- seek(1, true);
- }
- return *this;
-}
-
-inline MatConstIterator MatConstIterator::operator ++(int)
-{
- MatConstIterator b = *this;
- *this += 1;
- return b;
-}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>::MatConstIterator_() {}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m)
- : MatConstIterator(_m) {}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>::
- MatConstIterator_(const Mat_<_Tp>* _m, int _row, int _col)
- : MatConstIterator(_m, _row, _col) {}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>::
- MatConstIterator_(const Mat_<_Tp>* _m, Point _pt)
- : MatConstIterator(_m, _pt) {}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>::
- MatConstIterator_(const MatConstIterator_& it)
- : MatConstIterator(it) {}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>&
- MatConstIterator_<_Tp>::operator = (const MatConstIterator_& it )
-{
- MatConstIterator::operator = (it);
- return *this;
-}
-
-template<typename _Tp> inline _Tp MatConstIterator_<_Tp>::operator *() const { return *(_Tp*)(this->ptr); }
-
-template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator += (ptrdiff_t ofs)
-{
- MatConstIterator::operator += (ofs);
- return *this;
-}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator -= (ptrdiff_t ofs)
-{ return (*this += -ofs); }
-
-template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator --()
-{
- MatConstIterator::operator --();
- return *this;
-}
-
-template<typename _Tp> inline MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator --(int)
-{
- MatConstIterator_ b = *this;
- MatConstIterator::operator --();
- return b;
-}
-
-template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator ++()
-{
- MatConstIterator::operator ++();
- return *this;
-}
-
-template<typename _Tp> inline MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator ++(int)
-{
- MatConstIterator_ b = *this;
- MatConstIterator::operator ++();
- return b;
-}
-
-template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_() : MatConstIterator_<_Tp>() {}
-
-template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m)
- : MatConstIterator_<_Tp>(_m) {}
-
-template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, int _row, int _col)
- : MatConstIterator_<_Tp>(_m, _row, _col) {}
-
-template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(const Mat_<_Tp>* _m, Point _pt)
- : MatConstIterator_<_Tp>(_m, _pt) {}
-
-template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(const Mat_<_Tp>* _m, const int* _idx)
- : MatConstIterator_<_Tp>(_m, _idx) {}
-
-template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(const MatIterator_& it)
- : MatConstIterator_<_Tp>(it) {}
-
-template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator = (const MatIterator_<_Tp>& it )
-{
- MatConstIterator::operator = (it);
- return *this;
-}
-
-template<typename _Tp> inline _Tp& MatIterator_<_Tp>::operator *() const { return *(_Tp*)(this->ptr); }
-
-template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator += (ptrdiff_t ofs)
-{
- MatConstIterator::operator += (ofs);
- return *this;
-}
-
-template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator -= (ptrdiff_t ofs)
-{
- MatConstIterator::operator += (-ofs);
- return *this;
-}
-
-template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator --()
-{
- MatConstIterator::operator --();
- return *this;
-}
-
-template<typename _Tp> inline MatIterator_<_Tp> MatIterator_<_Tp>::operator --(int)
-{
- MatIterator_ b = *this;
- MatConstIterator::operator --();
- return b;
-}
-
-template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator ++()
-{
- MatConstIterator::operator ++();
- return *this;
-}
-
-template<typename _Tp> inline MatIterator_<_Tp> MatIterator_<_Tp>::operator ++(int)
-{
- MatIterator_ b = *this;
- MatConstIterator::operator ++();
- return b;
-}
-
-template<typename _Tp> inline Point MatConstIterator_<_Tp>::pos() const
-{
- if( !m )
- return Point();
- CV_DbgAssert( m->dims <= 2 );
- if( m->isContinuous() )
- {
- ptrdiff_t ofs = (const _Tp*)ptr - (const _Tp*)m->data;
- int y = (int)(ofs / m->cols), x = (int)(ofs - (ptrdiff_t)y*m->cols);
- return Point(x, y);
- }
- else
- {
- ptrdiff_t ofs = (uchar*)ptr - m->data;
- int y = (int)(ofs / m->step), x = (int)((ofs - y*m->step)/sizeof(_Tp));
- return Point(x, y);
- }
-}
-
-static inline bool
-operator == (const MatConstIterator& a, const MatConstIterator& b)
-{ return a.m == b.m && a.ptr == b.ptr; }
-
-template<typename _Tp> static inline bool
-operator != (const MatConstIterator& a, const MatConstIterator& b)
-{ return !(a == b); }
-
-template<typename _Tp> static inline bool
-operator == (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
-{ return a.m == b.m && a.ptr == b.ptr; }
-
-template<typename _Tp> static inline bool
-operator != (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
-{ return a.m != b.m || a.ptr != b.ptr; }
-
-template<typename _Tp> static inline bool
-operator == (const MatIterator_<_Tp>& a, const MatIterator_<_Tp>& b)
-{ return a.m == b.m && a.ptr == b.ptr; }
-
-template<typename _Tp> static inline bool
-operator != (const MatIterator_<_Tp>& a, const MatIterator_<_Tp>& b)
-{ return a.m != b.m || a.ptr != b.ptr; }
-
-static inline bool
-operator < (const MatConstIterator& a, const MatConstIterator& b)
-{ return a.ptr < b.ptr; }
-
-static inline bool
-operator > (const MatConstIterator& a, const MatConstIterator& b)
-{ return a.ptr > b.ptr; }
-
-static inline bool
-operator <= (const MatConstIterator& a, const MatConstIterator& b)
-{ return a.ptr <= b.ptr; }
-
-static inline bool
-operator >= (const MatConstIterator& a, const MatConstIterator& b)
-{ return a.ptr >= b.ptr; }
-
-CV_EXPORTS ptrdiff_t operator - (const MatConstIterator& b, const MatConstIterator& a);
-
-static inline MatConstIterator operator + (const MatConstIterator& a, ptrdiff_t ofs)
-{ MatConstIterator b = a; return b += ofs; }
-
-static inline MatConstIterator operator + (ptrdiff_t ofs, const MatConstIterator& a)
-{ MatConstIterator b = a; return b += ofs; }
-
-static inline MatConstIterator operator - (const MatConstIterator& a, ptrdiff_t ofs)
-{ MatConstIterator b = a; return b += -ofs; }
-
-template<typename _Tp> static inline MatConstIterator_<_Tp>
-operator + (const MatConstIterator_<_Tp>& a, ptrdiff_t ofs)
-{ MatConstIterator t = (const MatConstIterator&)a + ofs; return (MatConstIterator_<_Tp>&)t; }
-
-template<typename _Tp> static inline MatConstIterator_<_Tp>
-operator + (ptrdiff_t ofs, const MatConstIterator_<_Tp>& a)
-{ MatConstIterator t = (const MatConstIterator&)a + ofs; return (MatConstIterator_<_Tp>&)t; }
-
-template<typename _Tp> static inline MatConstIterator_<_Tp>
-operator - (const MatConstIterator_<_Tp>& a, ptrdiff_t ofs)
-{ MatConstIterator t = (const MatConstIterator&)a - ofs; return (MatConstIterator_<_Tp>&)t; }
-
-inline uchar* MatConstIterator::operator [](ptrdiff_t i) const
-{ return *(*this + i); }
-
-template<typename _Tp> inline _Tp MatConstIterator_<_Tp>::operator [](ptrdiff_t i) const
-{ return *(_Tp*)MatConstIterator::operator [](i); }
-
-template<typename _Tp> static inline MatIterator_<_Tp>
-operator + (const MatIterator_<_Tp>& a, ptrdiff_t ofs)
-{ MatConstIterator t = (const MatConstIterator&)a + ofs; return (MatIterator_<_Tp>&)t; }
-
-template<typename _Tp> static inline MatIterator_<_Tp>
-operator + (ptrdiff_t ofs, const MatIterator_<_Tp>& a)
-{ MatConstIterator t = (const MatConstIterator&)a + ofs; return (MatIterator_<_Tp>&)t; }
-
-template<typename _Tp> static inline MatIterator_<_Tp>
-operator - (const MatIterator_<_Tp>& a, ptrdiff_t ofs)
-{ MatConstIterator t = (const MatConstIterator&)a - ofs; return (MatIterator_<_Tp>&)t; }
-
-template<typename _Tp> inline _Tp& MatIterator_<_Tp>::operator [](ptrdiff_t i) const
-{ return *(*this + i); }
-
-template<typename _Tp> inline MatConstIterator_<_Tp> Mat_<_Tp>::begin() const
-{ return Mat::begin<_Tp>(); }
-
-template<typename _Tp> inline MatConstIterator_<_Tp> Mat_<_Tp>::end() const
-{ return Mat::end<_Tp>(); }
-
-template<typename _Tp> inline MatIterator_<_Tp> Mat_<_Tp>::begin()
-{ return Mat::begin<_Tp>(); }
-
-template<typename _Tp> inline MatIterator_<_Tp> Mat_<_Tp>::end()
-{ return Mat::end<_Tp>(); }
-
-template<typename _Tp> inline MatCommaInitializer_<_Tp>::MatCommaInitializer_(Mat_<_Tp>* _m) : it(_m) {}
-
-template<typename _Tp> template<typename T2> inline MatCommaInitializer_<_Tp>&
-MatCommaInitializer_<_Tp>::operator , (T2 v)
-{
- CV_DbgAssert( this->it < ((const Mat_<_Tp>*)this->it.m)->end() );
- *this->it = _Tp(v); ++this->it;
- return *this;
-}
-
-template<typename _Tp> inline Mat_<_Tp> MatCommaInitializer_<_Tp>::operator *() const
-{
- CV_DbgAssert( this->it == ((const Mat_<_Tp>*)this->it.m)->end() );
- return Mat_<_Tp>(*this->it.m);
-}
-
-template<typename _Tp> inline MatCommaInitializer_<_Tp>::operator Mat_<_Tp>() const
-{
- CV_DbgAssert( this->it == ((const Mat_<_Tp>*)this->it.m)->end() );
- return Mat_<_Tp>(*this->it.m);
-}
-
-template<typename _Tp, typename T2> static inline MatCommaInitializer_<_Tp>
-operator << (const Mat_<_Tp>& m, T2 val)
-{
- MatCommaInitializer_<_Tp> commaInitializer((Mat_<_Tp>*)&m);
- return (commaInitializer, val);
-}
-
-//////////////////////////////// SparseMat ////////////////////////////////
-
-inline SparseMat::SparseMat()
-: flags(MAGIC_VAL), hdr(0)
-{
-}
-
-inline SparseMat::SparseMat(int _dims, const int* _sizes, int _type)
-: flags(MAGIC_VAL), hdr(0)
-{
- create(_dims, _sizes, _type);
-}
-
-inline SparseMat::SparseMat(const SparseMat& m)
-: flags(m.flags), hdr(m.hdr)
-{
- addref();
-}
-
-inline SparseMat::~SparseMat()
-{
- release();
-}
-
-inline SparseMat& SparseMat::operator = (const SparseMat& m)
-{
- if( this != &m )
- {
- if( m.hdr )
- CV_XADD(&m.hdr->refcount, 1);
- release();
- flags = m.flags;
- hdr = m.hdr;
- }
- return *this;
-}
-
-inline SparseMat& SparseMat::operator = (const Mat& m)
-{ return (*this = SparseMat(m)); }
-
-inline SparseMat SparseMat::clone() const
-{
- SparseMat temp;
- this->copyTo(temp);
- return temp;
-}
-
-
-inline void SparseMat::assignTo( SparseMat& m, int _type ) const
-{
- if( _type < 0 )
- m = *this;
- else
- convertTo(m, _type);
-}
-
-inline void SparseMat::addref()
-{ if( hdr ) CV_XADD(&hdr->refcount, 1); }
-
-inline void SparseMat::release()
-{
- if( hdr && CV_XADD(&hdr->refcount, -1) == 1 )
- delete hdr;
- hdr = 0;
-}
-
-inline size_t SparseMat::elemSize() const
-{ return CV_ELEM_SIZE(flags); }
-
-inline size_t SparseMat::elemSize1() const
-{ return CV_ELEM_SIZE1(flags); }
-
-inline int SparseMat::type() const
-{ return CV_MAT_TYPE(flags); }
-
-inline int SparseMat::depth() const
-{ return CV_MAT_DEPTH(flags); }
-
-inline int SparseMat::channels() const
-{ return CV_MAT_CN(flags); }
-
-inline const int* SparseMat::size() const
-{
- return hdr ? hdr->size : 0;
-}
-
-inline int SparseMat::size(int i) const
-{
- if( hdr )
- {
- CV_DbgAssert((unsigned)i < (unsigned)hdr->dims);
- return hdr->size[i];
- }
- return 0;
-}
-
-inline int SparseMat::dims() const
-{
- return hdr ? hdr->dims : 0;
-}
-
-inline size_t SparseMat::nzcount() const
-{
- return hdr ? hdr->nodeCount : 0;
-}
-
-inline size_t SparseMat::hash(int i0) const
-{
- return (size_t)i0;
-}
-
-inline size_t SparseMat::hash(int i0, int i1) const
-{
- return (size_t)(unsigned)i0*HASH_SCALE + (unsigned)i1;
-}
-
-inline size_t SparseMat::hash(int i0, int i1, int i2) const
-{
- return ((size_t)(unsigned)i0*HASH_SCALE + (unsigned)i1)*HASH_SCALE + (unsigned)i2;
-}
-
-inline size_t SparseMat::hash(const int* idx) const
-{
- size_t h = (unsigned)idx[0];
- if( !hdr )
- return 0;
- int i, d = hdr->dims;
- for( i = 1; i < d; i++ )
- h = h*HASH_SCALE + (unsigned)idx[i];
- return h;
-}
-
-template<typename _Tp> inline _Tp& SparseMat::ref(int i0, size_t* hashval)
-{ return *(_Tp*)((SparseMat*)this)->ptr(i0, true, hashval); }
-
-template<typename _Tp> inline _Tp& SparseMat::ref(int i0, int i1, size_t* hashval)
-{ return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, true, hashval); }
-
-template<typename _Tp> inline _Tp& SparseMat::ref(int i0, int i1, int i2, size_t* hashval)
-{ return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, i2, true, hashval); }
-
-template<typename _Tp> inline _Tp& SparseMat::ref(const int* idx, size_t* hashval)
-{ return *(_Tp*)((SparseMat*)this)->ptr(idx, true, hashval); }
-
-template<typename _Tp> inline _Tp SparseMat::value(int i0, size_t* hashval) const
-{
- const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, false, hashval);
- return p ? *p : _Tp();
-}
-
-template<typename _Tp> inline _Tp SparseMat::value(int i0, int i1, size_t* hashval) const
-{
- const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, false, hashval);
- return p ? *p : _Tp();
-}
-
-template<typename _Tp> inline _Tp SparseMat::value(int i0, int i1, int i2, size_t* hashval) const
-{
- const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, false, hashval);
- return p ? *p : _Tp();
-}
-
-template<typename _Tp> inline _Tp SparseMat::value(const int* idx, size_t* hashval) const
-{
- const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(idx, false, hashval);
- return p ? *p : _Tp();
-}
-
-template<typename _Tp> inline const _Tp* SparseMat::find(int i0, size_t* hashval) const
-{ return (const _Tp*)((SparseMat*)this)->ptr(i0, false, hashval); }
-
-template<typename _Tp> inline const _Tp* SparseMat::find(int i0, int i1, size_t* hashval) const
-{ return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, false, hashval); }
-
-template<typename _Tp> inline const _Tp* SparseMat::find(int i0, int i1, int i2, size_t* hashval) const
-{ return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, false, hashval); }
-
-template<typename _Tp> inline const _Tp* SparseMat::find(const int* idx, size_t* hashval) const
-{ return (const _Tp*)((SparseMat*)this)->ptr(idx, false, hashval); }
-
-template<typename _Tp> inline _Tp& SparseMat::value(Node* n)
-{ return *(_Tp*)((uchar*)n + hdr->valueOffset); }
-
-template<typename _Tp> inline const _Tp& SparseMat::value(const Node* n) const
-{ return *(const _Tp*)((const uchar*)n + hdr->valueOffset); }
-
-inline SparseMat::Node* SparseMat::node(size_t nidx)
-{ return (Node*)(void*)&hdr->pool[nidx]; }
-
-inline const SparseMat::Node* SparseMat::node(size_t nidx) const
-{ return (const Node*)(void*)&hdr->pool[nidx]; }
-
-inline SparseMatIterator SparseMat::begin()
-{ return SparseMatIterator(this); }
-
-inline SparseMatConstIterator SparseMat::begin() const
-{ return SparseMatConstIterator(this); }
-
-inline SparseMatIterator SparseMat::end()
-{ SparseMatIterator it(this); it.seekEnd(); return it; }
-
-inline SparseMatConstIterator SparseMat::end() const
-{ SparseMatConstIterator it(this); it.seekEnd(); return it; }
-
-template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat::begin()
-{ return SparseMatIterator_<_Tp>(this); }
-
-template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat::begin() const
-{ return SparseMatConstIterator_<_Tp>(this); }
-
-template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat::end()
-{ SparseMatIterator_<_Tp> it(this); it.seekEnd(); return it; }
-
-template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat::end() const
-{ SparseMatConstIterator_<_Tp> it(this); it.seekEnd(); return it; }
-
-
-inline SparseMatConstIterator::SparseMatConstIterator()
-: m(0), hashidx(0), ptr(0)
-{
-}
-
-inline SparseMatConstIterator::SparseMatConstIterator(const SparseMatConstIterator& it)
-: m(it.m), hashidx(it.hashidx), ptr(it.ptr)
-{
-}
-
-static inline bool operator == (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2)
-{ return it1.m == it2.m && it1.ptr == it2.ptr; }
-
-static inline bool operator != (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2)
-{ return !(it1 == it2); }
-
-
-inline SparseMatConstIterator& SparseMatConstIterator::operator = (const SparseMatConstIterator& it)
-{
- if( this != &it )
- {
- m = it.m;
- hashidx = it.hashidx;
- ptr = it.ptr;
- }
- return *this;
-}
-
-template<typename _Tp> inline const _Tp& SparseMatConstIterator::value() const
-{ return *(_Tp*)ptr; }
-
-inline const SparseMat::Node* SparseMatConstIterator::node() const
-{
- return ptr && m && m->hdr ?
- (const SparseMat::Node*)(void*)(ptr - m->hdr->valueOffset) : 0;
-}
-
-inline SparseMatConstIterator SparseMatConstIterator::operator ++(int)
-{
- SparseMatConstIterator it = *this;
- ++*this;
- return it;
-}
-
-
-inline void SparseMatConstIterator::seekEnd()
-{
- if( m && m->hdr )
- {
- hashidx = m->hdr->hashtab.size();
- ptr = 0;
- }
-}
-
-inline SparseMatIterator::SparseMatIterator()
-{}
-
-inline SparseMatIterator::SparseMatIterator(SparseMat* _m)
-: SparseMatConstIterator(_m)
-{}
-
-inline SparseMatIterator::SparseMatIterator(const SparseMatIterator& it)
-: SparseMatConstIterator(it)
-{
-}
-
-inline SparseMatIterator& SparseMatIterator::operator = (const SparseMatIterator& it)
-{
- (SparseMatConstIterator&)*this = it;
- return *this;
-}
-
-template<typename _Tp> inline _Tp& SparseMatIterator::value() const
-{ return *(_Tp*)ptr; }
-
-inline SparseMat::Node* SparseMatIterator::node() const
-{
- return (SparseMat::Node*)SparseMatConstIterator::node();
-}
-
-inline SparseMatIterator& SparseMatIterator::operator ++()
-{
- SparseMatConstIterator::operator ++();
- return *this;
-}
-
-inline SparseMatIterator SparseMatIterator::operator ++(int)
-{
- SparseMatIterator it = *this;
- ++*this;
- return it;
-}
-
-
-template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_()
-{ flags = MAGIC_VAL | DataType<_Tp>::type; }
-
-template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(int _dims, const int* _sizes)
-: SparseMat(_dims, _sizes, DataType<_Tp>::type)
-{}
-
-template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const SparseMat& m)
-{
- if( m.type() == DataType<_Tp>::type )
- *this = (const SparseMat_<_Tp>&)m;
- else
- m.convertTo(*this, DataType<_Tp>::type);
-}
-
-template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const SparseMat_<_Tp>& m)
-{
- this->flags = m.flags;
- this->hdr = m.hdr;
- if( this->hdr )
- CV_XADD(&this->hdr->refcount, 1);
-}
-
-template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const Mat& m)
-{
- SparseMat sm(m);
- *this = sm;
-}
-
-template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const CvSparseMat* m)
-{
- SparseMat sm(m);
- *this = sm;
-}
-
-template<typename _Tp> inline SparseMat_<_Tp>&
-SparseMat_<_Tp>::operator = (const SparseMat_<_Tp>& m)
-{
- if( this != &m )
- {
- if( m.hdr ) CV_XADD(&m.hdr->refcount, 1);
- release();
- flags = m.flags;
- hdr = m.hdr;
- }
- return *this;
-}
-
-template<typename _Tp> inline SparseMat_<_Tp>&
-SparseMat_<_Tp>::operator = (const SparseMat& m)
-{
- if( m.type() == DataType<_Tp>::type )
- return (*this = (const SparseMat_<_Tp>&)m);
- m.convertTo(*this, DataType<_Tp>::type);
- return *this;
-}
-
-template<typename _Tp> inline SparseMat_<_Tp>&
-SparseMat_<_Tp>::operator = (const Mat& m)
-{ return (*this = SparseMat(m)); }
-
-template<typename _Tp> inline SparseMat_<_Tp>
-SparseMat_<_Tp>::clone() const
-{
- SparseMat_<_Tp> m;
- this->copyTo(m);
- return m;
-}
-
-template<typename _Tp> inline void
-SparseMat_<_Tp>::create(int _dims, const int* _sizes)
-{
- SparseMat::create(_dims, _sizes, DataType<_Tp>::type);
-}
-
-template<typename _Tp> inline
-SparseMat_<_Tp>::operator CvSparseMat*() const
-{
- return SparseMat::operator CvSparseMat*();
-}
-
-template<typename _Tp> inline int SparseMat_<_Tp>::type() const
-{ return DataType<_Tp>::type; }
-
-template<typename _Tp> inline int SparseMat_<_Tp>::depth() const
-{ return DataType<_Tp>::depth; }
-
-template<typename _Tp> inline int SparseMat_<_Tp>::channels() const
-{ return DataType<_Tp>::channels; }
-
-template<typename _Tp> inline _Tp&
-SparseMat_<_Tp>::ref(int i0, size_t* hashval)
-{ return SparseMat::ref<_Tp>(i0, hashval); }
-
-template<typename _Tp> inline _Tp
-SparseMat_<_Tp>::operator()(int i0, size_t* hashval) const
-{ return SparseMat::value<_Tp>(i0, hashval); }
-
-template<typename _Tp> inline _Tp&
-SparseMat_<_Tp>::ref(int i0, int i1, size_t* hashval)
-{ return SparseMat::ref<_Tp>(i0, i1, hashval); }
-
-template<typename _Tp> inline _Tp
-SparseMat_<_Tp>::operator()(int i0, int i1, size_t* hashval) const
-{ return SparseMat::value<_Tp>(i0, i1, hashval); }
-
-template<typename _Tp> inline _Tp&
-SparseMat_<_Tp>::ref(int i0, int i1, int i2, size_t* hashval)
-{ return SparseMat::ref<_Tp>(i0, i1, i2, hashval); }
-
-template<typename _Tp> inline _Tp
-SparseMat_<_Tp>::operator()(int i0, int i1, int i2, size_t* hashval) const
-{ return SparseMat::value<_Tp>(i0, i1, i2, hashval); }
-
-template<typename _Tp> inline _Tp&
-SparseMat_<_Tp>::ref(const int* idx, size_t* hashval)
-{ return SparseMat::ref<_Tp>(idx, hashval); }
-
-template<typename _Tp> inline _Tp
-SparseMat_<_Tp>::operator()(const int* idx, size_t* hashval) const
-{ return SparseMat::value<_Tp>(idx, hashval); }
-
-template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat_<_Tp>::begin()
-{ return SparseMatIterator_<_Tp>(this); }
-
-template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::begin() const
-{ return SparseMatConstIterator_<_Tp>(this); }
-
-template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat_<_Tp>::end()
-{ SparseMatIterator_<_Tp> it(this); it.seekEnd(); return it; }
-
-template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::end() const
-{ SparseMatConstIterator_<_Tp> it(this); it.seekEnd(); return it; }
-
-template<typename _Tp> inline
-SparseMatConstIterator_<_Tp>::SparseMatConstIterator_()
-{}
-
-template<typename _Tp> inline
-SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat_<_Tp>* _m)
-: SparseMatConstIterator(_m)
-{}
-
-template<typename _Tp> inline
-SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat* _m)
-: SparseMatConstIterator(_m)
-{
- CV_Assert( _m->type() == DataType<_Tp>::type );
-}
-
-template<typename _Tp> inline
-SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMatConstIterator_<_Tp>& it)
-: SparseMatConstIterator(it)
-{}
-
-template<typename _Tp> inline SparseMatConstIterator_<_Tp>&
-SparseMatConstIterator_<_Tp>::operator = (const SparseMatConstIterator_<_Tp>& it)
-{ return reinterpret_cast<SparseMatConstIterator_<_Tp>&>
- (*reinterpret_cast<SparseMatConstIterator*>(this) =
- reinterpret_cast<const SparseMatConstIterator&>(it)); }
-
-template<typename _Tp> inline const _Tp&
-SparseMatConstIterator_<_Tp>::operator *() const
-{ return *(const _Tp*)this->ptr; }
-
-template<typename _Tp> inline SparseMatConstIterator_<_Tp>&
-SparseMatConstIterator_<_Tp>::operator ++()
-{
- SparseMatConstIterator::operator ++();
- return *this;
-}
-
-template<typename _Tp> inline SparseMatConstIterator_<_Tp>
-SparseMatConstIterator_<_Tp>::operator ++(int)
-{
- SparseMatConstIterator_<_Tp> it = *this;
- SparseMatConstIterator::operator ++();
- return it;
-}
-
-template<typename _Tp> inline
-SparseMatIterator_<_Tp>::SparseMatIterator_()
-{}
-
-template<typename _Tp> inline
-SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat_<_Tp>* _m)
-: SparseMatConstIterator_<_Tp>(_m)
-{}
-
-template<typename _Tp> inline
-SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat* _m)
-: SparseMatConstIterator_<_Tp>(_m)
-{}
-
-template<typename _Tp> inline
-SparseMatIterator_<_Tp>::SparseMatIterator_(const SparseMatIterator_<_Tp>& it)
-: SparseMatConstIterator_<_Tp>(it)
-{}
-
-template<typename _Tp> inline SparseMatIterator_<_Tp>&
-SparseMatIterator_<_Tp>::operator = (const SparseMatIterator_<_Tp>& it)
-{ return reinterpret_cast<SparseMatIterator_<_Tp>&>
- (*reinterpret_cast<SparseMatConstIterator*>(this) =
- reinterpret_cast<const SparseMatConstIterator&>(it)); }
-
-template<typename _Tp> inline _Tp&
-SparseMatIterator_<_Tp>::operator *() const
-{ return *(_Tp*)this->ptr; }
-
-template<typename _Tp> inline SparseMatIterator_<_Tp>&
-SparseMatIterator_<_Tp>::operator ++()
-{
- SparseMatConstIterator::operator ++();
- return *this;
-}
-
-template<typename _Tp> inline SparseMatIterator_<_Tp>
-SparseMatIterator_<_Tp>::operator ++(int)
-{
- SparseMatIterator_<_Tp> it = *this;
- SparseMatConstIterator::operator ++();
- return it;
-}
-
-}
-
-#endif
-#endif