[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