source: NonGTP/Boost/boost/mpl/is_sequence.hpp @ 857

Revision 857, 2.8 KB checked in by igarcia, 19 years ago (diff)
Line 
1
2#ifndef BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
3#define BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
4
5// Copyright Aleksey Gurtovoy 2002-2004
6//
7// Distributed under the Boost Software License, Version 1.0.
8// (See accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10//
11// See http://www.boost.org/libs/mpl for documentation.
12
13// $Source: /cvsroot/boost/boost/boost/mpl/is_sequence.hpp,v $
14// $Date: 2004/09/02 15:40:41 $
15// $Revision: 1.8 $
16
17#include <boost/mpl/not.hpp>
18#include <boost/mpl/and.hpp>
19#include <boost/mpl/begin_end.hpp>
20#include <boost/mpl/if.hpp>
21#include <boost/mpl/bool.hpp>
22#include <boost/mpl/sequence_tag_fwd.hpp>
23#include <boost/mpl/identity.hpp>
24#include <boost/mpl/void.hpp>
25#include <boost/mpl/aux_/has_tag.hpp>
26#include <boost/mpl/aux_/has_begin.hpp>
27#include <boost/mpl/aux_/na_spec.hpp>
28#include <boost/mpl/aux_/lambda_support.hpp>
29#include <boost/mpl/aux_/config/eti.hpp>
30#include <boost/mpl/aux_/config/msvc.hpp>
31#include <boost/mpl/aux_/config/workaround.hpp>
32#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
33#   include <boost/mpl/aux_/msvc_is_class.hpp>
34#elif BOOST_WORKAROUND(BOOST_MSVC, == 1300)
35#   include <boost/type_traits/is_class.hpp>
36#endif
37
38#include <boost/type_traits/is_same.hpp>
39
40namespace boost { namespace mpl {
41
42#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
43
44namespace aux {
45
46// agurt, 11/jun/03:
47// MSVC 6.5/7.0 fails if 'has_begin' is instantiated on a class type that has a
48// 'begin' member that doesn't name a type; e.g. 'has_begin< std::vector<int> >'
49// would fail; requiring 'T' to have _both_ 'tag' and 'begin' members workarounds
50// the issue for most real-world cases
51template< typename T > struct is_sequence_impl
52    : and_<
53          identity< aux::has_tag<T> >
54        , identity< aux::has_begin<T> >
55        >
56{
57};
58
59} // namespace aux
60       
61template<
62      typename BOOST_MPL_AUX_NA_PARAM(T)
63    >
64struct is_sequence
65    : if_<
66#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
67          aux::msvc_is_class<T>
68#else
69          boost::is_class<T>
70#endif
71        , aux::is_sequence_impl<T>
72        , bool_<false>
73        >::type
74{
75    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T))
76};
77
78#elif defined(BOOST_MPL_CFG_NO_HAS_XXX)
79
80template<
81      typename BOOST_MPL_AUX_NA_PARAM(T)
82    >
83struct is_sequence
84    : bool_<false>
85{
86};
87
88#else
89
90template<
91      typename BOOST_MPL_AUX_NA_PARAM(T)
92    >
93struct is_sequence
94    : not_< is_same< typename begin<T>::type, void_ > >
95{
96    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T))
97};
98
99#endif // BOOST_MSVC
100
101#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
102template<> struct is_sequence<int>
103    : bool_<false>
104{
105};
106#endif
107
108BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, is_sequence)
109
110}}
111
112#endif // BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.