annotate DEPENDENCIES/generic/include/boost/icl/detail/element_comparer.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 /*-----------------------------------------------------------------------------+
Chris@16 2 Copyright (c) 2008-2009: Joachim Faulhaber
Chris@16 3 +------------------------------------------------------------------------------+
Chris@16 4 Distributed under the Boost Software License, Version 1.0.
Chris@16 5 (See accompanying file LICENCE.txt or copy at
Chris@16 6 http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7 +-----------------------------------------------------------------------------*/
Chris@16 8 #ifndef BOOST_ICL_ELEMENT_COMPARER_HPP_JOFA_090202
Chris@16 9 #define BOOST_ICL_ELEMENT_COMPARER_HPP_JOFA_090202
Chris@16 10
Chris@16 11 #include <boost/mpl/and.hpp>
Chris@16 12 #include <boost/icl/type_traits/is_map.hpp>
Chris@16 13 #include <boost/icl/detail/notate.hpp>
Chris@16 14 #include <boost/icl/type_traits/identity_element.hpp>
Chris@16 15
Chris@16 16 namespace boost{namespace icl
Chris@16 17 {
Chris@16 18
Chris@16 19 namespace Interval_Set
Chris@16 20 {
Chris@16 21
Chris@16 22 template<class LeftT, class RightT>
Chris@16 23 class element_comparer
Chris@16 24 {
Chris@16 25 public:
Chris@16 26 typedef typename LeftT::const_iterator LeftIterT;
Chris@16 27 typedef typename RightT::const_iterator RightIterT;
Chris@16 28
Chris@16 29 BOOST_STATIC_CONSTANT(bool,
Chris@16 30 _compare_codomain = (mpl::and_<is_map<LeftT>, is_map<RightT> >::value));
Chris@16 31
Chris@16 32 element_comparer(const LeftT& left,
Chris@16 33 const RightT& right,
Chris@16 34 const LeftIterT& left_end,
Chris@16 35 const RightIterT& right_end)
Chris@16 36 : _left(left), _right(right),
Chris@16 37 _left_end(left_end), _right_end(right_end), _result(equal)
Chris@16 38 {}
Chris@16 39
Chris@16 40 enum{nextboth, nextleft, nextright, stop};
Chris@16 41
Chris@16 42 enum
Chris@16 43 {
Chris@16 44 less = comparison::less,
Chris@16 45 equal = comparison::equal,
Chris@16 46 greater = comparison::greater
Chris@16 47 };
Chris@16 48
Chris@16 49 int result()const{ return _result; }
Chris@16 50
Chris@16 51 bool covalues_are_equal(LeftIterT& left, RightIterT& right)
Chris@16 52 {
Chris@16 53 if(co_value<LeftT>(left) < co_value<RightT>(right))
Chris@16 54 _result = less;
Chris@16 55 if(co_value<RightT>(right) < co_value<LeftT>(left))
Chris@16 56 _result = greater;
Chris@16 57 return _result == equal;
Chris@16 58 }
Chris@16 59
Chris@16 60 int proceed(LeftIterT& left, RightIterT& right)
Chris@16 61 {
Chris@16 62 if(upper_less(key_value<LeftT>(left), key_value<RightT>(right)))
Chris@16 63 {
Chris@16 64 _prior_left = left;
Chris@16 65 ++left;
Chris@16 66 return nextleft;
Chris@16 67 }
Chris@16 68 else if(upper_less(key_value<RightT>(right), key_value<LeftT>(left)))
Chris@16 69 {
Chris@16 70 _prior_right = right;
Chris@16 71 ++right;
Chris@16 72 return nextright;
Chris@16 73 }
Chris@16 74 else
Chris@16 75 {
Chris@16 76 ++left;
Chris@16 77 ++right;
Chris@16 78 return nextboth;
Chris@16 79 }
Chris@16 80 }
Chris@16 81
Chris@16 82 int next_both(LeftIterT& left, RightIterT& right)
Chris@16 83 {
Chris@16 84 if(left == _left_end)
Chris@16 85 {
Chris@16 86 _result = (right == _right_end) ? equal : less;
Chris@16 87 return stop;
Chris@16 88 }
Chris@16 89
Chris@16 90 // left != _left_end
Chris@16 91 if(right == _right_end)
Chris@16 92 {
Chris@16 93 _result = greater;
Chris@16 94 return stop;
Chris@16 95 }
Chris@16 96
Chris@16 97 // The starting intervals have to begin equally
Chris@16 98 if(lower_less(key_value<LeftT>(left), key_value<RightT>(right)))
Chris@16 99 { // left: same A... = sameA...
Chris@16 100 // right:same B.. = sameB...
Chris@16 101 _result = less;
Chris@16 102 return stop;
Chris@16 103 }
Chris@16 104
Chris@16 105 if(lower_less(key_value<LeftT>(right), key_value<RightT>(left)))
Chris@16 106 { // left: same B.. = sameB...
Chris@16 107 // right:same A... = sameA...
Chris@16 108 _result = greater;
Chris@16 109 return stop;
Chris@16 110 }
Chris@16 111
Chris@16 112 if(_compare_codomain && !covalues_are_equal(left, right))
Chris@16 113 return stop;
Chris@16 114
Chris@16 115 return proceed(left, right);
Chris@16 116 }
Chris@16 117
Chris@16 118 int next_left(LeftIterT& left, RightIterT& right)
Chris@16 119 {
Chris@16 120 if(left == _left_end)
Chris@16 121 { // left: same
Chris@16 122 // right:sameA...
Chris@16 123 _result = less;
Chris@16 124 return stop;
Chris@16 125 }
Chris@16 126
Chris@16 127 if(!key_value<LeftT>(_prior_left).touches(key_value<LeftT>(left)))
Chris@16 128 { // left: same B = sameB...
Chris@16 129 // right:sameA = sameA...
Chris@16 130 _result = greater;
Chris@16 131 return stop;
Chris@16 132 }
Chris@16 133
Chris@16 134 if(_compare_codomain && !covalues_are_equal(left, right))
Chris@16 135 return stop;
Chris@16 136
Chris@16 137 return proceed(left, right);
Chris@16 138 }
Chris@16 139
Chris@16 140 int next_right(LeftIterT& left, RightIterT& right)
Chris@16 141 {
Chris@16 142 if(right == _right_end)
Chris@16 143 { // left: sameA...
Chris@16 144 // right:same
Chris@16 145 _result = greater;
Chris@16 146 return stop;
Chris@16 147 }
Chris@16 148
Chris@16 149 if(!key_value<RightT>(_prior_right).touches(key_value<RightT>(right)))
Chris@16 150 {
Chris@16 151 // left: sameA... = sameA...
Chris@16 152 // right:same B.. = sameB...
Chris@16 153 _result = less;
Chris@16 154 return stop;
Chris@16 155 }
Chris@16 156
Chris@16 157 if(_compare_codomain && !covalues_are_equal(left, right))
Chris@16 158 return stop;
Chris@16 159
Chris@16 160 return proceed(left, right);
Chris@16 161 }
Chris@16 162
Chris@16 163 private:
Chris@16 164 const LeftT& _left;
Chris@16 165 const RightT& _right;
Chris@16 166 LeftIterT _left_end;
Chris@16 167 RightIterT _right_end;
Chris@16 168 LeftIterT _prior_left;
Chris@16 169 RightIterT _prior_right;
Chris@16 170 int _result;
Chris@16 171 };
Chris@16 172
Chris@16 173
Chris@16 174
Chris@16 175 template<class LeftT, class RightT>
Chris@16 176 int element_compare
Chris@16 177 (
Chris@16 178 const LeftT& left, //sub
Chris@16 179 const RightT& right, //super
Chris@16 180 typename LeftT::const_iterator left_begin,
Chris@16 181 typename LeftT::const_iterator left_end,
Chris@16 182 typename RightT::const_iterator right_begin,
Chris@16 183 typename RightT::const_iterator right_end
Chris@16 184 )
Chris@16 185 {
Chris@16 186 typedef element_comparer<LeftT,RightT> Step;
Chris@16 187 Step step(left, right, left_end, right_end);
Chris@16 188
Chris@16 189 typename LeftT::const_iterator left_ = left_begin;
Chris@16 190 typename RightT::const_iterator right_ = right_begin;
Chris@16 191
Chris@16 192 int state = Step::nextboth;
Chris@16 193 while(state != Step::stop)
Chris@16 194 {
Chris@16 195 switch(state){
Chris@16 196 case Step::nextboth: state = step.next_both (left_, right_); break;
Chris@16 197 case Step::nextleft: state = step.next_left (left_, right_); break;
Chris@16 198 case Step::nextright: state = step.next_right(left_, right_); break;
Chris@16 199 }
Chris@16 200 }
Chris@16 201 return step.result();
Chris@16 202 }
Chris@16 203
Chris@16 204
Chris@16 205 } // namespace Interval_Set
Chris@16 206
Chris@16 207 }} // namespace icl boost
Chris@16 208
Chris@16 209 #endif
Chris@16 210