diff --git a/bindings/engine.i b/bindings/engine.i index eb753e8068..4ae6c427f3 100644 --- a/bindings/engine.i +++ b/bindings/engine.i @@ -73,6 +73,8 @@ GLIST_HELPER_INOUT(AccountList, SWIGTYPE_p_Account); GLIST_HELPER_INOUT(PriceList, SWIGTYPE_p_GNCPrice); // TODO: free PriceList? GLIST_HELPER_INOUT(CommodityList, SWIGTYPE_p_gnc_commodity); +VECTOR_HELPER_INOUT(SplitsVec, SWIGTYPE_p_Split, Split); +VECTOR_HELPER_INOUT(AccountVec, SWIGTYPE_p_Account, Account); %typemap(newfree) char * "g_free($1);" diff --git a/common/base-typemaps.i b/common/base-typemaps.i index 5b807f0005..23c2a6cd4b 100644 --- a/common/base-typemaps.i +++ b/common/base-typemaps.i @@ -162,6 +162,29 @@ typedef char gchar; $result = scm_reverse(list); } %enddef + + +%define VECTOR_HELPER_INOUT(VectorType, ElemSwigType, ElemType) +%typemap(in) VectorType { + std::vector accum; + for (auto node = $input; !scm_is_null (node); node = scm_cdr (node)) + { + auto p_scm = scm_car (node); + auto p = (scm_is_false (p_scm) || scm_is_null (p_scm)) ? static_cast(nullptr) : + static_cast(SWIG_MustGetPtr(p_scm, ElemSwigType, 1, 0)); + accum.push_back (p); + } + accum.swap ($1); +} + +%typemap(out) VectorType { + SCM list = SCM_EOL; + std::for_each ($1.rbegin(), $1.rend(), [&list](auto n) + { list = scm_cons(SWIG_NewPointerObj(n, ElemSwigType, 0), list); }); + $result = list; +} +%enddef + #elif defined(SWIGPYTHON) /* Typemaps for Python */ %import "glib.h"