Line data Source code
1 : // Copyright (C) 2025-2026 Free Software Foundation, Inc.
2 :
3 : // This file is part of GCC.
4 :
5 : // GCC is free software; you can redistribute it and/or modify it under
6 : // the terms of the GNU General Public License as published by the Free
7 : // Software Foundation; either version 3, or (at your option) any later
8 : // version.
9 :
10 : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : // for more details.
14 :
15 : // You should have received a copy of the GNU General Public License
16 : // along with GCC; see the file COPYING3. If not see
17 : // <http://www.gnu.org/licenses/>.
18 :
19 : #ifndef RUST_GGC_H
20 : #define RUST_GGC_H
21 :
22 : #include "rust-system.h"
23 : #include "tree.h"
24 :
25 : namespace Rust {
26 :
27 : // forward declare
28 : class Identifier;
29 :
30 : namespace GGC {
31 :
32 : class Ident
33 : {
34 : tree inner;
35 :
36 : public:
37 : Ident (const char *str);
38 : Ident (const std::string &str);
39 : Ident (const Rust::Identifier &ident);
40 :
41 : bool operator== (const Ident &other) const { return inner == other.inner; }
42 : bool operator== (const std::string &other) const;
43 :
44 : const char *c_str () const { return IDENTIFIER_POINTER (inner); }
45 : size_t size () const { return IDENTIFIER_LENGTH (inner); }
46 :
47 : bool empty () const { return !size (); }
48 :
49 : std::string as_string () const
50 : {
51 : return std::string (c_str (), c_str () + size ());
52 : }
53 :
54 327022 : tree as_tree () const { return inner; }
55 : };
56 :
57 : static inline bool
58 : operator== (const std::string &a, const Ident &b)
59 : {
60 : return b == a;
61 : }
62 :
63 : class ChainList
64 : {
65 : tree head;
66 : tree *tail_cdr;
67 :
68 : public:
69 58 : ChainList () : head (NULL_TREE), tail_cdr (&head) {}
70 :
71 : ChainList (ChainList &&oth)
72 : {
73 : head = oth.head;
74 : if (oth.tail_cdr == &oth.head)
75 : tail_cdr = &oth.head;
76 : else
77 : tail_cdr = oth.tail_cdr;
78 : oth.head = NULL_TREE;
79 : oth.tail_cdr = &oth.head;
80 : }
81 :
82 : ChainList &operator= (ChainList &&oth)
83 : {
84 : this->~ChainList ();
85 : new (this) ChainList (std::move (oth));
86 : return *this;
87 : }
88 :
89 58 : tree get_head () const { return head; }
90 :
91 : // TREE_CHAIN (ent) will be modified
92 : // making ent a node in this list
93 : // do not push a single tree to multiple ChainList objects
94 35 : void push_back (tree ent)
95 : {
96 35 : *tail_cdr = ent;
97 35 : tail_cdr = &TREE_CHAIN (ent);
98 35 : }
99 : };
100 :
101 : } // namespace GGC
102 :
103 : } // namespace Rust
104 :
105 : #endif // RUST_GGC_H
|