Home | History | Annotate | Download | only in detail
      1 // Boost.Range library
      2 //
      3 //  Copyright Arno Schoedl & Neil Groves 2009.
      4 //  Use, modification and distribution is subject to the Boost Software
      5 //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
      6 //  http://www.boost.org/LICENSE_1_0.txt)
      7 //
      8 // For more information, see http://www.boost.org/libs/range/
      9 //
     10 #ifndef BOOST_RANGE_DETAIL_EXTRACT_OPTIONAL_TYPE_HPP_INCLUDED
     11 #define BOOST_RANGE_DETAIL_EXTRACT_OPTIONAL_TYPE_HPP_INCLUDED
     12 
     13 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
     14 # pragma once
     15 #endif
     16 
     17 #include <boost/config.hpp>
     18 
     19 #ifdef BOOST_NO_PARTIAL_TEMPLATE_SPECIALIZATION
     20 
     21 #define BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( a_typedef )                         \
     22     template< typename C >                                                     \
     23     struct extract_ ## a_typedef                                               \
     24     {                                                                          \
     25         typedef BOOST_DEDUCED_TYPENAME C::a_typedef type;                      \
     26     };
     27 
     28 #else
     29 
     30 namespace boost {
     31     namespace range_detail {
     32         template< typename T > struct exists { typedef void type; };
     33     }
     34 }
     35 
     36 // Defines extract_some_typedef<T> which exposes T::some_typedef as
     37 // extract_some_typedef<T>::type if T::some_typedef exists. Otherwise
     38 // extract_some_typedef<T> is empty.
     39 #define BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( a_typedef )                         \
     40     template< typename C, typename Enable=void >                               \
     41     struct extract_ ## a_typedef                                               \
     42     {};                                                                        \
     43     template< typename C >                                                     \
     44     struct extract_ ## a_typedef< C                                            \
     45     , BOOST_DEDUCED_TYPENAME boost::range_detail::exists< BOOST_DEDUCED_TYPENAME C::a_typedef >::type \
     46     > {                                                                        \
     47         typedef BOOST_DEDUCED_TYPENAME C::a_typedef type;                      \
     48     };
     49 
     50 #endif
     51 
     52 #endif // include guard
     53