/*============================================================================= | |
Copyright (c) 2001-2003 Joel de Guzman | |
Copyright (c) 2001 Daniel Nuffer | |
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_PARSER_ID_HPP) | |
#define BOOST_SPIRIT_PARSER_ID_HPP | |
#if defined(BOOST_SPIRIT_DEBUG) | |
# include <ostream> | |
#endif | |
#include <boost/spirit/home/classic/namespace.hpp> | |
/////////////////////////////////////////////////////////////////////////////// | |
namespace boost { namespace spirit { | |
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN | |
/////////////////////////////////////////////////////////////////////////// | |
// | |
// parser_id class | |
// | |
/////////////////////////////////////////////////////////////////////////// | |
class parser_id | |
{ | |
public: | |
parser_id() : p(0) {} | |
explicit parser_id(void const* prule) : p(prule) {} | |
parser_id(std::size_t l_) : l(l_) {} | |
bool operator==(parser_id const& x) const { return p == x.p; } | |
bool operator!=(parser_id const& x) const { return !(*this == x); } | |
bool operator<(parser_id const& x) const { return p < x.p; } | |
std::size_t to_long() const { return l; } | |
private: | |
union | |
{ | |
void const* p; | |
std::size_t l; | |
}; | |
}; | |
#if defined(BOOST_SPIRIT_DEBUG) | |
inline std::ostream& | |
operator<<(std::ostream& out, parser_id const& rid) | |
{ | |
out << (unsigned int)rid.to_long(); | |
return out; | |
} | |
#endif | |
/////////////////////////////////////////////////////////////////////////// | |
// | |
// parser_tag_base class: base class of all parser tags | |
// | |
/////////////////////////////////////////////////////////////////////////// | |
struct parser_tag_base {}; | |
/////////////////////////////////////////////////////////////////////////// | |
// | |
// parser_address_tag class: tags a parser with its address | |
// | |
/////////////////////////////////////////////////////////////////////////// | |
struct parser_address_tag : parser_tag_base | |
{ | |
parser_id id() const | |
{ return parser_id(reinterpret_cast<std::size_t>(this)); } | |
}; | |
/////////////////////////////////////////////////////////////////////////// | |
// | |
// parser_tag class: tags a parser with an integer ID | |
// | |
/////////////////////////////////////////////////////////////////////////// | |
template <int N> | |
struct parser_tag : parser_tag_base | |
{ | |
static parser_id id() | |
{ return parser_id(std::size_t(N)); } | |
}; | |
/////////////////////////////////////////////////////////////////////////// | |
// | |
// dynamic_parser_tag class: tags a parser with a dynamically changeable | |
// integer ID | |
// | |
/////////////////////////////////////////////////////////////////////////// | |
class dynamic_parser_tag : public parser_tag_base | |
{ | |
public: | |
dynamic_parser_tag() | |
: tag(std::size_t(0)) {} | |
parser_id | |
id() const | |
{ | |
return | |
tag.to_long() | |
? tag | |
: parser_id(reinterpret_cast<std::size_t>(this)); | |
} | |
void set_id(parser_id id_) { tag = id_; } | |
private: | |
parser_id tag; | |
}; | |
/////////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_CLASSIC_NAMESPACE_END | |
}} // namespace BOOST_SPIRIT_CLASSIC_NS | |
#endif | |