diff --git a/include/gsl/span b/include/gsl/span index 59bd121..c16ded4 100644 --- a/include/gsl/span +++ b/include/gsl/span @@ -512,6 +512,19 @@ public: constexpr reference at(index_type idx) const { return this->operator[](idx); } constexpr reference operator()(index_type idx) const { return this->operator[](idx); } + + constexpr reference front() const + { + Expects(size() > 0); + return data()[0]; + } + + constexpr reference back() const + { + Expects(size() > 0); + return data()[size() - 1]; + } + constexpr pointer data() const noexcept { return storage_.data(); } // [span.iter], span iterator support diff --git a/tests/span_tests.cpp b/tests/span_tests.cpp index edbd118..ebeb685 100644 --- a/tests/span_tests.cpp +++ b/tests/span_tests.cpp @@ -1644,6 +1644,22 @@ TEST(span_test, from_array_constructor) EXPECT_FALSE((std::is_default_constructible>::value)); } + TEST(span_test, front_back) + { + int arr[5] = {1,2,3,4,5}; + span s{arr}; + EXPECT_TRUE(s.front() == 1); + EXPECT_TRUE(s.back() == 5); + + std::set_terminate([] { + std::cerr << "Expected Death. front_back"; + std::abort(); + }); + span s2; + EXPECT_DEATH(s2.front(), deathstring); + EXPECT_DEATH(s2.back(), deathstring); + } + #if __clang__ || __GNUC__ #pragma GCC diagnostic pop #endif // __clang__ || __GNUC__