// (C) Copyright Joel de Guzman 2003. | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
#ifndef PY_CONTAINER_UTILS_JDG20038_HPP | |
# define PY_CONTAINER_UTILS_JDG20038_HPP | |
# include <utility> | |
# include <boost/foreach.hpp> | |
# include <boost/python/object.hpp> | |
# include <boost/python/handle.hpp> | |
# include <boost/python/extract.hpp> | |
# include <boost/python/stl_iterator.hpp> | |
namespace boost { namespace python { namespace container_utils { | |
template <typename Container> | |
void | |
extend_container(Container& container, object l) | |
{ | |
typedef typename Container::value_type data_type; | |
// l must be iterable | |
BOOST_FOREACH(object elem, | |
std::make_pair( | |
boost::python::stl_input_iterator<object>(l), | |
boost::python::stl_input_iterator<object>() | |
)) | |
{ | |
extract<data_type const&> x(elem); | |
// try if elem is an exact data_type type | |
if (x.check()) | |
{ | |
container.push_back(x()); | |
} | |
else | |
{ | |
// try to convert elem to data_type type | |
extract<data_type> x(elem); | |
if (x.check()) | |
{ | |
container.push_back(x()); | |
} | |
else | |
{ | |
PyErr_SetString(PyExc_TypeError, "Incompatible Data Type"); | |
throw_error_already_set(); | |
} | |
} | |
} | |
} | |
}}} // namespace boost::python::container_utils | |
#endif |