Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
StringEncoding.h
Go to the documentation of this file.
1#pragma once
2#include <cstdint>
3#include <ranges>
4#include <string_view>
5
8
9namespace storm::umb {
10
11auto inline stringVectorView(SEQ<char>::value_type const& strings, CSR::value_type const& stringMapping) {
12 STORM_LOG_ASSERT(stringMapping.size() > 0, "StringMapping CSR must not be empty.");
13 auto const numEntries = stringMapping.size() - 1;
14 return std::ranges::iota_view(0ull, numEntries) | std::ranges::views::transform([&strings, &stringMapping](auto i) -> std::string_view {
15 return std::string_view(strings.data() + stringMapping[i], stringMapping[i + 1] - stringMapping[i]);
16 });
17}
18
19auto inline stringVectorView(SEQ<char> const& strings, CSR const& stringMapping) {
20 STORM_LOG_ASSERT(!stringMapping.has_value() || std::ranges::size(stringMapping.value()) > 0, "StringMapping CSR must not be empty.");
21 STORM_LOG_ASSERT(stringMapping.has_value() == strings.has_value(), "StringMapping must be present iff strings is present.");
22 auto const numEntries = stringMapping.has_value() ? std::ranges::size(stringMapping.value()) - 1 : 0;
23 return std::ranges::iota_view(0ull, numEntries) | std::ranges::views::transform([&strings, &stringMapping](auto i) -> std::string_view {
24 // Note: this is only executed if numEntries is positive, i.e., if there actually are strings
25 STORM_LOG_ASSERT(strings.has_value(), "Expected strings to be present if there are entries in the string mapping.");
26 return std::string_view(strings->data() + stringMapping.value()[i], stringMapping.value()[i + 1] - stringMapping.value()[i]);
27 });
28}
29
31 public:
32 StringsBuilder(typename SEQ<char>::value_type& strings, typename CSR::value_type& stringMapping) : strings(strings), stringMapping(stringMapping) {
33 if (stringMapping.empty()) {
34 stringMapping.push_back(0);
35 }
36 STORM_LOG_ASSERT(stringMapping.front() == 0, "String mapping CSR must start with 0.");
37 STORM_LOG_ASSERT(stringMapping.back() == strings.size(), "String mapping CSR must end with the size of the strings.");
38 }
39
40 void reserve(uint64_t numStrings) {
41 strings.reserve(strings.size() + numStrings * 10); // assume average string length of 10
42 stringMapping.reserve(stringMapping.size() + numStrings);
43 }
44
45 std::string_view at(uint64_t index) const {
46 STORM_LOG_ASSERT(index + 1 < stringMapping.size(), "String index out of bounds.");
47 return std::string_view(strings.data() + stringMapping[index], stringMapping[index + 1] - stringMapping[index]);
48 }
49
50 std::size_t size() const {
51 return stringMapping.size() - 1;
52 }
53
58 uint64_t push_back(std::string_view str) {
59 strings.insert(strings.end(), str.begin(), str.end());
60 stringMapping.push_back(strings.size());
61 return size() - 1;
62 }
63
67 uint64_t findOrPushBack(std::string_view str) {
68 // search for existing string (note: this is a linear search)
69 auto const numStrings = stringMapping.size() - 1;
70 for (uint64_t i = 0; i < numStrings; ++i) {
71 if (at(i) == str) {
72 return i;
73 }
74 }
75 // not found, insert new string
76 return push_back(str);
77 }
78
79 void finalize() {
80 STORM_LOG_ASSERT(stringMapping.back() == strings.size(), "Final string mapping does not match string size.");
81 strings.shrink_to_fit();
82 stringMapping.shrink_to_fit();
83 }
84
85 private:
86 typename SEQ<char>::value_type& strings;
87 typename CSR::value_type& stringMapping;
88};
89
90} // namespace storm::umb
std::size_t size() const
uint64_t findOrPushBack(std::string_view str)
If the given string already exists, returns its index.
std::string_view at(uint64_t index) const
void reserve(uint64_t numStrings)
uint64_t push_back(std::string_view str)
inserts the string at the end of the vector and returns its index
StringsBuilder(typename SEQ< char >::value_type &strings, typename CSR::value_type &stringMapping)
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:9
Import and export of umb files.
OptionalVectorType< uint64_t > CSR
Definition FileTypes.h:32
auto stringVectorView(SEQ< char >::value_type const &strings, CSR::value_type const &stringMapping)
TO1< T > SEQ
Definition FileTypes.h:30