|
11 | 11 | #include "llvm/ADT/STLExtras.h" |
12 | 12 | #include "llvm/ADT/SmallBitVector.h" |
13 | 13 | #include "gtest/gtest.h" |
| 14 | +#include <initializer_list> |
14 | 15 |
|
15 | 16 | using namespace llvm; |
16 | 17 |
|
@@ -835,26 +836,115 @@ TYPED_TEST(BitVectorTest, BinOps) { |
835 | 836 | A.resize(65); |
836 | 837 | EXPECT_FALSE(A.anyCommon(B)); |
837 | 838 | EXPECT_FALSE(B.anyCommon(B)); |
| 839 | + EXPECT_TRUE(A.subsetOf(B)); |
| 840 | + EXPECT_TRUE(B.subsetOf(A)); |
838 | 841 |
|
839 | 842 | B.resize(64); |
840 | 843 | A.set(64); |
841 | 844 | EXPECT_FALSE(A.anyCommon(B)); |
842 | 845 | EXPECT_FALSE(B.anyCommon(A)); |
| 846 | + EXPECT_FALSE(A.subsetOf(B)); |
| 847 | + EXPECT_TRUE(B.subsetOf(A)); |
843 | 848 |
|
844 | 849 | B.set(63); |
845 | 850 | EXPECT_FALSE(A.anyCommon(B)); |
846 | 851 | EXPECT_FALSE(B.anyCommon(A)); |
| 852 | + EXPECT_FALSE(A.subsetOf(B)); |
| 853 | + EXPECT_FALSE(B.subsetOf(A)); |
847 | 854 |
|
848 | 855 | A.set(63); |
849 | 856 | EXPECT_TRUE(A.anyCommon(B)); |
850 | 857 | EXPECT_TRUE(B.anyCommon(A)); |
| 858 | + EXPECT_FALSE(A.subsetOf(B)); |
| 859 | + EXPECT_TRUE(B.subsetOf(A)); |
851 | 860 |
|
852 | 861 | B.resize(70); |
853 | 862 | B.set(64); |
854 | 863 | B.reset(63); |
855 | 864 | A.resize(64); |
856 | 865 | EXPECT_FALSE(A.anyCommon(B)); |
857 | 866 | EXPECT_FALSE(B.anyCommon(A)); |
| 867 | + EXPECT_FALSE(A.subsetOf(B)); |
| 868 | + EXPECT_FALSE(B.subsetOf(A)); |
| 869 | + |
| 870 | + B.set(63); |
| 871 | + B.reset(64); |
| 872 | + EXPECT_TRUE(A.anyCommon(B)); |
| 873 | + EXPECT_TRUE(B.anyCommon(A)); |
| 874 | + EXPECT_TRUE(A.subsetOf(B)); |
| 875 | + EXPECT_TRUE(B.subsetOf(A)); |
| 876 | +} |
| 877 | + |
| 878 | +template <typename VecType> |
| 879 | +static inline VecType |
| 880 | +createBitVectorFromBits(uint32_t Size, std::initializer_list<int> SetBits) { |
| 881 | + VecType V; |
| 882 | + V.resize(Size); |
| 883 | + for (int BitIndex : SetBits) |
| 884 | + V.set(BitIndex); |
| 885 | + return V; |
| 886 | +} |
| 887 | + |
| 888 | +TYPED_TEST(BitVectorTest, BinOpsLiteral) { |
| 889 | + // More tests of binary operations with more focus on the semantics and |
| 890 | + // less focus on mutability. |
| 891 | + |
| 892 | + auto AnyCommon = [](uint32_t SizeLHS, std::initializer_list<int> SetBitsLHS, |
| 893 | + uint32_t SizeRHS, std::initializer_list<int> SetBitsRHS) { |
| 894 | + auto LHS = createBitVectorFromBits<TypeParam>(SizeLHS, SetBitsLHS); |
| 895 | + auto RHS = createBitVectorFromBits<TypeParam>(SizeRHS, SetBitsRHS); |
| 896 | + return LHS.anyCommon(RHS); |
| 897 | + }; |
| 898 | + auto SubsetOf = [](uint32_t SizeLHS, std::initializer_list<int> SetBitsLHS, |
| 899 | + uint32_t SizeRHS, std::initializer_list<int> SetBitsRHS) { |
| 900 | + auto LHS = createBitVectorFromBits<TypeParam>(SizeLHS, SetBitsLHS); |
| 901 | + auto RHS = createBitVectorFromBits<TypeParam>(SizeRHS, SetBitsRHS); |
| 902 | + return LHS.subsetOf(RHS); |
| 903 | + }; |
| 904 | + |
| 905 | + // clang-format off |
| 906 | + |
| 907 | + // Test small-sized vectors. |
| 908 | + EXPECT_TRUE (AnyCommon(10, {1, 2, 3}, 10, {3, 4, 5})); |
| 909 | + EXPECT_FALSE(AnyCommon(10, {1, 2, 3}, 10, {4, 5})); |
| 910 | + |
| 911 | + EXPECT_FALSE(SubsetOf(10, {1, 2, 3}, 10, {2, 3, 4})); |
| 912 | + EXPECT_TRUE (SubsetOf(10, {2, 3}, 10, {2, 3, 4})); |
| 913 | + EXPECT_FALSE(SubsetOf(10, {1, 2, 3}, 10, {2, 3})); |
| 914 | + EXPECT_TRUE (SubsetOf(10, {1, 2, 3}, 10, {1, 2, 3})); |
| 915 | + |
| 916 | + // Test representations of empty sets of various sizes. |
| 917 | + EXPECT_FALSE(AnyCommon(10, {}, 10, {})); |
| 918 | + EXPECT_FALSE(AnyCommon(10, {}, 123, {})); |
| 919 | + EXPECT_FALSE(AnyCommon(123, {}, 10, {})); |
| 920 | + EXPECT_FALSE(AnyCommon(123, {}, 123, {})); |
| 921 | + EXPECT_TRUE(SubsetOf(10, {}, 10, {})); |
| 922 | + EXPECT_TRUE(SubsetOf(10, {}, 123, {})); |
| 923 | + EXPECT_TRUE(SubsetOf(123, {}, 10, {})); |
| 924 | + EXPECT_TRUE(SubsetOf(123, {}, 123, {})); |
| 925 | + |
| 926 | + // Test handling of the remainder words. |
| 927 | + EXPECT_FALSE(AnyCommon(10, {1, 2}, 123, {5, 70})); |
| 928 | + EXPECT_TRUE (AnyCommon(10, {1, 2}, 123, {1, 70})); |
| 929 | + EXPECT_FALSE(AnyCommon(123, {5, 70}, 10, {1, 2})); |
| 930 | + EXPECT_TRUE (AnyCommon(123, {1, 70}, 10, {1, 2})); |
| 931 | + |
| 932 | + EXPECT_FALSE(AnyCommon(10, {1, 2}, 123, {5})); |
| 933 | + EXPECT_TRUE (AnyCommon(10, {1, 2}, 123, {1})); |
| 934 | + EXPECT_FALSE(AnyCommon(123, {5}, 10, {1, 2})); |
| 935 | + EXPECT_TRUE (AnyCommon(123, {1}, 10, {1, 2})); |
| 936 | + |
| 937 | + EXPECT_FALSE(SubsetOf(10, {1, 2}, 123, {2, 70})); |
| 938 | + EXPECT_TRUE (SubsetOf(10, {1, 2}, 123, {1, 2, 70})); |
| 939 | + EXPECT_FALSE(SubsetOf(123, {2, 70}, 10, {1, 2})); |
| 940 | + EXPECT_FALSE(SubsetOf(123, {1, 2, 70}, 10, {1, 2})); |
| 941 | + |
| 942 | + EXPECT_FALSE(SubsetOf(10, {1, 2}, 123, {2})); |
| 943 | + EXPECT_TRUE (SubsetOf(10, {1, 2}, 123, {1, 2})); |
| 944 | + EXPECT_TRUE (SubsetOf(123, {2}, 10, {1, 2})); |
| 945 | + EXPECT_TRUE (SubsetOf(123, {1, 2}, 10, {1, 2})); |
| 946 | + |
| 947 | + // clang-format on |
858 | 948 | } |
859 | 949 |
|
860 | 950 | using RangeList = std::vector<std::pair<int, int>>; |
|
0 commit comments