// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include "common/new_bit_field.h" namespace Common::BitField { enum class U8Enum : std::uint8_t {}; enum class U16Enum : std::uint16_t {}; enum class U32Enum : std::uint32_t {}; enum class U64Enum : std::uint64_t {}; enum class S8Enum : std::int8_t {}; enum class S16Enum : std::int16_t {}; enum class S32Enum : std::int32_t {}; enum class S64Enum : std::int64_t {}; template struct NByteStruct { std::array raw; }; struct NonTrivialStruct { NonTrivialStruct() {} }; struct NonTriviallyCopyableStruct { NonTriviallyCopyableStruct(const NonTriviallyCopyableStruct&) {} }; struct NonStandardLayoutStruct { std::uint8_t a; private: std::uint8_t b; }; struct NonPODStruct { virtual void Foo() const = 0; }; // clang-format off // Tests that must pass. static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 8>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 8>>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v, 9>>); static_assert(std::is_same_v, 16>>); static_assert(std::is_same_v, 9>>); static_assert(std::is_same_v, 16>>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v, 17>>); static_assert(std::is_same_v, 32>>); static_assert(std::is_same_v, 17>>); static_assert(std::is_same_v, 32>>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v, 33>>); static_assert(std::is_same_v, 64>>); static_assert(std::is_same_v, 33>>); static_assert(std::is_same_v, 64>>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 8>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 8>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 16>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 16>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 32>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 32>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 64>>); static_assert(std::is_same_v, 1>>); static_assert(std::is_same_v, 64>>); static_assert(std::is_same_v, BitFieldOutputType, 8>>); static_assert(std::is_same_v, BitFieldOutputType, 16>>); static_assert(std::is_same_v, BitFieldOutputType, 24>>); static_assert(std::is_same_v, BitFieldOutputType, 32>>); static_assert(std::is_same_v, BitFieldOutputType, 40>>); static_assert(std::is_same_v, BitFieldOutputType, 48>>); static_assert(std::is_same_v, BitFieldOutputType, 56>>); static_assert(std::is_same_v, BitFieldOutputType, 64>>); static_assert(TypeTraits::SignExtend == true); static_assert(TypeTraits::SignExtend == false); static_assert(TypeTraits, 8>::SignExtend == true); static_assert(TypeTraits, 8>::SignExtend == true); static_assert(TypeTraits, 8>::SignExtend == false); static_assert(TypeTraits, 8>::SignExtend == false); // Tests that will fail if uncommented. // NumBits must not be 0. // static_assert(std::is_same_v>); // For bool, NumBits must be exactly 1. // static_assert(std::is_same_v>); // For signed integers, use SignExtSInt or ZeroExtSInt instead. // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // SignExtSInt: Type must be a signed integral. // static_assert(std::is_same_v, 8>>); // static_assert(std::is_same_v, 32>>); // static_assert(std::is_same_v, 8>>); // static_assert(std::is_same_v, BitFieldOutputType>, 8>>); // ZeroExtSInt: Type must be a signed integral. // static_assert(std::is_same_v, 8>>); // static_assert(std::is_same_v, 32>>); // static_assert(std::is_same_v, 8>>); // static_assert(std::is_same_v, BitFieldOutputType>, 8>>); // Type must be a POD type. // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // Type must contain at least NumBits bits. // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // Type must contain exactly NumBits bits. // static_assert(std::is_same_v>); // static_assert(std::is_same_v>); // static_assert(std::is_same_v, BitFieldOutputType, 7>>); // static_assert(std::is_same_v, BitFieldOutputType, 15>>); // static_assert(std::is_same_v, BitFieldOutputType, 23>>); // static_assert(std::is_same_v, BitFieldOutputType, 31>>); // static_assert(std::is_same_v, BitFieldOutputType, 39>>); // static_assert(std::is_same_v, BitFieldOutputType, 47>>); // static_assert(std::is_same_v, BitFieldOutputType, 55>>); // static_assert(std::is_same_v, BitFieldOutputType, 63>>); // clang-format on } // namespace Common::BitField