123 lines
3.8 KiB
Plaintext
123 lines
3.8 KiB
Plaintext
/*=============================================================================
|
|
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
|
|
|