1 2 #ifndef BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED 3 #define BOOST_MPL_O1_SIZE_IMPL_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: O1_size_impl.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 <boost/mpl/O1_size_fwd.hpp> 18 #include <boost/mpl/long.hpp> 19 #include <boost/mpl/if.hpp> 20 #include <boost/mpl/aux_/has_size.hpp> 21 #include <boost/mpl/aux_/config/forwarding.hpp> 22 #include <boost/mpl/aux_/config/static_constant.hpp> 23 #include <boost/mpl/aux_/config/msvc.hpp> 24 #include <boost/mpl/aux_/config/workaround.hpp> 25 26 namespace boost { namespace mpl { 27 28 // default implementation - returns 'Sequence::size' if sequence has a 'size' 29 // member, and -1 otherwise; conrete sequences might override it by 30 // specializing either the 'O1_size_impl' or the primary 'O1_size' template 31 32 # if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) \ 33 && !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) 34 35 namespace aux { 36 template< typename Sequence > struct O1_size_impl 37 : Sequence::size 38 { 39 }; 40 } 41 42 template< typename Tag > 43 struct O1_size_impl 44 { 45 template< typename Sequence > struct apply 46 #if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING) 47 : if_< 48 aux::has_size<Sequence> 49 , aux::O1_size_impl<Sequence> 50 , long_<-1> 51 >::type 52 { 53 #else 54 { 55 typedef typename if_< 56 aux::has_size<Sequence> 57 , aux::O1_size_impl<Sequence> 58 , long_<-1> 59 >::type type; 60 61 BOOST_STATIC_CONSTANT(long, value = 62 (if_< 63 aux::has_size<Sequence> 64 , aux::O1_size_impl<Sequence> 65 , long_<-1> 66 >::type::value) 67 ); 68 #endif 69 }; 70 }; 71 72 # else // BOOST_MSVC 73 74 template< typename Tag > 75 struct O1_size_impl 76 { 77 template< typename Sequence > struct apply 78 : long_<-1> 79 { 80 }; 81 }; 82 83 # endif 84 85 }} 86 87 #endif // BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED 88