34 #ifndef __INCLUDE_INTERVAL_TREE_H__
35 #define __INCLUDE_INTERVAL_TREE_H__
91 template<
typename S,
typename V >
110 _find( val, tags, root_ );
118 bool construct(
const std::vector< section_type > &secs )
124 if( secs.size( ) > 0 )
126 size_t tree_size = 0;
127 root_=
new node( secs, tree_size );
128 return ( tree_size == secs.size( ) );
186 if( it.root_ != NULL )
188 root_ =
new node( *it.root_ );
195 void _find(
const value_type &val, std::vector< tag_type > &tags, node *p )
199 if( val < p->val( ) )
201 for(
size_t i = 0 ; i < p->min_inc_secs_size( ) ; i ++ )
203 if( static_cast< value_type >( p->min_inc_secs( i ).minimum( ) ) > val )
207 tags.push_back( p->min_inc_secs( i ).tag( ) );
209 _find( val, tags, p->left( ) );
211 else if( val > p->val( ) )
213 for(
size_t i = 0 ; i < p->max_dec_secs_size( ) ; i ++ )
215 if( static_cast< value_type >( p->max_dec_secs( i ).maximum( ) ) <= val )
219 tags.push_back( p->max_dec_secs( i ).tag( ) );
221 _find( val, tags, p->right( ) );
225 for(
size_t i = 0 ; i < p->min_inc_secs_size( ) ; i ++ )
227 tags.push_back( p->min_inc_secs( i ).tag( ) );
246 template<
typename M,
typename T >
312 template<
typename M,
typename T >
313 inline std::ostream &operator <<( std::ostream &out, const tagged_section< M, T > &in )
315 return out << in.tag( ) <<
" [" << in.minimum( ) <<
", " << in.maximum( ) <<
")";
319 template<
typename M,
typename T >
327 template<
typename M,
typename T >
340 template<
typename S,
typename V >
346 const value_type &val( )
const {
return val_; }
347 const section_type &min_inc_secs(
const size_t i )
const {
return min_inc_secs_[ i ]; }
348 const section_type &max_dec_secs(
const size_t i )
const {
return max_dec_secs_[ i ]; }
349 size_t min_inc_secs_size( )
const {
return min_inc_secs_.size( ); }
350 size_t max_dec_secs_size( )
const {
return max_dec_secs_.size( ); }
352 node *left( ) {
return left_; }
353 node *right( ) {
return right_; }
355 node(
const std::vector< section_type > &secs,
size_t &tree_size ) : left_( NULL ), right_( NULL )
357 val_ = middle( secs );
358 std::vector< section_type > l_secs, r_secs;
359 for(
size_t i = 0 ; i < secs.size( ) ; i ++ )
361 if( static_cast< value_type >( secs[ i ].maximum( ) ) <= val_ )
363 l_secs.push_back( secs[ i ] );
366 if( static_cast< value_type >( secs[ i ] .minimum( ) ) > val_ )
368 r_secs.push_back( secs[ i ] );
371 min_inc_secs_.push_back( secs[ i ] );
373 tree_size += min_inc_secs_.size( );
375 max_dec_secs_ = min_inc_secs_;
377 if( l_secs.size( ) > 0 )
379 left_ =
new node( l_secs, tree_size );
381 if( r_secs.size( ) > 0 )
383 right_ =
new node( r_secs, tree_size );
387 node(
const node &nd ) : left_( NULL ), right_( NULL )
417 min_inc_secs_ = nd.min_inc_secs_;
418 max_dec_secs_ = nd.max_dec_secs_;
419 if( nd.left_ != NULL )
421 left_ =
new node( *nd.left_ );
423 if( nd.right_ != NULL )
425 right_ =
new node( *nd.right_ );
431 value_type middle(
const std::vector< section_type > &secs )
const
433 typename section_type::min_max_type minimum = secs[ 0 ].minimum( );
434 typename section_type::min_max_type maximum = secs[ 0 ].maximum( );
435 for(
size_t i = 1 ; i < secs.size( ) ; i ++ )
437 minimum = ( secs[ i ].minimum( ) < minimum ) ? secs[ i ].minimum( ) : minimum;
438 maximum = ( secs[ i ].maximum( ) > maximum ) ? secs[ i ].maximum( ) : maximum;
441 return( static_cast< value_type >( ( minimum + maximum ) / 2.0 ) );
445 std::vector< section_type > min_inc_secs_;
446 std::vector< section_type > max_dec_secs_;
458 #endif // #ifndef __INCLUDE_INTERVAL_TREE_H__