brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · f3e791d Raw
144 lines · cpp
1//===- BitmaskEnumTest.cpp ------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Test bitmask-enum support APIs.10//11//===----------------------------------------------------------------------===//12 13#include "orc-rt/BitmaskEnum.h"14#include "gtest/gtest.h"15 16#include <sstream>17#include <string>18 19using namespace orc_rt;20 21namespace {22 23enum Flags { F0 = 0, F1 = 1, F2 = 2, F3 = 4, F4 = 8 };24 25} // namespace26 27namespace orc_rt {28ORC_RT_DECLARE_ENUM_AS_BITMASK(Flags, F4);29} // namespace orc_rt30 31static_assert(is_bitmask_enum<Flags>::value != 0);32static_assert(largest_bitmask_enum_bit<Flags>::value == Flags::F4);33 34namespace {35 36static_assert(is_bitmask_enum<Flags>::value != 0);37static_assert(largest_bitmask_enum_bit<Flags>::value == Flags::F4);38 39TEST(BitmaskEnumTest, BitwiseOr) {40  Flags f = F1 | F2;41  EXPECT_EQ(3, f);42 43  f = f | F3;44  EXPECT_EQ(7, f);45}46 47TEST(BitmaskEnumTest, BitwiseOrEquals) {48  Flags f = F1;49  f |= F3;50  EXPECT_EQ(5, f);51 52  // |= should return a reference to the LHS.53  f = F2;54  (f |= F3) = F1;55  EXPECT_EQ(F1, f);56}57 58TEST(BitmaskEnumTest, BitwiseAnd) {59  Flags f = static_cast<Flags>(3) & F2;60  EXPECT_EQ(F2, f);61 62  f = (f | F3) & (F1 | F2 | F3);63  EXPECT_EQ(6, f);64}65 66TEST(BitmaskEnumTest, BitwiseAndEquals) {67  Flags f = F1 | F2 | F3;68  f &= F1 | F2;69  EXPECT_EQ(3, f);70 71  // &= should return a reference to the LHS.72  (f &= F1) = F3;73  EXPECT_EQ(F3, f);74}75 76TEST(BitmaskEnumTest, BitwiseXor) {77  Flags f = (F1 | F2) ^ (F2 | F3);78  EXPECT_EQ(5, f);79 80  f = f ^ F1;81  EXPECT_EQ(4, f);82}83 84TEST(BitmaskEnumTest, BitwiseXorEquals) {85  Flags f = (F1 | F2);86  f ^= (F2 | F4);87  EXPECT_EQ(9, f);88 89  // ^= should return a reference to the LHS.90  (f ^= F4) = F3;91  EXPECT_EQ(F3, f);92}93 94TEST(BitmaskEnumTest, ConstantExpression) {95  constexpr Flags f1 = ~F1;96  constexpr Flags f2 = F1 | F2;97  constexpr Flags f3 = F1 & F2;98  constexpr Flags f4 = F1 ^ F2;99  EXPECT_EQ(f1, ~F1);100  EXPECT_EQ(f2, F1 | F2);101  EXPECT_EQ(f3, F1 & F2);102  EXPECT_EQ(f4, F1 ^ F2);103}104 105TEST(BitmaskEnumTest, BitwiseNot) {106  Flags f = ~F1;107  EXPECT_EQ(14, f); // Largest value for f is 15.108  EXPECT_EQ(15, ~F0);109}110 111enum class FlagsClass {112  F0 = 0,113  F1 = 1,114  F2 = 2,115  F3 = 4,116  ORC_RT_MARK_AS_BITMASK_ENUM(F3)117};118 119TEST(BitmaskEnumTest, ScopedEnum) {120  FlagsClass f = (FlagsClass::F1 & ~FlagsClass::F0) | FlagsClass::F2;121  f |= FlagsClass::F3;122  EXPECT_EQ(7, static_cast<int>(f));123}124 125struct Container {126  enum Flags {127    F0 = 0,128    F1 = 1,129    F2 = 2,130    F3 = 4,131    ORC_RT_MARK_AS_BITMASK_ENUM(F3)132  };133 134  static Flags getFlags() {135    Flags f = F0 | F1;136    f |= F2;137    return f;138  }139};140 141TEST(BitmaskEnumTest, EnumInStruct) { EXPECT_EQ(3, Container::getFlags()); }142 143} // namespace144