/*============================================================================= | |
Copyright (c) 2003 Joel de Guzman | |
http://spirit.sourceforge.net/ | |
Distributed under the Boost Software License, Version 1.0. (See accompanying | |
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
=============================================================================*/ | |
#if !defined(BOOST_SPIRIT_SAFE_BOOL_HPP) | |
#define BOOST_SPIRIT_SAFE_BOOL_HPP | |
#include <boost/config.hpp> | |
#include <boost/detail/workaround.hpp> | |
#include <boost/spirit/home/classic/namespace.hpp> | |
namespace boost { namespace spirit { | |
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN | |
namespace impl | |
{ | |
template <typename T> | |
struct no_base {}; | |
template <typename T> | |
struct safe_bool_impl | |
{ | |
#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) | |
void stub(T*) {}; | |
typedef void (safe_bool_impl::*type)(T*); | |
#else | |
typedef T* TP; // workaround to make parsing easier | |
TP stub; | |
typedef TP safe_bool_impl::*type; | |
#endif | |
}; | |
} | |
template <typename DerivedT, typename BaseT = impl::no_base<DerivedT> > | |
struct safe_bool : BaseT | |
{ | |
private: | |
typedef impl::safe_bool_impl<DerivedT> impl_t; | |
typedef typename impl_t::type bool_type; | |
public: | |
operator bool_type() const | |
{ | |
return static_cast<const DerivedT*>(this)->operator_bool() ? | |
&impl_t::stub : 0; | |
} | |
operator bool_type() | |
{ | |
return static_cast<DerivedT*>(this)->operator_bool() ? | |
&impl_t::stub : 0; | |
} | |
}; | |
BOOST_SPIRIT_CLASSIC_NAMESPACE_END | |
}} | |
#endif | |