Boost logo

Boost-Commit :

From: mariano.consoni_at_[hidden]
Date: 2008-06-16 10:39:38


Author: mconsoni
Date: 2008-06-16 10:39:38 EDT (Mon, 16 Jun 2008)
New Revision: 46425
URL: http://svn.boost.org/trac/boost/changeset/46425

Log:

- More on remove.

Text files modified:
   sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree.hpp | 26 ++++++++++++++++++++++++--
   sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_leaf.hpp | 16 ++++++++++++++++
   sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_node.hpp | 15 +++++++++++++++
   sandbox/SOC/2008/spacial_indexing/boost/spatial_index/spatial_index.hpp | 2 +-
   sandbox/SOC/2008/spacial_indexing/libs/spatial_index/test/simple_test_rtree.cpp | 6 ++++++
   5 files changed, 62 insertions(+), 3 deletions(-)

Modified: sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree.hpp
==============================================================================
--- sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree.hpp (original)
+++ sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree.hpp 2008-06-16 10:39:38 EDT (Mon, 16 Jun 2008)
@@ -44,9 +44,31 @@
 
     /// remove the element with key 'k'
     /// TODO: implement
- virtual void remove(const Point &k)
+ virtual void remove(const geometry::box<Point> &k)
     {
- std::cerr << "Not implemented yet." << std::endl;
+ try {
+ boost::shared_ptr<rtree_node<Point, Value> > l(choose_leaf(k));
+
+ l->remove(k);
+
+ condense_tree(l);
+
+ // if the root has only one child, make it the root
+ if(root_->elements() == 1) {
+ root_ = root_->first_element();
+ root_->set_root();
+ }
+
+ element_count--;
+ } catch(std::logic_error &e) {
+ // not found
+ return;
+ }
+ }
+
+ void condense_tree(const boost::shared_ptr<rtree_node<Point,Value> > &l)
+ {
+ std::cerr << "Condensing tree." << std::endl;
     }
 
     virtual void print(void) const

Modified: sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_leaf.hpp
==============================================================================
--- sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_leaf.hpp (original)
+++ sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_leaf.hpp 2008-06-16 10:39:38 EDT (Mon, 16 Jun 2008)
@@ -97,6 +97,22 @@
 
     virtual Value get_value(const unsigned int i) const { return nodes_[i].second; }
 
+
+ /// remove value with key 'k' in this leaf
+ virtual void remove(const geometry::box<Point> &k)
+ {
+
+ for(typename leaves_map::iterator it = nodes_.begin(); it != nodes_.end(); ++it) {
+ if(it->first.min() == k.min() && it->first.max() == k.max()) {
+ std::cerr << "Erasing node." << std::endl;
+ nodes_.erase(it);
+ return;
+ }
+ }
+
+ }
+
+
     virtual std::vector< geometry::box<Point> > get_boxes(void) const
     {
       std::vector< geometry::box<Point> > r;

Modified: sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_node.hpp
==============================================================================
--- sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_node.hpp (original)
+++ sandbox/SOC/2008/spacial_indexing/boost/spatial_index/rtree_node.hpp 2008-06-16 10:39:38 EDT (Mon, 16 Jun 2008)
@@ -47,6 +47,15 @@
       return nodes_.size();
     }
 
+ /// first element, to replace root in case of condensing
+ boost::shared_ptr<rtree_node<Point, Value> > first_element(void) const
+ {
+ if(nodes_.size() == 0) {
+ throw std::logic_error("first_element in empty node");
+ }
+ return nodes_.begin()->second;
+ }
+
     /// true if it is a leaf node
     virtual bool is_leaf(void) const { return false; }
 
@@ -128,6 +137,12 @@
       std::cerr << "adjust_node: node not found." << std::endl;
     }
 
+ virtual void remove(const geometry::box<Point> &k)
+ {
+ // TODO
+ }
+
+
     /// replace the node in the nodes_ vector and recompute the box
     void replace_node(const boost::shared_ptr<rtree_node<Point, Value> > &l, boost::shared_ptr<rtree_node<Point, Value> > &new_l)
     {

Modified: sandbox/SOC/2008/spacial_indexing/boost/spatial_index/spatial_index.hpp
==============================================================================
--- sandbox/SOC/2008/spacial_indexing/boost/spatial_index/spatial_index.hpp (original)
+++ sandbox/SOC/2008/spacial_indexing/boost/spatial_index/spatial_index.hpp 2008-06-16 10:39:38 EDT (Mon, 16 Jun 2008)
@@ -30,7 +30,7 @@
   virtual void insert(const geometry::box<Point> &e, const Value &v) = 0;
 
   /// remove data with key 'k'
- virtual void remove(const Point &k) = 0;
+ virtual void remove(const geometry::box<Point> &k) = 0;
         
   /// bulk insert data from values
   virtual void bulk_insert(std::vector<Value> &values, std::vector<Point> &points) = 0;

Modified: sandbox/SOC/2008/spacial_indexing/libs/spatial_index/test/simple_test_rtree.cpp
==============================================================================
--- sandbox/SOC/2008/spacial_indexing/libs/spatial_index/test/simple_test_rtree.cpp (original)
+++ sandbox/SOC/2008/spacial_indexing/libs/spatial_index/test/simple_test_rtree.cpp 2008-06-16 10:39:38 EDT (Mon, 16 Jun 2008)
@@ -136,5 +136,11 @@
           std::cout << "Value: " << v << std::endl;
         }
 
+ // remove test
+ std::cerr << " --> remove" << std::endl;
+ q->remove(geometry::box<geometry::point_xy<double> >(geometry::point_xy<double>(10.0,10.0), geometry::point_xy<double>(12.0,13.0)));
+
+ q->print();
+
         return 0;
 };


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk