_Grid.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /******************************************************************************/
  2. struct _Cell // Cell - Do not use this class, use 'Cell' instead
  3. {
  4. #if !EE_PRIVATE
  5. private:
  6. #endif
  7. Ptr _data;
  8. Int _x[4],
  9. _y[4];
  10. _Cell *_parent;
  11. union
  12. {
  13. struct{_Cell *_g[9];};
  14. struct{_Cell *_lb, *_b, *_rb, *_l, *_c, *_r, *_lf, *_f, *_rf;};
  15. };
  16. #if EE_PRIVATE
  17. Int x ()C {return _x[0];}
  18. Int y()C {return _y[0];}
  19. VecI2 xy()C {return VecI2(x(), y());}
  20. Bool final()C {return _x[0]==_x[3] && _y[0]==_y[3];} // need to check both, because for special case outside normal range, one index can be the same, but other not
  21. void del ( _Grid &grid);
  22. _Cell* create (Int x , Int y , _Cell *parent, _Grid &grid);
  23. _Cell* create (Int x0, Int y0, Int x1, Int y1, _Cell *parent, _Grid &grid);
  24. _Cell* createAsParent( _Cell *child , _Grid &grid);
  25. _Cell* get(C VecI2 &xy, _Grid &grid);
  26. _Cell* find(C VecI2 &xy );
  27. Bool getLeft (Int &value)C;
  28. Bool getRight (Int &value)C;
  29. Bool getBottom(Int &value)C;
  30. Bool getTop (Int &value)C;
  31. void func ( void func(_Cell &cell, Ptr user), Ptr user );
  32. T1(USER_DATA) void func ( void func(_Cell &cell, USER_DATA &user), USER_DATA &user ) {T.func( (void(*)(_Cell &cell, Ptr user))func, &user);}
  33. void func (C RectI &rect, void func(_Cell &cell, Ptr user), Ptr user );
  34. T1(USER_DATA) void func (C RectI &rect, void func(_Cell &cell, USER_DATA &user), USER_DATA &user ) {T.func(rect, (void(*)(_Cell &cell, Ptr user))func, &user);}
  35. void funcCreate(C RectI &rect, void func(_Cell &cell, Ptr user), Ptr user, _Grid &grid);
  36. #endif
  37. _Cell() {Zero(T);}
  38. NO_COPY_CONSTRUCTOR(_Cell);
  39. };
  40. /******************************************************************************/
  41. struct _Grid // Grid - Do not use this class, use 'Grid' instead
  42. {
  43. Ptr user;
  44. void del( ) ;
  45. void del( _Cell *cell) ;
  46. _Cell& get(C VecI2 &xy ) ;
  47. _Cell* find(C VecI2 &xy )C;
  48. Bool size( RectI &rect)C;
  49. void fastAccess(C RectI *rect);
  50. void func ( void func(_Cell &cell, Ptr user), Ptr user);
  51. void func (C RectI &rect, void func(_Cell &cell, Ptr user), Ptr user);
  52. void funcCreate(C RectI &rect, void func(_Cell &cell, Ptr user), Ptr user);
  53. void mtFunc(Threads &threads, void func(_Cell &cell, Ptr user, Int thread_index), Ptr user);
  54. void mtFunc(Threads &threads, C RectI &rect, void func(_Cell &cell, Ptr user, Int thread_index), Ptr user);
  55. T2(TYPE, EXTENDED) void replaceClass()
  56. {
  57. struct Helper
  58. {
  59. static void New(EXTENDED* &elm, C VecI2 &xy, Ptr grid_user) {Alloc(elm); new(elm)EXTENDED(xy, grid_user);} // first allocate memory to setup pointer, then call the constructor in case the constructor checks the grid for self
  60. static void Del(EXTENDED* &elm ) {if(elm){elm->~EXTENDED(); Free(elm);}}
  61. };
  62. ASSERT_BASE_EXTENDED<TYPE, EXTENDED>();
  63. del();
  64. _new=(void (*)(Ptr &elm, C VecI2 &xy, Ptr grid_user))Helper::New;
  65. _del=(void (*)(Ptr &elm ))Helper::Del;
  66. }
  67. ~_Grid() {del();}
  68. #if !EE_PRIVATE
  69. private:
  70. #endif
  71. _Cell *_root;
  72. Int _fast_access_mul;
  73. RectI _fast_access_rect;
  74. Mems<_Cell*> _fast_access_cell;
  75. void (*_new)(Ptr &elm, C VecI2 &xy, Ptr grid_user);
  76. void (*_del)(Ptr &elm );
  77. #if EE_PRIVATE
  78. _Cell* &fastAccessCell(C VecI2 &xy) {return _fast_access_cell[(xy.x-_fast_access_rect.min.x) + (xy.y-_fast_access_rect.min.y)*_fast_access_mul];} // warning: this does not do any out of range checks
  79. _Cell* fastAccessCell(C VecI2 &xy)C {return ConstCast(T).fastAccessCell(xy);}
  80. #endif
  81. explicit _Grid() {user=null; _root=null; _fast_access_mul=0; _fast_access_rect.set(0, 0, -1, -1); _new=null; _del=null;}
  82. NO_COPY_CONSTRUCTOR(_Grid);
  83. T1(TYPE) friend struct Grid;
  84. };
  85. /******************************************************************************/