public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-1553] auto_vec copy/move improvements
@ 2021-06-17  9:11 Trevor Saunders
  0 siblings, 0 replies; only message in thread
From: Trevor Saunders @ 2021-06-17  9:11 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:e9681f5725f54a58098678cdea19d1e90d9a36e3

commit r12-1553-ge9681f5725f54a58098678cdea19d1e90d9a36e3
Author: Trevor Saunders <tbsaunde@tbsaunde.org>
Date:   Sun Jun 6 20:05:53 2021 -0400

    auto_vec copy/move improvements
    
    - Unfortunately using_auto_storage () needs to handle m_vec being null.
    - Handle self move of an auto_vec to itself.
    - Make sure auto_vec defines the classes move constructor and assignment
      operator, as well as ones taking vec<T>, so the compiler does not generate
    them for us.  Per https://en.cppreference.com/w/cpp/language/move_constructor
    the ones taking vec<T> do not count as the classes move constructor or
    assignment operator, but we want them as well to assign a plain vec to a
    auto_vec.
    - Explicitly delete auto_vec's copy constructor and assignment operator.  This
      prevents unintentional expenssive coppies of the vector and makes it clear
    when coppies are needed that that is what is intended.  When it is necessary to
    copy a vector copy () can be used.
    
    Signed-off-by: Trevor Saunders <tbsaunde@tbsaunde.org>
    
    gcc/ChangeLog:
    
            * vec.h (vl_ptr>::using_auto_storage): Handle null m_vec.
            (auto_vec<T, 0>::auto_vec): Define move constructor, and delete copy
            constructor.
            (auto_vec<T, 0>::operator=): Define move assignment and delete copy
            assignment.

Diff:
---
 gcc/vec.h | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/gcc/vec.h b/gcc/vec.h
index 193377cb69c..30ef9a69473 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -1570,14 +1570,43 @@ public:
       this->m_vec = r.m_vec;
       r.m_vec = NULL;
     }
+
+  auto_vec (auto_vec<T> &&r)
+    {
+      gcc_assert (!r.using_auto_storage ());
+      this->m_vec = r.m_vec;
+      r.m_vec = NULL;
+    }
+
   auto_vec& operator= (vec<T, va_heap>&& r)
     {
+	    if (this == &r)
+		    return *this;
+
+      gcc_assert (!r.using_auto_storage ());
+      this->release ();
+      this->m_vec = r.m_vec;
+      r.m_vec = NULL;
+      return *this;
+    }
+
+  auto_vec& operator= (auto_vec<T> &&r)
+    {
+	    if (this == &r)
+		    return *this;
+
       gcc_assert (!r.using_auto_storage ());
       this->release ();
       this->m_vec = r.m_vec;
       r.m_vec = NULL;
       return *this;
     }
+
+  // You probably don't want to copy a vector, so these are deleted to prevent
+  // unintentional use.  If you really need a copy of the vectors contents you
+  // can use copy ().
+  auto_vec(const auto_vec &) = delete;
+  auto_vec &operator= (const auto_vec &) = delete;
 };
 
 
@@ -2147,7 +2176,7 @@ template<typename T>
 inline bool
 vec<T, va_heap, vl_ptr>::using_auto_storage () const
 {
-  return m_vec->m_vecpfx.m_using_auto_storage;
+  return m_vec ? m_vec->m_vecpfx.m_using_auto_storage : false;
 }
 
 /* Release VEC and call release of all element vectors.  */


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-06-17  9:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-17  9:11 [gcc r12-1553] auto_vec copy/move improvements Trevor Saunders

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).