#ifndef BOOST_PYTHON_MAKE_TUPLE_FROM_FUSION_H_ #define BOOST_PYTHON_MAKE_TUPLE_FROM_FUSION_H_ #include #include #include #include #include namespace boost { namespace python { class tuple_maker { public: tuple_maker(tuple& t): m_tuple(t), m_iteration(0) {} template typename disable_if, void>::type operator() (const T& element) const { add_element(element); } template typename enable_if, void>::type operator() (const Sequence& s) const { add_element(make_tuple_from_fusion(s)); } private: template void add_element(const T& element) const { PyTuple_SET_ITEM( m_tuple.ptr(), m_iteration++, incref(object(element).ptr()) ); } tuple& m_tuple; mutable int m_iteration; }; template tuple make_tuple_from_fusion(const Sequence& s) { tuple result((detail::new_reference)::PyTuple_New(fusion::size(s))); fusion::for_each(s, tuple_maker(result)); return result; } } // namespace python } // namespace boost #endif