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