winneighb.hh

00001 // Copyright (C) 2001, 2002, 2003  EPITA Research and Development Laboratory
00002 //
00003 // This file is part of the Olena Library.  This library is free
00004 // software; you can redistribute it and/or modify it under the terms
00005 // of the GNU General Public License version 2 as published by the
00006 // Free Software Foundation.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this library; see the file COPYING.  If not, write to
00015 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
00016 // MA 02111-1307, USA.
00017 //
00018 // As a special exception, you may use this file as part of a free
00019 // software library without restriction.  Specifically, if other files
00020 // instantiate templates or use macros or inline functions from this
00021 // file, or you compile this file and link it with other files to
00022 // produce an executable, this file does not by itself cause the
00023 // resulting executable to be covered by the GNU General Public
00024 // License.  This exception does not however invalidate any other
00025 // reasons why the executable file might be covered by the GNU General
00026 // Public License.
00027 
00028 #ifndef OLENA_CORE_WINNEIGHB_HH
00029 # define OLENA_CORE_WINNEIGHB_HH
00030 
00031 # include <mlc/objs.hh>
00032 # include <oln/core/image.hh>
00033 
00034 # include <string>
00035 
00036 namespace oln
00037 {
00038 
00039   template< class Win >
00040   struct winneighb {
00041 
00042     typedef oln_point_type(Win) point;
00043     typedef oln_dpoint_type(Win) dpoint;
00044 
00045     template< class T >
00046     winneighb(const typename Win::abstract_type& win, const T& anchor) :
00047       win_(win.exact()), pos_(0), anchor_(anchor.point_ref()) 
00048     {}
00049 
00050     const point& point_ref() const
00051     {
00052       return cur_;
00053     }
00054 
00055     mlc::begin_type
00056     operator=(mlc::begin_type)
00057     {
00058       pos_ = 0;
00059       cur_ = anchor_ + win_.dp(pos_);
00060       return begin;
00061     }
00062 
00063     mlc::end_type
00064     operator=(mlc::end_type)
00065     {
00066       pos_ = win_.card();
00067       return end;
00068     }
00069 
00070     bool
00071     operator==(mlc::end_type) const
00072     {
00073       return pos_ == win_.card();
00074     }
00075 
00076     bool
00077     operator!=(mlc::end_type) const
00078     {
00079       return pos_ != win_.card();
00080     }
00081 
00082     winneighb&
00083     operator++()
00084     {
00085       precondition(*this != end);
00086       ++pos_;
00087       if (*this != end)
00088         cur_ = anchor_ + win_.dp(pos_);
00089       return *this;
00090     }
00091 
00092     winneighb
00093     operator++(int)
00094     {
00095       precondition(*this != end);
00096       winneighb i = *this;
00097       ++(*this);
00098       return i;
00099     }
00100 
00101     operator point() const
00102     {
00103       precondition(*this != end);
00104       return cur_;
00105     }
00106 
00107     // it's convenient to type `it.cur()' instead of `(point)it' when
00108     // necessary.
00109     point 
00110     cur() const
00111     {
00112       return *this;
00113     }
00114 
00115     static std::string 
00116     name()
00117     {
00118       return std::string("winneighb<") + Win::name() + ">";
00119     }
00120 
00121   private:
00122 
00123     const Win &win_;
00124     unsigned pos_;
00125     const point& anchor_;
00126     point cur_;
00127 
00128   };
00129 
00130 } // end of oln
00131 
00132 #endif // OLENA_CORE_WINNEIGHB_HH

Generated on Thu Apr 15 20:13:15 2004 for Olena by doxygen 1.3.6-20040222