ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
numbering.h
Go to the documentation of this file.
1#ifndef CPROVER_NUMBERING_H
2#define CPROVER_NUMBERING_H
3
4#include <cassert>
5#include <cstddef>
6#include <map>
7#include <unordered_map>
8#include <vector>
9#include <cstddef>
10
11template <typename T>
13{
14public:
16 {
17 next_obj_num = 0;
18 }
19
20 unsigned number(const T &a)
21 {
22 unsigned int num = next_obj_num;
23 std::pair<typename numberst::const_iterator, bool> result =
24 numbers.insert(std::pair<T, unsigned>(a, num));
25
26 if (result.second) // inserted?
27 {
29 vec[num] = a;
30 assert(vec.size() == numbers.size());
31 }
32
33 return (result.first)->second;
34 }
35
36 bool get_number(const T &a, unsigned &n) const
37 {
38 typename numberst::const_iterator it = numbers.find(a);
39
40 if (it == numbers.end())
41 return true;
42
43 n = it->second;
44 return false;
45 }
46
47 void clear()
48 {
49 vec.clear();
50 numbers.clear();
51 }
52
53 size_t size()
54 {
55 return vec.size();
56 }
57
58 void erase(unsigned int num)
59 {
60 // Precondition: this number actually exists.
61 assert(vec.find(num) != vec.end());
62
63 const T &ref = vec[num];
64 numbers.erase(ref);
65 vec.erase(num);
66 return;
67 }
68
69protected:
70 typedef std::map<T, unsigned> numberst;
71 typedef std::unordered_map<unsigned, T, std::hash<unsigned>> vectort;
74 unsigned int next_obj_num;
75};
76
77template <typename T, class hash_fkt>
79{
80public:
82 {
83 next_obj_num = 0;
84 }
85
86 unsigned number(const T &a)
87 {
88 unsigned int num = next_obj_num++;
89 std::pair<typename numberst::const_iterator, bool> result =
90 numbers.insert(std::pair<T, unsigned>(a, num));
91
92 if (result.second) // inserted?
93 {
94 vec[num] = a;
95 assert(vec.size() == numbers.size());
96 }
97
98 return (result.first)->second;
99 }
100
101 bool get_number(const T &a, unsigned &n) const
102 {
103 typename numberst::const_iterator it = numbers.find(a);
104
105 if (it == numbers.end())
106 return true;
107
108 n = it->second;
109 return false;
110 }
111
112 void clear()
113 {
114 vec.clear();
115 numbers.clear();
116 }
117
118 size_t size()
119 {
120 return vec.size();
121 }
122
123 const T &operator[](unsigned int i) const
124 {
125 return vec[i];
126 }
127
128 T &operator[](unsigned int i)
129 {
130 return vec[i];
131 }
132
133 void erase(unsigned int num)
134 {
135 assert(vec.find(num) != vec.end());
136 const T &ref = vec[num];
137 numbers.erase(ref);
138 vec.erase(num);
139 }
140
141protected:
142 typedef std::unordered_map<T, unsigned, hash_fkt> numberst;
143 typedef std::unordered_map<unsigned, T, std::hash<unsigned>> vectort;
146 unsigned int next_obj_num;
147};
148
149#endif
hash_numbering()
Definition numbering.h:81
T & operator[](unsigned int i)
Definition numbering.h:128
void erase(unsigned int num)
Definition numbering.h:133
unsigned int next_obj_num
Definition numbering.h:146
vectort vec
Definition numbering.h:145
void clear()
Definition numbering.h:112
const T & operator[](unsigned int i) const
Definition numbering.h:123
std::unordered_map< expr2tc, unsigned, irep2_hash > numberst
Definition numbering.h:142
size_t size()
Definition numbering.h:118
unsigned number(const T &a)
Definition numbering.h:86
numberst numbers
Definition numbering.h:144
std::unordered_map< unsigned, expr2tc, std::hash< unsigned > > vectort
Definition numbering.h:143
bool get_number(const T &a, unsigned &n) const
Definition numbering.h:101
void clear()
Definition numbering.h:47
numberst numbers
Definition numbering.h:72
size_t size()
Definition numbering.h:53
vectort vec
Definition numbering.h:73
numbering()
Definition numbering.h:15
std::unordered_map< unsigned, T, std::hash< unsigned > > vectort
Definition numbering.h:71
std::map< T, unsigned > numberst
Definition numbering.h:70
bool get_number(const T &a, unsigned &n) const
Definition numbering.h:36
unsigned number(const T &a)
Definition numbering.h:20
unsigned int next_obj_num
Definition numbering.h:74
void erase(unsigned int num)
Definition numbering.h:58
#define T
Definition exp2f.c:24