aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorregnat <rg@regnat.ovh>2022-03-07 17:45:35 +0100
committerregnat <rg@regnat.ovh>2022-03-07 17:49:02 +0100
commitdcf4f77fac8bc214afd4851b367ce386f0a34658 (patch)
tree9e3b607c1b0c2387ff4ef31a11ad2c975173865f
parent313bbc07a8ae9d72c5f728fde490f3cddcc5087b (diff)
Merge `or-suggestions.hh` into `suggestions.hh`
No real need for keeping a separate header for such a simple class. This requires changing a bit `OrSuggestions<T>::operator*` to not throw an `Error` to prevent a cyclic dependency. But since this error is only thrown on programmer error, we can replace the whole method by a direct call to `std::get` which will raise its own assertion if needs be.
-rw-r--r--src/libexpr/eval-cache.hh1
-rw-r--r--src/libutil/or-suggestions.hh64
-rw-r--r--src/libutil/suggestions.hh57
3 files changed, 57 insertions, 65 deletions
diff --git a/src/libexpr/eval-cache.hh b/src/libexpr/eval-cache.hh
index c0ca76bcf..40f1d4ffc 100644
--- a/src/libexpr/eval-cache.hh
+++ b/src/libexpr/eval-cache.hh
@@ -3,7 +3,6 @@
#include "sync.hh"
#include "hash.hh"
#include "eval.hh"
-#include "or-suggestions.hh"
#include <functional>
#include <variant>
diff --git a/src/libutil/or-suggestions.hh b/src/libutil/or-suggestions.hh
deleted file mode 100644
index cb152a1e4..000000000
--- a/src/libutil/or-suggestions.hh
+++ /dev/null
@@ -1,64 +0,0 @@
-#include "suggestions.hh"
-#include "error.hh"
-
-namespace nix {
-
-// Either a value of type `T`, or some suggestions
-template<typename T>
-class OrSuggestions {
-public:
- using Raw = std::variant<T, Suggestions>;
-
- Raw raw;
-
- T* operator ->()
- {
- return &**this;
- }
-
- T& operator *()
- {
- if (auto elt = std::get_if<T>(&raw))
- return *elt;
- throw Error("Invalid access to a failed value");
- }
-
- operator bool() const noexcept
- {
- return std::holds_alternative<T>(raw);
- }
-
- OrSuggestions(T t)
- : raw(t)
- {
- }
-
- OrSuggestions()
- : raw(Suggestions{})
- {
- }
-
- static OrSuggestions<T> failed(const Suggestions & s)
- {
- auto res = OrSuggestions<T>();
- res.raw = s;
- return res;
- }
-
- static OrSuggestions<T> failed()
- {
- return OrSuggestions<T>::failed(Suggestions{});
- }
-
- const Suggestions & getSuggestions()
- {
- static Suggestions noSuggestions;
- if (const auto & suggestions = std::get_if<Suggestions>(&raw))
- return *suggestions;
- else
- return noSuggestions;
- }
-
-};
-
-}
diff --git a/src/libutil/suggestions.hh b/src/libutil/suggestions.hh
index d8f36cb24..d54dd8e31 100644
--- a/src/libutil/suggestions.hh
+++ b/src/libutil/suggestions.hh
@@ -42,4 +42,61 @@ public:
std::ostream & operator<<(std::ostream & str, const Suggestion &);
std::ostream & operator<<(std::ostream & str, const Suggestions &);
+
+// Either a value of type `T`, or some suggestions
+template<typename T>
+class OrSuggestions {
+public:
+ using Raw = std::variant<T, Suggestions>;
+
+ Raw raw;
+
+ T* operator ->()
+ {
+ return &**this;
+ }
+
+ T& operator *()
+ {
+ return std::get<T>(raw);
+ }
+
+ operator bool() const noexcept
+ {
+ return std::holds_alternative<T>(raw);
+ }
+
+ OrSuggestions(T t)
+ : raw(t)
+ {
+ }
+
+ OrSuggestions()
+ : raw(Suggestions{})
+ {
+ }
+
+ static OrSuggestions<T> failed(const Suggestions & s)
+ {
+ auto res = OrSuggestions<T>();
+ res.raw = s;
+ return res;
+ }
+
+ static OrSuggestions<T> failed()
+ {
+ return OrSuggestions<T>::failed(Suggestions{});
+ }
+
+ const Suggestions & getSuggestions()
+ {
+ static Suggestions noSuggestions;
+ if (const auto & suggestions = std::get_if<Suggestions>(&raw))
+ return *suggestions;
+ else
+ return noSuggestions;
+ }
+
+};
+
}