cprover
cpp_name.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@cs.cmu.edu
6 
7 \*******************************************************************/
8 
9 
10 #ifndef CPROVER_CPP_CPP_NAME_H
11 #define CPROVER_CPP_CPP_NAME_H
12 
13 #include <util/expr.h>
14 #include <util/invariant.h>
15 
16 class cpp_namet:public irept
17 {
18 public:
19  // the subs are one of the following:
20  // ID_name (see namet)
21  // ID_operator
22  // ID_template_args
23  // ::
24  // ~
25 
26  class namet:public irept
27  {
28  public:
29  namet():irept(ID_name)
30  {
31  }
32 
33  explicit namet(const irep_idt &base_name):irept(ID_name)
34  {
35  set(ID_identifier, base_name);
36  }
37 
39  const irep_idt &_base_name,
40  const source_locationt &_source_location):irept(ID_name)
41  {
42  set(ID_identifier, _base_name);
43  add_source_location()=_source_location;
44  }
45 
47  {
48  return static_cast<source_locationt &>(add(ID_C_source_location));
49  }
50 
52  {
53  return static_cast<const source_locationt &>(find(ID_C_source_location));
54  }
55  };
56 
57  cpp_namet():irept(ID_cpp_name)
58  {
59  }
60 
61  explicit cpp_namet(const irep_idt &base_name):irept(ID_cpp_name)
62  {
63  get_sub().push_back(namet(base_name));
64  }
65 
67  const irep_idt &_base_name,
68  const source_locationt &_source_location):irept(ID_cpp_name)
69  {
70  get_sub().push_back(namet(_base_name, _source_location));
71  }
72 
74  {
75  if(get_sub().empty())
76  return static_cast<const source_locationt &>(get_nil_irep());
77  else
78  return static_cast<const source_locationt &>(
79  get_sub().front().find(ID_C_source_location));
80  }
81 
82  // void convert(std::string &identifier, std::string &base_name) const;
83  irep_idt get_base_name() const;
84 
85  // one of three:
86  // 'identifier'
87  // 'operator X'
88  // '~identifier'
89  bool is_simple_name() const
90  {
91  const subt &sub=get_sub();
92  return (sub.size()==1 && sub.front().id()==ID_name) ||
93  (sub.size()==2 && sub.front().id()==ID_operator) ||
94  (sub.size()==2 && sub[0].id()=="~" && sub[1].id()==ID_name);
95  }
96 
97  bool is_operator() const
98  {
99  if(get_sub().empty())
100  return false;
101  return get_sub().front().id()==ID_operator;
102  }
103 
104  bool is_typename() const
105  {
106  return get_bool(ID_typename);
107  }
108 
109  bool is_qualified() const
110  {
111  forall_irep(it, get_sub())
112  if(it->id()=="::")
113  return true;
114  return false;
115  }
116 
117  bool is_destructor() const
118  {
119  return get_sub().size()>=1 && get_sub().front().id()=="~";
120  }
121 
122  bool has_template_args() const
123  {
124  forall_irep(it, get_sub())
125  if(it->id()==ID_template_args)
126  return true;
127 
128  return false;
129  }
130 
131  std::string to_string() const;
132 
133  const exprt &as_expr() const
134  {
135  return static_cast<const exprt &>(static_cast<const irept &>(*this));
136  }
137 
138  const typet &as_type() const
139  {
140  return static_cast<const typet &>(static_cast<const irept &>(*this));
141  }
142 };
143 
144 inline cpp_namet &to_cpp_name(irept &cpp_name)
145 {
146  PRECONDITION(cpp_name.id() == ID_cpp_name);
147  return static_cast<cpp_namet &>(cpp_name);
148 }
149 
150 inline const cpp_namet &to_cpp_name(const irept &cpp_name)
151 {
152  PRECONDITION(cpp_name.id() == ID_cpp_name);
153  return static_cast<const cpp_namet &>(cpp_name);
154 }
155 
156 #endif // CPROVER_CPP_CPP_NAME_H
const irept & get_nil_irep()
Definition: irep.cpp:56
The type of an expression.
Definition: type.h:22
bool is_operator() const
Definition: cpp_name.h:97
const exprt & as_expr() const
Definition: cpp_name.h:133
std::vector< irept > subt
Definition: irep.h:90
cpp_namet & to_cpp_name(irept &cpp_name)
Definition: cpp_name.h:144
bool is_simple_name() const
Definition: cpp_name.h:89
namet(const irep_idt &_base_name, const source_locationt &_source_location)
Definition: cpp_name.h:38
bool get_bool(const irep_namet &name) const
Definition: irep.cpp:240
bool is_qualified() const
Definition: cpp_name.h:109
subt & get_sub()
Definition: irep.h:245
bool is_typename() const
Definition: cpp_name.h:104
const irep_idt & id() const
Definition: irep.h:189
const source_locationt & source_location() const
Definition: cpp_name.h:73
bool has_template_args() const
Definition: cpp_name.h:122
const source_locationt & source_location() const
Definition: cpp_name.h:51
#define PRECONDITION(CONDITION)
Definition: invariant.h:230
Base class for tree-like data structures with sharing.
Definition: irep.h:86
cpp_namet(const irep_idt &_base_name, const source_locationt &_source_location)
Definition: cpp_name.h:66
std::string to_string() const
Definition: cpp_name.cpp:76
source_locationt & add_source_location()
Definition: cpp_name.h:46
cpp_namet(const irep_idt &base_name)
Definition: cpp_name.h:61
namet(const irep_idt &base_name)
Definition: cpp_name.h:33
irep_idt get_base_name() const
Definition: cpp_name.cpp:17
const typet & as_type() const
Definition: cpp_name.h:138
Base class for all expressions.
Definition: expr.h:42
irept & add(const irep_namet &name)
Definition: irep.cpp:306
cpp_namet()
Definition: cpp_name.h:57
const irept & find(const irep_namet &name) const
Definition: irep.cpp:285
bool is_destructor() const
Definition: cpp_name.h:117
#define forall_irep(it, irep)
Definition: irep.h:61