~tsarev/boostdc/cmake

« back to all changes in this revision

Viewing changes to boost/boost/mpl/sequence_tag.hpp

  • Committer: bigmuscle
  • Date: 2010-05-08 08:47:15 UTC
  • Revision ID: svn-v4:5fb55d53-692c-0410-a46a-e90ab66e00ee:trunk:497
removed old boost version

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
#ifndef BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED
3
 
#define BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED
4
 
 
5
 
// Copyright Aleksey Gurtovoy 2000-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
 
// $Id: sequence_tag.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
14
 
// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
15
 
// $Revision: 49267 $
16
 
 
17
 
#include <boost/mpl/sequence_tag_fwd.hpp>
18
 
#include <boost/mpl/aux_/has_tag.hpp>
19
 
#include <boost/mpl/aux_/has_begin.hpp>
20
 
#include <boost/mpl/aux_/na_spec.hpp>
21
 
#include <boost/mpl/aux_/is_msvc_eti_arg.hpp>
22
 
#include <boost/mpl/aux_/config/eti.hpp>
23
 
#include <boost/mpl/aux_/yes_no.hpp>
24
 
#include <boost/mpl/aux_/config/workaround.hpp>
25
 
 
26
 
namespace boost { namespace mpl {
27
 
 
28
 
// agurt, 27/nov/02: have to use a simplistic 'sequence_tag' implementation
29
 
// on MSVC to avoid dreadful "internal structure overflow" error
30
 
#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
31
 
    || defined(BOOST_MPL_CFG_NO_HAS_XXX)
32
 
 
33
 
template<
34
 
      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
35
 
    >
36
 
struct sequence_tag
37
 
{
38
 
    typedef typename Sequence::tag type;
39
 
};
40
 
 
41
 
#elif BOOST_WORKAROUND(BOOST_MSVC, == 1300)
42
 
 
43
 
// agurt, 07/feb/03: workaround for what seems to be MSVC 7.0-specific ETI issue
44
 
 
45
 
namespace aux {
46
 
 
47
 
template< bool >
48
 
struct sequence_tag_impl
49
 
{
50
 
    template< typename Sequence > struct result_
51
 
    {
52
 
        typedef typename Sequence::tag type;
53
 
    };
54
 
};
55
 
 
56
 
template<>
57
 
struct sequence_tag_impl<false>
58
 
{
59
 
    template< typename Sequence > struct result_
60
 
    {
61
 
        typedef int type;
62
 
    };
63
 
};
64
 
 
65
 
} // namespace aux
66
 
 
67
 
template<
68
 
      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
69
 
    >
70
 
struct sequence_tag
71
 
    : aux::sequence_tag_impl< !aux::is_msvc_eti_arg<Sequence>::value >
72
 
        ::template result_<Sequence>
73
 
{
74
 
};
75
 
 
76
 
#else
77
 
 
78
 
namespace aux {
79
 
 
80
 
template< bool has_tag_, bool has_begin_ >
81
 
struct sequence_tag_impl
82
 
{
83
 
    // agurt 24/nov/02: MSVC 6.5 gets confused in 'sequence_tag_impl<true>' 
84
 
    // specialization below, if we name it 'result_' here
85
 
    template< typename Sequence > struct result2_;
86
 
};
87
 
 
88
 
#   define AUX_CLASS_SEQUENCE_TAG_SPEC(has_tag, has_begin, result_type) \
89
 
template<> struct sequence_tag_impl<has_tag,has_begin> \
90
 
{ \
91
 
    template< typename Sequence > struct result2_ \
92
 
    { \
93
 
        typedef result_type type; \
94
 
    }; \
95
 
}; \
96
 
/**/
97
 
 
98
 
AUX_CLASS_SEQUENCE_TAG_SPEC(true, true, typename Sequence::tag)
99
 
AUX_CLASS_SEQUENCE_TAG_SPEC(true, false, typename Sequence::tag)
100
 
AUX_CLASS_SEQUENCE_TAG_SPEC(false, true, nested_begin_end_tag)
101
 
AUX_CLASS_SEQUENCE_TAG_SPEC(false, false, non_sequence_tag)
102
 
 
103
 
#   undef AUX_CLASS_SEQUENCE_TAG_SPEC
104
 
 
105
 
} // namespace aux
106
 
 
107
 
template<
108
 
      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
109
 
    >
110
 
struct sequence_tag
111
 
    : aux::sequence_tag_impl<
112
 
          ::boost::mpl::aux::has_tag<Sequence>::value
113
 
        , ::boost::mpl::aux::has_begin<Sequence>::value
114
 
        >::template result2_<Sequence>
115
 
{
116
 
};
117
 
 
118
 
#endif // BOOST_MSVC
119
 
 
120
 
BOOST_MPL_AUX_NA_SPEC(1, sequence_tag)
121
 
 
122
 
}}
123
 
 
124
 
#endif // BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED