11dc62f26SNikolas Klauser //===----------------------------------------------------------------------===// 21dc62f26SNikolas Klauser // 31dc62f26SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41dc62f26SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 51dc62f26SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61dc62f26SNikolas Klauser // 71dc62f26SNikolas Klauser //===----------------------------------------------------------------------===// 81dc62f26SNikolas Klauser 91dc62f26SNikolas Klauser // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 101dc62f26SNikolas Klauser 111dc62f26SNikolas Klauser #include <bit> 121dc62f26SNikolas Klauser #include <cassert> 13*e99c4906SNikolas Klauser #include <cstddef> 141dc62f26SNikolas Klauser #include <cstdint> 151dc62f26SNikolas Klauser #include <utility> 161dc62f26SNikolas Klauser 171dc62f26SNikolas Klauser #include "test_macros.h" 181dc62f26SNikolas Klauser 191dc62f26SNikolas Klauser template <class T> 201dc62f26SNikolas Klauser concept has_byteswap = requires(T t) { 211dc62f26SNikolas Klauser std::byteswap(t); 221dc62f26SNikolas Klauser }; 231dc62f26SNikolas Klauser 241dc62f26SNikolas Klauser static_assert(!has_byteswap<void*>); 251dc62f26SNikolas Klauser static_assert(!has_byteswap<float>); 261dc62f26SNikolas Klauser static_assert(!has_byteswap<char[2]>); 271dc62f26SNikolas Klauser static_assert(!has_byteswap<std::byte>); 281dc62f26SNikolas Klauser 291dc62f26SNikolas Klauser template <class T> 301dc62f26SNikolas Klauser constexpr void test_num(T in, T expected) { 311dc62f26SNikolas Klauser assert(std::byteswap(in) == expected); 321dc62f26SNikolas Klauser ASSERT_SAME_TYPE(decltype(std::byteswap(in)), decltype(in)); 331dc62f26SNikolas Klauser ASSERT_NOEXCEPT(std::byteswap(in)); 341dc62f26SNikolas Klauser } 351dc62f26SNikolas Klauser 361dc62f26SNikolas Klauser template <class T> 371dc62f26SNikolas Klauser constexpr std::pair<T, T> get_test_data() { 381dc62f26SNikolas Klauser switch (sizeof(T)) { 391dc62f26SNikolas Klauser case 2: 401dc62f26SNikolas Klauser return {static_cast<T>(0x1234), static_cast<T>(0x3412)}; 411dc62f26SNikolas Klauser case 4: 421dc62f26SNikolas Klauser return {static_cast<T>(0x60AF8503), static_cast<T>(0x0385AF60)}; 431dc62f26SNikolas Klauser case 8: 441dc62f26SNikolas Klauser return {static_cast<T>(0xABCDFE9477936406), static_cast<T>(0x0664937794FECDAB)}; 45cb71d77cSCasey Carter default: 461dc62f26SNikolas Klauser assert(false); 47cb71d77cSCasey Carter return {}; // for MSVC, whose `assert` is tragically not [[noreturn]] 48cb71d77cSCasey Carter } 491dc62f26SNikolas Klauser } 501dc62f26SNikolas Klauser 511dc62f26SNikolas Klauser template <class T> 521dc62f26SNikolas Klauser constexpr void test_implementation_defined_size() { 531dc62f26SNikolas Klauser const auto [in, expected] = get_test_data<T>(); 541dc62f26SNikolas Klauser test_num<T>(in, expected); 551dc62f26SNikolas Klauser } 561dc62f26SNikolas Klauser 571dc62f26SNikolas Klauser constexpr bool test() { 58bd5d0feeSMark de Wever test_num<std::uint8_t>(0xAB, 0xAB); 59bd5d0feeSMark de Wever test_num<std::uint16_t>(0xCDEF, 0xEFCD); 60da79d6e1SMark de Wever test_num<std::uint32_t>(0x01234567, 0x67452301); 61bd5d0feeSMark de Wever test_num<std::uint64_t>(0x0123456789ABCDEF, 0xEFCDAB8967452301); 621dc62f26SNikolas Klauser 63bd5d0feeSMark de Wever test_num<std::int8_t>(static_cast<std::int8_t>(0xAB), static_cast<std::int8_t>(0xAB)); 64bd5d0feeSMark de Wever test_num<std::int16_t>(static_cast<std::int16_t>(0xCDEF), static_cast<std::int16_t>(0xEFCD)); 65bd5d0feeSMark de Wever test_num<std::int32_t>(0x01234567, 0x67452301); 66bd5d0feeSMark de Wever test_num<std::int64_t>(0x0123456789ABCDEF, 0xEFCDAB8967452301); 671dc62f26SNikolas Klauser 688f972cb0SMark de Wever #ifndef TEST_HAS_NO_INT128 691dc62f26SNikolas Klauser const auto in = static_cast<__uint128_t>(0x0123456789ABCDEF) << 64 | 0x13579BDF02468ACE; 701dc62f26SNikolas Klauser const auto expected = static_cast<__uint128_t>(0xCE8A4602DF9B5713) << 64 | 0xEFCDAB8967452301; 711dc62f26SNikolas Klauser test_num<__uint128_t>(in, expected); 721dc62f26SNikolas Klauser test_num<__int128_t>(in, expected); 731dc62f26SNikolas Klauser #endif 741dc62f26SNikolas Klauser 751dc62f26SNikolas Klauser test_num<bool>(true, true); 761dc62f26SNikolas Klauser test_num<bool>(false, false); 77cb71d77cSCasey Carter test_num<char>(static_cast<char>(0xCD), static_cast<char>(0xCD)); 781dc62f26SNikolas Klauser test_num<unsigned char>(0xEF, 0xEF); 791dc62f26SNikolas Klauser test_num<signed char>(0x45, 0x45); 801dc62f26SNikolas Klauser test_num<char8_t>(0xAB, 0xAB); 811dc62f26SNikolas Klauser test_num<char16_t>(0xABCD, 0xCDAB); 821dc62f26SNikolas Klauser test_num<char32_t>(0xABCDEF01, 0x01EFCDAB); 831dc62f26SNikolas Klauser #ifndef TEST_HAS_NO_WIDE_CHARACTERS 841dc62f26SNikolas Klauser test_implementation_defined_size<wchar_t>(); 851dc62f26SNikolas Klauser #endif 861dc62f26SNikolas Klauser 871dc62f26SNikolas Klauser test_implementation_defined_size<short>(); 881dc62f26SNikolas Klauser test_implementation_defined_size<unsigned short>(); 891dc62f26SNikolas Klauser test_implementation_defined_size<int>(); 901dc62f26SNikolas Klauser test_implementation_defined_size<unsigned int>(); 911dc62f26SNikolas Klauser test_implementation_defined_size<long>(); 921dc62f26SNikolas Klauser test_implementation_defined_size<unsigned long>(); 931dc62f26SNikolas Klauser test_implementation_defined_size<long long>(); 941dc62f26SNikolas Klauser test_implementation_defined_size<unsigned long long>(); 951dc62f26SNikolas Klauser return true; 961dc62f26SNikolas Klauser } 971dc62f26SNikolas Klauser 981dc62f26SNikolas Klauser int main(int, char**) { 991dc62f26SNikolas Klauser test(); 1001dc62f26SNikolas Klauser static_assert(test()); 1011dc62f26SNikolas Klauser 1021dc62f26SNikolas Klauser return 0; 1031dc62f26SNikolas Klauser } 104