3 #include <machine/acceptingMachine.h>
12 namespace impl_details_ {
43 template<
typename StateType_>
54 template<
typename StateType_>
65 template<
typename StateType_>
77 typedef std::tuple<bool, const std::set<StateType_> &,
const std::set<StateType_> &,
const std::set<StateType_> &,
const std::set<StateType_> &>
AcceptingConstructorArgs;
102 template<
typename MachineType_>
105 using typename MachineType_::StateType;
106 using typename MachineType_::IsAccepting;
107 using typename MachineType_::StorageType;
108 using typename MachineType_::IsAlternating;
109 using typename MachineType_::TransitionType;
110 using typename MachineType_::ApplyHelperType;
111 using typename MachineType_::IsDeterministic;
112 using typename MachineType_::TransitionContainer;
113 using typename MachineType_::InitialStateContainer;
114 using typename MachineType_::OptionalHelpedTransition;
116 static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
117 static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
118 static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
119 static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType& , ApplyHelperType>>>);
152 template<
typename MachineType_>
155 using typename MachineType_::StateType;
156 using typename MachineType_::IsAccepting;
157 using typename MachineType_::StorageType;
158 using typename MachineType_::IsAlternating;
159 using typename MachineType_::TransitionType;
160 using typename MachineType_::ApplyHelperType;
161 using typename MachineType_::IsDeterministic;
162 using typename MachineType_::TransitionContainer;
163 using typename MachineType_::InitialStateContainer;
164 using typename MachineType_::OptionalHelpedTransition;
166 static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
167 static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
168 static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
169 static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType& , ApplyHelperType>>>);
180 acceptingStates(acceptingStates) {}
201 #pragma clang diagnostic push
202 #pragma clang diagnostic ignored "-Wunused-parameter"
211 return isAcceptingState(state);
213 #pragma clang diagnostic pop
220 return acceptingStates.count(state) > 0;
236 template<
typename MachineType_>
239 using typename MachineType_::StateType;
240 using typename MachineType_::IsAccepting;
241 using typename MachineType_::StorageType;
242 using typename MachineType_::IsAlternating;
243 using typename MachineType_::TransitionType;
244 using typename MachineType_::ApplyHelperType;
245 using typename MachineType_::IsDeterministic;
246 using typename MachineType_::TransitionContainer;
247 using typename MachineType_::InitialStateContainer;
248 using typename MachineType_::OptionalHelpedTransition;
250 static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
251 static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
252 static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
253 static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType& , ApplyHelperType>>>);
269 bool initiallyUniversal,
270 const std::set<StateType>& accepting,
271 const std::set<StateType>& rejecting,
272 const std::set<StateType>& universal,
273 const std::set<StateType>& existential) :
275 initiallyUniversal(initiallyUniversal), acceptance() {
276 std::vector<std::tuple<const std::set<StateType>*, Acceptance::NodeType>> categories = {
277 {&accepting, Acceptance::Accept},
278 {&rejecting, Acceptance::Reject},
279 {&universal, Acceptance::Universal},
280 {&existential, Acceptance::Existential},
282 for (
auto&[set, category]: categories) {
283 for (
const StateType& state: *set) {
284 acceptance[state] = category;
308 #pragma clang diagnostic push
309 #pragma clang diagnostic ignored "-Wunused-parameter"
317 virtual Acceptance::NodeType
isAcceptingConfiguration(
const StateType& state,
const StorageType& storage)
const noexcept
override final {
318 return isAcceptingState(state);
320 #pragma clang diagnostic pop
329 if (
typename std::map<StateType, Acceptance::NodeType>::const_iterator it = acceptance.find(state);
330 it != acceptance.end()) {
333 return Acceptance::Existential;
340 return initiallyUniversal;