diff --git a/libraries/libmesosphere/source/kern_k_class_token.cpp b/libraries/libmesosphere/source/kern_k_class_token.cpp index 566716f5f..2531d9f45 100644 --- a/libraries/libmesosphere/source/kern_k_class_token.cpp +++ b/libraries/libmesosphere/source/kern_k_class_token.cpp @@ -18,6 +18,8 @@ namespace ams::kern { /* Ensure that we generate correct class tokens for all types. */ + + /* Ensure that the absolute token values are correct. */ static_assert(ClassToken == 0b00000000'00000000); static_assert(ClassToken == 0b00000000'00000001); static_assert(ClassToken == 0b00000000'00000011); @@ -43,4 +45,64 @@ namespace ams::kern { static_assert(ClassToken == 0b10100001'00000000); static_assert(ClassToken == 0b11000001'00000000); + /* Ensure that the token hierarchy is correct. */ + + /* Base classes */ + static_assert(ClassToken == (0b00000000)); + static_assert(ClassToken == (0b00000001 | ClassToken)); + static_assert(ClassToken == (0b00000010 | ClassToken)); + + /* Final classes */ + static_assert(ClassToken == ((0b00000111 << 8) | ClassToken)); + static_assert(ClassToken == ((0b00001011 << 8) | ClassToken)); + static_assert(ClassToken == ((0b00010011 << 8) | ClassToken)); + /* TODO: static_assert(ClassToken == ((0b00100011 << 8) | ClassToken)); */ + /* TODO: static_assert(ClassToken == ((0b01000011 << 8) | ClassToken)); */ + /* TODO: static_assert(ClassToken == ((0b10000011 << 8) | ClassToken)); */ + /* TODO: static_assert(ClassToken == ((0b00001101 << 8) | ClassToken)); */ + static_assert(ClassToken == ((0b00010101 << 8) | ClassToken)); + static_assert(ClassToken == ((0b00100101 << 8) | ClassToken)); + static_assert(ClassToken == ((0b01000101 << 8) | ClassToken)); + static_assert(ClassToken == ((0b10000101 << 8) | ClassToken)); + static_assert(ClassToken == ((0b00011001 << 8) | ClassToken)); + static_assert(ClassToken == ((0b00101001 << 8) | ClassToken)); + static_assert(ClassToken == ((0b01001001 << 8) | ClassToken)); + /* TODO: static_assert(ClassToken == ((0b10001001 << 8) | ClassToken)); */ + /* TODO: static_assert(ClassToken == ((0b00110001 << 8) | ClassToken)); */ + /* TODO: static_assert(ClassToken == ((0b01010001 << 8) | ClassToken)); */ + static_assert(ClassToken == ((0b10010001 << 8) | ClassToken)); + static_assert(ClassToken == ((0b01100001 << 8) | ClassToken)); + static_assert(ClassToken == ((0b10100001 << 8) | ClassToken)); + static_assert(ClassToken == ((0b11000001 << 8) | ClassToken)); + + /* Ensure that the token hierarchy reflects the class hierarchy. */ + + /* Base classes. */ + static_assert(!std::is_final::value && std::is_base_of::value); + static_assert(!std::is_final::value && std::is_base_of::value); + + /* Final classes */ + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + /* TODO: static_assert(std::is_final::value && std::is_base_of::value); */ + /* TODO: static_assert(std::is_final::value && std::is_base_of::value); */ + /* TODO: static_assert(std::is_final::value && std::is_base_of::value); */ + /* TODO: static_assert(std::is_final::value && std::is_base_of::value); */ + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + /* TODO: static_assert(std::is_final::value && std::is_base_of::value); */ + /* TODO: static_assert(std::is_final::value && std::is_base_of::value); */ + /* TODO: static_assert(std::is_final::value && std::is_base_of::value); */ + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + static_assert(std::is_final::value && std::is_base_of::value); + + }