Storm 1.13.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
GenericVector.h
Go to the documentation of this file.
1#pragma once
2
3#include <ranges>
4#include <variant>
5
13
14namespace storm::umb {
15
17 public:
18 template<typename T>
20
21 template<typename T>
22 void set(Vec<T>&& v) {
23 data = std::move(v);
24 }
25
26 template<typename T>
27 void set(Vec<T> const& v) {
28 data = v;
29 }
30
31 void unset();
32
33 template<typename T>
35 STORM_LOG_ASSERT(std::holds_alternative<Vec<T>>(data), "GenericVector does not hold a value of requested type.");
36 return std::get<Vec<T>>(data);
37 }
38
39 template<typename T>
40 Vec<T> const& get() const {
41 STORM_LOG_ASSERT(std::holds_alternative<Vec<T>>(data), "GenericVector does not hold a value of requested type.");
42 return std::get<Vec<T>>(data);
43 }
44
45 template<typename T>
46 bool isType() const {
47 return std::holds_alternative<Vec<T>>(data);
48 }
49
53 bool hasValue() const;
54
58 uint64_t size() const;
59
60 template<typename FromType, typename ToType>
61 auto convertFromTo() const {
62 if constexpr (std::is_same_v<FromType, ToType>) {
63 return get<ToType>();
64 } else {
65 return get<FromType>() |
66 std::ranges::views::transform([](FromType const& value) -> ToType { return storm::utility::convertNumber<ToType, FromType>(value); });
67 }
68 }
69
70 template<typename T>
71 std::vector<T> asVector() const {
72 if (isType<T>()) {
73 return std::vector<T>(get<T>().begin(), get<T>().end());
74 } else {
75 if constexpr (!std::is_same_v<T, bool>) {
76 if (isType<uint64_t>()) {
77 auto convertedView = convertFromTo<uint64_t, T>();
78 return std::vector<T>(convertedView.begin(), convertedView.end());
79 } else if (isType<int64_t>()) {
80 auto convertedView = convertFromTo<int64_t, T>();
81 return std::vector<T>(convertedView.begin(), convertedView.end());
82 } else if (isType<double>()) {
83 auto convertedView = convertFromTo<double, T>();
84 return std::vector<T>(convertedView.begin(), convertedView.end());
85 } else if (isType<storm::RationalNumber>()) {
86 auto convertedView = convertFromTo<storm::RationalNumber, T>();
87 return std::vector<T>(convertedView.begin(), convertedView.end());
88 } else if (isType<storm::Interval>()) {
89 auto convertedView = convertFromTo<storm::Interval, T>();
90 return std::vector<T>(convertedView.begin(), convertedView.end());
92 auto convertedView = convertFromTo<storm::RationalInterval, T>();
93 return std::vector<T>(convertedView.begin(), convertedView.end());
94 }
95 }
96 STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Unexpected type.");
97 }
98 }
99
100 template<typename ValueType>
101 ValueType at(uint64_t index) const {
103 if (isType<double>()) {
105 } else {
107 }
108 }
109
110 private:
113 data;
114};
115} // namespace storm::umb
Vec< T > const & get() const
storm::umb::VectorType< T > Vec
std::vector< T > asVector() const
ValueType at(uint64_t index) const
void set(Vec< T > &&v)
void set(Vec< T > const &v)
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
std::conditional_t< std::is_same_v< T, bool >, storm::storage::BitVector, std::vector< T > > VectorType
Definition FileTypes.h:18
TargetType convertNumber(SourceType const &number)