123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // (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
|