diff options
| author | 2018-09-21 19:53:14 -0400 | |
|---|---|---|
| committer | 2019-02-06 17:21:15 +0100 | |
| commit | 94bc48dd783989a178ae8cb5956f50d990878a92 (patch) | |
| tree | d1205cb5355b664cd220761235fddc2914307815 /src/common/swap.h | |
| parent | Merge pull request #2081 from ReinUsesLisp/lmem-64 (diff) | |
| download | yuzu-94bc48dd783989a178ae8cb5956f50d990878a92.tar.gz yuzu-94bc48dd783989a178ae8cb5956f50d990878a92.tar.xz yuzu-94bc48dd783989a178ae8cb5956f50d990878a92.zip | |
common/swap: add swap template for enum
Diffstat (limited to 'src/common/swap.h')
| -rw-r--r-- | src/common/swap.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/common/swap.h b/src/common/swap.h index 32af0b6ac..466096f58 100644 --- a/src/common/swap.h +++ b/src/common/swap.h | |||
| @@ -17,6 +17,8 @@ | |||
| 17 | 17 | ||
| 18 | #pragma once | 18 | #pragma once |
| 19 | 19 | ||
| 20 | #include <type_traits> | ||
| 21 | |||
| 20 | #if defined(_MSC_VER) | 22 | #if defined(_MSC_VER) |
| 21 | #include <cstdlib> | 23 | #include <cstdlib> |
| 22 | #elif defined(__linux__) | 24 | #elif defined(__linux__) |
| @@ -605,6 +607,44 @@ struct swap_double_t { | |||
| 605 | } | 607 | } |
| 606 | }; | 608 | }; |
| 607 | 609 | ||
| 610 | template <typename T> | ||
| 611 | struct swap_enum_t { | ||
| 612 | static_assert(std::is_enum_v<T>); | ||
| 613 | using base = std::underlying_type_t<T>; | ||
| 614 | |||
| 615 | public: | ||
| 616 | swap_enum_t() = default; | ||
| 617 | swap_enum_t(const T& v) : value(swap(v)) {} | ||
| 618 | |||
| 619 | swap_enum_t& operator=(const T& v) { | ||
| 620 | value = swap(v); | ||
| 621 | return *this; | ||
| 622 | } | ||
| 623 | |||
| 624 | operator T() const { | ||
| 625 | return swap(value); | ||
| 626 | } | ||
| 627 | |||
| 628 | explicit operator base() const { | ||
| 629 | return static_cast<base>(swap(value)); | ||
| 630 | } | ||
| 631 | |||
| 632 | protected: | ||
| 633 | T value{}; | ||
| 634 | // clang-format off | ||
| 635 | using swap_t = std::conditional_t< | ||
| 636 | std::is_same_v<base, u16>, swap_16_t<u16>, std::conditional_t< | ||
| 637 | std::is_same_v<base, s16>, swap_16_t<s16>, std::conditional_t< | ||
| 638 | std::is_same_v<base, u32>, swap_32_t<u32>, std::conditional_t< | ||
| 639 | std::is_same_v<base, s32>, swap_32_t<s32>, std::conditional_t< | ||
| 640 | std::is_same_v<base, u64>, swap_64_t<u64>, std::conditional_t< | ||
| 641 | std::is_same_v<base, s64>, swap_64_t<s64>, void>>>>>>; | ||
| 642 | // clang-format on | ||
| 643 | static T swap(T x) { | ||
| 644 | return static_cast<T>(swap_t::swap(static_cast<base>(x))); | ||
| 645 | } | ||
| 646 | }; | ||
| 647 | |||
| 608 | #if COMMON_LITTLE_ENDIAN | 648 | #if COMMON_LITTLE_ENDIAN |
| 609 | using u16_le = u16; | 649 | using u16_le = u16; |
| 610 | using u32_le = u32; | 650 | using u32_le = u32; |
| @@ -614,6 +654,9 @@ using s16_le = s16; | |||
| 614 | using s32_le = s32; | 654 | using s32_le = s32; |
| 615 | using s64_le = s64; | 655 | using s64_le = s64; |
| 616 | 656 | ||
| 657 | template <typename T> | ||
| 658 | using enum_le = std::enable_if_t<std::is_enum_v<T>, T>; | ||
| 659 | |||
| 617 | using float_le = float; | 660 | using float_le = float; |
| 618 | using double_le = double; | 661 | using double_le = double; |
| 619 | 662 | ||
| @@ -626,6 +669,9 @@ using s32_be = swap_struct_t<s32, swap_32_t<s32>>; | |||
| 626 | using u16_be = swap_struct_t<u16, swap_16_t<u16>>; | 669 | using u16_be = swap_struct_t<u16, swap_16_t<u16>>; |
| 627 | using s16_be = swap_struct_t<s16, swap_16_t<s16>>; | 670 | using s16_be = swap_struct_t<s16, swap_16_t<s16>>; |
| 628 | 671 | ||
| 672 | template <typename T> | ||
| 673 | using enum_be = swap_enum_t<T>; | ||
| 674 | |||
| 629 | using float_be = swap_struct_t<float, swap_float_t<float>>; | 675 | using float_be = swap_struct_t<float, swap_float_t<float>>; |
| 630 | using double_be = swap_struct_t<double, swap_double_t<double>>; | 676 | using double_be = swap_struct_t<double, swap_double_t<double>>; |
| 631 | #else | 677 | #else |
| @@ -639,6 +685,9 @@ using s32_le = swap_struct_t<s32, swap_32_t<s32>>; | |||
| 639 | using u16_le = swap_struct_t<u16, swap_16_t<u16>>; | 685 | using u16_le = swap_struct_t<u16, swap_16_t<u16>>; |
| 640 | using s16_le = swap_struct_t<s16, swap_16_t<s16>>; | 686 | using s16_le = swap_struct_t<s16, swap_16_t<s16>>; |
| 641 | 687 | ||
| 688 | template <typename T> | ||
| 689 | using enum_le = swap_enum_t<T>; | ||
| 690 | |||
| 642 | using float_le = swap_struct_t<float, swap_float_t<float>>; | 691 | using float_le = swap_struct_t<float, swap_float_t<float>>; |
| 643 | using double_le = swap_struct_t<double, swap_double_t<double>>; | 692 | using double_le = swap_struct_t<double, swap_double_t<double>>; |
| 644 | 693 | ||
| @@ -650,6 +699,9 @@ using s16_be = s16; | |||
| 650 | using s32_be = s32; | 699 | using s32_be = s32; |
| 651 | using s64_be = s64; | 700 | using s64_be = s64; |
| 652 | 701 | ||
| 702 | template <typename T> | ||
| 703 | using enum_be = std::enable_if_t<std::is_enum_v<T>, T>; | ||
| 704 | |||
| 653 | using float_be = float; | 705 | using float_be = float; |
| 654 | using double_be = double; | 706 | using double_be = double; |
| 655 | 707 | ||