示例#1
0
 /**
  * Return the bounds of a range that includes all the elements that are near specified (x, y).
  *
  * @param  x X-axis coordinate of val.
  * @param  y Y-axis coordinate of val.
  * @return   Pair of iterators that point to the first and the last of the elements that are
  *           near the (x, y) point. If any of given x or y is outside of a QuadTree range (i.e.
  *           x >= startX + width or y >= startY + width), pair of end() is returned.
  */
 std::pair<iterator, iterator> near(double x, double y)
 {
     if (coordinatesAreOk(x, y))
     {
         TreeNode* node = getExistingNode(
             LocationCode<maxLevels>(tr.forward(Coordinates(x, y))));
         return std::pair<iterator, iterator>(
             iterator(node, 0), ++iterator(node, node->count()));
     }
     return std::pair<iterator, iterator>(end(), end());
 }
示例#2
0
 iterator insert(StoredObject&& toStore)
 {
     TreeNode* node = getNode(toStore.location);
     if (node->level() > 0)
     {
         // We store one element at time so there will be a moment before node overflow when its
         // count will be equal capacity. Then we'll relocate all its elements to the new child
         // nodes. At worst scenario, all elements will be relocated to the same node, so its
         // count() will be again equal to capacity. The loop ends when at least one element is
         // relocated to the another child node.
         while (node->count() == nodeCapacity && node->level() > 0)
         {
             typename TreeNode::iterator it;
             typename TreeNode::iterator itEnd = node->end();
             for (it = node->begin(); it != itEnd; ++it)
             {
                 node->child(it->location).insert(std::move(*it));
             }
             node->clear();
             node = &(node->child(toStore.location));
         }
     }
     return iterator(node, node->insert(std::move(toStore)));
 }