smats  0.0.1
Satisfability Modulo Arithmetic Theories Symbols
Loading...
Searching...
No Matches
variables.h
1
6#pragma once
7// IWYU pragma: no_include <string_view>
8
9#include <initializer_list>
10#include <ostream>
11#include <set>
12
13#include "smats/symbolic/variable.h"
14#include "smats/util/concepts.h"
15#include "smats/util/hash.hpp"
16
17namespace smats {
18
27class Variables {
28 public:
29 using size_type = std::set<Variable>::size_type;
30 using iterator = std::set<Variable>::iterator;
31 using const_iterator = std::set<Variable>::const_iterator;
32 using reverse_iterator = std::set<Variable>::reverse_iterator;
33 using const_reverse_iterator = std::set<Variable>::const_reverse_iterator;
34
36 Variables() = default;
41 Variables(std::initializer_list<Variable> init);
42
44 [[nodiscard]] size_type size() const { return vars_.size(); }
46 [[nodiscard]] bool empty() const { return vars_.empty(); }
48 void hash(InvocableHashAlgorithm auto& hasher) const noexcept { hash_append(hasher, vars_); }
50 iterator begin() { return vars_.begin(); }
52 iterator end() { return vars_.end(); }
54 [[nodiscard]] const_iterator begin() const { return vars_.cbegin(); }
56 [[nodiscard]] const_iterator end() const { return vars_.cend(); }
58 [[nodiscard]] const_iterator cbegin() const { return vars_.cbegin(); }
60 [[nodiscard]] const_iterator cend() const { return vars_.cend(); }
62 reverse_iterator rbegin() { return vars_.rbegin(); }
64 reverse_iterator rend() { return vars_.rend(); }
66 [[nodiscard]] const_reverse_iterator rbegin() const { return vars_.crbegin(); }
68 [[nodiscard]] const_reverse_iterator rend() const { return vars_.crend(); }
70 [[nodiscard]] const_reverse_iterator crbegin() const { return vars_.crbegin(); }
72 [[nodiscard]] const_reverse_iterator crend() const { return vars_.crend(); }
73
78 void insert(const Variable& var) { vars_.insert(var); }
84 template <class InputIt>
85 void insert(InputIt first, InputIt last) {
86 vars_.insert(first, last);
87 }
92 void insert(const Variables& vars) { vars_.insert(vars.begin(), vars.end()); }
93
100 size_type erase(const Variable& key) { return vars_.erase(key); }
101
108 size_type erase(const Variables& vars);
109
115 iterator find(const Variable& key) { return vars_.find(key); }
121 [[nodiscard]] const_iterator find(const Variable& key) const { return vars_.find(key); }
123 [[nodiscard]] bool contains(const Variable& key) const { return find(key) != end(); }
124
126 [[nodiscard]] bool is_subset_of(const Variables& vars) const;
128 [[nodiscard]] bool is_superset_of(const Variables& vars) const;
130 [[nodiscard]] bool is_strict_subset_of(const Variables& vars) const;
132 [[nodiscard]] bool is_strict_superset_of(const Variables& vars) const;
133
134 bool operator==(const Variables& vars) const;
135 bool operator<(const Variables& vars) const;
136
137 Variables& operator+=(const Variables& vars);
138 Variables& operator+=(const Variable& var);
139
140 Variables& operator-=(const Variables& vars);
141 Variables& operator-=(const Variable& var);
142
143 Variables operator+(const Variables& vars) const;
144 Variables operator+(const Variable& var) const;
145
146 Variables operator-(const Variables& vars) const;
147 Variables operator-(const Variable& var) const;
148
154 [[nodiscard]] Variables intersect(const Variables& vars) const;
155
156 private:
161 explicit Variables(std::set<Variable> vars);
162
163 std::set<Variable> vars_;
164};
165
166Variables operator+(const Variable& var, Variables vars);
167
168std::ostream& operator<<(std::ostream&, const Variables& vars);
169
170} // namespace smats
171
172namespace std {
173template <>
174struct hash<smats::Variables> : public smats::DefaultHash {};
175} // namespace std
Definition variable.h:34
Definition variables.h:27
const_iterator begin() const
Definition variables.h:54
iterator find(const Variable &key)
Definition variables.h:115
bool is_superset_of(const Variables &vars) const
Definition variables.cpp:27
const_reverse_iterator crend() const
Definition variables.h:72
void insert(InputIt first, InputIt last)
Definition variables.h:85
const_reverse_iterator rend() const
Definition variables.h:68
reverse_iterator rbegin()
Definition variables.h:62
bool is_strict_subset_of(const Variables &vars) const
Definition variables.cpp:29
void insert(const Variable &var)
Definition variables.h:78
Variables intersect(const Variables &vars) const
Definition variables.cpp:94
bool is_strict_superset_of(const Variables &vars) const
Definition variables.cpp:34
const_iterator find(const Variable &key) const
Definition variables.h:121
std::set< Variable > vars_
Set of variables.
Definition variables.h:163
const_reverse_iterator crbegin() const
Definition variables.h:70
reverse_iterator rend()
Definition variables.h:64
iterator end()
Definition variables.h:52
iterator begin()
Definition variables.h:50
const_iterator cbegin() const
Definition variables.h:58
const_reverse_iterator rbegin() const
Definition variables.h:66
bool empty() const
Definition variables.h:46
bool contains(const Variable &key) const
Definition variables.h:123
size_type erase(const Variable &key)
Definition variables.h:100
bool is_subset_of(const Variables &vars) const
Definition variables.cpp:23
Variables()=default
const_iterator end() const
Definition variables.h:56
size_type size() const
Definition variables.h:44
void hash(InvocableHashAlgorithm auto &hasher) const noexcept
Definition variables.h:48
void insert(const Variables &vars)
Definition variables.h:92
const_iterator cend() const
Definition variables.h:60
Definition concepts.h:88
ExpressionKind enum.
void hash_append(HashAlgorithm &hasher, const T &hashable) noexcept
Definition hash.hpp:79
Definition gmp.cpp:14
Definition hash.hpp:265