boost/numeric/odeint/algebra/detail/extract_value_type.hpp
/* [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 <type_traits> #include <boost/utility.hpp> #include <boost/mpl/identity.hpp> #include <boost/mpl/if.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 { typedef S 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 std::enable_if< has_value_type<S>::value >::type > : mpl::if_< std::is_same< S, typename S::value_type > , mpl::identity< S > , // cut the recursion if S and S::value_type are the same extract_value_type< typename S::value_type > >::type {}; } } } } #endif