58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| //  (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
 | 
