diff --git a/runtime/core/span.h b/runtime/core/span.h index 1bcde396ccd..2202204571a 100644 --- a/runtime/core/span.h +++ b/runtime/core/span.h @@ -55,6 +55,10 @@ class Span final { template /* implicit */ constexpr Span(T (&Arr)[N]) : data_(Arr), length_(N) {} + /// Construct a Span from a single element reference. + /* implicit */ constexpr Span(T& single_element) + : data_(&single_element), length_(1) {} + /// @returns a pointer to the start of the underlying element buffer. iterator begin() const noexcept { return data_; diff --git a/runtime/core/test/span_test.cpp b/runtime/core/test/span_test.cpp index c2d65baf8e7..51063b8be0f 100644 --- a/runtime/core/test/span_test.cpp +++ b/runtime/core/test/span_test.cpp @@ -61,3 +61,19 @@ TEST(SpanTest, TriviallyCopyable) { EXPECT_EQ(span.size(), span_copy.size()); EXPECT_TRUE(std::is_trivially_copyable>::value); } + +TEST(SpanTest, SingleElementConstructor) { + int64_t single_value = 42; + Span span = single_value; + + EXPECT_EQ(span.size(), 1); + EXPECT_EQ(span.data(), &single_value); + EXPECT_EQ(span[0], 42); + EXPECT_EQ(*span.begin(), 42); + EXPECT_EQ(span.end(), span.begin() + 1); + + // Test that modifying through span affects original value + span[0] = 100; + EXPECT_EQ(single_value, 100); + EXPECT_EQ(span[0], 100); +}