estar/flexgrid.hpp

Go to the documentation of this file.
00001 /* 
00002  * Copyright (C) 2007 Roland Philippsen <roland dot philippsen at gmx net>
00003  * 
00004  * This program is free software; you can redistribute it and/or modify
00005  * it under the terms of the GNU General Public License as published by
00006  * the Free Software Foundation; either version 2 of the License, or
00007  * (at your option) any later version.
00008  * 
00009  * This program is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  * 
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00017  * USA
00018  */
00019 
00020 
00021 #ifndef ESTAR_FLEXGRID_HPP
00022 #define ESTAR_FLEXGRID_HPP
00023 
00024 
00025 #include <estar/sdeque.hpp>
00026 #include <estar/flexgrid_traits.hpp>
00027 #include <estar/flexgrid_iterator.hpp>
00028 
00029 
00030 namespace estar {
00031   
00032   
00033   template<typename value_t>
00034   class flexgrid
00035   {
00036   public:
00037     typedef flexgrid_traits<value_t>             traits;
00038     typedef typename traits::line_t              line_t;
00039     typedef typename traits::cell_iterator       cell_iterator;
00040     typedef typename traits::const_cell_iterator const_cell_iterator;
00041     typedef typename traits::grid_t              grid_t;
00042     typedef typename traits::line_iterator       line_iterator;
00043     typedef typename traits::const_line_iterator const_line_iterator;
00044     typedef flexgrid_iterator<value_t>           iterator;
00045     typedef const_flexgrid_iterator<value_t>     const_iterator;
00046     
00047     value_t & at(ssize_t ix, ssize_t iy) { return m_grid.at(iy).at(ix); }
00048     
00049     value_t const & at(ssize_t ix, ssize_t iy) const
00050     { return m_grid.at(iy).at(ix); }
00051     
00052     void resize_xbegin(ssize_t xbegin, value_t const & value) {
00053       for (line_iterator ii(m_grid.begin()); ii != m_grid.end(); ++ii)
00054         ii->resize_begin(xbegin, value);
00055       m_default.resize_begin(xbegin);
00056     }
00057     
00058     void resize_xbegin(ssize_t xbegin) { resize_xbegin(xbegin, value_t()); }
00059     
00060     void resize_xend(ssize_t xend, value_t const & value) {
00061       for (line_iterator ii(m_grid.begin()); ii != m_grid.end(); ++ii)
00062         ii->resize_end(xend, value);
00063       m_default.resize_end(xend);
00064     }
00065     
00066     void resize_xend(ssize_t xend) { resize_xend(xend, value_t()); }
00067     
00068     void resize_x(ssize_t xbegin, ssize_t xend, value_t const & value) {
00069       if (xbegin < m_default.ibegin())
00070         resize_xbegin(xbegin, value);
00071       if (xend > m_default.iend())
00072         resize_xend(xend, value);
00073     }
00074     
00075     void resize_x(ssize_t xbegin, ssize_t xend) {
00076       if (xbegin < m_default.ibegin())
00077         resize_xbegin(xbegin);
00078       if (xend > m_default.iend())
00079         resize_xend(xend);
00080     }
00081     
00084     void resize_ybegin(ssize_t ybegin, value_t const & value) {
00085       if (ybegin > m_grid.ibegin()) // shrink
00086         m_grid.resize_begin(ybegin, m_default);
00087       else if (ybegin < m_grid.ibegin()) { // grow
00088         line_t vline(m_default);
00089         fill(vline.begin(), vline.end(), value);
00090         m_grid.resize_begin(ybegin, vline);
00091       }
00092       // else do nothing
00093     }
00094     
00095     void resize_ybegin(ssize_t ybegin)
00096     { m_grid.resize_begin(ybegin, m_default); }
00097     
00100     void resize_yend(ssize_t yend, value_t const & value) {
00101       if (yend < m_grid.iend()) // shrink
00102         m_grid.resize_end(yend, m_default);
00103       else if (yend > m_grid.iend()) { // grow
00104         line_t vline(m_default);
00105         fill(vline.begin(), vline.end(), value);
00106         m_grid.resize_end(yend, vline);
00107       }
00108       // else do nothing
00109     }
00110     
00111     void resize_yend(ssize_t yend)
00112     { m_grid.resize_end(yend, m_default); }
00113     
00114     void resize_y(ssize_t ybegin, ssize_t yend, value_t const & value) {
00115       if (ybegin < m_grid.ibegin())
00116         resize_ybegin(ybegin, value);
00117       if (yend > m_grid.iend())
00118         resize_yend(yend, value);
00119     }
00120     
00121     void resize_y(ssize_t ybegin, ssize_t yend) {
00122       if (ybegin < m_grid.ibegin())
00123         resize_ybegin(ybegin);
00124       if (yend > m_grid.iend())
00125         resize_yend(yend);
00126     }
00127     
00130     void resize(ssize_t xbegin, ssize_t xend,
00131                 ssize_t ybegin, ssize_t yend,
00132                 value_t const & value) {
00133       if (xbegin < m_default.ibegin())
00134         resize_xbegin(xbegin, value);
00135       if (xend > m_default.iend())
00136         resize_xend(xend, value);
00137       if (ybegin < m_grid.ibegin())
00138         resize_ybegin(ybegin, value);
00139       if (yend > m_grid.iend())
00140         resize_yend(yend, value);
00141     }
00142     
00145     void resize(ssize_t xbegin, ssize_t xend,
00146                 ssize_t ybegin, ssize_t yend) {
00147       if (xbegin < m_default.ibegin())
00148         resize_xbegin(xbegin);
00149       if (xend > m_default.iend())
00150         resize_xend(xend);
00151       if (ybegin < m_grid.ibegin())
00152         resize_ybegin(ybegin);
00153       if (yend > m_grid.iend())
00154         resize_yend(yend);
00155     }
00156     
00157     ssize_t xbegin() const { return m_default.ibegin(); }
00158     
00159     ssize_t xend() const { return m_default.iend(); }
00160     
00161     ssize_t ybegin() const { return m_grid.ibegin(); }
00162     
00163     ssize_t yend() const { return m_grid.iend(); }
00164     
00167     value_t & smart_at(ssize_t ix, ssize_t iy) {
00168       if (ix < m_default.ibegin())
00169         resize_xbegin(ix);
00170       else if (ix >= m_default.iend())
00171         resize_xend(ix + 1);
00172       if (iy < m_grid.ibegin())
00173         resize_ybegin(iy);
00174       else if (iy >= m_grid.iend())
00175         resize_yend(iy + 1);
00176       return m_grid.at(iy).at(ix);
00177     }
00178     
00179     line_iterator line_begin() { return m_grid.begin(); }
00180     
00181     const_line_iterator line_begin() const { return m_grid.begin(); }
00182     
00183     line_iterator line_end() { return m_grid.end(); }
00184     
00185     const_line_iterator line_end() const { return m_grid.end(); }
00186     
00187     iterator begin() {
00188       return iterator(m_grid, m_default, m_default.ibegin(), m_grid.ibegin());
00189     }
00190     
00191     const_iterator begin() const {
00192       return const_iterator(m_grid, m_default,
00193                             m_default.ibegin(), m_grid.ibegin());
00194     }
00195     
00196     iterator end()
00197     { return iterator(m_grid, m_default, m_default.iend(), m_grid.iend()); }
00198     
00199     const_iterator end() const {
00200       return const_iterator(m_grid, m_default,
00201                             m_default.iend(), m_grid.iend());
00202     }
00203     
00204     bool valid(ssize_t ix, ssize_t iy) const {
00205       return (ix >= m_default.ibegin())
00206         &&   (ix <  m_default.iend())
00207         &&   (iy >= m_grid.ibegin())
00208         &&   (iy <  m_grid.iend());
00209     }
00210     
00211     bool valid_range(ssize_t xbegin, ssize_t xend,
00212                      ssize_t ybegin, ssize_t yend) const {
00213       return (xbegin >= m_default.ibegin())
00214         &&   (xend   <= m_default.iend())
00215         &&   (ybegin >= m_grid.ibegin())
00216         &&   (yend   <= m_grid.iend());
00217     }
00218     
00219     bool valid_bbox(ssize_t x0, ssize_t y0, ssize_t x1, ssize_t y1) const {
00220       return (x0 >= m_default.ibegin())
00221         &&   (x1 <  m_default.iend())
00222         &&   (y0 >= m_grid.ibegin())
00223         &&   (y1 <  m_grid.iend());
00224     }
00225     
00226   protected:
00227     friend class flexgrid_iterator<value_t>;
00228     
00229     grid_t m_grid;
00230     line_t m_default;
00231   };
00232   
00233 }
00234 
00235 #endif // ESTAR_FLEXGRID_HPP

doxygen SourceForge.net Logo
E* Interpolated Graph Replanner Wed Dec 12 18:55:40 2007