00001 // Copyright (C) 2005 Pablo Mejia 00002 00003 00004 #ifndef CAJUN_GRID_H 00005 #define CAJUN_GRID_H 00006 00007 00008 #include "grid_base.H" 00009 00010 00011 namespace cajun 00012 { 00013 template <typename CELL_t> 00014 class grid_t : public grid_base_t 00015 { 00016 protected: 00017 class tile_t : public tile_base_t 00018 { 00019 public: 00020 tile_t () : 00021 m_cell (new CELL_t[TILE_SIZE * TILE_SIZE]) {} 00022 ~tile_t () { delete [] m_cell; } 00023 00024 CELL_t &cell (int x_, int y_) 00025 { 00026 return m_cell[x_ * TILE_SIZE + y_]; 00027 } 00028 00029 private: 00030 CELL_t *m_cell; 00031 }; 00032 00033 tile_base_t *create_tile () { return new tile_t; } 00034 00035 public: 00036 class iterator_t : public iterator_base_t 00037 { 00038 public: 00039 bool operator== (iterator_t const &v_) const 00040 { 00041 return iterator_base_t::operator== (&v_); 00042 } 00043 bool operator!= (iterator_t const &v_) const 00044 { 00045 return iterator_base_t::operator!= (&v_); 00046 } 00047 CELL_t &operator* () const 00048 { 00049 return ((tile_t *) m_tile)->cell (m_x, m_y); 00050 } 00051 CELL_t *operator-> () const 00052 { 00053 return &((tile_t *) m_tile)->cell (m_x, m_y); 00054 } 00055 00056 friend class grid_t; 00057 }; 00058 00059 iterator_t find (int x_, int y_) 00060 { 00061 iterator_t iter; 00062 00063 grid_base_t::find (&iter, x_, y_); 00064 return iter; 00065 } 00066 00067 template <class WALKER_t> 00068 void walk (WALKER_t &walker_) 00069 { 00070 walker_.init (); 00071 00072 iterator_t ci; 00073 index_t::const_iterator ti; 00074 00075 for (ti = m_index.begin (); ti != m_index.end (); ++ti) 00076 { 00077 ci.m_tile = ti->second; 00078 if (! ci.m_tile->lru_visited ()) 00079 continue; 00080 00081 walker_.init_tile (ci.m_tile->x (), 00082 ci.m_tile->y ()); 00083 for (int x = 0; x < TILE_SIZE; x++) 00084 for (int y = 0; y < TILE_SIZE; y++) 00085 { 00086 ci.m_x = x; 00087 ci.m_y = y; 00088 walker_.visit (x, y, ci); 00089 } 00090 walker_.fini_tile (); 00091 } 00092 } 00093 }; 00094 }; 00095 00096 00097 #endif