зеркало из https://github.com/AvaloniaUI/angle.git
Make BitSetArray constexpr
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:
Родитель
36f5e6ce55
Коммит
20820bb4b3
|
@ -383,10 +383,11 @@ def _CheckNonAsciiInSourceFiles(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):
|
||||
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 = []
|
||||
for f in input_api.AffectedSourceFiles(test_files):
|
||||
|
@ -398,7 +399,9 @@ def _CheckCommentBeforeTestInTestFiles(input_api, output_api):
|
|||
continue
|
||||
|
||||
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:
|
||||
tests_with_no_comment.append(line[1:])
|
||||
|
|
|
@ -504,13 +504,14 @@ class BitSetArray final
|
|||
{
|
||||
public:
|
||||
using BaseBitSet = priv::BaseBitSetType;
|
||||
|
||||
BitSetArray();
|
||||
BitSetArray(const BitSetArray<N> &other);
|
||||
|
||||
using value_type = BaseBitSet::value_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
|
||||
{
|
||||
public:
|
||||
|
@ -633,7 +634,7 @@ class BitSetArray final
|
|||
constexpr std::size_t size() const { return N; }
|
||||
Iterator begin() const { return Iterator(*this, 0); }
|
||||
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
|
||||
for (std::size_t index = 1; index < kArraySize; index++)
|
||||
|
@ -644,45 +645,45 @@ class BitSetArray final
|
|||
}
|
||||
|
||||
// Assignment operators
|
||||
BitSetArray &operator=(const BitSetArray &other);
|
||||
BitSetArray &operator&=(const BitSetArray &other);
|
||||
BitSetArray &operator|=(const BitSetArray &other);
|
||||
BitSetArray &operator^=(const BitSetArray &other);
|
||||
constexpr BitSetArray &operator=(const BitSetArray &other);
|
||||
constexpr BitSetArray &operator&=(const BitSetArray &other);
|
||||
constexpr BitSetArray &operator|=(const BitSetArray &other);
|
||||
constexpr BitSetArray &operator^=(const BitSetArray &other);
|
||||
|
||||
// Bitwise operators
|
||||
BitSetArray<N> operator&(const angle::BitSetArray<N> &other) const;
|
||||
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;
|
||||
constexpr BitSetArray<N> operator|(const angle::BitSetArray<N> &other) const;
|
||||
constexpr BitSetArray<N> operator^(const angle::BitSetArray<N> &other) const;
|
||||
|
||||
// Relational Operators
|
||||
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;
|
||||
constexpr bool operator!=(const angle::BitSetArray<N> &other) const;
|
||||
|
||||
// Unary operators
|
||||
BitSetArray operator~() const;
|
||||
bool operator[](std::size_t pos) const;
|
||||
Reference operator[](std::size_t pos)
|
||||
constexpr BitSetArray operator~() const;
|
||||
constexpr bool operator[](std::size_t pos) const;
|
||||
constexpr Reference operator[](std::size_t pos)
|
||||
{
|
||||
ASSERT(pos < size());
|
||||
return Reference(*this, pos);
|
||||
}
|
||||
|
||||
// Setter, getters and other helper methods
|
||||
BitSetArray &set();
|
||||
BitSetArray &set(std::size_t pos, bool value = true);
|
||||
BitSetArray &reset();
|
||||
BitSetArray &reset(std::size_t pos);
|
||||
bool test(std::size_t pos) const;
|
||||
bool all() const;
|
||||
bool any() const;
|
||||
bool none() const;
|
||||
std::size_t count() const;
|
||||
bool intersects(const BitSetArray &other) const;
|
||||
BitSetArray<N> &flip();
|
||||
param_type first() const;
|
||||
param_type last() const;
|
||||
constexpr BitSetArray &set();
|
||||
constexpr BitSetArray &set(std::size_t pos, bool value = true);
|
||||
constexpr BitSetArray &reset();
|
||||
constexpr BitSetArray &reset(std::size_t pos);
|
||||
constexpr bool test(std::size_t pos) const;
|
||||
constexpr bool all() const;
|
||||
constexpr bool any() const;
|
||||
constexpr bool none() const;
|
||||
constexpr std::size_t count() const;
|
||||
constexpr bool intersects(const BitSetArray &other) const;
|
||||
constexpr BitSetArray<N> &flip();
|
||||
constexpr param_type first() const;
|
||||
constexpr param_type last() const;
|
||||
|
||||
value_type bits(size_t index) const;
|
||||
constexpr value_type bits(size_t index) const;
|
||||
|
||||
private:
|
||||
static constexpr std::size_t kDefaultBitSetSizeMinusOne = priv::kDefaultBitSetSize - 1;
|
||||
|
@ -692,18 +693,31 @@ class BitSetArray final
|
|||
((N + kDefaultBitSetSizeMinusOne) >> kShiftForDivision);
|
||||
constexpr static std::size_t kLastElementCount = (N & kDefaultBitSetSizeMinusOne);
|
||||
constexpr static std::size_t kLastElementMask = priv::BaseBitSetType::Mask(
|
||||
kLastElementCount == 0 ? priv::kDefaultBitSetSize : kLastElementCount);
|
||||
kLastElementCount == 0 ? priv::kDefaultBitSetSize : kLastElementCount);
|
||||
|
||||
std::array<BaseBitSet, kArraySize> mBaseBitSetArray;
|
||||
};
|
||||
|
||||
template <std::size_t N>
|
||||
BitSetArray<N>::BitSetArray()
|
||||
constexpr BitSetArray<N>::BitSetArray()
|
||||
{
|
||||
static_assert(N > priv::kDefaultBitSetSize, "BitSetArray type can't support requested size.");
|
||||
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>
|
||||
BitSetArray<N>::BitSetArray(const BitSetArray<N> &other)
|
||||
{
|
||||
|
@ -774,7 +788,7 @@ std::size_t BitSetArray<N>::Iterator::operator*() const
|
|||
}
|
||||
|
||||
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++)
|
||||
{
|
||||
|
@ -784,7 +798,7 @@ BitSetArray<N> &BitSetArray<N>::operator=(const BitSetArray<N> &other)
|
|||
}
|
||||
|
||||
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++)
|
||||
{
|
||||
|
@ -794,7 +808,7 @@ BitSetArray<N> &BitSetArray<N>::operator&=(const BitSetArray<N> &other)
|
|||
}
|
||||
|
||||
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++)
|
||||
{
|
||||
|
@ -804,7 +818,7 @@ BitSetArray<N> &BitSetArray<N>::operator|=(const BitSetArray<N> &other)
|
|||
}
|
||||
|
||||
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++)
|
||||
{
|
||||
|
@ -814,7 +828,7 @@ BitSetArray<N> &BitSetArray<N>::operator^=(const BitSetArray<N> &other)
|
|||
}
|
||||
|
||||
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);
|
||||
result &= *this;
|
||||
|
@ -822,7 +836,7 @@ BitSetArray<N> BitSetArray<N>::operator&(const angle::BitSetArray<N> &other) con
|
|||
}
|
||||
|
||||
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);
|
||||
result |= *this;
|
||||
|
@ -830,7 +844,7 @@ BitSetArray<N> BitSetArray<N>::operator|(const angle::BitSetArray<N> &other) con
|
|||
}
|
||||
|
||||
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);
|
||||
result ^= *this;
|
||||
|
@ -838,7 +852,7 @@ BitSetArray<N> BitSetArray<N>::operator^(const angle::BitSetArray<N> &other) con
|
|||
}
|
||||
|
||||
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++)
|
||||
{
|
||||
|
@ -851,13 +865,13 @@ bool BitSetArray<N>::operator==(const angle::BitSetArray<N> &other) const
|
|||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
template <std::size_t N>
|
||||
BitSetArray<N> BitSetArray<N>::operator~() const
|
||||
constexpr BitSetArray<N> BitSetArray<N>::operator~() const
|
||||
{
|
||||
angle::BitSetArray<N> result;
|
||||
for (std::size_t index = 0; index < kArraySize; index++)
|
||||
|
@ -871,14 +885,14 @@ BitSetArray<N> BitSetArray<N>::operator~() const
|
|||
}
|
||||
|
||||
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());
|
||||
return test(pos);
|
||||
}
|
||||
|
||||
template <std::size_t N>
|
||||
BitSetArray<N> &BitSetArray<N>::set()
|
||||
constexpr BitSetArray<N> &BitSetArray<N>::set()
|
||||
{
|
||||
for (BaseBitSet &baseBitSet : mBaseBitSetArray)
|
||||
{
|
||||
|
@ -891,7 +905,7 @@ BitSetArray<N> &BitSetArray<N>::set()
|
|||
}
|
||||
|
||||
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());
|
||||
// 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>
|
||||
BitSetArray<N> &BitSetArray<N>::reset()
|
||||
constexpr BitSetArray<N> &BitSetArray<N>::reset()
|
||||
{
|
||||
for (BaseBitSet &baseBitSet : mBaseBitSetArray)
|
||||
{
|
||||
|
@ -912,14 +926,14 @@ BitSetArray<N> &BitSetArray<N>::reset()
|
|||
}
|
||||
|
||||
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());
|
||||
return set(pos, false);
|
||||
}
|
||||
|
||||
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());
|
||||
// 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>
|
||||
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++)
|
||||
{
|
||||
|
@ -946,7 +960,7 @@ bool BitSetArray<N>::all() const
|
|||
}
|
||||
|
||||
template <std::size_t N>
|
||||
bool BitSetArray<N>::any() const
|
||||
constexpr bool BitSetArray<N>::any() const
|
||||
{
|
||||
for (const BaseBitSet &baseBitSet : mBaseBitSetArray)
|
||||
{
|
||||
|
@ -959,7 +973,7 @@ bool BitSetArray<N>::any() const
|
|||
}
|
||||
|
||||
template <std::size_t N>
|
||||
bool BitSetArray<N>::none() const
|
||||
constexpr bool BitSetArray<N>::none() const
|
||||
{
|
||||
for (const BaseBitSet &baseBitSet : mBaseBitSetArray)
|
||||
{
|
||||
|
@ -972,7 +986,7 @@ bool BitSetArray<N>::none() const
|
|||
}
|
||||
|
||||
template <std::size_t N>
|
||||
std::size_t BitSetArray<N>::count() const
|
||||
constexpr std::size_t BitSetArray<N>::count() const
|
||||
{
|
||||
size_t count = 0;
|
||||
for (const BaseBitSet &baseBitSet : mBaseBitSetArray)
|
||||
|
@ -983,7 +997,7 @@ std::size_t BitSetArray<N>::count() const
|
|||
}
|
||||
|
||||
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++)
|
||||
{
|
||||
|
@ -996,7 +1010,7 @@ bool BitSetArray<N>::intersects(const BitSetArray<N> &other) const
|
|||
}
|
||||
|
||||
template <std::size_t N>
|
||||
BitSetArray<N> &BitSetArray<N>::flip()
|
||||
constexpr BitSetArray<N> &BitSetArray<N>::flip()
|
||||
{
|
||||
for (BaseBitSet &baseBitSet : mBaseBitSetArray)
|
||||
{
|
||||
|
@ -1009,7 +1023,7 @@ BitSetArray<N> &BitSetArray<N>::flip()
|
|||
}
|
||||
|
||||
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());
|
||||
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>
|
||||
typename BitSetArray<N>::param_type BitSetArray<N>::last() const
|
||||
constexpr typename BitSetArray<N>::param_type BitSetArray<N>::last() const
|
||||
{
|
||||
ASSERT(any());
|
||||
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>
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -100,6 +100,26 @@ TYPED_TEST(BitSetTest, Basic)
|
|||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
TypeParam &mBits = this->mBitSet;
|
||||
|
|
Загрузка…
Ссылка в новой задаче