This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 05/13] allow constructing a auto_vec with a preallocation, and a possibly larger actual allocation size
- From: tbsaunde+gcc at tbsaunde dot org
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 9 May 2017 16:52:34 -0400
- Subject: [PATCH 05/13] allow constructing a auto_vec with a preallocation, and a possibly larger actual allocation size
- Authentication-results: sourceware.org; auth=none
- References: <20170509205242.2237-1-tbsaunde+gcc@tbsaunde.org>
From: Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
This allows us to set the capacity of the vector when we construct it,
and still use a stack buffer when the size is small enough.
gcc/ChangeLog:
2017-05-09 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
* genrecog.c (int_set::int_set): Explicitly construct our
auto_vec base class.
* vec.h (auto_vec::auto_vec): New constructor.
---
gcc/genrecog.c | 8 +++++---
gcc/vec.h | 12 ++++++++++++
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index 6a9e610e7a0..b69043f0d02 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -1407,14 +1407,16 @@ struct int_set : public auto_vec <uint64_t, 1>
iterator end ();
};
-int_set::int_set () {}
+int_set::int_set () : auto_vec<uint64_t, 1> () {}
-int_set::int_set (uint64_t label)
+int_set::int_set (uint64_t label) :
+ auto_vec<uint64_t, 1> ()
{
safe_push (label);
}
-int_set::int_set (const int_set &other)
+int_set::int_set (const int_set &other) :
+ auto_vec<uint64_t, 1> ()
{
safe_splice (other);
}
diff --git a/gcc/vec.h b/gcc/vec.h
index fee46164b01..914f89c350c 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -1272,6 +1272,18 @@ public:
this->m_vec = &m_auto;
}
+ auto_vec (size_t s)
+ {
+ if (s > N)
+ {
+ this->create (s);
+ return;
+ }
+
+ m_auto.embedded_init (MAX (N, 2), 0, 1);
+ this->m_vec = &m_auto;
+ }
+
~auto_vec ()
{
this->release ();
--
2.11.0