summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-11-21 11:23:05 +0100
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-11-21 11:23:05 +0100
commitd0ee242b3a617fa8676e56388ce01a8a676bf7d1 (patch)
tree398c35f97acde6b4417578c01bf0c08f3786c722
parent069beaa49325728e0eff0ba13fa480604ce43a84 (diff)
fixed issue 107, casting a value to a std::map was not working correctly
-rw-r--r--include/value.h25
-rw-r--r--zend/value.cpp16
2 files changed, 33 insertions, 8 deletions
diff --git a/include/value.h b/include/value.h
index 85935ec..ea56487 100644
--- a/include/value.h
+++ b/include/value.h
@@ -526,14 +526,19 @@ public:
// must be an array or an object, otherwise the map is empty
if (!isArray() && !isObject()) return std::map<std::string,T>();
- // get the original map value
- std::map<std::string,Php::Value> map(mapValue());
-
// result variable
std::map<std::string,T> result;
-
- // loop through the original map, and copy everything to the result
- for (auto &iter : map) result[iter.first] = iter.second;
+
+ // iterate over the values
+ iterate([&result](const Value &key, const Value &value) {
+
+ // first convert the value to the appropriate type (otherwise
+ // compiler errors occur)
+ T val = value;
+
+ // add the value to the array
+ result[key] = val;
+ });
// done
return result;
@@ -674,7 +679,7 @@ public:
{
return stringValue();
}
-
+
/**
* Cast to byte array
* @return const char *
@@ -1040,6 +1045,12 @@ public:
private:
/**
+ * Iterate over key value pairs
+ * @param callback
+ */
+ void iterate(const std::function<void(const Php::Value &,const Php::Value &)> &callback) const;
+
+ /**
* Call function with a number of parameters
* @param argc Number of parameters
* @param argv The parameters
diff --git a/zend/value.cpp b/zend/value.cpp
index dfea847..544926a 100644
--- a/zend/value.cpp
+++ b/zend/value.cpp
@@ -1738,7 +1738,7 @@ ValueIterator Value::createIterator(bool begin) const
// check type
if (isArray()) return ValueIterator(new HashIterator(Z_ARRVAL_P(_val), begin, true));
- // get access to the hast table
+ // get access to the hash table
if (isObject())
{
// we need the TSRMLS_CC variable
@@ -1786,6 +1786,20 @@ ValueIterator Value::end() const
}
/**
+ * Iterate over key value pairs
+ * @param callback
+ */
+void Value::iterate(const std::function<void(const Php::Value &,const Php::Value &)> &callback) const
+{
+ // iterate over the object
+ for (const auto &iter : *this)
+ {
+ // call the callback
+ callback(iter.first, iter.second);
+ }
+}
+
+/**
* Does the array contain a certain index?
* @param index
* @return bool