summaryrefslogtreecommitdiff
path: root/include/method.h
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-10-15 05:54:52 -0700
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-10-15 05:54:52 -0700
commit61ba30d716dab670a5f2ed0ee2f6650375b2058d (patch)
tree711db9359015de260071088ef027b020cd95d4b3 /include/method.h
parentb2042dbd58c043ab49e9b0dbb51bf8516fe8cea8 (diff)
Calling custom member methods is now functional
Diffstat (limited to 'include/method.h')
-rw-r--r--include/method.h127
1 files changed, 127 insertions, 0 deletions
diff --git a/include/method.h b/include/method.h
new file mode 100644
index 0000000..9398fd7
--- /dev/null
+++ b/include/method.h
@@ -0,0 +1,127 @@
+/**
+ * Method.h
+ */
+
+/**
+ * Namespace
+ */
+namespace Php {
+
+/**
+ * A very generic function pointer
+ */
+typedef void (*function_ptr)();
+
+/**
+ * Base class of the method
+ */
+class _Method
+{
+public:
+ /**
+ * Copy constructor
+ * @param method
+ */
+ _Method(const _Method &method) : _type(method._type), _callback(method._callback) {}
+
+ /**
+ * Destructor
+ * @param type
+ * @param callback
+ */
+ virtual ~_Method() {}
+
+ /**
+ * Invoke the method
+ * @param environment
+ * @param parameters
+ * @return Value
+ */
+ Value invoke(Environment &environment, Parameters &parameters)
+ {
+ // the object to call a method on
+ Base *base = parameters.object();
+
+ // find out which method to call, and call it
+ switch (_type) {
+ case 0: (base->*_callback.m0)(); return Value();
+ case 1: (base->*_callback.m1)(parameters); return Value();
+ case 2: (base->*_callback.m2)(environment); return Value();
+ case 3: (base->*_callback.m3)(environment, parameters); return Value();
+ case 4: return (base->*_callback.m4)();
+ case 5: return (base->*_callback.m5)(parameters);
+ case 6: return (base->*_callback.m6)(environment);
+ case 7: return (base->*_callback.m7)(environment, parameters);
+ default: return Value();
+ }
+ }
+
+protected:
+ /**
+ * Protected constructor to prevent that anyone instantiates this object
+ */
+ _Method(method_callback_0 callback) : _type(0) { _callback.m0 = callback; }
+ _Method(method_callback_1 callback) : _type(1) { _callback.m1 = callback; }
+ _Method(method_callback_2 callback) : _type(2) { _callback.m2 = callback; }
+ _Method(method_callback_3 callback) : _type(3) { _callback.m3 = callback; }
+ _Method(method_callback_4 callback) : _type(4) { _callback.m4 = callback; }
+ _Method(method_callback_5 callback) : _type(5) { _callback.m5 = callback; }
+ _Method(method_callback_6 callback) : _type(6) { _callback.m6 = callback; }
+ _Method(method_callback_7 callback) : _type(7) { _callback.m7 = callback; }
+
+private:
+ /**
+ * Callback type
+ * @var int
+ */
+ int _type;
+
+ /**
+ * The actual callback
+ * @var void*
+ */
+ union {
+ method_callback_0 m0;
+ method_callback_1 m1;
+ method_callback_2 m2;
+ method_callback_3 m3;
+ method_callback_4 m4;
+ method_callback_5 m5;
+ method_callback_6 m6;
+ method_callback_7 m7;
+ } _callback;
+};
+
+/**
+ * Actual template class of the method
+ */
+template <typename T>
+class Method : public _Method
+{
+public:
+ /**
+ * Constructor
+ * @param callback
+ */
+ Method(void(T::*callback)()) : _Method(static_cast<method_callback_0>(callback)) {}
+ Method(void(T::*callback)(Parameters&)) : _Method(static_cast<method_callback_1>(callback)) {}
+ Method(void(T::*callback)(Environment&)) : _Method(static_cast<method_callback_2>(callback)) {}
+ Method(void(T::*callback)(Environment&,Parameters&)) : _Method(static_cast<method_callback_3>(callback)) {}
+ Method(Value(T::*callback)()) : _Method(static_cast<method_callback_4>(callback)) {}
+ Method(Value(T::*callback)(Parameters&)) : _Method(static_cast<method_callback_5>(callback)) {}
+ Method(Value(T::*callback)(Environment&)) : _Method(static_cast<method_callback_6>(callback)) {}
+ Method(Value(T::*callback)(Environment&,Parameters&)) : _Method(static_cast<method_callback_7>(callback)) {}
+
+ /**
+ * Destructor
+ */
+ virtual ~Method() {}
+
+};
+
+/**
+ * End of namespace
+ */
+}
+
+