1*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 2*fe6060f1SDimitry Andric // 3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fe6060f1SDimitry Andric // 7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8*fe6060f1SDimitry Andric 9*fe6060f1SDimitry Andric #ifndef _LIBCPP___ALGORITHM_CLAMP_H 10*fe6060f1SDimitry Andric #define _LIBCPP___ALGORITHM_CLAMP_H 11*fe6060f1SDimitry Andric 12*fe6060f1SDimitry Andric #include <__config> 13*fe6060f1SDimitry Andric #include <__debug> 14*fe6060f1SDimitry Andric #include <__algorithm/comp.h> 15*fe6060f1SDimitry Andric 16*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17*fe6060f1SDimitry Andric #pragma GCC system_header 18*fe6060f1SDimitry Andric #endif 19*fe6060f1SDimitry Andric 20*fe6060f1SDimitry Andric _LIBCPP_PUSH_MACROS 21*fe6060f1SDimitry Andric #include <__undef_macros> 22*fe6060f1SDimitry Andric 23*fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 24*fe6060f1SDimitry Andric 25*fe6060f1SDimitry Andric #if _LIBCPP_STD_VER > 14 26*fe6060f1SDimitry Andric // clamp 27*fe6060f1SDimitry Andric template<class _Tp, class _Compare> 28*fe6060f1SDimitry Andric _LIBCPP_NODISCARD_EXT inline 29*fe6060f1SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 30*fe6060f1SDimitry Andric const _Tp& 31*fe6060f1SDimitry Andric clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp) 32*fe6060f1SDimitry Andric { 33*fe6060f1SDimitry Andric _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp"); 34*fe6060f1SDimitry Andric return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v; 35*fe6060f1SDimitry Andric 36*fe6060f1SDimitry Andric } 37*fe6060f1SDimitry Andric 38*fe6060f1SDimitry Andric template<class _Tp> 39*fe6060f1SDimitry Andric _LIBCPP_NODISCARD_EXT inline 40*fe6060f1SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 41*fe6060f1SDimitry Andric const _Tp& 42*fe6060f1SDimitry Andric clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi) 43*fe6060f1SDimitry Andric { 44*fe6060f1SDimitry Andric return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>()); 45*fe6060f1SDimitry Andric } 46*fe6060f1SDimitry Andric #endif 47*fe6060f1SDimitry Andric 48*fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 49*fe6060f1SDimitry Andric 50*fe6060f1SDimitry Andric _LIBCPP_POP_MACROS 51*fe6060f1SDimitry Andric 52*fe6060f1SDimitry Andric #endif // _LIBCPP___ALGORITHM_CLAMP_H 53