annotate DEPENDENCIES/generic/include/boost/next_prior.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost next_prior.hpp header file ---------------------------------------//
Chris@16 2
Chris@16 3 // (C) Copyright Dave Abrahams and Daniel Walker 1999-2003. Distributed under the Boost
Chris@16 4 // Software License, Version 1.0. (See accompanying file
Chris@16 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6
Chris@16 7 // See http://www.boost.org/libs/utility for documentation.
Chris@16 8
Chris@16 9 // Revision History
Chris@16 10 // 13 Dec 2003 Added next(x, n) and prior(x, n) (Daniel Walker)
Chris@16 11
Chris@16 12 #ifndef BOOST_NEXT_PRIOR_HPP_INCLUDED
Chris@16 13 #define BOOST_NEXT_PRIOR_HPP_INCLUDED
Chris@16 14
Chris@16 15 #include <iterator>
Chris@101 16 #if defined(_MSC_VER) && _MSC_VER <= 1310
Chris@101 17 #include <boost/mpl/and.hpp>
Chris@101 18 #include <boost/type_traits/is_integral.hpp>
Chris@101 19 #endif
Chris@101 20 #include <boost/type_traits/is_unsigned.hpp>
Chris@101 21 #include <boost/type_traits/integral_promotion.hpp>
Chris@101 22 #include <boost/type_traits/make_signed.hpp>
Chris@101 23 #include <boost/type_traits/has_plus.hpp>
Chris@101 24 #include <boost/type_traits/has_plus_assign.hpp>
Chris@101 25 #include <boost/type_traits/has_minus.hpp>
Chris@101 26 #include <boost/type_traits/has_minus_assign.hpp>
Chris@16 27
Chris@16 28 namespace boost {
Chris@16 29
Chris@16 30 // Helper functions for classes like bidirectional iterators not supporting
Chris@16 31 // operator+ and operator-
Chris@16 32 //
Chris@16 33 // Usage:
Chris@16 34 // const std::list<T>::iterator p = get_some_iterator();
Chris@16 35 // const std::list<T>::iterator prev = boost::prior(p);
Chris@16 36 // const std::list<T>::iterator next = boost::next(prev, 2);
Chris@16 37
Chris@16 38 // Contributed by Dave Abrahams
Chris@16 39
Chris@101 40 namespace next_prior_detail {
Chris@101 41
Chris@101 42 template< typename T, typename Distance, bool HasPlus = has_plus< T, Distance >::value >
Chris@101 43 struct next_impl2
Chris@101 44 {
Chris@101 45 static T call(T x, Distance n)
Chris@101 46 {
Chris@101 47 std::advance(x, n);
Chris@101 48 return x;
Chris@101 49 }
Chris@101 50 };
Chris@101 51
Chris@101 52 template< typename T, typename Distance >
Chris@101 53 struct next_impl2< T, Distance, true >
Chris@101 54 {
Chris@101 55 static T call(T x, Distance n)
Chris@101 56 {
Chris@101 57 return x + n;
Chris@101 58 }
Chris@101 59 };
Chris@101 60
Chris@101 61
Chris@101 62 template< typename T, typename Distance, bool HasPlusAssign = has_plus_assign< T, Distance >::value >
Chris@101 63 struct next_impl1 :
Chris@101 64 public next_impl2< T, Distance >
Chris@101 65 {
Chris@101 66 };
Chris@101 67
Chris@101 68 template< typename T, typename Distance >
Chris@101 69 struct next_impl1< T, Distance, true >
Chris@101 70 {
Chris@101 71 static T call(T x, Distance n)
Chris@101 72 {
Chris@101 73 x += n;
Chris@101 74 return x;
Chris@101 75 }
Chris@101 76 };
Chris@101 77
Chris@101 78
Chris@101 79 template<
Chris@101 80 typename T,
Chris@101 81 typename Distance,
Chris@101 82 typename PromotedDistance = typename integral_promotion< Distance >::type,
Chris@101 83 #if !defined(_MSC_VER) || _MSC_VER > 1310
Chris@101 84 bool IsUInt = is_unsigned< PromotedDistance >::value
Chris@101 85 #else
Chris@101 86 // MSVC 7.1 has problems with applying is_unsigned to non-integral types
Chris@101 87 bool IsUInt = mpl::and_< is_integral< PromotedDistance >, is_unsigned< PromotedDistance > >::value
Chris@101 88 #endif
Chris@101 89 >
Chris@101 90 struct prior_impl3
Chris@101 91 {
Chris@101 92 static T call(T x, Distance n)
Chris@101 93 {
Chris@101 94 std::advance(x, -n);
Chris@101 95 return x;
Chris@101 96 }
Chris@101 97 };
Chris@101 98
Chris@101 99 template< typename T, typename Distance, typename PromotedDistance >
Chris@101 100 struct prior_impl3< T, Distance, PromotedDistance, true >
Chris@101 101 {
Chris@101 102 static T call(T x, Distance n)
Chris@101 103 {
Chris@101 104 typedef typename make_signed< PromotedDistance >::type signed_distance;
Chris@101 105 std::advance(x, -static_cast< signed_distance >(static_cast< PromotedDistance >(n)));
Chris@101 106 return x;
Chris@101 107 }
Chris@101 108 };
Chris@101 109
Chris@101 110
Chris@101 111 template< typename T, typename Distance, bool HasMinus = has_minus< T, Distance >::value >
Chris@101 112 struct prior_impl2 :
Chris@101 113 public prior_impl3< T, Distance >
Chris@101 114 {
Chris@101 115 };
Chris@101 116
Chris@101 117 template< typename T, typename Distance >
Chris@101 118 struct prior_impl2< T, Distance, true >
Chris@101 119 {
Chris@101 120 static T call(T x, Distance n)
Chris@101 121 {
Chris@101 122 return x - n;
Chris@101 123 }
Chris@101 124 };
Chris@101 125
Chris@101 126
Chris@101 127 template< typename T, typename Distance, bool HasMinusAssign = has_minus_assign< T, Distance >::value >
Chris@101 128 struct prior_impl1 :
Chris@101 129 public prior_impl2< T, Distance >
Chris@101 130 {
Chris@101 131 };
Chris@101 132
Chris@101 133 template< typename T, typename Distance >
Chris@101 134 struct prior_impl1< T, Distance, true >
Chris@101 135 {
Chris@101 136 static T call(T x, Distance n)
Chris@101 137 {
Chris@101 138 x -= n;
Chris@101 139 return x;
Chris@101 140 }
Chris@101 141 };
Chris@101 142
Chris@101 143 } // namespace next_prior_detail
Chris@101 144
Chris@16 145 template <class T>
Chris@16 146 inline T next(T x) { return ++x; }
Chris@16 147
Chris@16 148 template <class T, class Distance>
Chris@16 149 inline T next(T x, Distance n)
Chris@16 150 {
Chris@101 151 return next_prior_detail::next_impl1< T, Distance >::call(x, n);
Chris@16 152 }
Chris@16 153
Chris@16 154 template <class T>
Chris@16 155 inline T prior(T x) { return --x; }
Chris@16 156
Chris@16 157 template <class T, class Distance>
Chris@16 158 inline T prior(T x, Distance n)
Chris@16 159 {
Chris@101 160 return next_prior_detail::prior_impl1< T, Distance >::call(x, n);
Chris@16 161 }
Chris@16 162
Chris@16 163 } // namespace boost
Chris@16 164
Chris@16 165 #endif // BOOST_NEXT_PRIOR_HPP_INCLUDED