CBMC
c_qualifiers.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 
10 #ifndef CPROVER_ANSI_C_C_QUALIFIERS_H
11 #define CPROVER_ANSI_C_C_QUALIFIERS_H
12 
13 #include <iosfwd>
14 #include <memory>
15 #include <string>
16 
17 class typet;
18 
20 {
21 protected:
22  // Only derived classes can construct
23  qualifierst() = default;
24 
25 public:
26  // Copy/move construction/assignment is deleted here and in derived classes
27  qualifierst(const qualifierst &) = delete;
28  qualifierst(qualifierst &&) = delete;
29  qualifierst &operator=(const qualifierst &) = delete;
31 
32  // Destruction is virtual
33  virtual ~qualifierst() = default;
34 
35 public:
36  virtual std::unique_ptr<qualifierst> clone() const = 0;
37 
38  virtual qualifierst &operator+=(const qualifierst &b) = 0;
39 
40  virtual std::size_t count() const = 0;
41 
42  virtual void clear() = 0;
43 
44  virtual void read(const typet &src) = 0;
45  virtual void write(typet &src) const = 0;
46 
47  // Comparisons
48  virtual bool is_subset_of(const qualifierst &q) const = 0;
49  virtual bool operator==(const qualifierst &other) const = 0;
50  bool operator!=(const qualifierst &other) const
51  {
52  return !(*this == other);
53  }
54 
55  // String conversion
56  virtual std::string as_string() const = 0;
57  friend std::ostream &operator<<(std::ostream &, const qualifierst &);
58 };
59 
60 
61 class c_qualifierst : public qualifierst
62 {
63 public:
65  {
66  clear();
67  }
68 
69  explicit c_qualifierst(const typet &src)
70  {
71  clear();
72  read(src);
73  }
74 
75 protected:
76  c_qualifierst &operator=(const c_qualifierst &other);
77 public:
78  virtual std::unique_ptr<qualifierst> clone() const override;
79 
80  virtual void clear() override
81  {
82  is_constant=false;
83  is_volatile=false;
84  is_restricted=false;
85  is_atomic=false;
86  is_ptr32=is_ptr64=false;
88  is_noreturn=false;
89  }
90 
91  // standard ones
93 
94  // MS Visual Studio extension
96 
97  // gcc extension
99 
100  // will likely add alignment here as well
101 
102  virtual std::string as_string() const override;
103  virtual void read(const typet &src) override;
104  virtual void write(typet &src) const override;
105 
106  static void clear(typet &dest);
107 
108  virtual bool is_subset_of(const qualifierst &other) const override
109  {
110  const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
111  return
112  (!is_constant || cq->is_constant) &&
113  (!is_volatile || cq->is_volatile) &&
114  (!is_restricted || cq->is_restricted) &&
115  (!is_atomic || cq->is_atomic) &&
116  (!is_ptr32 || cq->is_ptr32) &&
117  (!is_ptr64 || cq->is_ptr64) &&
118  (!is_noreturn || cq->is_noreturn);
119 
120  // is_transparent_union isn't checked
121  }
122 
123  virtual bool operator==(const qualifierst &other) const override
124  {
125  const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
126  return
127  is_constant == cq->is_constant &&
128  is_volatile == cq->is_volatile &&
129  is_restricted == cq->is_restricted &&
130  is_atomic == cq->is_atomic &&
131  is_ptr32 == cq->is_ptr32 &&
132  is_ptr64 == cq->is_ptr64 &&
134  is_noreturn == cq->is_noreturn;
135  }
136 
137  virtual qualifierst &operator+=(const qualifierst &other) override
138  {
139  const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
140  is_constant |= cq->is_constant;
141  is_volatile |= cq->is_volatile;
143  is_atomic |= cq->is_atomic;
144  is_ptr32 |= cq->is_ptr32;
145  is_ptr64 |= cq->is_ptr64;
147  is_noreturn |= cq->is_noreturn;
148  return *this;
149  }
150 
151  virtual std::size_t count() const override
152  {
155  }
156 };
157 
158 #endif // CPROVER_ANSI_C_C_QUALIFIERS_H
virtual void clear() override
Definition: c_qualifiers.h:80
c_qualifierst(const typet &src)
Definition: c_qualifiers.h:69
bool is_restricted
Definition: c_qualifiers.h:92
virtual std::string as_string() const override
virtual void write(typet &src) const override
virtual bool operator==(const qualifierst &other) const override
Definition: c_qualifiers.h:123
bool is_transparent_union
Definition: c_qualifiers.h:98
virtual std::size_t count() const override
Definition: c_qualifiers.h:151
virtual std::unique_ptr< qualifierst > clone() const override
virtual void read(const typet &src) override
virtual qualifierst & operator+=(const qualifierst &other) override
Definition: c_qualifiers.h:137
c_qualifierst & operator=(const c_qualifierst &other)
virtual bool is_subset_of(const qualifierst &other) const override
Definition: c_qualifiers.h:108
virtual std::unique_ptr< qualifierst > clone() const =0
qualifierst()=default
qualifierst(qualifierst &&)=delete
bool operator!=(const qualifierst &other) const
Definition: c_qualifiers.h:50
virtual std::size_t count() const =0
virtual void write(typet &src) const =0
virtual bool is_subset_of(const qualifierst &q) const =0
qualifierst & operator=(const qualifierst &)=delete
virtual std::string as_string() const =0
virtual void read(const typet &src)=0
qualifierst & operator=(qualifierst &&)=delete
virtual qualifierst & operator+=(const qualifierst &b)=0
virtual void clear()=0
virtual ~qualifierst()=default
qualifierst(const qualifierst &)=delete
friend std::ostream & operator<<(std::ostream &, const qualifierst &)
pretty-print the qualifiers
virtual bool operator==(const qualifierst &other) const =0
The type of an expression, extends irept.
Definition: type.h:29