Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r53930 - sandbox/itl/boost/itl
From: afojgo_at_[hidden]
Date: 2009-06-15 09:24:26


Author: jofaber
Date: 2009-06-15 09:24:25 EDT (Mon, 15 Jun 2009)
New Revision: 53930
URL: http://svn.boost.org/trac/boost/changeset/53930

Log:
Refactoring: Simplified split_interval_map::add. Stable {msvc-9.0}

Text files modified:
   sandbox/itl/boost/itl/split_interval_map.hpp | 59 ++++++++++++++++-----------------------
   1 files changed, 24 insertions(+), 35 deletions(-)

Modified: sandbox/itl/boost/itl/split_interval_map.hpp
==============================================================================
--- sandbox/itl/boost/itl/split_interval_map.hpp (original)
+++ sandbox/itl/boost/itl/split_interval_map.hpp 2009-06-15 09:24:25 EDT (Mon, 15 Jun 2009)
@@ -139,7 +139,7 @@
     void fill_gap(const value_type&);
 
     template<class Combiner>
- void add_mid(interval_type& x_itv, const CodomainT& x_val,
+ void add_main(interval_type& x_itv, const CodomainT& x_val,
                  iterator& it, iterator& end_it);
 
     template<class Combiner>
@@ -256,11 +256,15 @@
         // this is a new Interval that is a gap in the current map
                 if(!lead_gap.empty())
                         fill_gap<Combiner>(value_type(lead_gap, co_val));
-
- // only for the first there can be a leftResid: a part of *it left of addend
- interval_type leftResid; fst_itv.right_subtract(leftResid, inter_val);
-
- // handle special case for first
+ else
+ {
+ interval_type left_resid = right_subtract(fst_itv, inter_val);
+ if(!left_resid.empty())
+ {
+ const_cast<interval_type&>(fst_it->KEY_VALUE).left_subtract(left_resid);
+ fill(value_type(left_resid, cur_val));
+ }
+ }
 
         interval_type interSec = fst_itv & inter_val;
         CodomainT cmb_val = cur_val;
@@ -268,34 +272,17 @@
 
         iterator snd_it = fst_it; snd_it++;
         if(snd_it == end_it)
- {
- // first == last
-
- interval_type endGap; inter_val.left_subtract(endGap, fst_itv);
- // this is a new Interval that is a gap in the current map
- fill_gap<Combiner>(value_type(endGap, co_val));
-
- // only for the last there can be a rightResid: a part of *it right of addend
- interval_type rightResid; (*fst_it).KEY_VALUE.left_subtract(rightResid, inter_val);
-
- this->_map.erase(fst_it);
- fill(value_type(leftResid, cur_val));
- fill(value_type(interSec, cmb_val));
- fill(value_type(rightResid, cur_val));
- }
+ add_rear<Combiner>(inter_val, co_val, lst_it);
         else
         {
- this->_map.erase(fst_it);
- fill(value_type(leftResid, cur_val));
- fill(value_type(interSec, cmb_val));
+ this->template combine<Combiner>(fst_it, co_val);
 
             // shrink interval
             interval_type x_rest(inter_val);
             x_rest.left_subtract(fst_itv);
 
- add_mid<Combiner> (x_rest, co_val, snd_it, end_it);
- add_rear<Combiner>(x_rest, co_val, snd_it);
-
+ add_main<Combiner>(x_rest, co_val, snd_it, end_it);
+ add_rear<Combiner>(x_rest, co_val, lst_it);
         }
     }
 }
@@ -303,7 +290,7 @@
 template <typename DomainT, typename CodomainT, class Traits, ITL_COMPARE Compare, ITL_COMBINE Combine, ITL_SECTION Section, template<class,ITL_COMPARE>class Interval, ITL_ALLOC Alloc>
     template<class Combiner>
 void split_interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::add_mid(interval_type& inter_val, const CodomainT& co_val,
+ ::add_main(interval_type& inter_val, const CodomainT& co_val,
               iterator& it, iterator& end_it)
 {
     iterator pred_it, nxt_it = it; ++nxt_it;
@@ -313,7 +300,7 @@
     {
                 // [----- . . . . . ------) inter_val->co_val
                 // [prior_) [ it_ ) . . .
- cur_itv = (*it).KEY_VALUE ;
+ cur_itv = it->KEY_VALUE;
         left_gap = right_subtract(inter_val, cur_itv);
 
         Combiner()(it->CONT_VALUE, co_val);
@@ -332,19 +319,21 @@
         ++nxt_it;
     }
 
+ cur_itv = it->KEY_VALUE;
+ left_gap = right_subtract(inter_val, cur_itv);
+ if(!left_gap.empty())
+ fill_gap<Combiner>(value_type(left_gap, co_val));
+
+
 }
 
+
 template <typename DomainT, typename CodomainT, class Traits, ITL_COMPARE Compare, ITL_COMBINE Combine, ITL_SECTION Section, template<class,ITL_COMPARE>class Interval, ITL_ALLOC Alloc>
     template<class Combiner>
 void split_interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
     ::add_rear(const interval_type& inter_val, const CodomainT& co_val, iterator& it)
 {
- interval_type cur_itv = (*it).KEY_VALUE ;
- //CodomainT cur_val = (*it).CONT_VALUE ;
-
- interval_type left_gap = right_subtract(inter_val, cur_itv);
- if(!left_gap.empty())
- fill_gap<Combiner>(value_type(left_gap, co_val));
+ interval_type cur_itv = it->KEY_VALUE ;
 
     interval_type end_gap = left_subtract(inter_val, cur_itv);
         if(!end_gap.empty())


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