00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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())
00086 m_grid.resize_begin(ybegin, m_default);
00087 else if (ybegin < m_grid.ibegin()) {
00088 line_t vline(m_default);
00089 fill(vline.begin(), vline.end(), value);
00090 m_grid.resize_begin(ybegin, vline);
00091 }
00092
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())
00102 m_grid.resize_end(yend, m_default);
00103 else if (yend > m_grid.iend()) {
00104 line_t vline(m_default);
00105 fill(vline.begin(), vline.end(), value);
00106 m_grid.resize_end(yend, vline);
00107 }
00108
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