void BaseGameObject::remove_child(BaseGameObject *b) { int index = get_child_index(b); if (index != -1) { children.erase(children.begin() + index); } }
static void _sift_down(const RandomAccessIterator &first, const LessComparer &less_comparer, const size_t heap_size, size_t hole_index, const typename std::iterator_traits<RandomAccessIterator>::value_type &item) { assert(heap_size > 0); assert(hole_index < heap_size); const size_t root_index = hole_index; const size_t last_full_index = heap_size - (heap_size - 1) % Fanout; while (true) { const size_t child_index = get_child_index(hole_index); if (child_index >= last_full_index) { if (child_index < heap_size) { assert(child_index == last_full_index); hole_index = _move_up_max_child(first, less_comparer, heap_size - child_index, hole_index, child_index); } break; } assert(heap_size - child_index >= Fanout); hole_index = _move_up_max_child(first, less_comparer, Fanout, hole_index, child_index); } _sift_up(first, less_comparer, root_index, hole_index, item); }
static size_t _move_up_max_child(const RandomAccessIterator &first, const LessComparer &less_comparer, const size_t children_count, const size_t hole_index, const size_t child_index) { assert(children_count > 0); assert(children_count <= Fanout); assert(child_index == get_child_index(hole_index)); size_t max_child_index = child_index; for (size_t i = 1; i < children_count; ++i) { if (!less_comparer(first[child_index + i], first[max_child_index])) { max_child_index = child_index + i; } } _move(first[hole_index], first[max_child_index]); return max_child_index; }
void BaseGameObject::add_child(BaseGameObject *b) { if (get_child_index(b) == -1) { children.insert(children.end(), b); } }