181ad6265SDimitry Andric //===----------------------------------------------------------------------===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric 981ad6265SDimitry Andric #ifndef _LIBCPP___TYPE_TRAITS_EXTENT_H 1081ad6265SDimitry Andric #define _LIBCPP___TYPE_TRAITS_EXTENT_H 1181ad6265SDimitry Andric 1281ad6265SDimitry Andric #include <__config> 1381ad6265SDimitry Andric #include <__type_traits/integral_constant.h> 1481ad6265SDimitry Andric #include <cstddef> 1581ad6265SDimitry Andric 1681ad6265SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1781ad6265SDimitry Andric # pragma GCC system_header 1881ad6265SDimitry Andric #endif 1981ad6265SDimitry Andric 2081ad6265SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 2181ad6265SDimitry Andric 22753f127fSDimitry Andric #if __has_builtin(__array_extent) 2381ad6265SDimitry Andric 2481ad6265SDimitry Andric template <class _Tp, size_t _Dim = 0> 25*06c3fb27SDimitry Andric struct _LIBCPP_TEMPLATE_VIS extent : integral_constant<size_t, __array_extent(_Tp, _Dim)> {}; 2681ad6265SDimitry Andric 27*06c3fb27SDimitry Andric # if _LIBCPP_STD_VER >= 17 2881ad6265SDimitry Andric template <class _Tp, unsigned _Ip = 0> 2981ad6265SDimitry Andric inline constexpr size_t extent_v = __array_extent(_Tp, _Ip); 3081ad6265SDimitry Andric # endif 3181ad6265SDimitry Andric 32753f127fSDimitry Andric #else // __has_builtin(__array_extent) 3381ad6265SDimitry Andric 34*06c3fb27SDimitry Andric template <class _Tp, unsigned _Ip = 0> 35*06c3fb27SDimitry Andric struct _LIBCPP_TEMPLATE_VIS extent : public integral_constant<size_t, 0> {}; 36*06c3fb27SDimitry Andric template <class _Tp> 37*06c3fb27SDimitry Andric struct _LIBCPP_TEMPLATE_VIS extent<_Tp[], 0> : public integral_constant<size_t, 0> {}; 38*06c3fb27SDimitry Andric template <class _Tp, unsigned _Ip> 39*06c3fb27SDimitry Andric struct _LIBCPP_TEMPLATE_VIS extent<_Tp[], _Ip> : public integral_constant<size_t, extent<_Tp, _Ip - 1>::value> {}; 40*06c3fb27SDimitry Andric template <class _Tp, size_t _Np> 41*06c3fb27SDimitry Andric struct _LIBCPP_TEMPLATE_VIS extent<_Tp[_Np], 0> : public integral_constant<size_t, _Np> {}; 42*06c3fb27SDimitry Andric template <class _Tp, size_t _Np, unsigned _Ip> 43*06c3fb27SDimitry Andric struct _LIBCPP_TEMPLATE_VIS extent<_Tp[_Np], _Ip> : public integral_constant<size_t, extent<_Tp, _Ip - 1>::value> {}; 4481ad6265SDimitry Andric 45*06c3fb27SDimitry Andric # if _LIBCPP_STD_VER >= 17 4681ad6265SDimitry Andric template <class _Tp, unsigned _Ip = 0> 4781ad6265SDimitry Andric inline constexpr size_t extent_v = extent<_Tp, _Ip>::value; 4881ad6265SDimitry Andric # endif 4981ad6265SDimitry Andric 50753f127fSDimitry Andric #endif // __has_builtin(__array_extent) 5181ad6265SDimitry Andric 5281ad6265SDimitry Andric _LIBCPP_END_NAMESPACE_STD 5381ad6265SDimitry Andric 5481ad6265SDimitry Andric #endif // _LIBCPP___TYPE_TRAITS_EXTENT_H 55