diff options
author | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2013-08-29 17:03:00 +0200 |
---|---|---|
committer | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2013-08-29 17:03:00 +0200 |
commit | 3537cce27590c6197ffe458ac6cc7dee39040e7b (patch) | |
tree | b780efd8140dc86a9109df48911d696330c5a188 /include/member.h | |
parent | 8cb852a298cf8aa260883c5bc474bcf8cb7f9a76 (diff) |
working with arrays is now almost as simple as it is in PHP
Diffstat (limited to 'include/member.h')
-rw-r--r-- | include/member.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/include/member.h b/include/member.h new file mode 100644 index 0000000..86e3554 --- /dev/null +++ b/include/member.h @@ -0,0 +1,236 @@ +/** + * Member.h + * + * When you're accessing members in an array or an object, you're + * doing so via an internal member object. This is an object that + * keeps track of the array to which it belonged, and that updates + * the class when the object is modified + * + * This is an abstract class. You are not supposed to instantiate it + * yourself. An instance of it is created when you call Value::operator[] + * + * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com> + * @copyright 2013 Copernica BV + */ + +/** + * Set up namespace + */ +namespace PhpCpp { + +/** + * Forward definitions + */ +class Value; + +/** + * Member class + */ +template <class Type> +class Member +{ +public: + /** + * Destructor + */ + virtual ~Member() {} + + /** + * Assign a numeric value + * @param value + * @return Member + */ + Member &operator=(long value) + { + _value->set(_index, value); + return *this; + } + + /** + * Assign a numeric value + * @param value + * @return Member + */ + Member &operator=(int value) + { + _value->set(_index, value); + return *this; + } + + /** + * Assign a double value + * @param value + * @return Member + */ + Member &operator=(double value) + { + _value->set(_index, value); + return *this; + } + + /** + * Assign a boolean value + * @param value + * @return Member + */ + Member &operator=(bool value) + { + _value->set(_index, value); + return *this; + } + + /** + * Assign a string value + * @param value + * @return Member + */ + Member &operator=(const std::string &value) + { + _value->set(_index, value); + return *this; + } + + /** + * Assign a byte array value + * @param value + * @return Member + */ + Member &operator=(const char *value) + { + _value->set(_index, value); + return *this; + } + + /** + * Retrieve the original value + * @return Value + */ + Value value() const + { + return _value->get(_index); + } + + /** + * Cast to a value object + * @return Value + */ + operator Value () const + { + return _value->get(_index); + } + + /** + * Cast to a long + * @return long + */ + operator long () const + { + return _value->get(_index).longValue(); + } + + /** + * Cast to a boolean + * @return boolean + */ + operator bool () const + { + return _value->get(_index).boolValue(); + } + + /** + * Cast to a string + * @return string + */ + operator std::string () const + { + return _value->get(_index).stringValue(); + } + + /** + * Cast to byte array + * @return const char * + */ + operator const char * () const + { + return _value->get(_index).rawValue(); + } + + /** + * Cast to a floating point + * @return double + */ + operator double () const + { + return _value->get(_index).decimalValue(); + } + + /** + * Array access operator + * This can be used for accessing arrays + * @param index + * @return Member + */ + Member operator[](int index) + { + return _value->get(_index)[index]; + } + + /** + * Array access operator + * This can be used for accessing associative arrays + * @param key + * @return Member + */ + Member operator[](const std::string &key) + { + return _value->get(_index)[key]; + } + + /** + * Array access operator + * This can be used for accessing associative arrays + * @param key + * @return Member + */ + Member operator[](const char *key) + { + return _value->get(_index)[key]; + } + +private: + /** + * Constructor + * @param value Parent element + * @param index Index in the array + */ + Member(Value *value, Type index) : _value(value), _index(index) {} + + /** + * Private copy constructor + * @param value Other element + */ + Member(const Member<Type> &member) : _value(member._value), _index(member._index) {} + + /** + * The array of which this is a member + * @var Value + */ + Value *_value; + + /** + * The original index + * @var Type + */ + Type _index; + + /** + * Value objects may create members + */ + friend class Value; +}; + +/** + * End of namespace + */ +} + |