diff options
author | valmat <ufabiz@gmail.com> | 2014-04-10 13:09:43 +0600 |
---|---|---|
committer | valmat <ufabiz@gmail.com> | 2014-04-10 13:09:43 +0600 |
commit | b015506a3b1738405a948d11e221e3948aa42d13 (patch) | |
tree | 22ade795098cdf02db039d181a5bea38b551e057 /include | |
parent | 14b63ee87dde3688fea7e58fa25b73362117ae11 (diff) | |
parent | 6ac0bc83b53ab854baaaba74dd54e60c562751ff (diff) |
Merge branch 'master' into ini
Conflicts:
include/namespace.h
Diffstat (limited to 'include')
-rw-r--r-- | include/call.h | 49 | ||||
-rw-r--r-- | include/hashmember.h | 119 | ||||
-rw-r--r-- | include/hashparent.h | 39 | ||||
-rw-r--r-- | include/namespace.h | 6 | ||||
-rw-r--r-- | include/value.h | 99 |
5 files changed, 296 insertions, 16 deletions
diff --git a/include/call.h b/include/call.h index 3ad4776..9be5c91 100644 --- a/include/call.h +++ b/include/call.h @@ -44,17 +44,44 @@ Value call(const char *name, Params&&... params) * make the code run on the highway), it is not expected that these functions * are going to be used very often anyway. */ -inline Value array_keys(const Value &value) { return call("array_keys", value); } -inline Value array_values(const Value &value) { return call("array_values", value); } -inline Value echo(const char *input) { out << input; return nullptr; } -inline Value echo(const std::string &input) { out << input; return nullptr; } -inline Value empty(const Value &value) { return value.isNull() || !value.boolValue(); } -inline Value empty(const HashMember<std::string> &member) { return !member.exists() || empty(member.value()); } -inline Value empty(const HashMember<int> &member) { return !member.exists() || empty(member.value()); } -inline Value ini_get(const Value &value) { return call("ini_get", value); } -//inline Value isset(const Value &value) { return call("isset", value); } -//inline Value isset(const HashMember<std::string> &member) { return member.exists() && isset(member.value()); } -//inline Value isset(const HashMember<int> &member) { return member.exists() && isset(member.value()); } +inline Value array_key_exists(const Value &key, const Value &array) { return array.contains(key); } +inline Value array_key_exists(int key, const Value &array) { return array.contains(key); } +inline Value array_key_exists(const char *key, const Value &array) { return array.contains(key); } +inline Value array_key_exists(const std::string &key, const Value &array) { return array.contains(key); } +inline Value array_keys(const Value &value) { return call("array_keys", value); } +inline Value array_push(const Value &array, const Value &value) { return call("array_push", array, value); } +inline Value array_values(const Value &value) { return call("array_values", value); } +inline Value count(const Value &value) { return call("count", value); } +inline Value echo(const char *input) { out << input; return nullptr; } +inline Value echo(const std::string &input) { out << input; return nullptr; } +inline Value empty(const Value &value) { return value.isNull() || !value.boolValue(); } +inline Value empty(const HashMember<std::string> &member) { return !member.exists() || empty(member.value()); } +inline Value empty(const HashMember<int> &member) { return !member.exists() || empty(member.value()); } +inline Value ini_get(const Value &value) { return call("ini_get", value); } +inline Value is_array(const Value &value) { return value.isArray(); } +inline Value strlen(const Value &value) { return call("strlen", value); } +inline void unset(const HashMember<std::string> &member) { member.unset(); } +inline void unset(const HashMember<int> &member) { member.unset(); } +inline void unset(const HashMember<Value> &member) { member.unset(); } + +/** + * The isset function conflicts with the 'isset' macro defined by the Zend engine + */ +#pragma push_macro("isset"); +#undef isset + +/** + * Define the isset function + */ +inline Value isset(const Value &value) { return call("isset", value); } +inline Value isset(const HashMember<std::string> &member) { return member.exists() && isset(member.value()); } +inline Value isset(const HashMember<int> &member) { return member.exists() && isset(member.value()); } +inline Value isset(const HashMember<Value> &member) { return member.exists() && isset(member.value()); } + +/** + * Re-install the ISSET macro + */ +#pragma pop_macro("isset"); /** * End of namespace diff --git a/include/hashmember.h b/include/hashmember.h index 9a2d5e8..6853228 100644 --- a/include/hashmember.h +++ b/include/hashmember.h @@ -381,7 +381,7 @@ public: /** * Check if a certain index exists in the array/object - * @param key + * @param index * @return bool */ virtual bool contains(int index) const override @@ -389,6 +389,17 @@ public: // object must exist, and the value must contain the key return exists() && value().contains(index); } + + /** + * Check if a certain index exists in the array/object + * @param key + * @return bool + */ + virtual bool contains(const Value &key) const override + { + // object must exist, and the value must contain the key + return exists() && value().contains(key); + } /** * Retrieve the value at a string index @@ -417,6 +428,20 @@ public: // ask the value return value().get(index); } + + /** + * Retrieve the value at a variant index + * @param key + * @return Value + */ + virtual Value get(const Value &key) const override + { + // return null if it does not exist + if (!exists()) return nullptr; + + // ask the value + return value().get(key); + } /** * Overwrite the value at a certain string index @@ -452,6 +477,97 @@ public: _parent->set(_index, current); } + /** + * Overwrite the value at a certain variant index + * @param key + * @param value + */ + virtual void set(const Value &key, const Value &value) override + { + // get the current value + Value current(this->value()); + + // add the value + current[key] = value; + + // pass this to the base + _parent->set(_index, current); + } + + /** + * Unset the member + */ + void unset() const + { + _parent->unset(_index); + } + + /** + * Unset a member by its index + * @param index + */ + virtual void unset(int index) override + { + // if the current property does not even exist, we do not have to add anything + if (!exists()) return; + + // get the current value + Value current(this->value()); + + // skip if the property does not exist + if (!current.contains(index)) return; + + // remove the index + current.unset(index); + + // pass the new value to the base + _parent->set(_index, current); + } + + /** + * Unset a member by its key + * @param key + */ + virtual void unset(const std::string &key) override + { + // if the current property does not even exist, we do not have to add anything + if (!exists()) return; + + // get the current value + Value current(this->value()); + + // skip if the property does not exist + if (!current.contains(key)) return; + + // remove the index + current.unset(key); + + // pass the new value to the base + _parent->set(_index, current); + } + + /** + * Unset a member by its key + * @param key + */ + virtual void unset(const Value &key) override + { + // if the current property does not even exist, we do not have to add anything + if (!exists()) return; + + // get the current value + Value current(this->value()); + + // skip if the property does not exist + if (!current.contains(key)) return; + + // remove the index + current.unset(key); + + // pass the new value to the base + _parent->set(_index, current); + } + protected: /** * Protected copy constructor @@ -483,6 +599,7 @@ private: * Friend classes */ friend class HashMember<std::string>; + friend class HashMember<Value>; friend class HashMember<int>; friend class Base; friend class Value; diff --git a/include/hashparent.h b/include/hashparent.h index 4c2ee68..5ba05bd 100644 --- a/include/hashparent.h +++ b/include/hashparent.h @@ -56,6 +56,13 @@ public: virtual bool contains(int index) const = 0; /** + * Check if a certain index exists in the array/object + * @param key + * @return bool + */ + virtual bool contains(const Value &index) const = 0; + + /** * Retrieve the value at a string index * @param key * @return Value @@ -68,6 +75,13 @@ public: * @return Value */ virtual Value get(int index) const = 0; + + /** + * Retrieve the value at a value index + * @param key + * @return Value + */ + virtual Value get(const Value &key) const = 0; /** * Overwrite the value at a certain string index @@ -83,6 +97,31 @@ public: */ virtual void set(int index, const Value &value) = 0; + /** + * Overwrite the value at a certain variant index + * @param key + * @param value + */ + virtual void set(const Value &key, const Value &value) = 0; + + /** + * Unset a member by its index + * @param index + */ + virtual void unset(int index) = 0; + + /** + * Unset a member by its key + * @param key + */ + virtual void unset(const std::string &key) = 0; + + /** + * Unset a member by its key + * @param key + */ + virtual void unset(const Value &key) = 0; + }; /** diff --git a/include/namespace.h b/include/namespace.h index 468a423..1c9d457 100644 --- a/include/namespace.h +++ b/include/namespace.h @@ -225,7 +225,7 @@ public: * * @param callback */ - void apply(const std::function<void(const std::string &ns, Function &func)> &callback); + void functions(const std::function<void(const std::string &ns, Function &func)> &callback); /** * Apply a callback to each registered class @@ -235,7 +235,7 @@ public: * * @param callback */ - void apply(const std::function<void(const std::string &ns, ClassBase &clss)> &callback); + void classes(const std::function<void(const std::string &ns, ClassBase &clss)> &callback); /** * Filling ini entries into external zend_ini_entry array @@ -243,8 +243,6 @@ public: */ void fill_ini(_zend_ini_entry *ini_entries, int module_number); - - }; /** diff --git a/include/value.h b/include/value.h index 95985d7..d1e6c8a 100644 --- a/include/value.h +++ b/include/value.h @@ -575,6 +575,18 @@ public: } /** + * Is a certain key set in the array, when that key is stored as value object + * @param key + * @return bool + */ + virtual bool contains(const Value &value) const override + { + if (value.isNumeric()) return contains(value.numericValue()); + if (value.isString()) return contains(value.rawValue(), value.size()); + return contains(value.stringValue()); + } + + /** * Cast to a number * @return int32_t */ @@ -692,6 +704,18 @@ public: } /** + * Get access to a certain variant member + * @param key + * @return Value + */ + virtual Value get(const Value &key) const override + { + if (key.isNumeric()) return get(key.numericValue()); + if (key.isString()) return get(key.rawValue(), key.size()); + return get(key.stringValue()); + } + + /** * Set a certain property * Calling this method will turn the value into an array * @param index Index of the property to set @@ -732,6 +756,61 @@ public: } /** + * Overwrite the value at a certain variant index + * @param key + * @param value + */ + virtual void set(const Value &key, const Value &value) override + { + if (key.isNumeric()) return set(key.numericValue(), value); + if (key.isString()) return set(key.rawValue(), key.size(), value); + return set(key.stringValue(), value); + } + + /** + * Unset a member by its index + * @param index + */ + virtual void unset(int index) override; + + /** + * Unset by key name and length of the key + * @param key + * @param size + */ + void unset(const char *key, int size); + + /** + * Unset by key name and length of the key + * @param key + * @param size + */ + void unset(const char *key) + { + unset(key, strlen(key)); + } + + /** + * Unset a member by its key + * @param key + */ + virtual void unset(const std::string &key) override + { + return unset(key.c_str(), key.size()); + } + + /** + * Unset a member by its key + * @param key + */ + virtual void unset(const Value &key) override + { + if (key.isNumeric()) return unset(key.numericValue()); + if (key.isString()) return unset(key.rawValue(), key.size()); + return unset(key.stringValue()); + } + + /** * Array access operator * This can be used for accessing arrays * @param index @@ -787,6 +866,26 @@ public: { return get(key); } + + /** + * Index by other value object + * @param key + * @return HashMember<std::string> + */ + HashMember<Value> operator[](const Value &key); + + /** + * Index by other value object + * @param key + * @return HashMember<std::string> + */ + Value operator[](const Value &key) const + { + if (key.isNumeric()) return get(key.numericValue()); + if (key.isString()) return get(key.rawValue(), key.size()); + return get(key.stringValue()); + } + /** * Call the function in PHP |