109 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// Copyright David Abrahams 2002.
							 | 
						||
| 
								 | 
							
								// 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 ENUM_DWA200298_HPP
							 | 
						||
| 
								 | 
							
								# define ENUM_DWA200298_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/prefix.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/python/object/enum_base.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/converter/rvalue_from_python_data.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/converter/registered.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace python { 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								struct enum_ : public objects::enum_base
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef objects::enum_base base;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Declare a new enumeration type in the current scope()
							 | 
						||
| 
								 | 
							
								    enum_(char const* name, char const* doc = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Add a new enumeration value with the given name and value.
							 | 
						||
| 
								 | 
							
								    inline enum_<T>& value(char const* name, T);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Add all of the defined enumeration values to the current scope with the
							 | 
						||
| 
								 | 
							
								    // same names used here.
							 | 
						||
| 
								 | 
							
								    inline enum_<T>& export_values();
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								    static PyObject* to_python(void const* x);
							 | 
						||
| 
								 | 
							
								    static void* convertible_from_python(PyObject* obj);
							 | 
						||
| 
								 | 
							
								    static void construct(PyObject* obj, converter::rvalue_from_python_stage1_data* data);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline enum_<T>::enum_(char const* name, char const* doc )
							 | 
						||
| 
								 | 
							
								    : base(
							 | 
						||
| 
								 | 
							
								        name
							 | 
						||
| 
								 | 
							
								        , &enum_<T>::to_python
							 | 
						||
| 
								 | 
							
								        , &enum_<T>::convertible_from_python
							 | 
						||
| 
								 | 
							
								        , &enum_<T>::construct
							 | 
						||
| 
								 | 
							
								        , type_id<T>()
							 | 
						||
| 
								 | 
							
								        , doc
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// This is the conversion function that gets registered for converting
							 | 
						||
| 
								 | 
							
								// these enums to Python.
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								PyObject* enum_<T>::to_python(void const* x)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return base::to_python(
							 | 
						||
| 
								 | 
							
								        converter::registered<T>::converters.m_class_object
							 | 
						||
| 
								 | 
							
								        , static_cast<long>(*(T const*)x));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// The following two static functions serve as the elements of an
							 | 
						||
| 
								 | 
							
								// rvalue from_python converter for the enumeration type.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// This checks that a given Python object can be converted to the
							 | 
						||
| 
								 | 
							
								// enumeration type.
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								void* enum_<T>::convertible_from_python(PyObject* obj)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return PyObject_IsInstance(
							 | 
						||
| 
								 | 
							
								        obj
							 | 
						||
| 
								 | 
							
								        , upcast<PyObject>(
							 | 
						||
| 
								 | 
							
								            converter::registered<T>::converters.m_class_object))
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        ? obj : 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Constructs an instance of the enumeration type in the from_python
							 | 
						||
| 
								 | 
							
								// data.
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								void enum_<T>::construct(PyObject* obj, converter::rvalue_from_python_stage1_data* data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if PY_VERSION_HEX >= 0x03000000
							 | 
						||
| 
								 | 
							
								    T x = static_cast<T>(PyLong_AS_LONG(obj));
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    T x = static_cast<T>(PyInt_AS_LONG(obj));
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    void* const storage = ((converter::rvalue_from_python_storage<T>*)data)->storage.bytes;
							 | 
						||
| 
								 | 
							
								    new (storage) T(x);
							 | 
						||
| 
								 | 
							
								    data->convertible = storage;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline enum_<T>& enum_<T>::value(char const* name, T x)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    this->add_value(name, static_cast<long>(x));
							 | 
						||
| 
								 | 
							
								    return *this;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline enum_<T>& enum_<T>::export_values()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    this->base::export_values();
							 | 
						||
| 
								 | 
							
								    return *this;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}} // namespace boost::python
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // ENUM_DWA200298_HPP
							 |