blob: 24111bf7f87cde25d7a41decfb84b772656232b6 [file] [log] [blame]
Jeff Thompsona28eed82013-08-22 16:21:10 -07001
Jeff Thompson3d613fd2013-10-15 15:39:04 -07002#ifndef NDNBOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
3#define NDNBOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
Jeff Thompsona28eed82013-08-22 16:21:10 -07004
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// $Id: is_sequence.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
14// $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $
15// $Revision: 49267 $
16
17#include <ndnboost/mpl/not.hpp>
18#include <ndnboost/mpl/and.hpp>
19#include <ndnboost/mpl/begin_end.hpp>
20#include <ndnboost/mpl/if.hpp>
21#include <ndnboost/mpl/bool.hpp>
22#include <ndnboost/mpl/sequence_tag_fwd.hpp>
23#include <ndnboost/mpl/identity.hpp>
24#include <ndnboost/mpl/void.hpp>
25#include <ndnboost/mpl/aux_/has_tag.hpp>
26#include <ndnboost/mpl/aux_/has_begin.hpp>
27#include <ndnboost/mpl/aux_/na_spec.hpp>
28#include <ndnboost/mpl/aux_/lambda_support.hpp>
29#include <ndnboost/mpl/aux_/config/eti.hpp>
30#include <ndnboost/mpl/aux_/config/msvc.hpp>
31#include <ndnboost/mpl/aux_/config/workaround.hpp>
Jeff Thompson3d613fd2013-10-15 15:39:04 -070032#if NDNBOOST_WORKAROUND(NDNBOOST_MSVC, < 1300)
Jeff Thompsona28eed82013-08-22 16:21:10 -070033# include <ndnboost/mpl/aux_/msvc_is_class.hpp>
Jeff Thompson3d613fd2013-10-15 15:39:04 -070034#elif NDNBOOST_WORKAROUND(NDNBOOST_MSVC, == 1300)
Jeff Thompsona28eed82013-08-22 16:21:10 -070035# include <ndnboost/type_traits/is_class.hpp>
36#endif
37
38#include <ndnboost/type_traits/is_same.hpp>
39
40namespace ndnboost { namespace mpl {
41
Jeff Thompson3d613fd2013-10-15 15:39:04 -070042#if NDNBOOST_WORKAROUND(NDNBOOST_MSVC, <= 1300)
Jeff Thompsona28eed82013-08-22 16:21:10 -070043
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<
Jeff Thompson3d613fd2013-10-15 15:39:04 -070062 typename NDNBOOST_MPL_AUX_NA_PARAM(T)
Jeff Thompsona28eed82013-08-22 16:21:10 -070063 >
64struct is_sequence
65 : if_<
Jeff Thompson3d613fd2013-10-15 15:39:04 -070066#if NDNBOOST_WORKAROUND(NDNBOOST_MSVC, < 1300)
Jeff Thompsona28eed82013-08-22 16:21:10 -070067 aux::msvc_is_class<T>
68#else
69 ndnboost::is_class<T>
70#endif
71 , aux::is_sequence_impl<T>
72 , bool_<false>
73 >::type
74{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070075 NDNBOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T))
Jeff Thompsona28eed82013-08-22 16:21:10 -070076};
77
Jeff Thompson3d613fd2013-10-15 15:39:04 -070078#elif defined(NDNBOOST_MPL_CFG_NO_HAS_XXX)
Jeff Thompsona28eed82013-08-22 16:21:10 -070079
80template<
Jeff Thompson3d613fd2013-10-15 15:39:04 -070081 typename NDNBOOST_MPL_AUX_NA_PARAM(T)
Jeff Thompsona28eed82013-08-22 16:21:10 -070082 >
83struct is_sequence
84 : bool_<false>
85{
86};
87
88#else
89
90template<
Jeff Thompson3d613fd2013-10-15 15:39:04 -070091 typename NDNBOOST_MPL_AUX_NA_PARAM(T)
Jeff Thompsona28eed82013-08-22 16:21:10 -070092 >
93struct is_sequence
94 : not_< is_same< typename begin<T>::type, void_ > >
95{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070096 NDNBOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T))
Jeff Thompsona28eed82013-08-22 16:21:10 -070097};
98
Jeff Thompson3d613fd2013-10-15 15:39:04 -070099#endif // NDNBOOST_MSVC
Jeff Thompsona28eed82013-08-22 16:21:10 -0700100
Jeff Thompson3d613fd2013-10-15 15:39:04 -0700101#if defined(NDNBOOST_MPL_CFG_MSVC_60_ETI_BUG)
Jeff Thompsona28eed82013-08-22 16:21:10 -0700102template<> struct is_sequence<int>
103 : bool_<false>
104{
105};
106#endif
107
Jeff Thompson3d613fd2013-10-15 15:39:04 -0700108NDNBOOST_MPL_AUX_NA_SPEC_NO_ETI(1, is_sequence)
Jeff Thompsona28eed82013-08-22 16:21:10 -0700109
110}}
111
Jeff Thompson3d613fd2013-10-15 15:39:04 -0700112#endif // NDNBOOST_MPL_IS_SEQUENCE_HPP_INCLUDED