5#ifndef V8_BASE_BOUNDS_H_
6#define V8_BASE_BOUNDS_H_
16template <
typename T,
typename U>
17 requires((std::is_integral_v<T> || std::is_enum_v<T>) &&
18 (std::is_integral_v<U> || std::is_enum_v<U>)) &&
19 (
sizeof(U) <=
sizeof(T))
20inline constexpr bool IsInRange(T value, U lower_limit, U higher_limit) {
22 using unsigned_T =
typename std::make_unsigned<T>::type;
24 return static_cast<unsigned_T
>(
static_cast<unsigned_T
>(
value) -
25 static_cast<unsigned_T
>(lower_limit)) <=
26 static_cast<unsigned_T
>(
static_cast<unsigned_T
>(higher_limit) -
27 static_cast<unsigned_T
>(lower_limit));
31template <
typename T,
typename U>
32 requires((std::is_integral_v<T> || std::is_enum_v<T>) &&
33 (std::is_integral_v<U> || std::is_enum_v<U>)) &&
34 (
sizeof(U) <=
sizeof(T))
38 using unsigned_T =
typename std::make_unsigned<T>::type;
40 return static_cast<unsigned_T
>(
static_cast<unsigned_T
>(
value) -
41 static_cast<unsigned_T
>(lower_limit)) <
42 static_cast<unsigned_T
>(
static_cast<unsigned_T
>(higher_limit) -
43 static_cast<unsigned_T
>(lower_limit));
49inline constexpr bool IsInBounds(T index, T length, T max)
50 requires std::is_unsigned<T>::value
52 return length <= max && index <= (max -
length);
64 T avail = max -
index;
65 bool oob = *length > avail;
66 if (oob) *length = avail;
bool ClampToBounds(T index, T *length, T max)
constexpr bool IsInHalfOpenRange(T value, U lower_limit, U higher_limit)
constexpr bool IsInBounds(T index, T length, T max)
constexpr bool IsInRange(T value, U lower_limit, U higher_limit)
#define DCHECK_LE(v1, v2)
std::unique_ptr< ValueMirror > value