[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pecl-cvs
Subject:    [PECL-CVS] com =?UTF-8?Q?pecl/database/mysql=5Fxdevapi=3A=20orabug=20=23=33=30=30=38?= =?UTF-8?Q?=34
From:       hery ramilison <mysqlre () php ! net>
Date:       2019-08-28 11:04:03
Message-ID: php-mail-d9512ee714ace5f24af61fcfeb0102b52025582800 () git ! php ! net
[Download RAW message or body]

Commit:    0001de175a66c90dd0b3db4ee9153c9eb79afd22
Author:    Darek Slusarczyk <dariusz.slusarczyk@oracle.com>         Wed, 28 Aug 2019 \
                13:04:03 +0200
Parents:   df5cbe76f0a2476f72de7dcd78579f5206064a00
Branches:  master

Link:       http://git.php.net/?p=pecl/database/mysql_xdevapi.git;a=commitdiff;h=0001de175a66c90dd0b3db4ee9153c9eb79afd22


Log:
orabug #30084547: improve zval wrapper
- add support for 'map' style initializer_list (list of std::pairs)
- zvalue::reserve improvement - if 'this' is array, then just extend the size

Bugs:
https://bugs.php.net/30084547

Changed paths:
  M  util/value.cc
  M  util/value.h
  M  util/value.inl


Diff:
diff --git a/util/value.cc b/util/value.cc
index 42fc01d..3281cb4 100644
--- a/util/value.cc
+++ b/util/value.cc
@@ -185,6 +185,12 @@ zvalue::zvalue(const char* value, std::size_t length)
 	assign(value, length);
 }
 
+zvalue::zvalue(std::initializer_list<std::pair<const char*, zvalue>> values)
+{
+	ZVAL_UNDEF(&zv);
+	insert(values);
+}
+
 zvalue zvalue::create_array(std::size_t size)
 {
 	zvalue arr;
@@ -336,6 +342,12 @@ void zvalue::assign(const char* value, std::size_t length)
 	ZVAL_STRINGL(&zv, value, length);
 }
 
+zvalue& zvalue::operator=(std::initializer_list<std::pair<const char*, zvalue>> \
values) +{
+	insert(values);
+	return *this;
+}
+
 // -----------------------------------------------------------------------------
 
 bool zvalue::to_bool() const
@@ -494,8 +506,12 @@ void zvalue::clear()
 
 void zvalue::reserve(std::size_t size)
 {
-	zval_ptr_dtor(&zv);
-	array_init_size(&zv, static_cast<uint32_t>(size));
+	if (is_array()) {
+		zend_hash_extend(Z_ARRVAL(zv), size, (Z_ARRVAL(zv)->u.flags & HASH_FLAG_PACKED));
+	} else {
+		zval_ptr_dtor(&zv);
+		array_init_size(&zv, static_cast<uint32_t>(size));
+	}
 }
 
 void zvalue::reset()
diff --git a/util/value.h b/util/value.h
index 7167406..a2b1845 100644
--- a/util/value.h
+++ b/util/value.h
@@ -71,6 +71,8 @@ class zvalue
 		zvalue(const char* value);
 		zvalue(const char* value, std::size_t length);
 
+		zvalue(std::initializer_list<std::pair<const char*, zvalue>> values);
+
 		template<typename T>
 		zvalue(std::initializer_list<T> values);
 
@@ -114,6 +116,8 @@ class zvalue
 
 		void assign(const char* value, std::size_t length);
 
+		zvalue& operator=(std::initializer_list<std::pair<const char*, zvalue>> values);
+
 		template<typename T>
 		zvalue& operator=(std::initializer_list<T> values);
 
@@ -299,10 +303,21 @@ class zvalue
 		void insert(const char* key, zvalue&& value);
 		void insert(const char* key, std::size_t key_length, zvalue&& value);
 
+		template<typename Key, typename Value>
+		void insert(const std::pair<Key, Value>& key_value);
+
+		void insert(std::initializer_list<std::pair<const char*, zvalue>> values);
+
+		template<typename Key, typename Value>
+		void append(std::initializer_list<std::pair<Key, Value>> values);
+
 		// adds new item at the next free index
 		void push_back(const zvalue& value);
 		void push_back(zvalue&& value);
 
+		template<typename T>
+		void push_back(std::initializer_list<T> values);
+
 		// returns true if item was erased, or false if given index/key didn't exist
 		bool erase(std::size_t index);
 		bool erase(long index);
diff --git a/util/value.inl b/util/value.inl
index 0f0f980..7d173b6 100644
--- a/util/value.inl
+++ b/util/value.inl
@@ -23,10 +23,7 @@ template<typename T>
 zvalue::zvalue(std::initializer_list<T> values)
 {
 	ZVAL_UNDEF(&zv);
-	reserve(values.size());
-	for (const auto& value : values) {
-		push_back(value);
-	}
+	push_back(values);
 }
 
 template<typename Iterator>
@@ -78,10 +75,7 @@ zvalue::zvalue(const map<Key, Value>& values)
 template<typename T>
 zvalue& zvalue::operator=(std::initializer_list<T> values)
 {
-	reserve(values.size());
-	for (const auto& value : values) {
-		push_back(value);
-	}
+	push_back(values);
 	return *this;
 }
 
@@ -525,6 +519,41 @@ inline void zvalue::insert(const char* key, zvalue&& value)
 
 // ---------------------
 
+template<typename Key, typename Value>
+void zvalue::insert(const std::pair<Key, Value>& key_value)
+{
+	insert(key_value.first, key_value.second);
+}
+
+inline void zvalue::insert(std::initializer_list<std::pair<const char*, zvalue>> \
values) +{
+	append(values);
+}
+
+template<typename Key, typename Value>
+void zvalue::append(std::initializer_list<std::pair<Key, Value>> values)
+{
+	reserve(values.size());
+	for_each(
+		values.begin(),
+		values.end(),
+		[this](const auto& key_value) { insert(key_value); }
+		);
+}
+
+// ---------------------
+
+template<typename T>
+void zvalue::push_back(std::initializer_list<T> values)
+{
+	reserve(values.size());
+	for (const auto& value : values) {
+		push_back(value);
+	}
+}
+
+// ---------------------
+
 inline bool zvalue::erase(long index)
 {
 	return erase(static_cast<std::size_t>(index));


--
PECL CVS Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic