HilbertTGSinsert.h

Go to the documentation of this file.
00001 /*
00002  *  Copyright (C) 2007  A.N. Yzelman
00003  *  Released under LGPL, see license.txt
00004  *
00005  *  Last modified at 11th of May, 2007, by A.N. Yzelman
00006  *
00007  *  HilbertTGS.h: Definition of a Hilbert-bulk-loaded Basic R-tree.
00008  *
00009  */
00010 
00011 #ifndef _H_HILBERTinsert_TGS
00012 #define _H_HILBERTinsert_TGS
00013  
00014 #include "TGS.h"
00015 #include <limits>
00016 #include <vector>
00017 
00026 template< typename base_tree >
00027 class Hilbert_TGSinsert_tree : public TGS_tree< base_tree > {
00028 
00029   private:
00035         inline void insertionSort( BB_container* element );
00036         
00046         unsigned int lowestGeqThan( const double currentVal, const unsigned int left, const unsigned int right ) const;
00047         
00049         vector< double > hilbertCache;
00050 
00051   protected:
00052   
00054         virtual vector< Ordering< BB_container > * > useOrderings() const;
00055 
00056   public:
00057   
00059         Hilbert_TGSinsert_tree() : TGS_tree< base_tree >() {}
00060         
00062         Hilbert_TGSinsert_tree( R_tree_props* props ) : TGS_tree< base_tree >( props ) {}
00063         
00065         virtual base_tree* insert( BB_container *element );
00066 
00067 };
00068 
00069 template< typename base_tree >
00070 unsigned int Hilbert_TGSinsert_tree< base_tree >::lowestGeqThan( const double currentVal, const unsigned int left, const unsigned int right ) const {
00071         if ( hilbertCache[ left ] >= currentVal )
00072                 return left;
00073         if ( left == right )
00074                 return left + 1;
00075         
00076         const unsigned int mid = ( left + right ) / 2;
00077         
00078         if ( hilbertCache[ mid ] >= currentVal )
00079                 return lowestGeqThan( currentVal, left + 1, mid );
00080         else
00081                 return lowestGeqThan( currentVal, mid + 1, right );
00082 }
00083 
00084 template< typename base_tree >
00085 void Hilbert_TGSinsert_tree< base_tree >::insertionSort( BB_container* element ) {
00086         const unsigned int size = this->cache.size();
00087         vector< double > centre;
00088         element->getCenterCoordinate( &centre );
00089         const double currentVal = HilbertCoordinateMapper::toHilbert3D( &centre );
00090         if ( size == 0 ) {
00091                 hilbertCache.push_back( currentVal );
00092                 this->cache.push_back( BB_container( element ) );
00093                 return;
00094         }
00095         const unsigned int insertAt = lowestGeqThan( currentVal, 0, size-1 );
00096         hilbertCache.insert( hilbertCache.begin() + insertAt, currentVal );
00097         this->cache.insert( this->cache.begin() + insertAt, BB_container( element ) );
00098 }
00099 
00100 template< typename base_tree >
00101 base_tree* Hilbert_TGSinsert_tree< base_tree >::insert( BB_container *element ) {
00102         if ( this->loaded ) {
00103                 return base_tree::insert( element );
00104         } else {
00105                 insertionSort( element );
00106                 delete element;
00107                 return this;
00108         }
00109 }
00110 
00111 template< typename base_tree >
00112 vector< Ordering< BB_container > * > Hilbert_TGSinsert_tree< base_tree >::useOrderings() const {
00113         vector< Ordering< BB_container > * > ret;
00114         
00115         ret.push_back( &BB_container::NO_ORDERING );
00116         
00117         return ret;
00118 }
00119 
00120 #endif
00121 

Generated on Sat Oct 13 17:34:42 2007 for R-Tree by  doxygen 1.5.2