Файл заголовка clamp.hpp содержит две функции для «зажима» значения между парой граничных значений.
Функция<clamp(v,lo,hi)
>возвращается:
- Если v<
- hi if hi< v
- в противном случае v
Примечание: использование<clamp
>с числами с плавающей запятой может дать неожиданные результаты, если одно из значений<NaN
>.
Существует также версия, которая позволяет абоненту указать сравнительный предикат для использования вместо<operator<
>.
template<typename T>
const T& clamp ( const T& val, const T& lo, const T& hi );
template<typename T, typename Pred>
const T& clamp ( const T& val, const T& lo, const T& hi, Pred p );
Следующий код:
int foo = 23;
foo = clamp ( foo, 1, 10 );
Оставит<foo
>со значением 10
Сложность:<clamp
>сделает один или два вызова предикату сравнения, прежде чем вернуть один из трех параметров.
Есть также четыре версии зажима на основе диапазона, которые применяют зажим к ряду значений. Вы можете написать их сами с помощью std::transform и bind, как это:<std::transform(first,last,out,bind
(clamp
(_1,lo,
hi)))
>, но они предоставляются здесь для вашего удобства.
template<typename InputIterator, typename OutputIterator>
OutputIterator clamp_range ( InputIterator first, InputIterator last, OutputIterator out,
typename std::iterator_traits<InputIterator>::value_type lo,
typename std::iterator_traits<InputIterator>::value_type hi );
template<typename Range, typename OutputIterator>
OutputIterator clamp_range ( const Range &r, OutputIterator out,
typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type lo,
typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type hi );
template<typename InputIterator, typename OutputIterator, typename Pred>
OutputIterator clamp_range ( InputIterator first, InputIterator last, OutputIterator out,
typename std::iterator_traits<InputIterator>::value_type lo,
typename std::iterator_traits<InputIterator>::value_type hi, Pred p );
template<typename Range, typename OutputIterator, typename Pred>
OutputIterator clamp_range ( const Range &r, OutputIterator out,
typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type lo,
typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type hi,
Pred p );