This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] gdb::optional: Add observers


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d194f1fe51cb85b8a919b7ee9e3a7715b0ec9744

commit d194f1fe51cb85b8a919b7ee9e3a7715b0ec9744
Author: Pedro Alves <palves@redhat.com>
Date:   Tue Apr 4 20:03:25 2017 +0100

    gdb::optional: Add observers
    
    Currently, gdb::optional is really minimal and can only be used for
    lazy initialization.  There's no way to get at the value contained
    inside the optinal.  This commit corrects that, by adding observer
    methods, mostly copied from libstdc++'s implementation of C++17
    std::optional.
    
    This will be used in the following patch.
    
    gdb/ChangeLog:
    2017-04-04  Pedro Alves  <palves@redhat.com>
    
    	* common/gdb_optional.h (gdb::optiona): Add operator->, operator*,
    	operator bool, has_value and get methods.

Diff:
---
 gdb/ChangeLog             |  5 +++++
 gdb/common/gdb_optional.h | 29 +++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5e124c4..f2b64b9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2017-04-04  Pedro Alves  <palves@redhat.com>
 
+	* common/gdb_optional.h (gdb::optiona): Add operator->, operator*,
+	operator bool, has_value and get methods.
+
+2017-04-04  Pedro Alves  <palves@redhat.com>
+
 	* dwarf2read.c (struct file_entry): Add ctors, and initialize all
 	fields.
 	(line_header): Initialize all data fields.  Change type of
diff --git a/gdb/common/gdb_optional.h b/gdb/common/gdb_optional.h
index d991da1..fef7a73 100644
--- a/gdb/common/gdb_optional.h
+++ b/gdb/common/gdb_optional.h
@@ -61,6 +61,31 @@ public:
     m_instantiated = true;
   }
 
+  /* Observers.  */
+  constexpr const T *operator-> () const
+  { return std::addressof (this->get ()); }
+
+  T *operator-> ()
+  { return std::addressof (this->get ()); }
+
+  constexpr const T &operator* () const &
+  { return this->get (); }
+
+  T &operator* () &
+  { return this->get (); }
+
+  T &&operator* () &&
+  { return std::move (this->get ()); }
+
+  constexpr const T &&operator* () const &&
+  { return std::move (this->get ()); }
+
+  constexpr explicit operator bool () const noexcept
+  { return m_instantiated; }
+
+  constexpr bool has_value () const noexcept
+  { return m_instantiated; }
+
 private:
 
   /* Destroy the object.  */
@@ -71,6 +96,10 @@ private:
     m_item.~T ();
   }
 
+  /* The get operations have m_instantiated as a precondition.  */
+  T &get () noexcept { return m_item; }
+  constexpr const T &get () const noexcept { return m_item; }
+
   /* The object.  */
   union
   {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]