Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r54324 - in sandbox/itl/boost: itl validate/driver
From: afojgo_at_[hidden]
Date: 2009-06-24 18:26:04


Author: jofaber
Date: 2009-06-24 18:26:02 EDT (Wed, 24 Jun 2009)
New Revision: 54324
URL: http://svn.boost.org/trac/boost/changeset/54324

Log:
Refactoring: Improving (split_)interval_map::add,subtract. Stable {msvc-9.0}
Text files modified:
   sandbox/itl/boost/itl/interval_base_map.hpp | 9 +
   sandbox/itl/boost/itl/interval_map.hpp | 221 +++++++++++----------------------------
   sandbox/itl/boost/itl/interval_set.hpp | 14 +-
   sandbox/itl/boost/itl/split_interval_map.hpp | 24 ++-
   sandbox/itl/boost/validate/driver/signed_quantifier_driver.hpp | 2
   5 files changed, 92 insertions(+), 178 deletions(-)

Modified: sandbox/itl/boost/itl/interval_base_map.hpp
==============================================================================
--- sandbox/itl/boost/itl/interval_base_map.hpp (original)
+++ sandbox/itl/boost/itl/interval_base_map.hpp 2009-06-24 18:26:02 EDT (Wed, 24 Jun 2009)
@@ -623,6 +623,15 @@
     sub_type& self() { return *that(); }
 
 protected:
+
+ iterator prior(iterator it_)
+ {
+ if(it_ == this->_map.begin())
+ return this->_map.end();
+ else
+ return --it_;
+ }
+
         template <class Combiner>
         bool combine(iterator& it_, const codomain_type& co_val)
         {

Modified: sandbox/itl/boost/itl/interval_map.hpp
==============================================================================
--- sandbox/itl/boost/itl/interval_map.hpp (original)
+++ sandbox/itl/boost/itl/interval_map.hpp 2009-06-24 18:26:02 EDT (Wed, 24 Jun 2009)
@@ -139,8 +139,11 @@
     bool join_right(iterator& it);
     void join_neighbours(iterator& it){ join_left(it); join_right(it); };
     bool joinable(const iterator& some, const iterator& next)const;
- iterator joint_insert(iterator& some, const iterator& next);
+ iterator join_on_left(iterator& some, const iterator& next);
+ iterator join_on_right(const iterator& some, iterator& next);
+ iterator join_segments(iterator& some, const iterator& next){ return join_on_left(some, next); };//JODO ausbauen
 
+ /*
     template<class Combiner>
     iterator fill_gap_join_left(const value_type&);
 
@@ -152,6 +155,7 @@
 
     template<class Combiner>
     iterator fill_gap_join_both(iterator& prior_, const value_type&);
+ */
 
     iterator fill_join_left(const value_type&);
     iterator fill_join_both(const value_type&);
@@ -200,7 +204,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>
-bool interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
+inline bool interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
     ::joinable(const iterator& some, const iterator& next)const
 {
     // assert: next != end && some++ == next
@@ -208,16 +212,15 @@
         && some->CONT_VALUE == next->CONT_VALUE;
 }
 
+
 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>
-typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
+inline typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
     interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::joint_insert(iterator& left_it, const iterator& right_it)
+ ::join_on_left(iterator& left_it, const iterator& right_it)
 {
- // both left and right are in the set and they are neighbours
- BOOST_ASSERT(right_it != this->_map.end());
- BOOST_ASSERT(left_it->KEY_VALUE.exclusive_less(right_it->KEY_VALUE));
- BOOST_ASSERT(left_it->KEY_VALUE.touches(right_it->KEY_VALUE));
+ // both left and right are in the map and they are neighbours
+ BOOST_ASSERT(joinable(left_it, right_it));
 
     interval_type right_interval = right_it->KEY_VALUE;
     this->_map.erase(right_it);
@@ -226,10 +229,32 @@
     return left_it;
 }
 
+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>
+inline typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
+ interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
+ ::join_on_right(const iterator& left_it, iterator& right_it)
+{
+ // both left and right are in the map and they are neighbours
+ BOOST_ASSERT(joinable(left_it, right_it));
+
+ //JODO: This implementation does not work in very rare cases. Causes are not clear
+ //interval_type left_interval = left_it->KEY_VALUE;
+ //this->_map.erase(left_it);
+ //const_cast<interval_type&>(right_it->KEY_VALUE).extend(left_interval);
+
+ interval_type right_interval = right_it->KEY_VALUE;
+ this->_map.erase(right_it);
+ const_cast<interval_type&>(left_it->KEY_VALUE).extend(right_interval);
+ right_it = left_it;
+
+ return right_it;
+}
+
 
 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>
-bool interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
+inline bool interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
     ::join_left(iterator& it)
 {
     if(it == this->_map.begin())
@@ -240,9 +265,7 @@
 
     if(joinable(it_pred, it))
     {
- iterator it_leftExtended = joint_insert(it_pred, it);
- //CAUTION: it is now invalidated
- it = it_leftExtended;
+ join_on_right(it_pred, it);
         return true;
     }
 
@@ -262,7 +285,7 @@
 
     if(it_succ != this->_map.end() && joinable(it, it_succ))
     {
- joint_insert(it, it_succ);
+ join_segments(it, it_succ);
         return true;
     }
 
@@ -270,132 +293,6 @@
 }
 
 
-
-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>
-typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
-interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::fill_join_left(const value_type& value)
-{
- //collision free insert is asserted
- if(value.KEY_VALUE.empty())
- return this->_map.end();
- if(Traits::absorbs_neutrons && value.CONT_VALUE == codomain_combine::neutron())
- return this->_map.end();
-
- std::pair<iterator,bool> insertion = this->_map.insert(value);
-
- join_left(insertion.ITERATOR);
-
- return insertion.ITERATOR;
-}
-
-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>
-typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
-interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::fill_join_both(const value_type& value)
-{
- //collision free insert is asserted
- if(value.KEY_VALUE.empty())
- return this->_map.end();
- if(Traits::absorbs_neutrons && value.CONT_VALUE == codomain_combine::neutron())
- return this->_map.end();
-
- std::pair<iterator,bool> insertion = this->_map.insert(value);
-
- join_neighbours(insertion.ITERATOR);
-
- return insertion.ITERATOR;
-}
-
-//-----------------------------------------------------------------------------
-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>
-typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
-interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::fill_gap_join_left(const value_type& value)//JODO hint prior_
-{
- //collision free insert is asserted
- if(value.KEY_VALUE.empty())
- return this->_map.end();
- if(Traits::absorbs_neutrons && value.CONT_VALUE == Combiner::neutron())
- return this->_map.end();
-
- std::pair<iterator,bool> insertion
- = this->template map_insert(value.KEY_VALUE, value.CONT_VALUE);
-
- join_left(insertion.ITERATOR);
-
- return insertion.ITERATOR;
-}
-
-//-----------------------------------------------------------------------------
-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>
-typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
-interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::fill_gap_join_left(iterator& prior_, const value_type& value)
-{
- //collision free insert is asserted
- if(value.KEY_VALUE.empty())
- return this->_map.end();
- if(Traits::absorbs_neutrons && value.CONT_VALUE == Combiner::neutron())
- return this->_map.end();
-
- iterator insertion_
- = this->template map_insert<Combiner>(prior_, value.KEY_VALUE, value.CONT_VALUE);
-
- join_left(insertion_);
-
- return insertion_;
-}
-
-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>
-typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
-interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::fill_gap_join_both(const value_type& value)
-{
- //collision free insert is asserted
- if(value.KEY_VALUE.empty())
- return this->_map.end();
- if(Traits::absorbs_neutrons && value.CONT_VALUE == Combiner::neutron())
- return this->_map.end();
-
- std::pair<iterator,bool> insertion
- = this->template map_insert<Combiner>(value.KEY_VALUE, value.CONT_VALUE);
-
- join_neighbours(insertion.ITERATOR);
-
- return insertion.ITERATOR;
-}
-
-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>
-typename interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>::iterator
-interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
- ::fill_gap_join_both(iterator& prior_, const value_type& value)
-{
- //collision free insert is asserted
- if(value.KEY_VALUE.empty())
- return this->_map.end();
- if(Traits::absorbs_neutrons && value.CONT_VALUE == Combiner::neutron())
- return this->_map.end();
-
- iterator insertion_
- = this->template map_insert<Combiner>(prior_, value.KEY_VALUE, value.CONT_VALUE);
-
- join_neighbours(insertion_);
-
- return insertion_;
-}
-
-
 //-----------------------------------------------------------------------------
 // add<Combinator>(pair(interval,value)):
 //-----------------------------------------------------------------------------
@@ -446,15 +343,12 @@
     interval_type left_resid = right_subtract(first_->KEY_VALUE, inter_val);
 
         if(!left_resid.empty())
- { // [------------ . . .
- // [left_resid---fst_it --- . . .
- iterator prior_ = first_;
- if(prior_ != this->_map.begin())
- --prior_;
+ { // [------------ . . .
+ // [prior) [left_resid---fst_it --- . . .
+ iterator prior_ = this->prior(first_);
                 const_cast<interval_type&>(first_->KEY_VALUE).left_subtract(left_resid);
                 //NOTE: Only splitting
- iterator insertion_ = this->_map.insert(prior_, value_type(left_resid, first_->CONT_VALUE));
- join_left(insertion_);
+ this->_map.insert(prior_, value_type(left_resid, first_->CONT_VALUE));
         }
 
         //POST:
@@ -489,12 +383,19 @@
         {
                 // [------ . . .
                 // [-- it ...
- iterator prior_ = it_; prior_--;
- fill_gap_join_left<Combiner>(prior_, value_type(lead_gap, co_val));
+ iterator prior_ = it_;
+ if(prior_ != this->_map.begin())
+ {
+ iterator inserted_ = this->template map_insert<Combiner>(--prior_, lead_gap, co_val);
+ if(joinable(prior_, inserted_))
+ join_on_right(prior_, inserted_);
+ }
+ else
+ this->template map_insert<Combiner>(lead_gap, co_val);
         }
 
- // . . . ------------ . . . addend interval
- // [-- fst_it --) has a common part with the first overval
+ // . . . --------- . . . addend interval
+ // [-- it_ --) has a common part with the first overval
         Combiner()(it_->CONT_VALUE, co_val);
         if(Traits::absorbs_neutrons && it_->CONT_VALUE == Combiner::neutron())
                 this->_map.erase(it_++);
@@ -512,20 +413,23 @@
 inline void interval_map<DomainT,CodomainT,Traits,Compare,Combine,Section,Interval,Alloc>
     ::add_rear(const interval_type& inter_val, const CodomainT& co_val, iterator& it)
 {
- iterator prior_ = it; --prior_;
+ iterator prior_ = this->prior(it);
     interval_type cur_itv = (*it).KEY_VALUE ;
 
     interval_type lead_gap = right_subtract(inter_val, cur_itv);
         if(!lead_gap.empty())
- // [------ . . .
+ { // [------ . . .
                 // [-- it ...
- fill_gap_join_left<Combiner>(prior_, value_type(lead_gap, co_val));
+ iterator inserted_ = this->template map_insert<Combiner>(prior_, lead_gap, co_val);
+ if(prior_ != this->_map.end() && joinable(prior_, inserted_))
+ join_on_left(prior_, inserted_);
+ }
 
     interval_type end_gap = left_subtract(inter_val, cur_itv);
         if(!end_gap.empty())
         {
- // [------------------)
- // [-- it --)
+ // [-------------------)
+ // . . . -- it --)
                 Combiner()(it->CONT_VALUE, co_val);
 
         if(Traits::absorbs_neutrons && it->CONT_VALUE == Combiner::neutron())
@@ -537,7 +441,8 @@
         else
                 {
             join_left(it);
- fill_gap_join_both<Combiner>(it, value_type(end_gap, co_val));
+ iterator inserted_ = this->template map_insert<Combiner>(it, end_gap, co_val);
+ join_neighbours(inserted_);
                 }
         }
         else
@@ -620,9 +525,7 @@
 
     if(!left_resid.empty())
     {
- iterator prior_ = it_;
- if(prior_ != this->_map.begin())
- --prior_;
+ iterator prior_ = this->prior(it_);
                 const_cast<interval_type&>(it_->KEY_VALUE).left_subtract(left_resid);
                 this->_map.insert(prior_, value_type(left_resid, it_->CONT_VALUE));
     }

Modified: sandbox/itl/boost/itl/interval_set.hpp
==============================================================================
--- sandbox/itl/boost/itl/interval_set.hpp (original)
+++ sandbox/itl/boost/itl/interval_set.hpp 2009-06-24 18:26:02 EDT (Wed, 24 Jun 2009)
@@ -143,7 +143,7 @@
     /// Treatment of adjoint intervals on insertion
     void handle_neighbours(const iterator& it);
 
- iterator joint_insert(const iterator& left_it, const iterator& right_it);
+ iterator join_segments(const iterator& left_it, const iterator& right_it);
 } ;
 
 
@@ -178,7 +178,7 @@
     {
         iterator it_nxt=it; it_nxt++;
         if(it_nxt!=this->_set.end() && (*it).touches(*it_nxt))
- joint_insert(it, it_nxt);
+ join_segments(it, it_nxt);
     }
     else
     {
@@ -187,14 +187,14 @@
 
         if((*it_pred).touches(*it))
         {
- iterator it_extended = joint_insert(it_pred, it);
+ iterator it_extended = join_segments(it_pred, it);
 
             iterator it_succ=it_extended; it_succ++;
             if(it_succ!=this->_set.end())
             {
                 // it's a non border element that might have two touching neighbours
                 if((*it_extended).touches(*it_succ))
- joint_insert(it_extended, it_succ);
+ join_segments(it_extended, it_succ);
             }
         }
         else
@@ -204,7 +204,7 @@
             {
                 // it's a non border element that might have a right touching neighbours
                 if((*it).touches(*it_succ))
- joint_insert(it, it_succ);
+ join_segments(it, it_succ);
             }
         }
     }
@@ -213,9 +213,9 @@
 
 
 template <typename DomainT, ITL_COMPARE Compare, template<class,ITL_COMPARE>class Interval, ITL_ALLOC Alloc>
-typename interval_set<DomainT,Compare,Interval,Alloc>::iterator
+inline typename interval_set<DomainT,Compare,Interval,Alloc>::iterator
     interval_set<DomainT,Compare,Interval,Alloc>
- ::joint_insert(const iterator& left_it, const iterator& right_it)
+ ::join_segments(const iterator& left_it, const iterator& right_it)
 {
     // both left and right are in the set and they are neighbours
     BOOST_ASSERT((*left_it).exclusive_less(*right_it));

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-24 18:26:02 EDT (Wed, 24 Jun 2009)
@@ -295,9 +295,7 @@
         if(!left_resid.empty())
         { // [------------ . . .
                 // [left_resid---fst_it --- . . .
- iterator prior_ = first_;
- if(prior_ != this->_map.begin())
- --prior_;
+ iterator prior_ = this->prior(first_);
                 const_cast<interval_type&>(first_->KEY_VALUE).left_subtract(left_resid);
                 //NOTE: Only splitting
                 iterator insertion_ = this->_map.insert(prior_, value_type(left_resid, first_->CONT_VALUE));
@@ -335,12 +333,15 @@
         {
                 // [------ . . .
                 // [-- it ...
- iterator prior_ = it_; prior_--;
- fill_gap<Combiner>(prior_, lead_gap, co_val);
+ iterator prior_ = it_;
+ if(prior_ != this->_map.begin())
+ this->template map_insert<Combiner>(--prior_, lead_gap, co_val);
+ else
+ this->template map_insert<Combiner>(lead_gap, co_val);
         }
 
- // . . . ------------ . . . addend interval
- // [-- fst_it --) has a common part with the first overval
+ // . . . --------- . . . addend interval
+ // [-- it_ --) has a common part with the first overval
         Combiner()(it_->CONT_VALUE, co_val);
         if(Traits::absorbs_neutrons && it_->CONT_VALUE == Combiner::neutron())
                 this->_map.erase(it_++);
@@ -355,14 +356,15 @@
 inline 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)
 {
- iterator prior_ = it; --prior_;
+ iterator prior_ = this->prior(it);
     interval_type cur_itv = (*it).KEY_VALUE ;
 
     interval_type lead_gap = right_subtract(inter_val, cur_itv);
         if(!lead_gap.empty())
- // [------ . . .
- // [-- it ...
- fill_gap<Combiner>(prior_, lead_gap, co_val);
+ // [------ . . .
+ // [prior) [-- it ...
+ this->template map_insert<Combiner>(prior_, lead_gap, co_val);
+
 
     interval_type end_gap = left_subtract(inter_val, cur_itv);
         if(!end_gap.empty())

Modified: sandbox/itl/boost/validate/driver/signed_quantifier_driver.hpp
==============================================================================
--- sandbox/itl/boost/validate/driver/signed_quantifier_driver.hpp (original)
+++ sandbox/itl/boost/validate/driver/signed_quantifier_driver.hpp 2009-06-24 18:26:02 EDT (Wed, 24 Jun 2009)
@@ -101,7 +101,7 @@
             switch(rootChoice)
             {
             //-----------------------------------------------------------------
- case RootType::itl_map: { //JODO URG
+ case RootType::itl_map: {
                 switch(neutronizerChoice) {
                 case NeutronHandlerType::partial_absorber: return new signed_quantifier_validater<itl::map<int,int,partial_absorber> >;
                 case NeutronHandlerType::partial_enricher: return new signed_quantifier_validater<itl::map<int,int,partial_enricher> >;


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