summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2015-01-10 10:08:58 +0100
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2015-01-10 10:08:58 +0100
commitfb80367d418f9a9fb059c98d5aec80febeb3bd23 (patch)
treed1a1c40b8339ba36eaac61c64753c45f1e5e0642 /include
parentbdbc7b6c2430aaf396f79fc9ca097534f2c964ac (diff)
parent7320131b8caada0e7237e33ef4e0340577627ef4 (diff)
Merge branch 'improvements' of https://github.com/valmat/PHP-CPP
Diffstat (limited to 'include')
-rw-r--r--include/array.h4
-rw-r--r--include/byref.h2
-rw-r--r--include/byval.h2
-rw-r--r--include/class.h2
-rw-r--r--include/classbase.h2
-rw-r--r--include/global.h4
-rw-r--r--include/hashmember.h2
-rw-r--r--include/hiddenpointer.h2
-rw-r--r--include/object.h26
-rw-r--r--include/value.h67
10 files changed, 57 insertions, 56 deletions
diff --git a/include/array.h b/include/array.h
index 4d6b6b1..d238862 100644
--- a/include/array.h
+++ b/include/array.h
@@ -38,7 +38,7 @@ public:
* Move constructor from a value object
* @param value
*/
- Array(Value &&value) : Value(std::move(value))
+ Array(Value &&value) noexcept : Value(std::move(value))
{
// type must be valid
if (value.type() != Type::Array) throw FatalError("Moving a non-array to an array variable");
@@ -107,7 +107,7 @@ public:
* @param value
* @return Array
*/
- Array &operator=(Value &&value)
+ Array &operator=(Value &&value) noexcept
{
// skip self assignment
if (this == &value) return *this;
diff --git a/include/byref.h b/include/byref.h
index 317c5c6..ff60981 100644
--- a/include/byref.h
+++ b/include/byref.h
@@ -45,7 +45,7 @@ public:
* Move constructor
* @param argument
*/
- ByRef(ByRef &&argument) : Argument(argument) {}
+ ByRef(ByRef &&argument) noexcept : Argument(argument) {}
/**
* Destructor
diff --git a/include/byval.h b/include/byval.h
index 66f9b8f..3606df7 100644
--- a/include/byval.h
+++ b/include/byval.h
@@ -45,7 +45,7 @@ public:
* Move constructor
* @param argument
*/
- ByVal(ByVal &&argument) : Argument(argument) {}
+ ByVal(ByVal &&argument) noexcept : Argument(argument) {}
/**
* Destructor
diff --git a/include/class.h b/include/class.h
index cffc7bd..9257213 100644
--- a/include/class.h
+++ b/include/class.h
@@ -48,7 +48,7 @@ public:
* Move constructor
* @param that
*/
- Class(Class<T> &&that) : ClassBase(std::move(that)) {}
+ Class(Class<T> &&that) noexcept : ClassBase(std::move(that)) {}
/**
* Destructor
diff --git a/include/classbase.h b/include/classbase.h
index 9f0bac3..1129298 100644
--- a/include/classbase.h
+++ b/include/classbase.h
@@ -85,7 +85,7 @@ public:
* Move constructor
* @param that
*/
- ClassBase(ClassBase &&that) : _impl(std::move(that._impl)) {}
+ ClassBase(ClassBase &&that) noexcept : _impl(std::move(that._impl)) {}
/**
* Destructor
diff --git a/include/global.h b/include/global.h
index ae54212..4593e5d 100644
--- a/include/global.h
+++ b/include/global.h
@@ -34,7 +34,7 @@ public:
* Move constructor
* @param global
*/
- Global(Global &&global) : Value(std::move(global)), _name(std::move(global._name)), _exists(global._exists) {}
+ Global(Global &&global) noexcept : Value(std::move(global)), _name(std::move(global._name)), _exists(global._exists) {}
/**
* Destructor
@@ -70,7 +70,7 @@ public:
* @return Global
*/
/*
- Global &operator=(Global &&global)
+ Global &operator=(Global &&global) noexcept
{
// skip self assignment
if (&global == this) return *this;
diff --git a/include/hashmember.h b/include/hashmember.h
index 6853228..b5b6c17 100644
--- a/include/hashmember.h
+++ b/include/hashmember.h
@@ -579,7 +579,7 @@ protected:
* Move constructor
* @param value Other element
*/
-// HashMember(HashMember<Type> &&member) :
+// HashMember(HashMember<Type> &&member) noexcept :
// _parent(std::move(member._parent)), _index(std::move(member._index)) {}
private:
diff --git a/include/hiddenpointer.h b/include/hiddenpointer.h
index dc981c0..5465ebb 100644
--- a/include/hiddenpointer.h
+++ b/include/hiddenpointer.h
@@ -84,7 +84,7 @@ public:
* Move constructor
* @param that
*/
- HiddenPointer(HiddenPointer<Type> &&that) : _allocated(that._allocated), _buffer(that._buffer)
+ HiddenPointer(HiddenPointer<Type> &&that) noexcept : _allocated(that._allocated), _buffer(that._buffer)
{
// the other object is no longer allocated
that._allocated = false;
diff --git a/include/object.h b/include/object.h
index 9387408..2e92f6a 100644
--- a/include/object.h
+++ b/include/object.h
@@ -71,28 +71,10 @@ public:
* number of parameters that are passed to the constructor
*
* @param name Name of the class to instantiate
- * @param arg0 Optional argument 1
- * @param arg1 Optional argument 2
- * @param arg2 Optional argument 3
- * @param arg3 Optional argument 4
- * @param arg4 Optional argument 5
- * @param arg5 Optional argument 6
- * @param arg6 Optional argument 7
- * @param arg7 Optional argument 8
- * @param arg8 Optional argument 9
- * @param arg9 Optional argument 10
+ * @param args Optional arguments
*/
- Object(const char *name) : Value() { if (instantiate(name)) call("__construct"); }
- Object(const char *name, Value p0) : Value() { if (instantiate(name)) call("__construct", p0); }
- Object(const char *name, Value p0, Value p1) : Value() { if (instantiate(name)) call("__construct", p0, p1); }
- Object(const char *name, Value p0, Value p1, Value p2) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2); }
- Object(const char *name, Value p0, Value p1, Value p2, Value p3) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2, p3); }
- Object(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2, p3, p4); }
- Object(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2, p3, p4, p5); }
- Object(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2, p3, p4, p5, p6); }
- Object(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2, p3, p4, p5, p6, p7); }
- Object(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2, p3, p4, p5, p6, p7, p8); }
- Object(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8, Value p9) : Value() { if (instantiate(name)) call("__construct", p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); }
+ template <typename ...Args>
+ Object(const char *name, Args&&... args) : Value() { if (instantiate(name)) call("__construct", std::forward<Value>(args)...); }
/**
* Destructor
@@ -137,7 +119,7 @@ public:
* @param value
* @return ForcedValue
*/
- Object &operator=(Value &&value)
+ Object &operator=(Value &&value) noexcept
{
// skip self assignment
if (this == &value) return *this;
diff --git a/include/value.h b/include/value.h
index 7bdd853..f0b7345 100644
--- a/include/value.h
+++ b/include/value.h
@@ -129,7 +129,7 @@ public:
* Move constructor
* @param value
*/
- Value(Value &&that);
+ Value(Value &&that) noexcept;
/**
* Destructor
@@ -141,7 +141,7 @@ public:
* @param value
* @return Value
*/
- Value &operator=(Value &&value);
+ Value &operator=(Value &&value) noexcept;
/**
* Assignment operator for various types
@@ -944,24 +944,32 @@ public:
return get(key.stringValue());
}
-
/**
* Call the function in PHP
- * We have ten variants of this function, depending on the number of parameters
* This call operator is only useful when the variable represents a callable
* @return Value
*/
Value operator()() const;
- Value operator()(Value p0) const;
- Value operator()(Value p0, Value p1) const;
- Value operator()(Value p0, Value p1, Value p2) const;
- Value operator()(Value p0, Value p1, Value p2, Value p3) const;
- Value operator()(Value p0, Value p1, Value p2, Value p3, Value p4) const;
- Value operator()(Value p0, Value p1, Value p2, Value p3, Value p4, Value p5) const;
- Value operator()(Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6) const;
- Value operator()(Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7) const;
- Value operator()(Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8) const;
- Value operator()(Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8, Value p9) const;
+
+ /**
+ * Call the function - if the variable holds a callable thing
+ * @param args Optional arguments
+ * @return Value
+ */
+ template <typename ...Args>
+ Value operator()(Args&&... args) const
+ {
+ // store arguments
+ Value vargs[] = { static_cast<Value>(args)... };
+ //Value vargs[] = { std::forward<Value>(args)... };
+
+ // array of parameters
+ _zval_struct **params[sizeof...(Args)];
+ for(unsigned i=0; i < sizeof...(Args); i++) {params[i] = &vargs[i]._val;}
+
+ // call the function
+ return exec(sizeof...(Args), params);
+ }
/**
* Call a method
@@ -971,16 +979,27 @@ public:
* @return Value
*/
Value call(const char *name);
- Value call(const char *name, Value p0);
- Value call(const char *name, Value p0, Value p1);
- Value call(const char *name, Value p0, Value p1, Value p2);
- Value call(const char *name, Value p0, Value p1, Value p2, Value p3);
- Value call(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4);
- Value call(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5);
- Value call(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6);
- Value call(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7);
- Value call(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8);
- Value call(const char *name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8, Value p9);
+
+ /**
+ *
+ * Call the method - if the variable holds an object with the given method
+ * @param name name of the method to call
+ * @param p0 The first parameter
+ * @return Value
+ */
+ template <typename ...Args>
+ Value call(const char *name, Args&&... args)
+ {
+ // store arguments
+ Value vargs[] = { static_cast<Value>(args)... };
+
+ // array of parameters
+ _zval_struct **params[sizeof...(Args)];
+ for(unsigned i=0; i < sizeof...(Args); i++) {params[i] = &vargs[i]._val;}
+
+ // call the function
+ return exec(name, sizeof...(Args), params);
+ }
/**
* Retrieve the original implementation