aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Stoelp <johannes.stoelp@gmail.com>2024-03-19 21:51:30 +0100
committerJohannes Stoelp <johannes.stoelp@gmail.com>2024-03-19 21:51:30 +0100
commit3544d9c12fcb66ff8d4dd947137a769eb99f26c2 (patch)
treee870d52f7189141283840de348b9ded770a6cc4e
parent9f051299964628452a10b80fff7b372e42b4fa32 (diff)
downloadcpp-utils-3544d9c12fcb66ff8d4dd947137a769eb99f26c2.tar.gz
cpp-utils-3544d9c12fcb66ff8d4dd947137a769eb99f26c2.zip
ring: add pre cpp17 take() fn
-rw-r--r--ring.h11
-rw-r--r--test/ring.cc4
2 files changed, 11 insertions, 4 deletions
diff --git a/ring.h b/ring.h
index 3658ec4..43c3fca 100644
--- a/ring.h
+++ b/ring.h
@@ -99,12 +99,19 @@ class ring {
#if __cplusplus >= 201703L
constexpr std::optional<T> take() {
if (!is_empty()) {
- const std::optional<T> kRet = std::move(vals[m_rc & kMASK]);
+ std::optional<T> ret = std::move(vals[m_rc & kMASK]);
pop();
- return kRet;
+ return ret;
}
return std::nullopt;
}
+#else
+ constexpr T take() {
+ assert(!is_empty());
+ T ret = std::move(vals[m_rc & kMASK]);
+ pop();
+ return ret;
+ }
#endif
// -- INTERNAL ---------------------------------------------------------------
diff --git a/test/ring.cc b/test/ring.cc
index a42efaa..657fdfa 100644
--- a/test/ring.cc
+++ b/test/ring.cc
@@ -56,14 +56,14 @@ int main() {
assert(!r.is_empty());
assert(r.is_full());
-#if __cplusplus >= 201703L
auto v = r.take();
+#if __cplusplus >= 201703L
assert(v.has_value());
+#endif
assert(r.size() == 7);
assert(!r.is_empty());
assert(!r.is_full());
-#endif
assert(m::cnt == 8);
}