williamr@2: williamr@2: #ifndef BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED williamr@2: #define BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED williamr@2: williamr@2: // Copyright Aleksey Gurtovoy 2002-2004 williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. williamr@2: // (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // See http://www.boost.org/libs/mpl for documentation. williamr@2: williamr@2: // $Source: /cvsroot/boost/boost/boost/mpl/is_sequence.hpp,v $ williamr@2: // $Date: 2005/08/25 16:27:21 $ williamr@2: // $Revision: 1.9 $ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) williamr@2: # include williamr@2: #elif BOOST_WORKAROUND(BOOST_MSVC, == 1300) williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #include williamr@2: williamr@2: namespace boost { namespace mpl { williamr@2: williamr@2: #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) williamr@2: williamr@2: namespace aux { williamr@2: williamr@2: // agurt, 11/jun/03: williamr@2: // MSVC 6.5/7.0 fails if 'has_begin' is instantiated on a class type that has a williamr@2: // 'begin' member that doesn't name a type; e.g. 'has_begin< std::vector >' williamr@2: // would fail; requiring 'T' to have _both_ 'tag' and 'begin' members workarounds williamr@2: // the issue for most real-world cases williamr@2: template< typename T > struct is_sequence_impl williamr@2: : and_< williamr@2: identity< aux::has_tag > williamr@2: , identity< aux::has_begin > williamr@2: > williamr@2: { williamr@2: }; williamr@2: williamr@2: } // namespace aux williamr@2: williamr@2: template< williamr@2: typename BOOST_MPL_AUX_NA_PARAM(T) williamr@2: > williamr@2: struct is_sequence williamr@2: : if_< williamr@2: #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) williamr@2: aux::msvc_is_class williamr@2: #else williamr@2: boost::is_class williamr@2: #endif williamr@2: , aux::is_sequence_impl williamr@2: , bool_ williamr@2: >::type williamr@2: { williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T)) williamr@2: }; williamr@2: williamr@2: #elif defined(BOOST_MPL_CFG_NO_HAS_XXX) williamr@2: williamr@2: template< williamr@2: typename BOOST_MPL_AUX_NA_PARAM(T) williamr@2: > williamr@2: struct is_sequence williamr@2: : bool_ williamr@2: { williamr@2: }; williamr@2: williamr@2: #else williamr@2: williamr@2: template< williamr@2: typename BOOST_MPL_AUX_NA_PARAM(T) williamr@2: > williamr@2: struct is_sequence williamr@2: : not_< is_same< typename begin::type, void_ > > williamr@2: { williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T)) williamr@2: }; williamr@2: williamr@2: #endif // BOOST_MSVC williamr@2: williamr@2: #if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG) williamr@2: template<> struct is_sequence williamr@2: : bool_ williamr@2: { williamr@2: }; williamr@2: #endif williamr@2: williamr@2: BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, is_sequence) williamr@2: williamr@2: }} williamr@2: williamr@2: #endif // BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED