Nicolas Ballas <ballas(a)lrde.epita.fr> writes:
Index: ChangeLog
from Nicolas Ballas <ballas(a)lrde.epita.fr>
Add rle_class, not finish yet.
s/finish/finished/
:)
* oln/core/rle: New.
* oln/core/rle/rle_image.hh: New.
* oln/core/rle/rle_psite.hh: New.
* oln/core/rle/rle_pset.hh: New.
It's only a matter of style (and taste), but you can also factor
entries like this :
* oln/core/rle/rle_image.hh, oln/core/rle/rle_psite.hh,
* oln/core/rle/rle_pset.hh: New.
Mentioning new directories is superfluous, IMHO.
Index: oln/core/rle/rle_image.hh
--- oln/core/rle/rle_image.hh (revision 0)
+++ oln/core/rle/rle_image.hh (revision 0)
@@ -0,0 +1,184 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 EPITA
+// Research and Development Laboratory
Mismatching dates, only 2007 is valid.
+//
+// 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 OLN_CORE_RLE_RLE_IMAGE_HH_
+# define OLN_CORE_RLE_RLE_IMAGE_HH_
No trailing underscore.
+
+# include <map>
+# include <utility>
+
+
+# include <oln/core/internal/image_base.hh>
+# include <oln/core/rle/rle_psite.hh>
+# include <oln/core/rle/rle_pset.hh>
+
+
+
+namespace oln
+{
+ // Fwd decl.
+ template <typename P, typename T>
+ struct rle_image;
+
+ // Super type.
+ template <typename P, typename T>
+ struct super_trait_< rle_image<P, T> >
+ {
+ typedef rle_image<P, T> current;
+ typedef internal::primitive_image_<current> ret;
+ };
+
+ // Virtual types
+ template <typename P, typename T>
+ struct vtypes< rle_image<P, T> >
+ {
+ typedef T value;
+ typedef const T& rvalue;
+ typedef T& lvalue;
+
+ typedef P point;
+ typedef typename P::coord coord;
+
+ typedef rle_psite<P, T> psite;
+
+ typedef rle_pset<point> pset;
+// typedef typename pset::box box;
+
+ typedef std::map<std::pair<point, unsigned>, value> data;
+ };
+
+
+ // Rle image class
+ template < typename P, typename T>
+ class rle_image : public internal::primitive_image_< rle_image<P, T> >
+ {
+ typedef rle_image<P, T> current;
+ typedef internal::primitive_image_< rle_image<P, T> > super;
+ public:
+ stc_using(pset);
+ stc_using(box);
+ stc_using(point);
+ stc_using(value);
+ stc_using(rvalue);
+ stc_using(lvalue);
+ stc_using(psite);
+ stc_using(data);
+
+ rle_image();
+
+ pset impl_points() const;
+ box impl_bbox() const;
+ bool impl_has(const point& p) const;
+ bool impl_owns_(const psite& p) const;
+ void insert(const point& p, unsigned len, value val);
+ rvalue impl_read(const psite& p) const;
+ lvalue impl_read_write(const psite& p);
+
+ //Internal
+ const data& get_data_() const;
+
+ protected:
+ pset pset_;
+ };
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <typename P, typename T>
+ rle_image<P, T>::rle_image()
+ {
+ this->data_ = new typename rle_image<P, T>::data;
+ }
+
+ template <typename P, typename T>
+ typename rle_image<P, T>::pset
+ rle_image<P, T>::impl_points() const
+ {
+ return pset_;
+ }
+
+
+ template <typename P, typename T>
+ typename rle_image<P, T>::box
+ rle_image<P, T>::impl_bbox() const
+ {
+ return pset_.bbox();
+ }
+
+ template <typename P, typename T>
+ bool
+ rle_image<P, T>::impl_has(const typename rle_image<P, T>::point& p)
const
+ {
+ return this->pset_.has(p.point_());
+ }
+
+ template <typename P, typename T>
+ bool
+ rle_image<P, T>::impl_owns_(const typename rle_image<P, T>::psite& p)
const
+ {
+ //FIXME
+ return this->pset_.has(p.point_());
+ }
+
+ template <typename P, typename T>
+ void
+ rle_image<P, T>::insert(const typename rle_image<P, T>::point& p,
unsigned len, rle_image<P, T>::value val)
Line too long.
+ {
+ pset_.insert(p, len);
+ ((this->data_))->operator[](std::make_pair(p, len)) = val;
+ }
+
+ template <typename P, typename T>
+ typename rle_image<P, T>::rvalue
+ rle_image<P, T>::impl_read(const rle_image<P, T>::psite& p) const
+ {
+ precondition(p.iterator_() != this->data_->end());
+ return p.iterator_()->second;
+ }
+
+ template <typename P, typename T>
+ typename rle_image<P, T>::lvalue
+ rle_image<P, T>::impl_read_write(const rle_image<P, T>::psite& p)
+ {
+ precondition(p.iterator_() != this->data_->end());
+ return p.iterator_()->second;
+ }
+
+ template <typename P, typename T>
+ const typename rle_image<P, T>::data&
+ rle_image<P, T>::get_data_() const
+ {
+ //FIXME: another way to do that?
+ return *(this->data_.ptr_);
+ }
+
+
+# endif // !OLN_INCLUDE_ONLY
+
+} // end of namespace oln
+
+#endif /* !OLN_CORE_RLE_RLE_IMAGE_HH_ */
Use:
#endif // ! OLN_CORE_RLE_RLE_IMAGE_HH
Index: oln/core/rle/rle_psite.hh
--- oln/core/rle/rle_psite.hh (revision 0)
+++ oln/core/rle/rle_psite.hh (revision 0)
@@ -0,0 +1,104 @@
+// Copyright (C) 2006, 2007 EPITA Research and Development Laboratory
Same as above w.r.t. dates.
+//
+// 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 OLN_CORE_RLE_RLE_PSITE_HH_
+# define OLN_CORE_RLE_RLE_PSITE_HH_
Same as above.
+
+
+# include <map>
+# include <utility>
+
+namespace oln
+{
+
+
+ // Forward declaration
+ template <typename P, typename T> struct rle_image;
+
+ /*
+ ** \class rle_piste
+ ** \brief psite for rle image
+ **
+ **
+ **
+ */
+ template <typename P, typename T>
+ class rle_psite
+ {
+ public:
+ rle_psite(const rle_image<P, T>& ima, const P& p);
+ const typename std::map<std::pair<P, unsigned>, T>::iterator&
iterator_() const;
Line too long.
+ typename std::map<std::pair<P,
unsigned>, T>::iterator& iterator_();
+ const P& point_() const;
+ protected:
+ P p_; /*!< point
corresponding to the psite */
+ typename std::map<std::pair<P, unsigned>, T>::iterator it_;
/*!< it_ on image map corresponding to p_*/
+ };
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <typename P, typename T>
+ rle_psite<P, T>::rle_psite(const rle_image<P, T>& ima, const P& p)
: p_(p)//, it_(ima.points().con())
+ {
+ P pend;
+
+// for (this->it_ = ima.get_data_().begin(); this->it_ !=
ima.get_data_().end(); ++(this->it_))
+// {
+// pend = this->it_->first.first;
+// pend[0] += this->it_->first.second - 1;
+// if (this->it_->first.first >= p && p <= pend)
+// return;
+// }
Unmarked dead code.
+ it_ = ima.get_data_().end();
+ }
+
+ template <typename P, typename T>
+ const typename std::map<std::pair<P, unsigned>, T>::iterator&
+ rle_psite<P, T>::iterator_() const
+ {
+ return this->it_;
+ }
+
+ template <typename P, typename T>
+ typename std::map<std::pair<P, unsigned>, T>::iterator&
+ rle_psite<P, T>::iterator_()
+ {
+ return this->it_;
+ }
+
+ template <typename P, typename T>
+ const P&
+ rle_psite<P, T>::point_() const
+ {
+ return p_;
+ }
+
+# endif /* !OLN_INCLUDE_ONLY */
+
+ //end of class rle_psite
+}
+#endif /* !OLN_CORE_RLE_RLE_PSITE_HH_ */
Same as above.
Index: oln/core/rle/rle_pset.hh
--- oln/core/rle/rle_pset.hh (revision 0)
+++ oln/core/rle/rle_pset.hh (revision 0)
@@ -0,0 +1,375 @@
+// Copyright (C) 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 OLN_CORE_RLE_RLE_PSET_HH_
+# define OLN_CORE_RLE_RLE_PSET_HH_
+
+# include <set>
+# include <utility>
+
+# include <oln/core/rle/rle_psite.hh>
+
+# include <oln/core/internal/point_set_base.hh>
+
+# include <oln/core/concept/iterator_on_points.hh>
+
+# include <oln/core/gen/fbbox.hh>
+
+namespace oln
+{
+
+ // Forwards declaration
+ template <typename P> struct rle_pset;
+ template <typename P> struct rle_pset_fwd_piter_;
+ template <typename P> struct rle_pset_bkd_piter_;
+
+ // Vtypes associated to rle_pset class
+ template <typename P>
+ struct vtypes< rle_pset<P> >
+ {
+ typedef P point;
+ typedef typename P::grid grid;
+
+ typedef fbbox_<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
+
+ template <typename P>
+ class rle_pset : public internal::point_set_base_<rle_pset <P> >
+ {
+ typedef rle_pset<P> current;
+ typedef internal::point_set_base_<rle_pset<P> > super;
+ public:
+ stc_using(point);
+ stc_using(box);
+
+ typedef std::set< std::pair<point, unsigned> > std_container;
+
+ rle_pset();
+
+ unsigned impl_npoints() const;
+ const box& impl_bbox() const;
+ void insert(const P& p, unsigned len);
+ bool impl_has(const P& p) const;
+ const std_container& con() const;
+
+ protected:
+ unsigned npts;
+ std_container con_;
+ fbbox_<point> fb_;
+ };
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <typename P>
+ rle_pset<P>::rle_pset() : npts(0)
+ {
+ }
+
+
+ template <typename P>
+ unsigned
+ rle_pset<P>::impl_npoints() const
+ {
+ return npts;
+ }
+
+ template <typename P>
+ void
+ rle_pset<P>::insert(const P& p, unsigned len)
+ {
+ con_.insert(std::make_pair(p, len));
+ P pend;
+
+ //update bbox
+ fb_.take(p);
+ pend = p;
+ pend[0] += len - 1;
+ fb_.take(pend);
+
+ // update size
+ npts += len;
+ }
+
+ template <typename P>
+ const typename rle_pset<P>::box&
+ rle_pset<P>::impl_bbox() const
+ {
+ return fb_;
+ }
+
+ template <typename P>
+ bool
+ rle_pset<P>::impl_has(const P& p) const
+ {
+ point pend;
+ 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;
+ }
+
+ // end of rle_pset class
+
+ template <typename P>
+ const typename rle_pset<P>::std_container&
+ rle_pset<P>::con() const
+ {
+ return this->con_;
+ }
+
+
+# endif // !OLN_INCLUDE_ONLY
+
+
+ // -------------------- iterators on classes deriving from
internal::rle_pset<P>
If you're an Emacs user, rebox.el (available at
~levill_r/emacs/rebox.el) is great to create titles like this.
/*-----------------------------------------------------------.
| Iterators on classes deriving from internal::rle_pset<P>. |
`-----------------------------------------------------------*/
Using Doxygen's command to gather things under the same name is also a
good idea:
/// Iterators on classes deriving from internal::rle_pset<P>.
/// \{
// ...
/// \}
+
+ // Forward declaration
+ template <typename P>
+ class rle_pset_fwd_piter_;
+
+ // Virtual types
+ template <typename P>
+ struct vtypes< rle_pset_fwd_piter_<P> >
+ {
+ typedef P point;
+ };
+
+ // class rle_pset_fwd_iterator_
+ template <typename P>
+ class rle_pset_fwd_piter_ : public Iterator_on_Points< rle_pset_fwd_piter_<P>
>
+ {
+ typedef Iterator_on_Points< rle_pset_fwd_piter_<P> > super;
+ typedef rle_pset_fwd_piter_<P> current;
+ public:
+ stc_using(point);
+
+ rle_pset_fwd_piter_(const rle_pset<P>& con);
+
+ void impl_start();
+ void impl_next();
+ void impl_invalidate();
+ bool impl_is_valid() const;
+ point impl_to_point() const;
+ const point* impl_point_adr() const;
+
+ protected:
+ const typename rle_pset<P>::std_container& con_;
+ typename rle_pset<P>::std_container::const_iterator it_;
+ point p_;
+ };
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <typename P>
+ rle_pset_fwd_piter_<P>::rle_pset_fwd_piter_(const rle_pset<P>& cont) :
con_(cont.con())
+ {
+ this->it_ = this->con_.end();
+ }
+
+ template <typename P>
+ void
+ rle_pset_fwd_piter_<P>::impl_start()
+ {
+ this->it_ = this->con_.begin();
+ this->p_ = this->it_->first;
+ }
+
+ template <typename P>
+ void
+ rle_pset_fwd_piter_<P>::impl_next()
+ {
+ point pend;
+
+ if (!this->is_valid())
+ return;
+
+ pend = this->it_->first;
+ pend[0] += this->it_->second - 1;
+
+ ++p_[0];
+ if (p_ > pend)
+ {
+ ++it_;
+ p_ = this->it_->first;
+ }
+ }
+
+ template <typename P>
+ void
+ rle_pset_fwd_piter_<P>::impl_invalidate()
+ {
+ this->it_ = this->con_.end();
+ }
+
+ template <typename P>
+ bool
+ rle_pset_fwd_piter_<P>::impl_is_valid() const
+ {
+ return this->it_ != this->con_.end();
+ }
+
+ template <typename P>
+ typename rle_pset_fwd_piter_<P>::point
+ rle_pset_fwd_piter_<P>::impl_to_point() const
+ {
+ return p_;
+ }
+
+ template <typename P>
+ const typename rle_pset_fwd_piter_<P>::point*
+ rle_pset_fwd_piter_<P>::impl_point_adr() const
+ {
+ return &p_;
+ }
+
+# endif // !OLN_INCLUDE_ONLY
+
+ //end of class rle_pset_fwd_iterator_
+
+ // Forward declaration
+ template <typename P>
+ class rle_pset_bkd_piter_;
+
+ // Virtual type
+ template <typename P>
+ struct vtypes< rle_pset_bkd_piter_<P> >
+ {
+ typedef P point;
+ };
+
+ // class rle_pset_bkd_piter_
+
+ template <typename P>
+ class rle_pset_bkd_piter_ : public Iterator_on_Points< rle_pset_bkd_piter_<P>
>
+ {
+ typedef Iterator_on_Points< rle_pset_bkd_piter_<P> > super;
+ typedef rle_pset_bkd_piter_<P> current;
+ public:
+ stc_using(point);
+
+ rle_pset_bkd_piter_(const rle_pset<P>& con);
+
+ void impl_start();
+ void impl_next();
+ void impl_invalidate();
+ bool impl_is_valid() const;
+ point impl_to_point() const;
+ const point* impl_point_adr() const;
+
+ protected:
+ const typename rle_pset<P>::std_container& con_;
+ typename rle_pset<P>::std_container::const_reverse_iterator it_;
+ point p_;
+ };
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <typename P>
+ rle_pset_bkd_piter_<P>::rle_pset_bkd_piter_(const rle_pset<P>& cont) :
con_(cont.con())
+ {
+ this->it_ = this->con_.rend();
+ }
+
+ template <typename P>
+ void
+ rle_pset_bkd_piter_<P>::impl_start()
+ {
+ this->it_ = this->con_.rbegin();
+ this->p_ = this->it_->first;
+ this->p_[0] += this->it_->second - 1;
+ }
+
+ template <typename P>
+ void
+ rle_pset_bkd_piter_<P>::impl_next()
+ {
+ point pend;
+
+ if (!this->is_valid())
+ return;
+
+ pend = this->it_->first;
+
+ --p_[0];
+ if (p_ < pend)
+ {
+ ++it_;
+ p_ = this->it_->first;
+ this->p_[0] += this->it_->second - 1;
+ }
+ }
+
+ template <typename P>
+ void
+ rle_pset_bkd_piter_<P>::impl_invalidate()
+ {
+ this->it_ = this->con_.rend();
+ }
+
+ template <typename P>
+ bool
+ rle_pset_bkd_piter_<P>::impl_is_valid() const
+ {
+ return this->it_ != this->con_.rend();
+ }
+
+ template <typename P>
+ typename rle_pset_bkd_piter_<P>::point
+ rle_pset_bkd_piter_<P>::impl_to_point() const
+ {
+ return p_;
+ }
+
+ template <typename P>
+ const typename rle_pset_bkd_piter_<P>::point*
+ rle_pset_bkd_piter_<P>::impl_point_adr() const
+ {
+ return &p_;
+ }
+
+# endif // !OLN_INCLUDE_ONLY
+
+ // end of class rle_pset_bkd_piter_
+
+
+} // end of namespace oln
+
+
+#endif /* !OLN_CORE_RLE_RLE_PSET_HH_ */
Same as above (see previous points).