AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
language.h
1#ifndef PROBFD_LANGUAGE_H
2#define PROBFD_LANGUAGE_H
3
4#include <iterator>
5#include <utility>
6
7namespace probfd {
8
17template <class... Ts>
18struct overloaded : Ts... {
19 using Ts::operator()...;
20};
21
22template <class... Ts>
23overloaded(Ts... ts) -> overloaded<Ts...>;
24
25template <size_t i>
26decltype(auto) select(auto&&... args)
27 requires(i < sizeof...(args))
28{
29 return std::get<i>(std::tie(args...));
30}
31
32template <size_t i>
33decltype(auto) select_opt(auto&&... args)
34{
35 if constexpr (i < sizeof...(args)) {
36 return std::get<i>(std::tie(args...));
37 } else {
38 return nullptr;
39 }
40}
41
42template <typename Derived>
43class add_postfix_inc_dec {
44public:
45 Derived operator++(int)
46 requires requires(Derived d) { ++d; }
47 {
48 auto& self = static_cast<Derived&>(*this);
49
50 Derived tmp(self);
51 ++self;
52 return tmp;
53 }
54
55 Derived operator--(int)
56 requires requires(Derived d) { --d; }
57 {
58 auto& self = static_cast<Derived&>(*this);
59
60 Derived tmp(self);
61 --self;
62 return tmp;
63 }
64};
65
66template <typename Derived>
67class add_pm_assignment {
68public:
69 Derived& operator+=(int n)
70 requires requires(Derived d, int x) {
71 {
72 d + x
73 } -> std::convertible_to<Derived>;
74 }
75 {
76 auto& self = static_cast<Derived&>(*this);
77 self = self + n;
78 return self;
79 }
80
81 Derived& operator-=(int n)
82 requires requires(Derived d, int x) {
83 {
84 d - x
85 } -> std::convertible_to<Derived>;
86 }
87 {
88 auto& self = static_cast<Derived&>(*this);
89 self = self - n;
90 return self;
91 }
92};
93
94template <typename T>
95concept lvalue_reference = std::is_lvalue_reference_v<T>;
96
97template <typename Derived>
98class add_indirection {
99public:
100 auto* operator->()
101 {
102 auto& self = static_cast<Derived&>(*this);
103 return &*self;
104 }
105};
106
107template <typename Derived>
108class add_subscript {
109public:
110 auto& operator[](int n)
111 requires requires(Derived d, int x) {
112 {
113 d + x
114 } -> std::convertible_to<Derived>;
115 {
116 *d
117 };
118 }
119 {
120 auto& self = static_cast<Derived&>(*this);
121 return *(self + n);
122 }
123};
124
125} // namespace probfd
126
127#endif
The top-level namespace of probabilistic Fast Downward.
Definition command_line.h:8
Definition language.h:18