CBMC
boolbv_width.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_SOLVERS_FLATTENING_BOOLBV_WIDTH_H
11 #define CPROVER_SOLVERS_FLATTENING_BOOLBV_WIDTH_H
12 
13 #include <util/type.h> // IWYU pragma: keep
14 
15 class namespacet;
16 class struct_typet;
17 
19 {
20 public:
21  explicit boolbv_widtht(const namespacet &_ns);
22  virtual ~boolbv_widtht() = default;
23 
24  virtual std::size_t operator()(const typet &type) const
25  {
26  const auto &entry_opt = get_entry(type);
27  CHECK_RETURN(entry_opt.has_value());
28  return entry_opt->total_width;
29  }
30 
31  virtual std::optional<std::size_t> get_width_opt(const typet &type) const
32  {
33  const auto &entry_opt = get_entry(type);
34  if(!entry_opt.has_value())
35  return std::nullopt;
36  return entry_opt->total_width;
37  }
38 
39  struct membert
40  {
41  std::size_t offset, width;
42  };
43 
44  const membert &
45  get_member(const struct_typet &type, const irep_idt &member) const;
46 
47 protected:
48  const namespacet &ns;
49 
51  {
53  {
54  }
55 
56  std::size_t total_width;
57  std::vector<membert> members;
58  };
59  using entryt = std::optional<defined_entryt>;
60 
61  typedef std::unordered_map<typet, entryt, irep_hash> cachet;
62 
63  // the 'mutable' is allow const methods above
64  mutable cachet cache;
65 
66  const entryt &get_entry(const typet &type) const;
67 };
68 
69 #endif // CPROVER_SOLVERS_FLATTENING_BOOLBV_WIDTH_H
virtual std::optional< std::size_t > get_width_opt(const typet &type) const
Definition: boolbv_width.h:31
boolbv_widtht(const namespacet &_ns)
const namespacet & ns
Definition: boolbv_width.h:48
const entryt & get_entry(const typet &type) const
std::optional< defined_entryt > entryt
Definition: boolbv_width.h:59
virtual std::size_t operator()(const typet &type) const
Definition: boolbv_width.h:24
std::unordered_map< typet, entryt, irep_hash > cachet
Definition: boolbv_width.h:61
virtual ~boolbv_widtht()=default
const membert & get_member(const struct_typet &type, const irep_idt &member) const
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:38
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:94
Structure type, corresponds to C style structs.
Definition: std_types.h:231
The type of an expression, extends irept.
Definition: type.h:29
#define CHECK_RETURN(CONDITION)
Definition: invariant.h:495
std::vector< membert > members
Definition: boolbv_width.h:57
defined_entryt(std::size_t total_width)
Definition: boolbv_width.h:52
Defines typet, type_with_subtypet and type_with_subtypest.