#line 1 "/user/cvsspst/ees1cg/RAVL/RAVL-0.7/Core/Container/Array/Array2dSqr3111Iter4.hh"
// This file is part of RAVL, Recognition And Vision Library
// Copyright (C) 2001, University of Surrey
// This code may be redistributed under the terms of the GNU Lesser
// General Public License (LGPL). See the lgpl.licence file for details or
// see http://www.gnu.org/copyleft/lesser.html
// file-header-ends-here
#ifndef RAVL_ARRAY2DSQR3111ITER4_HEADER
#define RAVL_ARRAY2DSQR3111ITER4_HEADER 1
//////////////////////////////////////////////////////////////////
//! rcsid="$Id: Array2dSqr3111Iter4.hh,v 1.6 2002/04/28 21:54:15 craftit Exp $"
//! docentry="Ravl.Core.Arrays.2D"
//! author="Charles Galambos"
//! lib=RavlCore
//! file="Ravl/Core/Container/Array/Array2dSqr3111Iter4.hh"
#include "Ravl/Array2d.hh"
#include "Ravl/BfAcc2Iter4.hh"
namespace RavlN {
//! userlevel=Normal
//: Iterate through an array accessing 3x3 area.
// The square can be accessed with DataBL,DataBR etc...
// which access the following array elements.
// TL TM TR
// ML MM MR
// BL BM BR
// for the first array.
template
class Array2dSqr3111Iter4C
: protected BufferAccess2dIter4C
{
public:
Array2dSqr3111Iter4C()
{}
//: Default constructor.
Array2dSqr3111Iter4C(const Array2dC &narray1,
const Array2dC &narray2,
const Array2dC &narray3,
const Array2dC &narray4
)
: array1(narray1),
array2(narray2),
array3(narray3),
array4(narray4)
{ First(); }
//: Constructor.
bool First() {
rng1 = IndexRangeC(array1.Range2().Min()+1,array1.Range2().Max()-1);
rng2 = array2.Range2();
rng3 = array3.Range2();
rng4 = array4.Range2();
rng2.ClipBy(rng1);
rng3.ClipBy(rng1);
rng4.ClipBy(rng1);
RavlAssertMsg(rng2.Size() == rng1.Size(),"Array2dC 2 Range2() too small.");
RavlAssertMsg(rng3.Size() == rng1.Size(),"Array2dC 3 Range2() too small.");
RavlAssertMsg(rng4.Size() == rng1.Size(),"Array2dC 4 Range2() too small.");
IndexRangeC srng1(array1.Range1().Min()+1,array1.Range1().Max()-1);
IndexRangeC srng2 = array2.Range1();
IndexRangeC srng3 = array3.Range1();
IndexRangeC srng4 = array4.Range1();
srng2.ClipBy(srng1);
srng3.ClipBy(srng1);
srng4.ClipBy(srng1);
RavlAssertMsg(srng2.Size() == srng1.Size(),"Array2dC 2 Range1() too small.");
RavlAssertMsg(srng3.Size() == srng1.Size(),"Array2dC 3 Range1() too small.");
RavlAssertMsg(srng4.Size() == srng1.Size(),"Array2dC 4 Range1() too small.");
if(!rit.First(array1,srng1,
array2,srng2,
array3,srng3,
array4,srng4
)) {
cit.Invalidate();
return false;
}
cit.First(rit.Data1(),rng1,
rit.Data2(),rng2,
rit.Data3(),rng3,
rit.Data4(),rng4
);
if(!cit) {
cit.Invalidate();
return false;
}
up = &((&(rit.Data1()))[-1][rng1.Min()]);
dn = &((&(rit.Data1()))[ 1][rng1.Min()]);
return true;
}
//: Goto first element in the array.
bool Next() {
up++;
dn++;
cit++;
if(cit)
return true;
up = &((rit.Data1())[rng1.Min()]);
dn = &((&(rit.Data1()))[2][rng1.Min()]);
rit++;
if(!rit)
return false;
cit.First(rit.Data1(),rng1,
rit.Data2(),rng2,
rit.Data3(),rng3,
rit.Data4(),rng4
);
return false;
}
//: Goto next element.
bool IsElm() const
{ return cit.IsElm(); }
//: Test if iterator is at a valid element.
operator bool() const
{ return cit.IsElm(); }
//: Test if iterator is at a valid element.
void operator++()
{ Next(); }
//: Goto next element.
void operator++(int)
{ Next(); }
//: Goto next element.
Data1T &DataBL1()
{ return dn[-1]; }
//: Access bottom left data element
const Data1T &DataBL1() const
{ return dn[-1]; }
//: Access bottom left data element
Data1T &DataBM1()
{ return *dn; }
//: Access bottom mid data element
const Data1T &DataBM1() const
{ return *dn; }
//: Access bottom mid data element
Data1T &DataBR1()
{ return dn[1]; }
//: Access bottom right data element
const Data1T &DataBR1() const
{ return dn[1]; }
//: Access bottom right data element
Data1T &DataML1()
{ return (&(cit.Data1()))[-1]; }
//: Access middle left data element
const Data1T &DataML1() const
{ return (&(cit.Data1()))[-1]; }
//: Access middle left data element
Data1T &DataMM1()
{ return cit.Data1(); }
//: Access middle data element
const Data1T &DataMM1() const
{ return cit.Data1(); }
//: Access middle data element
Data1T &Data1()
{ return cit.Data1(); }
//: Access middle data element
const Data1T &Data1() const
{ return cit.Data1(); }
//: Access middle data element
Data1T &DataMR1()
{ return (&(cit.Data1()))[1]; }
//: Access middle right data element
const Data1T &DataMR1() const
{ return (&(cit.Data1()))[1]; }
//: Access middle right data element
Data1T &DataTL1()
{ return up[-1]; }
//: Access top left data element.
const Data1T &DataTL1() const
{ return up[-1]; }
//: Access top left data element
Data1T &DataTM1()
{ return *up; }
//: Access top middle element
const Data1T &DataTM1() const
{ return *up; }
//: Access top middle element
Data1T &DataTR1()
{ return up[1]; }
//: Access top right data element
const Data1T &DataTR1() const
{ return up[1]; }
//: Access top right data element
Data2T &Data2()
{ return cit.Data2(); }
//: Access middle data element of second array.
const Data2T &Data2() const
{ return cit.Data2(); }
//: Access middle data element of second array.
Data3T &Data3()
{ return cit.Data3(); }
//: Access middle data element of 3rd array.
const Data3T &Data3() const
{ return cit.Data3(); }
//: Access middle data element of 3rd array.
Data4T &Data4()
{ return cit.Data4(); }
//: Access middle data element of 4th array.
const Data4T &Data4() const
{ return cit.Data4(); }
//: Access middle data element of 4th array.
protected:
Array2dC array1;
Array2dC array2;
Array2dC array3;
Array2dC array4;
Data1T *up;
Data1T *dn;
};
}
#endif