From c9742265ac829c802075d278c89dd7b493c0e35f Mon Sep 17 00:00:00 2001 From: Julien Jerphanion Date: Mon, 18 Mar 2024 17:03:53 +0100 Subject: [PATCH] Use reference_proxy for primitive_layout Signed-off-by: Julien Jerphanion --- include/sparrow/layout.hpp | 19 ++++++++++--------- test/test_layout.cpp | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/include/sparrow/layout.hpp b/include/sparrow/layout.hpp index 73b528e2..5e85eb69 100644 --- a/include/sparrow/layout.hpp +++ b/include/sparrow/layout.hpp @@ -94,9 +94,10 @@ namespace sparrow public: using self_type = primitive_layout; - using value_type = T; - using reference = T&; - using const_reference = const T&; + using inner_value_type = T; + using value_type = std::optional; + using reference = reference_proxy; + using const_reference = const_reference_proxy; using pointer = T*; using const_pointer = const T*; using size_type = std::size_t; @@ -108,8 +109,8 @@ namespace sparrow using const_iterator = primitive_layout_iterator; size_type size() const; - reference element(size_type i); - const_reference element(size_type i) const; + reference value(size_type i); + const_reference value(size_type i) const; iterator begin(); iterator end(); @@ -203,17 +204,17 @@ namespace sparrow } template - auto primitive_layout::element(size_type i) -> reference + auto primitive_layout::value(size_type i) -> reference { assert(i < size()); - return i[data()]; + return reference(*this, i); } template - auto primitive_layout::element(size_type i) const -> const_reference + auto primitive_layout::value(size_type i) const -> const_reference { assert(i < size()); - return i[data()]; + return const_reference(*this, i); } template diff --git a/test/test_layout.cpp b/test/test_layout.cpp index a8ed8406..a442b4a9 100644 --- a/test/test_layout.cpp +++ b/test/test_layout.cpp @@ -73,8 +73,8 @@ namespace sparrow auto citer = lt.cbegin(); for (std::size_t i = 0; i < lt.size(); ++i) { - CHECK_EQ(*iter++, lt.element(i)); - CHECK_EQ(*citer++, lt.element(i)); + CHECK_EQ(*iter++, lt.value(i)); + CHECK_EQ(*citer++, lt.value(i)); } CHECK_EQ(iter, lt.end()); CHECK_EQ(citer, lt.cend());