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
 | 
						|
 |