Re: [Mesa-dev] [PATCH 2/3] clover: stdify compat::vector a little more

2014-08-18 Thread Francisco Jerez
EdB edb+m...@sigluy.net writes:

 make resize work like std::vector
 reserve take advantage of capacity
 rename members to be uniform with other class
 ---
  src/gallium/state_trackers/clover/core/module.cpp |   2 +-
  src/gallium/state_trackers/clover/util/compat.hpp | 113 
 +++---
  2 files changed, 78 insertions(+), 37 deletions(-)


This could be a *lot* simpler, see attachment.

From abd573bffb674a0a7565b18b38be116472fa5f24 Mon Sep 17 00:00:00 2001
From: Francisco Jerez curroje...@riseup.net
Date: Mon, 18 Aug 2014 08:30:46 +0300
Subject: [PATCH] clover/util: Have compat::vector track separate size and
 capacity.

In order to make the behaviour of resize() and reserve() closer to the
standard.
---
 src/gallium/state_trackers/clover/core/module.cpp |  4 +-
 src/gallium/state_trackers/clover/util/compat.hpp | 67 ++-
 2 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp
index 55ed91a..9ef584b 100644
--- a/src/gallium/state_trackers/clover/core/module.cpp
+++ b/src/gallium/state_trackers/clover/core/module.cpp
@@ -94,7 +94,7 @@ namespace {
 
   static void
   proc(compat::istream is, compat::vectorT v) {
- v.reserve(_procuint32_t(is));
+ v.resize(_procuint32_t(is));
 
  for (size_t i = 0; i  v.size(); i++)
 new(v[i]) T(_procT(is));
@@ -122,7 +122,7 @@ namespace {
 
   static void
   proc(compat::istream is, compat::vectorT v) {
- v.reserve(_procuint32_t(is));
+ v.resize(_procuint32_t(is));
  is.read(reinterpret_castchar *(v.begin()),
  v.size() * sizeof(T));
   }
diff --git a/src/gallium/state_trackers/clover/util/compat.hpp b/src/gallium/state_trackers/clover/util/compat.hpp
index 50e1c7d..a4e3938 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -66,65 +66,81 @@ namespace clover {
  typedef std::ptrdiff_t difference_type;
  typedef std::size_t size_type;
 
- vector() : p(NULL), n(0) {
+ vector() : p(NULL), _size(0), _capacity(0) {
  }
 
- vector(const vector v) : p(alloc(v.n, v.p, v.n)), n(v.n) {
+ vector(const vector v) :
+p(alloc(v._size, v.p, v._size)),
+_size(v._size), _capacity(v._size) {
  }
 
- vector(const_iterator p, size_type n) : p(alloc(n, p, n)), n(n) {
+ vector(const_iterator p, size_type n) :
+p(alloc(n, p, n)), _size(n), _capacity(n) {
  }
 
  templatetypename C
  vector(const C v) :
-p(alloc(v.size(), *v.begin(), v.size())), n(v.size()) {
+p(alloc(v.size(), *v.begin(), v.size())),
+_size(v.size()) , _capacity(v.size()) {
  }
 
  ~vector() {
-free(n, p);
+free(_size, p);
  }
 
  vector 
  operator=(const vector v) {
-free(n, p);
+free(_size, p);
 
-p = alloc(v.n, v.p, v.n);
-n = v.n;
+p = alloc(v._size, v.p, v._size);
+_size = v._size;
+_capacity = v._size;
 
 return *this;
  }
 
  void
- reserve(size_type m) {
-if (n  m) {
-   T *q = alloc(m, p, n);
-   free(n, p);
+ reserve(size_type n) {
+if (_capacity  n) {
+   T *q = alloc(n, p, _size);
+   free(_size, p);
 
p = q;
-   n = m;
+   _capacity = n;
 }
  }
 
  void
- resize(size_type m, T x = T()) {
-size_type n = size();
+ resize(size_type n, T x = T()) {
+if (n = _size) {
+   for (size_type i = n; i  _size; ++i)
+  p[i].~T();
 
-reserve(m);
+} else {
+   reserve(n);
 
-for (size_type i = n; i  m; ++i)
-   new(p[i]) T(x);
+   for (size_type i = _size; i  n; ++i)
+  new(p[i]) T(x);
+}
+
+_size = n;
  }
 
  void
  push_back(const T x) {
-size_type n = size();
-reserve(n + 1);
-new(p[n]) T(x);
+reserve(_size + 1);
+new(p[_size]) T(x);
+++_size;
  }
 
  size_type
  size() const {
-return n;
+return _size;
+ }
+
+ size_type
+ capacity() const {
+return _capacity;
  }
 
  iterator
@@ -139,12 +155,12 @@ namespace clover {
 
  iterator
  end() {
-return p + n;
+return p + _size;
  }
 
  const_iterator
  end() const {
-return p + n;
+return p + _size;
  }
 
  

Re: [Mesa-dev] [PATCH 2/3] clover: stdify compat::vector a little more

2014-08-18 Thread EdB
On Monday, August 18, 2014 09:29:02 AM Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  make resize work like std::vector
  reserve take advantage of capacity
  rename members to be uniform with other class
  ---
  
   src/gallium/state_trackers/clover/core/module.cpp |   2 +-
   src/gallium/state_trackers/clover/util/compat.hpp | 113
   +++--- 2 files changed, 78 insertions(+), 37
   deletions(-)
 
 This could be a *lot* simpler, see attachment.

Looks good to me.

Thanks
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/3] clover: stdify compat::vector a little more

2014-08-07 Thread EdB
make resize work like std::vector
reserve take advantage of capacity
rename members to be uniform with other class
---
 src/gallium/state_trackers/clover/core/module.cpp |   2 +-
 src/gallium/state_trackers/clover/util/compat.hpp | 113 +++---
 2 files changed, 78 insertions(+), 37 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/module.cpp 
b/src/gallium/state_trackers/clover/core/module.cpp
index 55ed91a..2a595d1 100644
--- a/src/gallium/state_trackers/clover/core/module.cpp
+++ b/src/gallium/state_trackers/clover/core/module.cpp
@@ -94,7 +94,7 @@ namespace {
 
   static void
   proc(compat::istream is, compat::vectorT v) {
- v.reserve(_procuint32_t(is));
+ v.resize(_procuint32_t(is));
 
  for (size_t i = 0; i  v.size(); i++)
 new(v[i]) T(_procT(is));
diff --git a/src/gallium/state_trackers/clover/util/compat.hpp 
b/src/gallium/state_trackers/clover/util/compat.hpp
index 50e1c7d..6f0f7cc 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -40,11 +40,14 @@ namespace clover {
   class vector {
   protected:
  static T *
- alloc(int n, const T *q, int m) {
-T *p = reinterpret_castT *(std::malloc(n * sizeof(T)));
-
-for (int i = 0; i  m; ++i)
-   new(p[i]) T(q[i]);
+ alloc(size_t n, const T *q) {
+T *p = 0;
+if (n  0) {
+   p = reinterpret_castT *(std::malloc(n * sizeof(T)));
+   if (!p) throw;
+   for (size_t i = 0; i  n; ++i)
+  new(p[i]) T(q[i]);
+}
 
 return p;
  }
@@ -66,100 +69,138 @@ namespace clover {
  typedef std::ptrdiff_t difference_type;
  typedef std::size_t size_type;
 
- vector() : p(NULL), n(0) {
+ vector() : _p(0), _s(0), _c(0) {
  }
 
- vector(const vector v) : p(alloc(v.n, v.p, v.n)), n(v.n) {
+ vector(const vector v) :
+   _p(alloc(v.size(), v.begin())), _s(v.size()), _c(_s) {
  }
 
- vector(const_iterator p, size_type n) : p(alloc(n, p, n)), n(n) {
+ vector(const_iterator v, size_type n) : _p(alloc(n, v)), _s(n), _c(n) 
{
  }
 
  templatetypename C
  vector(const C v) :
-p(alloc(v.size(), *v.begin(), v.size())), n(v.size()) {
+_p(alloc(v.size(), *v.begin())), _s(v.size()), _c(_s) {
  }
 
  ~vector() {
-free(n, p);
+free(_s, _p);
  }
 
  vector 
  operator=(const vector v) {
-free(n, p);
-
-p = alloc(v.n, v.p, v.n);
-n = v.n;
+size_type old_s = _s;
+_s = v.size();
+T *n_p = alloc(_s, v.begin());
+free(old_s, _p);
+_p = n_p;
+_c = _s;
 
 return *this;
  }
 
  void
  reserve(size_type m) {
-if (n  m) {
-   T *q = alloc(m, p, n);
-   free(n, p);
-
-   p = q;
-   n = m;
+if (m  _c) {
+   T *n_p = reinterpret_castT *(std::malloc(m * sizeof(T)));
+   for (size_type i = 0; i  _s; ++i) {
+  new(n_p[i]) T(_p[i]);
+  _p[i].~T();
+   }
+   std::free(_p);
+   _p = n_p;
+   _c = m;
 }
  }
 
  void
  resize(size_type m, T x = T()) {
-size_type n = size();
+if (_s == m)
+   return;
+
+//delete extra elements and keep capacity
+if (m  _s) {
+   size_type old_s = _s;
+   _s = m;
+   for (size_type i = m; i  old_s; ++i)
+  _p[i].~T();
+
+   return;
+}
+
+//fill with x
+if (m = _c) {
+   for (size_type i = _s; i  m; ++i)
+ new(_p[i]) T(x);
+
+   _s = m;
+   return;
+}
+
+if (m  _c) {
+   reserve(m);
 
-reserve(m);
+   //fill the extended part
+   for (size_type i = _s; i  m; ++i)
+ new(_p[i]) T(x);
 
-for (size_type i = n; i  m; ++i)
-   new(p[i]) T(x);
+   _s = m;
+   return;
+}
  }
 
  void
  push_back(const T x) {
-size_type n = size();
-reserve(n + 1);
-new(p[n]) T(x);
+reserve(_s + 1);
+new(_p[_s]) T(x);
+++_s;
  }
 
  size_type
  size() const {
-return n;
+return _s;
+ }
+
+ size_type
+ capacity() const {
+return _c;
  }
 
  iterator
  begin() {
-return p;
+