summaryrefslogtreecommitdiff
path: root/src/member.cpp
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-10-14 02:46:52 -0700
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-10-14 02:46:52 -0700
commit53272534a76a9d8cbee4ee887e1f360c4a99728b (patch)
tree54206aca1cfa1461ba365b05e5848f2843be91b9 /src/member.cpp
parent777eb276f635c949ccdcf9613ad55d42190cb387 (diff)
The initial class properties can now only be scalar values, just like in PHP
Diffstat (limited to 'src/member.cpp')
-rw-r--r--src/member.cpp157
1 files changed, 153 insertions, 4 deletions
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);
}
/**