From 53272534a76a9d8cbee4ee887e1f360c4a99728b Mon Sep 17 00:00:00 2001 From: Emiel Bruijntjes Date: Mon, 14 Oct 2013 02:46:52 -0700 Subject: The initial class properties can now only be scalar values, just like in PHP --- src/member.cpp | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 153 insertions(+), 4 deletions(-) (limited to 'src/member.cpp') diff --git a/src/member.cpp b/src/member.cpp index 82faf95..1c32777 100644 --- a/src/member.cpp +++ b/src/member.cpp @@ -12,17 +12,166 @@ * Set up namespace */ namespace Php { + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + */ +Member::Member(const char *name, bool pub) : _name(name), _public(pub) +{ + // create a null member + _info = new NullMember(); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + */ +Member::Member(const char *name, bool pub, std::nullptr_t value) : _name(name), _public(pub) +{ + // create a null member + _info = new NullMember(); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + */ +Member::Member(const char *name, bool pub, int value) : _name(name), _public(pub) +{ + // create a long member + _info = new LongMember(value); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + */ +Member::Member(const char *name, bool pub, long value) : _name(name), _public(pub) +{ + // create a long member + _info = new LongMember(value); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + */ +Member::Member(const char *name, bool pub, bool value) : _name(name), _public(pub) +{ + // create a bool member + _info = new BoolMember(value); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + */ +Member::Member(const char *name, bool pub, char value) : _name(name), _public(pub) +{ + // create a new string member + _info = new StringMember(&value, 1); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + */ +Member::Member(const char *name, bool pub, const std::string &value) : _name(name), _public(pub) +{ + // create a new string member + _info = new StringMember(value); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + * @param size String length + */ +Member::Member(const char *name, bool pub, const char *value, int size) : _name(name), _public(pub) +{ + // create a new string member + if (size < 0) size = strlen(value); + _info = new StringMember(value, size); +} + +/** + * Constructor + * @param name Name of the member + * @param pub Is this a public property (otherwise it is protected) + * @param value The value to add + */ +Member::Member(const char *name, bool pub, double value) : _name(name), _public(pub) +{ + // create a new double member + _info = new DoubleMember(value); +} + +/** + * Copy constructor + * @param member The member to copy + */ +Member::Member(const Member &member) +{ + // copy info object, and name and public members + _info = member._info; + _name = member._name; + _public = member._public; + + // update refcount in info object + _info->refcount(+1); +} + +/** + * Move constructor + * @param member The member to move + */ +Member::Member(Member &&member) +{ + // move info object, and name and public properties + _info = member._info; + _name = std::move(member._name); + _public = member._public; + + // reset info in other object + member._info = NULL; +} + +/** + * Destructor + */ +Member::~Member() +{ + // leap out if there is no other info object, or when it is also used by other objects + if (!_info || _info->refcount(-1) > 0) return; + // deallocate info object + delete _info; +} + /** * Internal method to declare the property * @var zend_class_entry */ void Member::declare(struct _zend_class_entry *entry) { - std::cout << "declare property " << _name << std::endl; - - // declare the property - zend_declare_property(entry, _name.c_str(), _name.size(), _value._val, _public ? ZEND_ACC_PUBLIC : ZEND_ACC_PROTECTED TSRMLS_CC); + // let the info object handle stuff + _info->declare(entry, _name.c_str(), _name.size(), _public ? ZEND_ACC_PUBLIC : ZEND_ACC_PROTECTED TSRMLS_CC); } /** -- cgit v1.2.3