summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorvalmat <ufabiz@gmail.com>2014-11-25 23:36:07 +0600
committervalmat <ufabiz@gmail.com>2014-11-25 23:36:07 +0600
commitcf25fa0b9636d232c63f01824d66289ab9a89b81 (patch)
treecdf0fae4bfca8497f7ba37c9d03516a9af38766c /include
parentda4de6cb1097471b2659c102d55a646cbc9e0f41 (diff)
Used variadic templates instead of code duplication
Diffstat (limited to 'include')
-rw-r--r--include/object.h24
-rw-r--r--include/value.h63
2 files changed, 44 insertions, 43 deletions
diff --git a/include/object.h b/include/object.h
index 9387408..98e2553 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
diff --git a/include/value.h b/include/value.h
index 5c34406..d6f8da6 100644
--- a/include/value.h
+++ b/include/value.h
@@ -945,24 +945,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
@@ -972,16 +980,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