//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20

#include <bit>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <utility>

#include "test_macros.h"

template <class T>
concept has_byteswap = requires(T t) {
  std::byteswap(t);
};

static_assert(!has_byteswap<void*>);
static_assert(!has_byteswap<float>);
static_assert(!has_byteswap<char[2]>);
static_assert(!has_byteswap<std::byte>);

template <class T>
constexpr void test_num(T in, T expected) {
  assert(std::byteswap(in) == expected);
  ASSERT_SAME_TYPE(decltype(std::byteswap(in)), decltype(in));
  ASSERT_NOEXCEPT(std::byteswap(in));
}

template <class T>
constexpr std::pair<T, T> get_test_data() {
  switch (sizeof(T)) {
  case 2:
    return {static_cast<T>(0x1234), static_cast<T>(0x3412)};
  case 4:
    return {static_cast<T>(0x60AF8503), static_cast<T>(0x0385AF60)};
  case 8:
    return {static_cast<T>(0xABCDFE9477936406), static_cast<T>(0x0664937794FECDAB)};
  default:
    assert(false);
    return {}; // for MSVC, whose `assert` is tragically not [[noreturn]]
  }
}

template <class T>
constexpr void test_implementation_defined_size() {
  const auto [in, expected] = get_test_data<T>();
  test_num<T>(in, expected);
}

constexpr bool test() {
  test_num<std::uint8_t>(0xAB, 0xAB);
  test_num<std::uint16_t>(0xCDEF, 0xEFCD);
  test_num<std::uint32_t>(0x01234567, 0x67452301);
  test_num<std::uint64_t>(0x0123456789ABCDEF, 0xEFCDAB8967452301);

  test_num<std::int8_t>(static_cast<std::int8_t>(0xAB), static_cast<std::int8_t>(0xAB));
  test_num<std::int16_t>(static_cast<std::int16_t>(0xCDEF), static_cast<std::int16_t>(0xEFCD));
  test_num<std::int32_t>(0x01234567, 0x67452301);
  test_num<std::int64_t>(0x0123456789ABCDEF, 0xEFCDAB8967452301);

#ifndef TEST_HAS_NO_INT128
  const auto in = static_cast<__uint128_t>(0x0123456789ABCDEF) << 64 | 0x13579BDF02468ACE;
  const auto expected = static_cast<__uint128_t>(0xCE8A4602DF9B5713) << 64 | 0xEFCDAB8967452301;
  test_num<__uint128_t>(in, expected);
  test_num<__int128_t>(in, expected);
#endif

  test_num<bool>(true, true);
  test_num<bool>(false, false);
  test_num<char>(static_cast<char>(0xCD), static_cast<char>(0xCD));
  test_num<unsigned char>(0xEF, 0xEF);
  test_num<signed char>(0x45, 0x45);
  test_num<char8_t>(0xAB, 0xAB);
  test_num<char16_t>(0xABCD, 0xCDAB);
  test_num<char32_t>(0xABCDEF01, 0x01EFCDAB);
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
  test_implementation_defined_size<wchar_t>();
#endif

  test_implementation_defined_size<short>();
  test_implementation_defined_size<unsigned short>();
  test_implementation_defined_size<int>();
  test_implementation_defined_size<unsigned int>();
  test_implementation_defined_size<long>();
  test_implementation_defined_size<unsigned long>();
  test_implementation_defined_size<long long>();
  test_implementation_defined_size<unsigned long long>();
  return true;
}

int main(int, char**) {
  test();
  static_assert(test());

  return 0;
}
