[dawn] Rewrite ityp::span on top of std::span
Allows removing the DAWN_CHECK which is now taken care of by libc++.
Note that begin() and end() now return iterators instead of pointers.
This doesn't affect anything except the tests.
Also minor reformat of other ityp classes for consistency.
Bug: none
Change-Id: I070cbb7c03c460fb5cd697208a0cf2f69a4889d3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/260380
Auto-Submit: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn/common/ityp_array.h b/src/dawn/common/ityp_array.h
index e15b22a..d3a7dc4 100644
--- a/src/dawn/common/ityp_array.h
+++ b/src/dawn/common/ityp_array.h
@@ -57,27 +57,24 @@
constexpr array(Values&&... values) : Base{std::forward<Values>(values)...} {}
constexpr Value& operator[](Index i) { return Base::operator[](static_cast<I>(i)); }
-
constexpr const Value& operator[](Index i) const { return Base::operator[](static_cast<I>(i)); }
Value& at(Index i) { return Base::at(static_cast<I>(i)); }
-
constexpr const Value& at(Index i) const { return Base::at(static_cast<I>(i)); }
typename Base::iterator begin() noexcept { return Base::begin(); }
-
typename Base::const_iterator begin() const noexcept { return Base::begin(); }
typename Base::iterator end() noexcept { return Base::end(); }
-
typename Base::const_iterator end() const noexcept { return Base::end(); }
constexpr Index size() const { return Index(I(Size)); }
- using Base::back;
using Base::data;
using Base::empty;
using Base::fill;
+
+ using Base::back;
using Base::front;
};
diff --git a/src/dawn/common/ityp_span.h b/src/dawn/common/ityp_span.h
index f3ff4b3..f3400a6 100644
--- a/src/dawn/common/ityp_span.h
+++ b/src/dawn/common/ityp_span.h
@@ -28,69 +28,39 @@
#ifndef SRC_DAWN_COMMON_ITYP_SPAN_H_
#define SRC_DAWN_COMMON_ITYP_SPAN_H_
+#include <limits>
+#include <span>
+
#include "dawn/common/TypedInteger.h"
#include "dawn/common/UnderlyingType.h"
namespace dawn::ityp {
-// ityp::span is a helper class that wraps an unowned packed array of type |Value|.
-// It stores the size and pointer to first element. It has the restriction that
-// indices must be a particular type |Index|. This provides a type-safe way to index
-// raw pointers.
+// ityp::span is a helper class that wraps std::span<T, std::dynamic_extent>
+// with the restriction that indices must be a particular type |Index|.
template <typename Index, typename Value>
-class span {
+class span : private ::std::span<Value> {
using I = UnderlyingType<Index>;
+ using Base = ::std::span<Value>;
public:
- constexpr span() : mData(nullptr), mSize(0) {}
- constexpr span(Value* data, Index size) : mData(data), mSize(size) {}
+ constexpr span() = default;
+ constexpr span(Value* data, Index size) : Base{data, static_cast<I>(size)} {}
- constexpr Value& operator[](Index i) const {
- DAWN_CHECK(i < mSize);
- return mData[static_cast<I>(i)];
+ constexpr Value& operator[](Index i) const { return Base::operator[](static_cast<I>(i)); }
+
+ constexpr Index size() const {
+ DAWN_ASSERT(std::numeric_limits<I>::max() >= Base::size());
+ return Index(static_cast<I>(Base::size()));
}
- Value* data() noexcept { return mData; }
+ using Base::data;
- const Value* data() const noexcept { return mData; }
+ using Base::begin;
+ using Base::end;
- Value* begin() noexcept { return mData; }
-
- const Value* begin() const noexcept { return mData; }
-
- Value* end() noexcept { return mData + static_cast<I>(mSize); }
-
- const Value* end() const noexcept { return mData + static_cast<I>(mSize); }
-
- Value& front() {
- DAWN_ASSERT(mData != nullptr);
- DAWN_ASSERT(static_cast<I>(mSize) >= 0);
- return *mData;
- }
-
- const Value& front() const {
- DAWN_ASSERT(mData != nullptr);
- DAWN_ASSERT(static_cast<I>(mSize) >= 0);
- return *mData;
- }
-
- Value& back() {
- DAWN_ASSERT(mData != nullptr);
- DAWN_ASSERT(static_cast<I>(mSize) >= 0);
- return *(mData + static_cast<I>(mSize) - 1);
- }
-
- const Value& back() const {
- DAWN_ASSERT(mData != nullptr);
- DAWN_ASSERT(static_cast<I>(mSize) >= 0);
- return *(mData + static_cast<I>(mSize) - 1);
- }
-
- Index size() const { return mSize; }
-
- private:
- Value* mData;
- Index mSize;
+ using Base::back;
+ using Base::front;
};
// ityp::SpanFromUntyped<Index>(myValues, myValueCount) creates a span<Index, Value> from a C-style
diff --git a/src/dawn/common/ityp_vector.h b/src/dawn/common/ityp_vector.h
index b10c20a..9cb0c39 100644
--- a/src/dawn/common/ityp_vector.h
+++ b/src/dawn/common/ityp_vector.h
@@ -55,42 +55,26 @@
public:
vector() : Base() {}
-
explicit vector(Index size) : Base(static_cast<I>(size)) {}
-
vector(Index size, const Value& init) : Base(static_cast<I>(size), init) {}
-
vector(const vector& rhs) : Base(static_cast<const Base&>(rhs)) {}
-
vector(vector&& rhs) : Base(static_cast<Base&&>(rhs)) {}
-
vector(std::initializer_list<Value> init) : Base(init) {}
vector& operator=(const vector& rhs) {
Base::operator=(static_cast<const Base&>(rhs));
return *this;
}
-
vector& operator=(vector&& rhs) noexcept {
Base::operator=(static_cast<Base&&>(rhs));
return *this;
}
- Value& operator[](Index i) {
- return Base::operator[](static_cast<I>(i));
- }
+ Value& operator[](Index i) { return Base::operator[](static_cast<I>(i)); }
+ constexpr const Value& operator[](Index i) const { return Base::operator[](static_cast<I>(i)); }
- constexpr const Value& operator[](Index i) const {
- return Base::operator[](static_cast<I>(i));
- }
-
- Value& at(Index i) {
- return Base::at(static_cast<I>(i));
- }
-
- constexpr const Value& at(Index i) const {
- return Base::at(static_cast<I>(i));
- }
+ Value& at(Index i) { return Base::at(static_cast<I>(i)); }
+ constexpr const Value& at(Index i) const { return Base::at(static_cast<I>(i)); }
constexpr Index size() const {
DAWN_ASSERT(std::numeric_limits<I>::max() >= Base::size());
diff --git a/src/dawn/tests/unittests/ITypSpanTests.cpp b/src/dawn/tests/unittests/ITypSpanTests.cpp
index f34427e..27eb80f 100644
--- a/src/dawn/tests/unittests/ITypSpanTests.cpp
+++ b/src/dawn/tests/unittests/ITypSpanTests.cpp
@@ -81,16 +81,16 @@
Span span(arr.data(), Key(arr.size()));
// non-const versions
- ASSERT_EQ(span.begin(), &span[Key(0)]);
- ASSERT_EQ(span.end(), &span[Key(0)] + static_cast<size_t>(span.size()));
+ ASSERT_EQ(&*span.begin(), &span[Key(0)]);
+ ASSERT_EQ(&*span.end(), &span[Key(0)] + static_cast<size_t>(span.size()));
ASSERT_EQ(&span.front(), &span[Key(0)]);
ASSERT_EQ(&span.back(), &span[Key(9)]);
ASSERT_EQ(span.data(), &span[Key(0)]);
// const versions
const Span& constSpan = span;
- ASSERT_EQ(constSpan.begin(), &constSpan[Key(0)]);
- ASSERT_EQ(constSpan.end(), &constSpan[Key(0)] + static_cast<size_t>(constSpan.size()));
+ ASSERT_EQ(&*constSpan.begin(), &constSpan[Key(0)]);
+ ASSERT_EQ(&*constSpan.end(), &constSpan[Key(0)] + static_cast<size_t>(constSpan.size()));
ASSERT_EQ(&constSpan.front(), &constSpan[Key(0)]);
ASSERT_EQ(&constSpan.back(), &constSpan[Key(9)]);
ASSERT_EQ(constSpan.data(), &constSpan[Key(0)]);