Bug: angleproject:5906
Change-Id: If1ccacfc81e3e01b4bdbd10d47cf4ec860e3fe0b
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3645494
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
This commit is contained in:
Shahbaz Youssefi 2022-05-13 10:50:47 -04:00 коммит произвёл Angle LUCI CQ
Родитель 36f5e6ce55
Коммит 20820bb4b3
3 изменённых файлов: 121 добавлений и 62 удалений

Просмотреть файл

@ -383,10 +383,11 @@ def _CheckNonAsciiInSourceFiles(input_api, output_api):
def _CheckCommentBeforeTestInTestFiles(input_api, output_api): def _CheckCommentBeforeTestInTestFiles(input_api, output_api):
"""Require a comment before TEST_P() tests. """ """Require a comment before TEST_P() and other tests. """
def test_files(f): def test_files(f):
return input_api.FilterSourceFile(f, files_to_check=(r'^src\/tests\/.+\.cpp$',)) return input_api.FilterSourceFile(
f, files_to_check=(r'^src\/tests\/.+\.cpp$', r'^src\/.+_unittest\.cpp$'))
tests_with_no_comment = [] tests_with_no_comment = []
for f in input_api.AffectedSourceFiles(test_files): for f in input_api.AffectedSourceFiles(test_files):
@ -398,7 +399,9 @@ def _CheckCommentBeforeTestInTestFiles(input_api, output_api):
continue continue
new_line_is_comment = line.startswith(' //') or line.startswith('+//') new_line_is_comment = line.startswith(' //') or line.startswith('+//')
new_line_is_test_declaration = line.startswith('+TEST_P(') new_line_is_test_declaration = (
line.startswith('+TEST_P(') or line.startswith('+TEST(') or
line.startswith('+TYPED_TEST('))
if new_line_is_test_declaration and not last_line_was_comment: if new_line_is_test_declaration and not last_line_was_comment:
tests_with_no_comment.append(line[1:]) tests_with_no_comment.append(line[1:])

Просмотреть файл

@ -504,13 +504,14 @@ class BitSetArray final
{ {
public: public:
using BaseBitSet = priv::BaseBitSetType; using BaseBitSet = priv::BaseBitSetType;
BitSetArray();
BitSetArray(const BitSetArray<N> &other);
using value_type = BaseBitSet::value_type; using value_type = BaseBitSet::value_type;
using param_type = BaseBitSet::param_type; using param_type = BaseBitSet::param_type;
constexpr BitSetArray();
constexpr explicit BitSetArray(std::initializer_list<param_type> init);
BitSetArray(const BitSetArray<N> &other);
class Reference final class Reference final
{ {
public: public:
@ -633,7 +634,7 @@ class BitSetArray final
constexpr std::size_t size() const { return N; } constexpr std::size_t size() const { return N; }
Iterator begin() const { return Iterator(*this, 0); } Iterator begin() const { return Iterator(*this, 0); }
Iterator end() const { return Iterator(*this, kArraySize); } Iterator end() const { return Iterator(*this, kArraySize); }
unsigned long to_ulong() const constexpr unsigned long to_ulong() const
{ {
// TODO(anglebug.com/5628): Handle serializing more than kDefaultBitSetSize // TODO(anglebug.com/5628): Handle serializing more than kDefaultBitSetSize
for (std::size_t index = 1; index < kArraySize; index++) for (std::size_t index = 1; index < kArraySize; index++)
@ -644,45 +645,45 @@ class BitSetArray final
} }
// Assignment operators // Assignment operators
BitSetArray &operator=(const BitSetArray &other); constexpr BitSetArray &operator=(const BitSetArray &other);
BitSetArray &operator&=(const BitSetArray &other); constexpr BitSetArray &operator&=(const BitSetArray &other);
BitSetArray &operator|=(const BitSetArray &other); constexpr BitSetArray &operator|=(const BitSetArray &other);
BitSetArray &operator^=(const BitSetArray &other); constexpr BitSetArray &operator^=(const BitSetArray &other);
// Bitwise operators // Bitwise operators
BitSetArray<N> operator&(const angle::BitSetArray<N> &other) const; constexpr BitSetArray<N> operator&(const angle::BitSetArray<N> &other) const;
BitSetArray<N> operator|(const angle::BitSetArray<N> &other) const; constexpr BitSetArray<N> operator|(const angle::BitSetArray<N> &other) const;
BitSetArray<N> operator^(const angle::BitSetArray<N> &other) const; constexpr BitSetArray<N> operator^(const angle::BitSetArray<N> &other) const;
// Relational Operators // Relational Operators
bool operator==(const angle::BitSetArray<N> &other) const; constexpr bool operator==(const angle::BitSetArray<N> &other) const;
bool operator!=(const angle::BitSetArray<N> &other) const; constexpr bool operator!=(const angle::BitSetArray<N> &other) const;
// Unary operators // Unary operators
BitSetArray operator~() const; constexpr BitSetArray operator~() const;
bool operator[](std::size_t pos) const; constexpr bool operator[](std::size_t pos) const;
Reference operator[](std::size_t pos) constexpr Reference operator[](std::size_t pos)
{ {
ASSERT(pos < size()); ASSERT(pos < size());
return Reference(*this, pos); return Reference(*this, pos);
} }
// Setter, getters and other helper methods // Setter, getters and other helper methods
BitSetArray &set(); constexpr BitSetArray &set();
BitSetArray &set(std::size_t pos, bool value = true); constexpr BitSetArray &set(std::size_t pos, bool value = true);
BitSetArray &reset(); constexpr BitSetArray &reset();
BitSetArray &reset(std::size_t pos); constexpr BitSetArray &reset(std::size_t pos);
bool test(std::size_t pos) const; constexpr bool test(std::size_t pos) const;
bool all() const; constexpr bool all() const;
bool any() const; constexpr bool any() const;
bool none() const; constexpr bool none() const;
std::size_t count() const; constexpr std::size_t count() const;
bool intersects(const BitSetArray &other) const; constexpr bool intersects(const BitSetArray &other) const;
BitSetArray<N> &flip(); constexpr BitSetArray<N> &flip();
param_type first() const; constexpr param_type first() const;
param_type last() const; constexpr param_type last() const;
value_type bits(size_t index) const; constexpr value_type bits(size_t index) const;
private: private:
static constexpr std::size_t kDefaultBitSetSizeMinusOne = priv::kDefaultBitSetSize - 1; static constexpr std::size_t kDefaultBitSetSizeMinusOne = priv::kDefaultBitSetSize - 1;
@ -698,12 +699,25 @@ class BitSetArray final
}; };
template <std::size_t N> template <std::size_t N>
BitSetArray<N>::BitSetArray() constexpr BitSetArray<N>::BitSetArray()
{ {
static_assert(N > priv::kDefaultBitSetSize, "BitSetArray type can't support requested size."); static_assert(N > priv::kDefaultBitSetSize, "BitSetArray type can't support requested size.");
reset(); reset();
} }
template <std::size_t N>
constexpr BitSetArray<N>::BitSetArray(std::initializer_list<param_type> init)
{
reset();
for (param_type element : init)
{
size_t index = element >> kShiftForDivision;
size_t offset = element & kDefaultBitSetSizeMinusOne;
mBaseBitSetArray[index].set(offset, true);
}
}
template <size_t N> template <size_t N>
BitSetArray<N>::BitSetArray(const BitSetArray<N> &other) BitSetArray<N>::BitSetArray(const BitSetArray<N> &other)
{ {
@ -774,7 +788,7 @@ std::size_t BitSetArray<N>::Iterator::operator*() const
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::operator=(const BitSetArray<N> &other) constexpr BitSetArray<N> &BitSetArray<N>::operator=(const BitSetArray<N> &other)
{ {
for (std::size_t index = 0; index < kArraySize; index++) for (std::size_t index = 0; index < kArraySize; index++)
{ {
@ -784,7 +798,7 @@ BitSetArray<N> &BitSetArray<N>::operator=(const BitSetArray<N> &other)
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::operator&=(const BitSetArray<N> &other) constexpr BitSetArray<N> &BitSetArray<N>::operator&=(const BitSetArray<N> &other)
{ {
for (std::size_t index = 0; index < kArraySize; index++) for (std::size_t index = 0; index < kArraySize; index++)
{ {
@ -794,7 +808,7 @@ BitSetArray<N> &BitSetArray<N>::operator&=(const BitSetArray<N> &other)
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::operator|=(const BitSetArray<N> &other) constexpr BitSetArray<N> &BitSetArray<N>::operator|=(const BitSetArray<N> &other)
{ {
for (std::size_t index = 0; index < kArraySize; index++) for (std::size_t index = 0; index < kArraySize; index++)
{ {
@ -804,7 +818,7 @@ BitSetArray<N> &BitSetArray<N>::operator|=(const BitSetArray<N> &other)
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::operator^=(const BitSetArray<N> &other) constexpr BitSetArray<N> &BitSetArray<N>::operator^=(const BitSetArray<N> &other)
{ {
for (std::size_t index = 0; index < kArraySize; index++) for (std::size_t index = 0; index < kArraySize; index++)
{ {
@ -814,7 +828,7 @@ BitSetArray<N> &BitSetArray<N>::operator^=(const BitSetArray<N> &other)
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> BitSetArray<N>::operator&(const angle::BitSetArray<N> &other) const constexpr BitSetArray<N> BitSetArray<N>::operator&(const angle::BitSetArray<N> &other) const
{ {
angle::BitSetArray<N> result(other); angle::BitSetArray<N> result(other);
result &= *this; result &= *this;
@ -822,7 +836,7 @@ BitSetArray<N> BitSetArray<N>::operator&(const angle::BitSetArray<N> &other) con
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> BitSetArray<N>::operator|(const angle::BitSetArray<N> &other) const constexpr BitSetArray<N> BitSetArray<N>::operator|(const angle::BitSetArray<N> &other) const
{ {
angle::BitSetArray<N> result(other); angle::BitSetArray<N> result(other);
result |= *this; result |= *this;
@ -830,7 +844,7 @@ BitSetArray<N> BitSetArray<N>::operator|(const angle::BitSetArray<N> &other) con
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> BitSetArray<N>::operator^(const angle::BitSetArray<N> &other) const constexpr BitSetArray<N> BitSetArray<N>::operator^(const angle::BitSetArray<N> &other) const
{ {
angle::BitSetArray<N> result(other); angle::BitSetArray<N> result(other);
result ^= *this; result ^= *this;
@ -838,7 +852,7 @@ BitSetArray<N> BitSetArray<N>::operator^(const angle::BitSetArray<N> &other) con
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::operator==(const angle::BitSetArray<N> &other) const constexpr bool BitSetArray<N>::operator==(const angle::BitSetArray<N> &other) const
{ {
for (std::size_t index = 0; index < kArraySize; index++) for (std::size_t index = 0; index < kArraySize; index++)
{ {
@ -851,13 +865,13 @@ bool BitSetArray<N>::operator==(const angle::BitSetArray<N> &other) const
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::operator!=(const angle::BitSetArray<N> &other) const constexpr bool BitSetArray<N>::operator!=(const angle::BitSetArray<N> &other) const
{ {
return !(*this == other); return !(*this == other);
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> BitSetArray<N>::operator~() const constexpr BitSetArray<N> BitSetArray<N>::operator~() const
{ {
angle::BitSetArray<N> result; angle::BitSetArray<N> result;
for (std::size_t index = 0; index < kArraySize; index++) for (std::size_t index = 0; index < kArraySize; index++)
@ -871,14 +885,14 @@ BitSetArray<N> BitSetArray<N>::operator~() const
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::operator[](std::size_t pos) const constexpr bool BitSetArray<N>::operator[](std::size_t pos) const
{ {
ASSERT(pos < size()); ASSERT(pos < size());
return test(pos); return test(pos);
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::set() constexpr BitSetArray<N> &BitSetArray<N>::set()
{ {
for (BaseBitSet &baseBitSet : mBaseBitSetArray) for (BaseBitSet &baseBitSet : mBaseBitSetArray)
{ {
@ -891,7 +905,7 @@ BitSetArray<N> &BitSetArray<N>::set()
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::set(std::size_t pos, bool value) constexpr BitSetArray<N> &BitSetArray<N>::set(std::size_t pos, bool value)
{ {
ASSERT(pos < size()); ASSERT(pos < size());
// Get the index and offset, then set the bit // Get the index and offset, then set the bit
@ -902,7 +916,7 @@ BitSetArray<N> &BitSetArray<N>::set(std::size_t pos, bool value)
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::reset() constexpr BitSetArray<N> &BitSetArray<N>::reset()
{ {
for (BaseBitSet &baseBitSet : mBaseBitSetArray) for (BaseBitSet &baseBitSet : mBaseBitSetArray)
{ {
@ -912,14 +926,14 @@ BitSetArray<N> &BitSetArray<N>::reset()
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::reset(std::size_t pos) constexpr BitSetArray<N> &BitSetArray<N>::reset(std::size_t pos)
{ {
ASSERT(pos < size()); ASSERT(pos < size());
return set(pos, false); return set(pos, false);
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::test(std::size_t pos) const constexpr bool BitSetArray<N>::test(std::size_t pos) const
{ {
ASSERT(pos < size()); ASSERT(pos < size());
// Get the index and offset, then test the bit // Get the index and offset, then test the bit
@ -929,9 +943,9 @@ bool BitSetArray<N>::test(std::size_t pos) const
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::all() const constexpr bool BitSetArray<N>::all() const
{ {
static priv::BaseBitSetType kLastElementBitSet = priv::BaseBitSetType(kLastElementMask); constexpr priv::BaseBitSetType kLastElementBitSet = priv::BaseBitSetType(kLastElementMask);
for (std::size_t index = 0; index < kArraySize - 1; index++) for (std::size_t index = 0; index < kArraySize - 1; index++)
{ {
@ -946,7 +960,7 @@ bool BitSetArray<N>::all() const
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::any() const constexpr bool BitSetArray<N>::any() const
{ {
for (const BaseBitSet &baseBitSet : mBaseBitSetArray) for (const BaseBitSet &baseBitSet : mBaseBitSetArray)
{ {
@ -959,7 +973,7 @@ bool BitSetArray<N>::any() const
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::none() const constexpr bool BitSetArray<N>::none() const
{ {
for (const BaseBitSet &baseBitSet : mBaseBitSetArray) for (const BaseBitSet &baseBitSet : mBaseBitSetArray)
{ {
@ -972,7 +986,7 @@ bool BitSetArray<N>::none() const
} }
template <std::size_t N> template <std::size_t N>
std::size_t BitSetArray<N>::count() const constexpr std::size_t BitSetArray<N>::count() const
{ {
size_t count = 0; size_t count = 0;
for (const BaseBitSet &baseBitSet : mBaseBitSetArray) for (const BaseBitSet &baseBitSet : mBaseBitSetArray)
@ -983,7 +997,7 @@ std::size_t BitSetArray<N>::count() const
} }
template <std::size_t N> template <std::size_t N>
bool BitSetArray<N>::intersects(const BitSetArray<N> &other) const constexpr bool BitSetArray<N>::intersects(const BitSetArray<N> &other) const
{ {
for (std::size_t index = 0; index < kArraySize; index++) for (std::size_t index = 0; index < kArraySize; index++)
{ {
@ -996,7 +1010,7 @@ bool BitSetArray<N>::intersects(const BitSetArray<N> &other) const
} }
template <std::size_t N> template <std::size_t N>
BitSetArray<N> &BitSetArray<N>::flip() constexpr BitSetArray<N> &BitSetArray<N>::flip()
{ {
for (BaseBitSet &baseBitSet : mBaseBitSetArray) for (BaseBitSet &baseBitSet : mBaseBitSetArray)
{ {
@ -1009,7 +1023,7 @@ BitSetArray<N> &BitSetArray<N>::flip()
} }
template <std::size_t N> template <std::size_t N>
typename BitSetArray<N>::param_type BitSetArray<N>::first() const constexpr typename BitSetArray<N>::param_type BitSetArray<N>::first() const
{ {
ASSERT(any()); ASSERT(any());
for (size_t arrayIndex = 0; arrayIndex < kArraySize; ++arrayIndex) for (size_t arrayIndex = 0; arrayIndex < kArraySize; ++arrayIndex)
@ -1025,7 +1039,7 @@ typename BitSetArray<N>::param_type BitSetArray<N>::first() const
} }
template <std::size_t N> template <std::size_t N>
typename BitSetArray<N>::param_type BitSetArray<N>::last() const constexpr typename BitSetArray<N>::param_type BitSetArray<N>::last() const
{ {
ASSERT(any()); ASSERT(any());
for (size_t arrayIndex = kArraySize; arrayIndex > 0; --arrayIndex) for (size_t arrayIndex = kArraySize; arrayIndex > 0; --arrayIndex)
@ -1041,7 +1055,7 @@ typename BitSetArray<N>::param_type BitSetArray<N>::last() const
} }
template <std::size_t N> template <std::size_t N>
typename BitSetArray<N>::value_type BitSetArray<N>::bits(size_t index) const constexpr typename BitSetArray<N>::value_type BitSetArray<N>::bits(size_t index) const
{ {
return mBaseBitSetArray[index].bits(); return mBaseBitSetArray[index].bits();
} }

Просмотреть файл

@ -100,6 +100,26 @@ TYPED_TEST(BitSetTest, Basic)
EXPECT_EQ(mBits.count(), 0u); EXPECT_EQ(mBits.count(), 0u);
} }
// Test that BitSetT's initializer list constructor works correctly.
TYPED_TEST(BitSetTest, InitializerList)
{
TypeParam bits = TypeParam{
2, 5, 6, 9, 10,
};
for (size_t i = 0; i < bits.size(); ++i)
{
if (i == 2 || i == 5 || i == 6 || i == 9 || i == 10)
{
EXPECT_TRUE(bits[i]) << i;
}
else
{
EXPECT_FALSE(bits[i]) << i;
}
}
}
TYPED_TEST(BitSetTest, BitwiseOperators) TYPED_TEST(BitSetTest, BitwiseOperators)
{ {
TypeParam mBits = this->mBits; TypeParam mBits = this->mBits;
@ -568,6 +588,28 @@ TYPED_TEST(BitSetArrayTest, BasicTest)
} }
} }
// Test that BitSetArray's initializer list constructor works correctly.
TEST(BitSetArrayTest, InitializerList)
{
BitSetArray<500> bits = BitSetArray<500>{
0, 11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132, 143, 154, 165,
176, 187, 198, 209, 220, 231, 242, 253, 264, 275, 286, 297, 308, 319, 330, 341,
352, 363, 374, 385, 396, 407, 418, 429, 440, 451, 462, 473, 484, 495,
};
for (size_t i = 0; i < bits.size(); ++i)
{
if (i % 11 == 0)
{
EXPECT_TRUE(bits[i]) << i;
}
else
{
EXPECT_FALSE(bits[i]) << i;
}
}
}
TYPED_TEST(BitSetArrayTest, IterationWithGaps) TYPED_TEST(BitSetArrayTest, IterationWithGaps)
{ {
TypeParam &mBits = this->mBitSet; TypeParam &mBits = this->mBitSet;