summaryrefslogtreecommitdiff
path: root/src/wrapper/raw_constructor.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wrapper/raw_constructor.hpp')
-rw-r--r--src/wrapper/raw_constructor.hpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/wrapper/raw_constructor.hpp b/src/wrapper/raw_constructor.hpp
new file mode 100644
index 0000000..69ee9ba
--- /dev/null
+++ b/src/wrapper/raw_constructor.hpp
@@ -0,0 +1,61 @@
+// Original code by Hans Meine <meine <at> kogs1.informatik.uni-hamburg.de>:
+// Subject: Re: Raw constructor (i.e. combination of make_constructor and raw_function)
+// Newsgroups: gmane.comp.python.c++
+// Date: 2005-11-17 18:43:48 GMT
+// No copyright statement found. Presumed to be in the public domain.
+
+#ifndef RAW_CONSTRUCTOR_HPP
+#define RAW_CONSTRUCTOR_HPP
+
+#include <boost/python.hpp>
+#include <boost/python/raw_function.hpp>
+#include <boost/python/make_constructor.hpp>
+#include "boost/python/detail/api_placeholder.hpp" // python::len
+
+namespace boost { namespace python {
+
+namespace detail {
+
+ template <class F>
+ struct raw_constructor_dispatcher
+ {
+ raw_constructor_dispatcher(F f)
+ : f(make_constructor(f)) {}
+
+ PyObject* operator()(PyObject* args, PyObject* keywords)
+ {
+ borrowed_reference_t* ra = borrowed_reference(args);
+ object a(ra);
+ return incref(
+ object(
+ f(
+ object(a[0])
+ , object(a.slice(0, len(a)))
+ , keywords ? dict(borrowed_reference(keywords)) : dict()
+ )
+ ).ptr()
+ );
+ }
+
+ private:
+ object f;
+ };
+
+} // namespace detail
+
+template <class F>
+object raw_constructor(F f, int min_args = 0)
+{
+ return detail::make_raw_function(
+ objects::py_function(
+ detail::raw_constructor_dispatcher<F>(f)
+ , mpl::vector2<void, object>()
+ , min_args+1
+ , (std::numeric_limits<unsigned>::max)()
+ )
+ );
+}
+
+}} // namespace boost::python
+
+#endif // RAW_CONSTRUCTOR_HPP