37 #ifndef OMPL_DATASTRUCTURES_GRID_B_
38 #define OMPL_DATASTRUCTURES_GRID_B_
40 #include "ompl/datastructures/GridN.h"
41 #include "ompl/datastructures/BinaryHeap.h"
42 #include "ompl/util/DisableCompilerWarning.h"
44 OMPL_PUSH_DISABLE_CLANG_WARNING(-Woverloaded-
virtual)
50 template <
typename _T,
class LessThanExternal = std::less<_T>,
class LessThanInternal = LessThanExternal>
51 class GridB :
public GridN<_T>
55 using Cell =
typename GridN<_T>::Cell;
58 using CellArray =
typename GridN<_T>::CellArray;
61 using Coord =
typename GridN<_T>::Coord;
67 struct CellX :
public Cell
73 ~CellX()
override =
default;
82 using EventCellUpdate = void (*)(Cell *,
void *);
85 explicit GridB(
unsigned int dimension) : GridN<_T>(dimension)
97 void onCellUpdate(EventCellUpdate event,
void *arg)
99 eventCellUpdate_ = event;
100 eventCellUpdateData_ = arg;
104 Cell *topInternal()
const
106 auto *top =
static_cast<Cell *
>(internal_.top()->data);
107 return top ? top : topExternal();
111 Cell *topExternal()
const
113 auto *top =
static_cast<Cell *
>(external_.top()->data);
114 return top ? top : topInternal();
118 unsigned int countInternal()
const
120 return internal_.size();
124 unsigned int countExternal()
const
126 return external_.size();
130 double fracExternal()
const
132 return external_.empty() ? 0.0 : (double)(external_.size()) / (
double)(external_.size() + internal_.size());
136 double fracInternal()
const
138 return 1.0 - fracExternal();
142 void update(Cell *cell)
144 eventCellUpdate_(cell, eventCellUpdateData_);
147 reinterpret_cast<typename externalBHeap::Element *
>(
static_cast<CellX *
>(cell)->heapElement));
150 reinterpret_cast<typename internalBHeap::Element *
>(
static_cast<CellX *
>(cell)->heapElement));
156 std::vector<Cell *> cells;
157 this->getCells(cells);
158 for (
int i = cells.size() - 1; i >= 0; --i)
159 eventCellUpdate_(cells[i], eventCellUpdateData_);
167 auto *cell =
new CellX();
171 this->neighbors(cell->coord, *list);
173 for (
auto cl = list->begin(); cl != list->end(); ++cl)
175 auto *c =
static_cast<CellX *
>(*cl);
176 bool wasBorder = c->border;
181 eventCellUpdate_(c, eventCellUpdateData_);
184 external_.update(
reinterpret_cast<typename externalBHeap::Element *
>(c->heapElement));
189 external_.remove(
reinterpret_cast<typename externalBHeap::Element *
>(c->heapElement));
193 internal_.update(
reinterpret_cast<typename internalBHeap::Element *
>(c->heapElement));
199 cell->border =
false;
204 return static_cast<Cell *
>(cell);
208 virtual void add(Cell *cell)
210 auto *ccell =
static_cast<CellX *
>(cell);
211 eventCellUpdate_(ccell, eventCellUpdateData_);
216 external_.insert(ccell);
218 internal_.insert(ccell);
222 virtual bool remove(Cell *cell)
227 this->neighbors(cell->coord, *list);
229 for (
auto cl = list->begin(); cl != list->end(); ++cl)
231 auto *c =
static_cast<CellX *
>(*cl);
232 bool wasBorder = c->border;
237 eventCellUpdate_(c, eventCellUpdateData_);
242 external_.update(
reinterpret_cast<typename externalBHeap::Element *
>(c->heapElement));
245 internal_.remove(
reinterpret_cast<typename internalBHeap::Element *
>(c->heapElement));
250 internal_.update(
reinterpret_cast<typename internalBHeap::Element *
>(c->heapElement));
255 auto pos = GridN<_T>::hash_.find(&cell->coord);
256 if (pos != GridN<_T>::hash_.end())
258 GridN<_T>::hash_.erase(pos);
259 auto *cx =
static_cast<CellX *
>(cell);
261 external_.remove(
reinterpret_cast<typename externalBHeap::Element *
>(cx->heapElement));
263 internal_.remove(
reinterpret_cast<typename internalBHeap::Element *
>(cx->heapElement));
270 void clear()
override
276 void status(std::ostream &out = std::cout)
const override
279 out << countInternal() <<
" internal cells" << std::endl;
280 out << countExternal() <<
" external cells" << std::endl;
288 void *eventCellUpdateData_;
291 static void noCellUpdate(Cell * ,
void * )
298 eventCellUpdate_ = &noCellUpdate;
299 eventCellUpdateData_ =
nullptr;
300 internal_.onAfterInsert(&setHeapElementI,
nullptr);
301 external_.onAfterInsert(&setHeapElementE,
nullptr);
312 struct LessThanInternalCell
314 bool operator()(
const CellX *
const a,
const CellX *
const b)
const
316 return lt_(a->data, b->data);
320 LessThanInternal lt_;
324 struct LessThanExternalCell
326 bool operator()(
const CellX *
const a,
const CellX *
const b)
const
328 return lt_(a->data, b->data);
332 LessThanExternal lt_;
342 static void setHeapElementI(
typename internalBHeap::Element *element,
void * )
344 element->data->heapElement =
reinterpret_cast<void *
>(element);
348 static void setHeapElementE(
typename externalBHeap::Element *element,
void * )
350 element->data->heapElement =
reinterpret_cast<void *
>(element);