]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/include/boost/spirit/home/classic/core/non_terminal/parser_id.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / spirit / include / boost / spirit / home / classic / core / non_terminal / parser_id.hpp
1 /*=============================================================================
2 Copyright (c) 2001-2003 Joel de Guzman
3 Copyright (c) 2001 Daniel Nuffer
4 http://spirit.sourceforge.net/
5
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 =============================================================================*/
9 #if !defined(BOOST_SPIRIT_PARSER_ID_HPP)
10 #define BOOST_SPIRIT_PARSER_ID_HPP
11
12 #if defined(BOOST_SPIRIT_DEBUG)
13 # include <ostream>
14 #endif
15 #include <boost/spirit/home/classic/namespace.hpp>
16
17 ///////////////////////////////////////////////////////////////////////////////
18 namespace boost { namespace spirit {
19
20 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
21
22 ///////////////////////////////////////////////////////////////////////////
23 //
24 // parser_id class
25 //
26 ///////////////////////////////////////////////////////////////////////////
27 class parser_id
28 {
29 public:
30 parser_id() : p(0) {}
31 explicit parser_id(void const* prule) : p(prule) {}
32 parser_id(std::size_t l_) : l(l_) {}
33
34 bool operator==(parser_id const& x) const { return p == x.p; }
35 bool operator!=(parser_id const& x) const { return !(*this == x); }
36 bool operator<(parser_id const& x) const { return p < x.p; }
37 std::size_t to_long() const { return l; }
38
39 private:
40
41 union
42 {
43 void const* p;
44 std::size_t l;
45 };
46 };
47
48 #if defined(BOOST_SPIRIT_DEBUG)
49 inline std::ostream&
50 operator<<(std::ostream& out, parser_id const& rid)
51 {
52 out << (unsigned int)rid.to_long();
53 return out;
54 }
55 #endif
56
57 ///////////////////////////////////////////////////////////////////////////
58 //
59 // parser_tag_base class: base class of all parser tags
60 //
61 ///////////////////////////////////////////////////////////////////////////
62 struct parser_tag_base {};
63
64 ///////////////////////////////////////////////////////////////////////////
65 //
66 // parser_address_tag class: tags a parser with its address
67 //
68 ///////////////////////////////////////////////////////////////////////////
69 struct parser_address_tag : parser_tag_base
70 {
71 parser_id id() const
72 { return parser_id(reinterpret_cast<std::size_t>(this)); }
73 };
74
75 ///////////////////////////////////////////////////////////////////////////
76 //
77 // parser_tag class: tags a parser with an integer ID
78 //
79 ///////////////////////////////////////////////////////////////////////////
80 template <int N>
81 struct parser_tag : parser_tag_base
82 {
83 static parser_id id()
84 { return parser_id(std::size_t(N)); }
85 };
86
87 ///////////////////////////////////////////////////////////////////////////
88 //
89 // dynamic_parser_tag class: tags a parser with a dynamically changeable
90 // integer ID
91 //
92 ///////////////////////////////////////////////////////////////////////////
93 class dynamic_parser_tag : public parser_tag_base
94 {
95 public:
96
97 dynamic_parser_tag()
98 : tag(std::size_t(0)) {}
99
100 parser_id
101 id() const
102 {
103 return
104 tag.to_long()
105 ? tag
106 : parser_id(reinterpret_cast<std::size_t>(this));
107 }
108
109 void set_id(parser_id id_) { tag = id_; }
110
111 private:
112
113 parser_id tag;
114 };
115
116 ///////////////////////////////////////////////////////////////////////////////
117 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
118
119 }} // namespace BOOST_SPIRIT_CLASSIC_NS
120
121 #endif
122