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
 |