summaryrefslogtreecommitdiff
path: root/src/py_utils.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2007-05-04 11:41:58 +0000
committerJohn Wiegley <johnw@newartisans.com>2008-04-13 03:38:38 -0400
commit96684b72ca367bfd4dbe2e45a9a66c56204eb533 (patch)
tree3e218d1048d5941baa1d1064bc2539ef2df55a45 /src/py_utils.cc
parent93096b77f3c03b826c8857e4817ccd1bca52f9ee (diff)
downloadfork-ledger-96684b72ca367bfd4dbe2e45a9a66c56204eb533.tar.gz
fork-ledger-96684b72ca367bfd4dbe2e45a9a66c56204eb533.tar.bz2
fork-ledger-96684b72ca367bfd4dbe2e45a9a66c56204eb533.zip
Added code for converting ledger::string and boost::date_time to their
respective Python counterparts.
Diffstat (limited to 'src/py_utils.cc')
-rw-r--r--src/py_utils.cc46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/py_utils.cc b/src/py_utils.cc
new file mode 100644
index 00000000..0f82d683
--- /dev/null
+++ b/src/py_utils.cc
@@ -0,0 +1,46 @@
+#include "pyinterp.h"
+#include "pyutils.h"
+
+#include <boost/python/module.hpp>
+#include <boost/python/def.hpp>
+#include <boost/python/to_python_converter.hpp>
+
+namespace ledger {
+
+using namespace boost::python;
+
+struct string_to_python
+{
+ static PyObject* convert(const string& str)
+ {
+ return incref(object(*boost::polymorphic_downcast<const std::string *>(&str)).ptr());
+ }
+};
+
+struct string_from_python
+{
+ static void* convertible(PyObject* obj_ptr)
+ {
+ if (!PyString_Check(obj_ptr)) return 0;
+ return obj_ptr;
+ }
+
+ static void construct(PyObject* obj_ptr, converter::rvalue_from_python_stage1_data* data)
+ {
+ const char* value = PyString_AsString(obj_ptr);
+ if (value == 0) throw_error_already_set();
+ void* storage = ((converter::rvalue_from_python_storage<string>*) data)->storage.bytes;
+ new (storage) string(value);
+ data->convertible = storage;
+ }
+};
+
+typedef register_python_conversion<string, string_to_python, string_from_python>
+ string_python_conversion;
+
+void export_utils()
+{
+ string_python_conversion();
+}
+
+} // namespace ledger