
Index: ChangeLog from Nicolas Ballas <ballas@lrde.epita.fr> New rle_encode function. * oln/core/encode, * oln/core/encode/rle_encode.hh: New encode/rle_encode.hh | 81 ++++++++++++++++++++++++++++++++++++++ rle/rle_image.hh | 34 ++++++++++------ rle/rle_pset.hh | 108 ++++++++++++++++++++++++++++++++++++--------------- rle/rle_psite.hh | 29 +------------ 4 files changed, 185 insertions(+), 67 deletions(-) Index: oln/core/rle/rle_image.hh --- oln/core/rle/rle_image.hh (revision 872) +++ oln/core/rle/rle_image.hh (working copy) @@ -67,7 +67,6 @@ typedef rle_psite<P> psite; typedef rle_pset<point> pset; -// typedef typename pset::box box; typedef mlc::none plain; @@ -75,7 +74,19 @@ }; - // Rle image class + /* + ** \class rle_image + ** \brief rle image (use a pair of point range and value as representation) + ** + ** method: + ** pset impl_points() const : return image pset + ** box impl_bbox() const : return image bbox + ** bool impl_has(const point& p) const : rle_image has p? + ** bool impl_owns_(const psite& p) const : same has impl_has + ** void insert(const point& p, unsigned len, value val) : insert a new range on the image + ** rvalue impl_read(const psite& p) const : return value associated to psite (for reading) + ** lvalue impl_read_write(const psite& p) : lvalue impl_read_write(const psite& p) (for writing) + */ template < typename P, typename T> class rle_image : public internal::primitive_image_< rle_image<P, T> > { @@ -136,7 +147,7 @@ bool rle_image<P, T>::impl_owns_(const typename rle_image<P, T>::psite& p) const { - return this->data_->first.has(p); + return this->data_->first.has(p.start_); } template <typename P, typename T> @@ -151,21 +162,22 @@ typename rle_image<P, T>::rvalue rle_image<P, T>::impl_read(const rle_image<P, T>::psite& ps) const { - // precondition(p.iterator_() != this->data_->second.end()); - return this->data_->second[ps]; + typename std::map<point, value>::const_iterator irun; + + irun = this->data_->second.find(ps.start_); + assert(irun != this->data_->second.end() && ps.index_ < this->data_->first.range_len_(ps.start_)); + return irun->second; } - int a = 5; template <typename P, typename T> typename rle_image<P, T>::lvalue rle_image<P, T>::impl_read_write(const rle_image<P, T>::psite& ps) { - std::cout << "read_write: " << std::endl; - std::cout << (point)ps << std::endl; + typename std::map<point, value>::iterator irun; - // precondition(p.iterator_() != this->data_->second.end()); - //return this->data_->second[ps]; - return a; + irun = this->data_->second.find(ps.start_); + assert(irun != this->data_->second.end() && ps.index_ < this->data_->first.range_len_(ps.start_)); + return irun->second; } # endif // !OLN_INCLUDE_ONLY Index: oln/core/rle/rle_psite.hh --- oln/core/rle/rle_psite.hh (revision 872) +++ oln/core/rle/rle_psite.hh (working copy) @@ -43,16 +43,16 @@ ** \class rle_piste ** \brief psite for rle image ** - ** - ** + ** Note: P must be a point type + ** method: + ** to_point: convert the psite to corresponding point + ** operator P(): convert psite to the corresponding point */ template <typename P> class rle_psite { public: rle_psite(); - // template <typename T> -// rle_psite(const rle_image<P, T>& ima, const P& p); P to_point() const; operator P () const; @@ -68,27 +68,6 @@ { } -// template <typename P> -// template <typename T> -// rle_psite<P>::rle_psite(const rle_image<P, T>& ima, const P& p) : start_(p) -// { -// P pend; - -// typename rle_image<P, T>::piter it (ima.points()); - -// for (it.start(); it.is_valid(); it.next()) -// { -// pend = it; -// pend[0] += it->second - 1; -// if (*it >= p && p <= pend) -// { -// this->start_ = it->first; -// this->index_ = it->second - this->start[0]; -// } -// } -// } - - template <typename P> P rle_psite<P>::to_point() const Index: oln/core/rle/rle_pset.hh --- oln/core/rle/rle_pset.hh (revision 872) +++ oln/core/rle/rle_pset.hh (working copy) @@ -47,21 +47,38 @@ template <typename P> struct rle_pset_fwd_piter_; template <typename P> struct rle_pset_bkd_piter_; + // Super type. + template <typename P> + struct super_trait_< rle_pset<P> > + { + typedef rle_pset<P> current; + typedef internal::point_set_base_<current> ret; + }; + // Vtypes associated to rle_pset class template <typename P> struct vtypes< rle_pset<P> > { typedef P point; - typedef typename P::grid grid; - - typedef box_<point> box; typedef rle_pset_fwd_piter_<P> fwd_piter; typedef rle_pset_bkd_piter_<P> bkd_piter; - typedef fwd_piter piter; }; // rle_pset class + /* + ** \class rle_pset + ** \brief pset correspoding to the rle_image class + ** + ** Note: P must be a point type + ** method: + ** unsigned impl_npoints() const : return number of point in the point set + ** const box& impl_bbox() const : return a box which includes all poin into the set + ** void insert(const P& p, unsigned len): insert a new range on the point set + ** bool impl_has(const P& p) const : if p include in the set + ** const std_container& con() const : return the container of the point + ** + */ template <typename P> class rle_pset : public internal::point_set_base_<rle_pset <P> > { @@ -81,11 +98,11 @@ bool impl_has(const P& p) const; const std_container& con() const; - unsigned range_len_(const P& range_start); + unsigned range_len_(const P& range_len_) const; protected: - unsigned npts; - std_container con_; - fbbox_<point> fb_; + unsigned npts; /*!< number of point in the set*/ + std_container con_; /*!< container of the set*/ + fbbox_<point> fb_; /*!< pset box*/ }; @@ -133,18 +150,10 @@ bool rle_pset<P>::impl_has(const P& p) const { - P pend; + typename std_container::const_iterator irun; - typename std_container::const_iterator iter; - - for (iter = con_.begin(); iter != con_.end(); ++iter ) - { - pend = iter->first; - pend[0] += iter->second - 1; - if (iter->first >= p && p <= pend) - return 1; - } - return 0; + irun = this->con_.find(p); + return irun != this->con_.end(); } template <typename P> @@ -156,9 +165,13 @@ template <typename P> unsigned - rle_pset<P>::range_len_(const P& range_start) + rle_pset<P>::range_len_(const P& range_start) const { - return this->con_[range_start]; + typename std_container::const_iterator irun; + + irun = this->con_.find(range_start); + assert(irun != this->con_.end()); + return (irun->second); } # endif // !OLN_INCLUDE_ONLY @@ -166,11 +179,18 @@ // end of rle_pset class // -------------------- iterators on classes deriving from internal::rle_pset<P> - // Forward declaration template <typename P> class rle_pset_fwd_piter_; + // Super type. + template <typename P> + struct super_trait_< rle_pset_fwd_piter_<P> > + { + typedef rle_pset_fwd_piter_<P> current; + typedef Iterator_on_Points<current> ret; + }; + // Virtual types template <typename P> struct vtypes< rle_pset_fwd_piter_<P> > @@ -179,6 +199,18 @@ }; // class rle_pset_fwd_iterator_ + /* + ** \class rle_pset_fwd_piter_ + ** \brief foward iterator for rle_pset + ** + ** P must be a point type + ** method: + ** void impl_start(): set the iterator to the start of pset + ** void impl_next(): go to next point + ** void impl_invalidate(): invalidate iterator + ** void impl_valid(): is the iterator valid? + ** + conversions methods + */ template <typename P> class rle_pset_fwd_piter_ : public Iterator_on_Points< rle_pset_fwd_piter_<P> > { @@ -203,7 +235,7 @@ protected: const typename rle_pset<P>::std_container& con_; typename rle_pset<P>::std_container::const_iterator it_; - rle_psite<P> ps_; + rle_psite<P> ps_; /*!< current point */ }; # ifndef OLN_INCLUDE_ONLY @@ -229,11 +261,8 @@ { precondition(this->is_valid()); - std::cout << "next: " << std::endl; - std::cout << "point start: " << ps_.start_ << " index: " << ps_.index_ << std::endl; - std::cout << "point start: " << it_->first << " index: " << it_->second << " ref" << std::endl; - ++this->ps_.index_; + if (this->ps_.index_ >= this->it_->second) { ++it_; @@ -291,6 +320,14 @@ template <typename P> class rle_pset_bkd_piter_; + // Super type. + template <typename P> + struct super_trait_< rle_pset_bkd_piter_<P> > + { + typedef rle_pset_bkd_piter_<P> current; + typedef Iterator_on_Points<current> ret; + }; + // Virtual type template <typename P> struct vtypes< rle_pset_bkd_piter_<P> > @@ -298,8 +335,18 @@ typedef P point; }; - // class rle_pset_bkd_piter_ - + /* + ** \class rle_pset_bkd_piter_ + ** \brief backward iterator for rle_pset + ** + ** P must be a point type + ** method: + ** void impl_start(): set the iterator to the start of pset + ** void impl_next(): go to next point + ** void impl_invalidate(): invalidate iterator + ** void impl_valid(): is the iterator valid? + ** + conversion method + */ template <typename P> class rle_pset_bkd_piter_ : public Iterator_on_Points< rle_pset_bkd_piter_<P> > { @@ -322,7 +369,7 @@ protected: const typename rle_pset<P>::std_container& con_; typename rle_pset<P>::std_container::const_reverse_iterator it_; - rle_psite<P> ps_; + rle_psite<P> ps_; /*!< current point*/ }; # ifndef OLN_INCLUDE_ONLY @@ -350,7 +397,6 @@ --ps_.index_; - // ps.index_ is unsigned if (ps_.index_ + 1 == 0) { ++it_; Index: oln/core/encode/rle_encode.hh --- oln/core/encode/rle_encode.hh (revision 0) +++ oln/core/encode/rle_encode.hh (revision 0) @@ -0,0 +1,81 @@ +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 EPITA +// Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +#ifndef RLE_ENCODE_HH_ +# define RLE_ENCODE_HH_ + +# include <oln/core/concept/image.hh> + +# include <oln/core/rle/rle_image.hh> + +namespace oln +{ + + /*! + ** encode an image class to a rle_image + ** + ** @param input has to respect the Image concept + ** + ** @return rle_image + */ + template <typename I> + rle_image<typename Image<I>::point, typename I::value> + rle_encode(const Image<I>& input) + { + rle_image<typename I::point, typename I::value> output; + typename I::piter p (input.points()); + unsigned len = 1; + typename I::point rstart; /*!< range pointstart */ + typename I::value rvalue; /*!< range value */ + + p.start(); + if (!p.is_valid()) + return output; + + rstart = p; + rvalue = input(p); + p.next(); + while (p.is_valid()) + { + if (rvalue == input(p)) + ++len; + else + { + output.insert(rstart, len, rvalue); + len = 1; + rstart = p; + rvalue = input(p); + } + p.next(); + } + output.insert(rstart, len, rvalue); + return output; + } +} // end of namespace oln + +#endif /* !RLE_ENCODE_HH_ */