brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 47ad127 Raw
88 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// unsigned long to_ulong() const; // constexpr since C++2310 11#include <bitset>12#include <algorithm>13#include <type_traits>14#include <limits>15#include <climits>16#include <cassert>17#include <stdexcept>18 19#include "test_macros.h"20 21template <std::size_t N>22TEST_CONSTEXPR_CXX23 void test_to_ulong() {23  const std::size_t M   = sizeof(unsigned long) * CHAR_BIT < N ? sizeof(unsigned long) * CHAR_BIT : N;24  const bool is_M_zero  = std::integral_constant < bool, M == 0 > ::value; // avoid compiler warnings25  const std::size_t X   = is_M_zero ? sizeof(unsigned long) * CHAR_BIT - 1 : sizeof(unsigned long) * CHAR_BIT - M;26  const std::size_t max = is_M_zero ? 0 : std::size_t(std::numeric_limits<unsigned long>::max()) >> X;27  std::size_t tests[]   = {28      0,29      std::min<std::size_t>(1, max),30      std::min<std::size_t>(2, max),31      std::min<std::size_t>(3, max),32      std::min(max, max - 3),33      std::min(max, max - 2),34      std::min(max, max - 1),35      max};36  for (std::size_t j : tests) {37    std::bitset<N> v(j);38    assert(j == v.to_ulong());39  }40 41  { // test values bigger than can fit into the bitset42    const unsigned long val  = 0x5AFFFFA5UL;43    const bool canFit        = N < sizeof(unsigned long) * CHAR_BIT;44    const unsigned long mask = canFit ? (1UL << (canFit ? N : 0)) - 1 : (unsigned long)(-1); // avoid compiler warnings45    std::bitset<N> v(val);46    assert(v.to_ulong() == (val & mask)); // we shouldn't return bit patterns from outside the limits of the bitset.47  }48}49 50TEST_CONSTEXPR_CXX23 bool test() {51  test_to_ulong<0>();52  test_to_ulong<1>();53  test_to_ulong<31>();54  test_to_ulong<32>();55  test_to_ulong<33>();56  test_to_ulong<63>();57  test_to_ulong<64>();58  test_to_ulong<65>();59  test_to_ulong<1000>();60 61#ifndef TEST_HAS_NO_EXCEPTIONS62  if (!TEST_IS_CONSTANT_EVALUATED) {63    // bitset has true bits beyond the size of unsigned long64    std::bitset<std::numeric_limits<unsigned long>::digits + 1> q(0);65    q.flip();66    try {67      (void)q.to_ulong(); // throws68      assert(false);69    } catch (const std::overflow_error&) {70      // expected71    } catch (...) {72      assert(false);73    }74  }75#endif // TEST_HAS_NO_EXCEPTIONS76 77  return true;78}79 80int main(int, char**) {81  test();82#if TEST_STD_VER > 2083  static_assert(test());84#endif85 86  return 0;87}88