CBMC
string_container.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Container for C-Strings
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #include "string_container.h"
13 
14 #include <cstring>
15 #include <iostream>
16 #include <numeric>
17 
18 string_ptrt::string_ptrt(const char *_s):s(_s), len(strlen(_s))
19 {
20 }
21 
22 bool string_ptrt::operator==(const string_ptrt &other) const
23 {
24  if(len!=other.len)
25  return false;
26 
27  return len==0 || memcmp(s, other.s, len)==0;
28 }
29 
31 {
32 }
33 
34 unsigned string_containert::get(const char *s)
35 {
36  string_ptrt string_ptr(s);
37 
38  hash_tablet::iterator it=hash_table.find(string_ptr);
39 
40  if(it!=hash_table.end())
41  return it->second;
42 
43  size_t r=hash_table.size();
44 
45  // these are stable
46  string_list.push_back(std::string(s));
47  string_ptrt result(string_list.back());
48 
49  hash_table[result]=r;
50 
51  // these are not
52  string_vector.push_back(&string_list.back());
53 
54  return r;
55 }
56 
57 unsigned string_containert::get(const std::string &s)
58 {
59  string_ptrt string_ptr(s);
60 
61  hash_tablet::iterator it=hash_table.find(string_ptr);
62 
63  if(it!=hash_table.end())
64  return it->second;
65 
66  size_t r=hash_table.size();
67 
68  // these are stable
69  string_list.push_back(s);
70  string_ptrt result(string_list.back());
71 
72  hash_table[result]=r;
73 
74  // these are not
75  string_vector.push_back(&string_list.back());
76 
77  return r;
78 }
79 
80 void string_container_statisticst::dump_on_stream(std::ostream &out) const
81 {
82  auto total_memory_usage = strings_memory_usage + vector_memory_usage +
84  out << "String container statistics:"
85  << "\n string count: " << string_count
86  << "\n string memory usage: " << strings_memory_usage.to_string()
87  << "\n vector memory usage: " << vector_memory_usage.to_string()
88  << "\n map memory usage: " << map_memory_usage.to_string()
89  << "\n list memory usage: " << list_memory_usage.to_string()
90  << "\n total memory usage: " << total_memory_usage.to_string() << '\n';
91 }
92 
94 {
96  result.string_count = string_vector.size();
98  sizeof(string_vector) +
99  sizeof(string_vectort::value_type) * string_vector.capacity());
100  result.strings_memory_usage = memory_sizet::from_bytes(std::accumulate(
101  begin(string_vector),
102  end(string_vector),
103  std::size_t(0),
104  [](std::size_t sz, const std::string *s) { return sz + s->capacity(); }));
106  sizeof(hash_table) + hash_table.size() * sizeof(hash_tablet::value_type));
107 
109  sizeof(string_list) + 2 * sizeof(void *) * string_list.size());
110  return result;
111 }
string_ptrt::s
const char * s
Definition: string_container.h:24
string_containert::~string_containert
~string_containert()
Definition: string_container.cpp:30
string_containert::hash_table
hash_tablet hash_table
Definition: string_container.h:98
string_containert::string_list
string_listt string_list
Definition: string_container.h:104
string_container.h
string_containert::string_vector
string_vectort string_vector
Definition: string_container.h:107
string_container_statisticst::dump_on_stream
void dump_on_stream(std::ostream &out) const
Definition: string_container.cpp:80
string_container_statisticst
Has estimated statistics about string container (estimated because this only uses public information,...
Definition: string_container.h:52
string_ptrt::len
size_t len
Definition: string_container.h:25
string_ptrt::string_ptrt
string_ptrt(const char *_s)
Definition: string_container.cpp:18
string_container_statisticst::list_memory_usage
memory_sizet list_memory_usage
Definition: string_container.h:58
string_ptrt::operator==
bool operator==(const string_ptrt &other) const
Definition: string_container.cpp:22
string_container_statisticst::string_count
std::size_t string_count
Definition: string_container.h:54
memory_sizet::to_string
std::string to_string() const
Definition: memory_units.cpp:63
string_container_statisticst::vector_memory_usage
memory_sizet vector_memory_usage
Definition: string_container.h:56
string_container_statisticst::strings_memory_usage
memory_sizet strings_memory_usage
Definition: string_container.h:55
string_containert::get
unsigned get(const char *s)
Definition: string_container.cpp:34
r
static int8_t r
Definition: irep_hash.h:60
string_containert::compute_statistics
string_container_statisticst compute_statistics() const
Definition: string_container.cpp:93
string_ptrt
Definition: string_container.h:22
memory_sizet::from_bytes
static memory_sizet from_bytes(std::size_t bytes)
Definition: memory_units.cpp:38
string_container_statisticst::map_memory_usage
memory_sizet map_memory_usage
Definition: string_container.h:57