1*a06073f9SLouis Dionne //===----------------------------------------------------------------------===// 2*a06073f9SLouis Dionne // 3*a06073f9SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*a06073f9SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*a06073f9SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*a06073f9SLouis Dionne // 7*a06073f9SLouis Dionne //===----------------------------------------------------------------------===// 8*a06073f9SLouis Dionne 9*a06073f9SLouis Dionne #ifndef _LIBCPP___UTILITY_IS_VALID_RANGE_H 10*a06073f9SLouis Dionne #define _LIBCPP___UTILITY_IS_VALID_RANGE_H 11*a06073f9SLouis Dionne 12*a06073f9SLouis Dionne #include <__algorithm/comp.h> 13*a06073f9SLouis Dionne #include <__config> 14*a06073f9SLouis Dionne #include <__type_traits/is_constant_evaluated.h> 15*a06073f9SLouis Dionne 16*a06073f9SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17*a06073f9SLouis Dionne # pragma GCC system_header 18*a06073f9SLouis Dionne #endif 19*a06073f9SLouis Dionne 20*a06073f9SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 21*a06073f9SLouis Dionne 22*a06073f9SLouis Dionne template <class _Tp> 23*a06073f9SLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") bool __is_valid_range(const _Tp * __first,const _Tp * __last)24*a06073f9SLouis Dionne__is_valid_range(const _Tp* __first, const _Tp* __last) { 25*a06073f9SLouis Dionne if (__libcpp_is_constant_evaluated()) { 26*a06073f9SLouis Dionne // If this is not a constant during constant evaluation, that is because __first and __last are not 27*a06073f9SLouis Dionne // part of the same allocation. If they are part of the same allocation, we must still make sure they 28*a06073f9SLouis Dionne // are ordered properly. 29*a06073f9SLouis Dionne return __builtin_constant_p(__first <= __last) && __first <= __last; 30*a06073f9SLouis Dionne } 31*a06073f9SLouis Dionne 32*a06073f9SLouis Dionne return !__less<>()(__last, __first); 33*a06073f9SLouis Dionne } 34*a06073f9SLouis Dionne 35*a06073f9SLouis Dionne _LIBCPP_END_NAMESPACE_STD 36*a06073f9SLouis Dionne 37*a06073f9SLouis Dionne #endif // _LIBCPP___UTILITY_IS_VALID_RANGE_H 38