brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · 847cee2 Raw
83 lines · cpp
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// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <utility>12 13// template<class R, class T>14//   constexpr bool in_range(T t) noexcept;               // C++2015 16#include <utility>17#include <limits>18#include <numeric>19#include <tuple>20#include <cassert>21#include <cstdint>22 23#include "test_macros.h"24 25template <typename T>26struct Tuple {27  T min;28  T max;29  T mid;30  constexpr Tuple() {31    min = std::numeric_limits<T>::min();32    max = std::numeric_limits<T>::max();33    mid = std::midpoint(min, max);34  }35};36 37template <typename T>38constexpr void test_in_range1() {39  constexpr Tuple<T> tup;40  assert(std::in_range<T>(tup.min));41  assert(std::in_range<T>(tup.min + 1));42  assert(std::in_range<T>(tup.max));43  assert(std::in_range<T>(tup.max - 1));44  assert(std::in_range<T>(tup.mid));45  assert(std::in_range<T>(tup.mid - 1));46  assert(std::in_range<T>(tup.mid + 1));47}48 49constexpr void test_in_range() {50  constexpr Tuple<std::uint8_t> utup8;51  constexpr Tuple<std::int8_t> stup8;52  assert(!std::in_range<std::int8_t>(utup8.max));53  assert(std::in_range<short>(utup8.max));54  assert(!std::in_range<std::uint8_t>(stup8.min));55  assert(std::in_range<std::int8_t>(utup8.mid));56  assert(!std::in_range<std::uint8_t>(stup8.mid));57  assert(!std::in_range<std::uint8_t>(-1));58}59 60template <class... Ts>61constexpr void test1(const std::tuple<Ts...>&) {62  (test_in_range1<Ts>() , ...);63}64 65constexpr bool test() {66  std::tuple<67#ifndef TEST_HAS_NO_INT12868      __int128_t, __uint128_t,69#endif70      unsigned long long, long long, unsigned long, long, unsigned int, int,71      unsigned short, short, unsigned char, signed char> types;72  test1(types);73  test_in_range();74  return true;75}76 77int main(int, char**) {78  ASSERT_NOEXCEPT(std::in_range<int>(-1));79  test();80  static_assert(test());81  return 0;82}83