From 122f519ceb12a142983dd381d3a42058a11fce22 Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Fri, 12 May 2023 03:05:03 -0400 Subject: [PATCH] gccrs: Improve Optional implementation gcc/rust/ChangeLog: * util/rust-optional.h (class Optional): Use pointers internally. Signed-off-by: Owen Avery --- gcc/rust/util/rust-optional.h | 59 ++++++----------------------------- 1 file changed, 9 insertions(+), 50 deletions(-) diff --git a/gcc/rust/util/rust-optional.h b/gcc/rust/util/rust-optional.h index 25662568eb4e..3b3f110b773e 100644 --- a/gcc/rust/util/rust-optional.h +++ b/gcc/rust/util/rust-optional.h @@ -171,48 +171,16 @@ public: template class Optional { private: - struct Empty - { - }; + T *inner; - enum Kind - { - Some, - None - } kind; - - union Content - { - Empty empty; - T *value; - - Content () = default; - } content; - - Optional (Kind kind, Content content) : kind (kind), content (content) {} + Optional (T *inner) : inner (inner) {} public: - Optional (const Optional &other) = default; - Optional (Optional &&other) = default; - Optional &operator= (Optional &&other) = default; - - static Optional some (T &value) - { - Content content; - content.value = &value; + static Optional some (T &value) { return Optional (&value); } - return Optional (Kind::Some, content); - } - - static Optional none () - { - Content content; - content.empty = Empty (); + static Optional none () { return Optional (nullptr); } - return Optional (Kind::None, content); - } - - bool is_some () const { return kind == Kind::Some; } + bool is_some () const { return inner; } bool is_none () const { return !is_some (); } // FIXME: Can we factor this in a single class? @@ -230,28 +198,19 @@ public: T *operator-> () { return &get (); } const T *operator-> () const { return &get (); } - const T &get () const + T &get () const { rust_assert (is_some ()); - return *content.value; - } - - T &get () - { - rust_assert (is_some ()); - - return *content.value; + return *inner; } T &take () { rust_assert (is_some ()); - auto to_return = std::move (content.value); - - content.empty = Empty (); - kind = Kind::None; + T *to_return = inner; + inner = nullptr; return *to_return; } -- 2.47.2