53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  |  [auto_generated] | ||
|  |  boost/numeric/odeint/algebra/detail/extract_value_type.hpp | ||
|  | 
 | ||
|  |  [begin_description] | ||
|  |  Extract true value type from complex types (eg. std::complex) | ||
|  |  [end_description] | ||
|  | 
 | ||
|  |  Copyright 2013 Karsten Ahnert | ||
|  |  Copyright 2013 Mario Mulansky | ||
|  | 
 | ||
|  |  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 BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_EXTRACT_VALUE_TYPE_HPP_INCLUDED | ||
|  | #define BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_EXTRACT_VALUE_TYPE_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <boost/utility.hpp> | ||
|  | #include <boost/mpl/has_xxx.hpp> | ||
|  | 
 | ||
|  | BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type) | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace numeric { | ||
|  | namespace odeint { | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | template< typename S , typename Enabler = void > | ||
|  | struct extract_value_type {}; | ||
|  | 
 | ||
|  | // as long as value_types are defined we go down the value_type chain | ||
|  | // e.g. returning S::value_type::value_type::value_type | ||
|  | 
 | ||
|  | template< typename S > | ||
|  | struct extract_value_type<S , typename boost::disable_if< has_value_type<S> >::type > | ||
|  | { | ||
|  |     // no value_type defined, return S | ||
|  |     typedef S type; | ||
|  | }; | ||
|  | 
 | ||
|  | template< typename S > | ||
|  | struct extract_value_type< S , typename boost::enable_if< has_value_type<S> >::type > | ||
|  | { | ||
|  |     // go down the value_type | ||
|  |     typedef typename extract_value_type< typename S::value_type >::type type; | ||
|  | }; | ||
|  | 
 | ||
|  | } } } } | ||
|  | 
 | ||
|  | #endif |