1134723edSLouis Dionne //===----------------------------------------------------------------------===// 2134723edSLouis Dionne // 3134723edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4134723edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5134723edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6134723edSLouis Dionne // 7134723edSLouis Dionne //===----------------------------------------------------------------------===// 8134723edSLouis Dionne 9134723edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_HALF_POSITIVE_H 10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_HALF_POSITIVE_H 11134723edSLouis Dionne 12134723edSLouis Dionne #include <__config> 13e698c595SNikolas Klauser #include <__type_traits/enable_if.h> 14e698c595SNikolas Klauser #include <__type_traits/is_integral.h> 15e698c595SNikolas Klauser #include <__type_traits/make_unsigned.h> 16134723edSLouis Dionne 17134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18134723edSLouis Dionne # pragma GCC system_header 19134723edSLouis Dionne #endif 20134723edSLouis Dionne 21134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 22134723edSLouis Dionne 23134723edSLouis Dionne // Perform division by two quickly for positive integers (llvm.org/PR39129) 24134723edSLouis Dionne 25475bd19eSNikolas Klauser template <typename _Integral, __enable_if_t<is_integral<_Integral>::value, int> = 0> __half_positive(_Integral __value)26*9783f28cSLouis Dionne_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Integral __half_positive(_Integral __value) { 275fab33afSNikolas Klauser return static_cast<_Integral>(static_cast<__make_unsigned_t<_Integral> >(__value) / 2); 28134723edSLouis Dionne } 29134723edSLouis Dionne 30475bd19eSNikolas Klauser template <typename _Tp, __enable_if_t<!is_integral<_Tp>::value, int> = 0> __half_positive(_Tp __value)31*9783f28cSLouis Dionne_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp __half_positive(_Tp __value) { 32134723edSLouis Dionne return __value / 2; 33134723edSLouis Dionne } 34134723edSLouis Dionne 35134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD 36134723edSLouis Dionne 37134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_HALF_POSITIVE_H 38