diff --git a/include/gsl/span b/include/gsl/span index 7a4b5d0..3daf16f 100644 --- a/include/gsl/span +++ b/include/gsl/span @@ -509,13 +509,27 @@ public: Expects(CheckRange(idx, storage_.size())); return data()[idx]; } + + constexpr reference front() const noexcept + { + Expects(size() > 0); + return data()[0]; + } + + constexpr reference back() const noexcept + { + Expects(size() > 0); + return data()[size() - 1]; + } // at and operator() are deprecated to align to the public member functions of std::span [[deprecated("Use operator[]")]] constexpr reference at(index_type idx) const noexcept{ return this->operator[](idx); } [[deprecated("Use operator[]")]] constexpr reference operator()(index_type idx) const noexcept{ return this->operator[](idx); } - + + + 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 de7455d..28c97f5 100644 --- a/tests/span_tests.cpp +++ b/tests/span_tests.cpp @@ -1683,6 +1683,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__