Commit 4c236029 authored by Clemens Backes's avatar Clemens Backes Committed by V8 LUCI CQ

[utils] Modernize BitVector implementation

Use default constructors and algorithms. No functional change intended.

R=jkummerow@chromium.org

Bug: v8:13063
Change-Id: I74abfe17d265c95e38fde1440ba48d88fdb5a2c5
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3760452
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81726}
parent e7e29e4a
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#ifndef V8_UTILS_BIT_VECTOR_H_ #ifndef V8_UTILS_BIT_VECTOR_H_
#define V8_UTILS_BIT_VECTOR_H_ #define V8_UTILS_BIT_VECTOR_H_
#include <algorithm>
#include "src/base/bits.h" #include "src/base/bits.h"
#include "src/zone/zone.h" #include "src/zone/zone.h"
...@@ -94,10 +96,10 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -94,10 +96,10 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
static const int kDataBitShift = kBitsPerSystemPointerLog2; static const int kDataBitShift = kBitsPerSystemPointerLog2;
static const uintptr_t kOne = 1; // This saves some static_casts. static const uintptr_t kOne = 1; // This saves some static_casts.
BitVector() : length_(0), data_length_(kDataLengthForInline), data_(0) {} BitVector() = default;
BitVector(int length, Zone* zone) BitVector(int length, Zone* zone)
: length_(length), data_length_(SizeFor(length)), data_(0) { : length_(length), data_length_(SizeFor(length)) {
DCHECK_LE(0, length); DCHECK_LE(0, length);
if (!is_inline()) { if (!is_inline()) {
data_.ptr_ = zone->NewArray<uintptr_t>(data_length_); data_.ptr_ = zone->NewArray<uintptr_t>(data_length_);
...@@ -112,9 +114,7 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -112,9 +114,7 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
data_(other.data_.inline_) { data_(other.data_.inline_) {
if (!is_inline()) { if (!is_inline()) {
data_.ptr_ = zone->NewArray<uintptr_t>(data_length_); data_.ptr_ = zone->NewArray<uintptr_t>(data_length_);
for (int i = 0; i < other.data_length_; i++) { std::copy_n(other.data_.ptr_, other.data_length_, data_.ptr_);
data_.ptr_[i] = other.data_.ptr_[i];
}
} }
} }
...@@ -134,9 +134,7 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -134,9 +134,7 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
DCHECK(other.is_inline()); DCHECK(other.is_inline());
data_.inline_ = other.data_.inline_; data_.inline_ = other.data_.inline_;
} else { } else {
for (int i = 0; i < data_length_; i++) { std::copy_n(other.data_.ptr_, data_length_, data_.ptr_);
data_.ptr_[i] = other.data_.ptr_[i];
}
} }
} }
...@@ -156,14 +154,10 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -156,14 +154,10 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
if (old_data_length == kDataLengthForInline) { if (old_data_length == kDataLengthForInline) {
data_.ptr_[0] = old_data.inline_; data_.ptr_[0] = old_data.inline_;
} else { } else {
for (int i = 0; i < old_data_length; i++) { std::copy_n(old_data.ptr_, old_data_length, data_.ptr_);
data_.ptr_[i] = old_data.ptr_[i];
}
} }
// Zero out the rest of the data. // Zero out the rest of the data.
for (int i = old_data_length; i < data_length_; i++) { std::fill(data_.ptr_ + old_data_length, data_.ptr_ + data_length_, 0);
data_.ptr_[i] = 0;
}
} }
length_ = new_length; length_ = new_length;
} }
...@@ -279,9 +273,7 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -279,9 +273,7 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
if (is_inline()) { if (is_inline()) {
data_.inline_ = 0; data_.inline_ = 0;
} else { } else {
for (int i = 0; i < data_length_; i++) { std::fill_n(data_.ptr_, data_length_, 0);
data_.ptr_[i] = 0;
}
} }
} }
...@@ -289,10 +281,8 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -289,10 +281,8 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
if (is_inline()) { if (is_inline()) {
return data_.inline_ == 0; return data_.inline_ == 0;
} else { } else {
for (int i = 0; i < data_length_; i++) { return std::all_of(data_.ptr_, data_.ptr_ + data_length_,
if (data_.ptr_[i] != 0) return false; std::logical_not{});
}
return true;
} }
} }
...@@ -302,10 +292,8 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -302,10 +292,8 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
DCHECK(other.is_inline()); DCHECK(other.is_inline());
return data_.inline_ == other.data_.inline_; return data_.inline_ == other.data_.inline_;
} else { } else {
for (int i = 0; i < data_length_; i++) { return std::equal(data_.ptr_, data_.ptr_ + data_length_,
if (data_.ptr_[i] != other.data_.ptr_[i]) return false; other.data_.ptr_);
}
return true;
} }
} }
...@@ -324,16 +312,16 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject { ...@@ -324,16 +312,16 @@ class V8_EXPORT_PRIVATE BitVector : public ZoneObject {
MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(BitVector); MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(BitVector);
private: private:
int length_; int length_ = 0;
int data_length_; int data_length_ = kDataLengthForInline;
DataStorage data_; DataStorage data_{0};
bool is_inline() const { return data_length_ == kDataLengthForInline; } bool is_inline() const { return data_length_ == kDataLengthForInline; }
}; };
class GrowableBitVector { class GrowableBitVector {
public: public:
GrowableBitVector() : bits_() {} GrowableBitVector() = default;
GrowableBitVector(int length, Zone* zone) : bits_(length, zone) {} GrowableBitVector(int length, Zone* zone) : bits_(length, zone) {}
bool Contains(int value) const { bool Contains(int value) const {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment