1 /*============================================================================= 2 Copyright (c) 2003 Joel de Guzman 3 http://spirit.sourceforge.net/ 4 5 Distributed under the Boost Software License, Version 1.0. (See accompanying 6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 =============================================================================*/ 8 #if !defined(BOOST_SPIRIT_SAFE_BOOL_HPP) 9 #define BOOST_SPIRIT_SAFE_BOOL_HPP 10 11 #include <boost/config.hpp> 12 #include <boost/detail/workaround.hpp> 13 #include <boost/spirit/home/classic/namespace.hpp> 14 15 namespace boost { namespace spirit { 16 17 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN 18 19 namespace impl 20 { 21 template <typename T> 22 struct no_base {}; 23 24 template <typename T> 25 struct safe_bool_impl 26 { 27 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) stubboost::spirit::impl::safe_bool_impl28 void stub(T*) {}; 29 typedef void (safe_bool_impl::*type)(T*); 30 #else 31 typedef T* TP; // workaround to make parsing easier 32 TP stub; 33 typedef TP safe_bool_impl::*type; 34 #endif 35 }; 36 } 37 38 template <typename DerivedT, typename BaseT = impl::no_base<DerivedT> > 39 struct safe_bool : BaseT 40 { 41 private: 42 typedef impl::safe_bool_impl<DerivedT> impl_t; 43 typedef typename impl_t::type bool_type; 44 45 public: operator bool_typeboost::spirit::safe_bool46 operator bool_type() const 47 { 48 return static_cast<const DerivedT*>(this)->operator_bool() ? 49 &impl_t::stub : 0; 50 } 51 operator bool_typeboost::spirit::safe_bool52 operator bool_type() 53 { 54 return static_cast<DerivedT*>(this)->operator_bool() ? 55 &impl_t::stub : 0; 56 } 57 }; 58 59 BOOST_SPIRIT_CLASSIC_NAMESPACE_END 60 61 }} 62 63 #endif 64 65