123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- /*-----------------------------------------------------------------------------+
- Copyright (c) 2007-2010: Joachim Faulhaber
- +------------------------------------------------------------------------------+
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENCE.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
- +-----------------------------------------------------------------------------*/
- #ifndef BOOST_ICL_MAPALGO_HPP_JOFA_080225
- #define BOOST_ICL_MAPALGO_HPP_JOFA_080225
- #include <boost/mpl/and.hpp>
- #include <boost/mpl/or.hpp>
- #include <boost/mpl/not.hpp>
- #include <boost/icl/detail/notate.hpp>
- #include <boost/icl/detail/set_algo.hpp>
- #ifdef BOOST_MSVC
- #pragma warning(push)
- #pragma warning(disable:4127) // conditional expression is constant
- #endif
- namespace boost{namespace icl
- {
- namespace Map
- {
- template <class ObjectT, class CoObjectT>
- bool intersects(const ObjectT& left, const CoObjectT& right)
- {
- typedef typename CoObjectT::const_iterator co_iterator;
- co_iterator right_common_lower_, right_common_upper_;
- if(!Set::common_range(right_common_lower_, right_common_upper_, right, left))
- return false;
- co_iterator right_ = right_common_lower_;
- while(right_ != right_common_upper_)
- if(!(left.find(key_value<CoObjectT>(right_++))==left.end()))
- return true;
- return false;
- }
- template<class MapT>
- typename MapT::const_iterator next_proton(typename MapT::const_iterator& iter_, const MapT& object)
- {
- while( iter_ != object.end()
- && (*iter_).second == identity_element<typename MapT::codomain_type>::value())
- ++iter_;
- return iter_;
- }
- /** Function template <tt>lexicographical_equal</tt> implements
- lexicographical equality except for identity_elementic content values. */
- template<class MapT>
- bool lexicographical_distinct_equal(const MapT& left, const MapT& right)
- {
- if(&left == &right)
- return true;
- typename MapT::const_iterator left_ = left.begin();
- typename MapT::const_iterator right_ = right.begin();
- left_ = next_proton(left_, left);
- right_ = next_proton(right_, right);
- while(left_ != left.end() && right_ != right.end())
- {
- if(!(left_->first == right_->first && left_->second == right_->second))
- return false;
- ++left_;
- ++right_;
- left_ = next_proton(left_, left);
- right_ = next_proton(right_, right);
- }
- return left_ == left.end() && right_ == right.end();
- }
- } // namespace Map
- }} // namespace boost icl
- #ifdef BOOST_MSVC
- #pragma warning(pop)
- #endif
- #endif
|