Skip to content

Commit 4bb4246

Browse files
committed
Divide value-set of values from value-set of pointers
Stripped back value_set_abstract_object now it doesn't have to deal with pointers. Pulled out abstract_object_sett as a type not just an alias. Add behaviour with functions pulled across from value_set_abstract_objectt and value_set_pointer_abstract_objectt.
1 parent be65c8a commit 4bb4246

10 files changed

+594
-196
lines changed

src/analyses/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ SRC = ai.cpp \
3535
uninitialized_domain.cpp \
3636
variable-sensitivity/abstract_environment.cpp \
3737
variable-sensitivity/abstract_object.cpp \
38+
variable-sensitivity/abstract_object_set.cpp \
3839
variable-sensitivity/abstract_pointer_object.cpp \
3940
variable-sensitivity/abstract_value_object.cpp \
4041
variable-sensitivity/constant_abstract_value.cpp \
@@ -47,6 +48,7 @@ SRC = ai.cpp \
4748
variable-sensitivity/three_way_merge_abstract_interpreter.cpp \
4849
variable-sensitivity/value_set_abstract_object.cpp \
4950
variable-sensitivity/value_set_abstract_value.cpp \
51+
variable-sensitivity/value_set_pointer_abstract_object.cpp \
5052
variable-sensitivity/variable_sensitivity_configuration.cpp \
5153
variable-sensitivity/variable_sensitivity_dependence_graph.cpp \
5254
variable-sensitivity/variable_sensitivity_domain.cpp \
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*******************************************************************\
2+
3+
Module: analyses variable-sensitivity
4+
5+
Author: Jez Higgins, [email protected]
6+
7+
\*******************************************************************/
8+
9+
#include <analyses/variable-sensitivity/abstract_object_set.h>
10+
#include <util/string_utils.h>
11+
12+
static bool by_length(const std::string &lhs, const std::string &rhs)
13+
{
14+
if(lhs.size() < rhs.size())
15+
return true;
16+
if(lhs.size() > rhs.size())
17+
return false;
18+
return lhs < rhs;
19+
}
20+
21+
void abstract_object_sett::output(
22+
std::ostream &out,
23+
const ai_baset &ai,
24+
const namespacet &ns) const
25+
{
26+
std::vector<std::string> output_values;
27+
for(const auto &value : values)
28+
{
29+
std::ostringstream ss;
30+
value->output(ss, ai, ns);
31+
output_values.emplace_back(ss.str());
32+
}
33+
std::sort(output_values.begin(), output_values.end(), by_length);
34+
35+
join_strings(out, output_values.begin(), output_values.end(), ", ");
36+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*******************************************************************\
2+
3+
Module: analyses variable-sensitivity
4+
5+
Author: Jez Higgins, [email protected]
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// an unordered set of value objects
11+
12+
#ifndef CBMC_ABSTRACT_OBJECT_SET_H
13+
#define CBMC_ABSTRACT_OBJECT_SET_H
14+
15+
#include <analyses/variable-sensitivity/abstract_value_object.h>
16+
#include <unordered_set>
17+
18+
class abstract_object_sett
19+
{
20+
public:
21+
using value_sett = std::unordered_set<
22+
abstract_object_pointert,
23+
abstract_hashert,
24+
abstract_equalert>;
25+
using const_iterator = value_sett::const_iterator;
26+
using value_type = value_sett::value_type;
27+
using size_type = value_sett::size_type;
28+
29+
void insert(const abstract_object_pointert &o)
30+
{
31+
values.insert(o);
32+
}
33+
void insert(abstract_object_pointert &&o)
34+
{
35+
values.insert(std::move(o));
36+
}
37+
void insert(const abstract_object_sett &rhs)
38+
{
39+
values.insert(rhs.begin(), rhs.end());
40+
}
41+
42+
abstract_object_pointert first() const
43+
{
44+
return *begin();
45+
}
46+
47+
const_iterator begin() const
48+
{
49+
return values.begin();
50+
}
51+
const_iterator end() const
52+
{
53+
return values.end();
54+
}
55+
56+
value_sett::size_type size() const
57+
{
58+
return values.size();
59+
}
60+
bool empty() const
61+
{
62+
return values.empty();
63+
}
64+
65+
bool operator==(const abstract_object_sett &rhs) const
66+
{
67+
return values == rhs.values;
68+
}
69+
70+
void
71+
output(std::ostream &out, const ai_baset &ai, const namespacet &ns) const;
72+
73+
private:
74+
value_sett values;
75+
};
76+
77+
class value_set_tag
78+
{
79+
public:
80+
virtual const abstract_object_sett &get_values() const = 0;
81+
};
82+
83+
#endif //CBMC_ABSTRACT_OBJECT_SET_H

0 commit comments

Comments
 (0)