summaryrefslogtreecommitdiff
path: root/include/function.h
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2015-01-15 16:34:14 +0100
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2015-01-15 16:34:14 +0100
commitd87b3ca8f1dbcb395f2dfd6540483da7a0e5e15c (patch)
tree6dd3179162d5cecc474fc9028039bd757f6df04b /include/function.h
parentd8fe9239959dfeae11daa5de70126e30119d3b75 (diff)
Added the Php::Function class. This is an extension to the Php::Value class that can be used if you want to assign a std::function object to a Value. This is useful if you want to pass a C++ lambda to a PHP userspace function
Diffstat (limited to 'include/function.h')
-rw-r--r--include/function.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/include/function.h b/include/function.h
new file mode 100644
index 0000000..7073f84
--- /dev/null
+++ b/include/function.h
@@ -0,0 +1,73 @@
+/**
+ * Function.h
+ *
+ * Small extension to the Value class that allows a value to be
+ * constructed with a std::function.
+ *
+ * If you want to assign a std::function to a value, the following
+ * piece of code won't work:
+ *
+ * Php::Value value([]() { .... });
+ *
+ * Because the passed in function would match with many of the possible
+ * Value constructors. For that reason we have created a small and
+ * simple Function class that can be used instead:
+ *
+ * Php::Function valu([]() { .... });
+ *
+ * A Php::Function is an extended Php::Value object, so can be used
+ * in place of Php::Values all the time. The only difference is that
+ * it has a different constructor
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2015 Copernica BV
+ */
+
+/**
+ * Set up namespace
+ */
+namespace Php {
+
+/**
+ * Class definition
+ */
+class Function : public Value
+{
+public:
+ /**
+ * Constructor to wrap a function that takes parameters
+ * @param function The C++ function to be wrapped
+ */
+ Function(const std::function<Value(Parameters&)> &function);
+
+ /**
+ * Constructor to wrap a function that does not accept parameters
+ * @param function The C++ function to be wrapped
+ */
+ Function(const std::function<Value()> &function) : Function([function](Parameters &params) -> Value {
+
+ // call original function, forget about the parameters
+ return function();
+
+ }) {}
+
+ /**
+ * Destructor
+ */
+ virtual ~Function() {}
+
+private:
+ /**
+ * Retrieve the class entry of the _functor class
+ * @return _zend_class_entry
+ */
+ static struct _zend_class_entry *entry();
+
+
+};
+
+/**
+ * End namespace
+ */
+}
+