49 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___BIT_COUNTL_H10#define _LIBCPP___BIT_COUNTL_H11 12#include <__config>13#include <__type_traits/integer_traits.h>14#include <limits>15 16#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)17# pragma GCC system_header18#endif19 20_LIBCPP_PUSH_MACROS21#include <__undef_macros>22 23_LIBCPP_BEGIN_NAMESPACE_STD24 25template <class _Tp>26_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countl_zero(_Tp __t) _NOEXCEPT {27 return __builtin_clzg(__t, numeric_limits<_Tp>::digits);28}29 30#if _LIBCPP_STD_VER >= 2031 32template <__unsigned_integer _Tp>33[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr int countl_zero(_Tp __t) noexcept {34 return std::__countl_zero(__t);35}36 37template <__unsigned_integer _Tp>38[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr int countl_one(_Tp __t) noexcept {39 return std::countl_zero(static_cast<_Tp>(~__t));40}41 42#endif // _LIBCPP_STD_VER >= 2043 44_LIBCPP_END_NAMESPACE_STD45 46_LIBCPP_POP_MACROS47 48#endif // _LIBCPP___BIT_COUNTL_H49