diff options
author | regnat <rg@regnat.ovh> | 2022-03-07 17:45:35 +0100 |
---|---|---|
committer | regnat <rg@regnat.ovh> | 2022-03-07 17:49:02 +0100 |
commit | dcf4f77fac8bc214afd4851b367ce386f0a34658 (patch) | |
tree | 9e3b607c1b0c2387ff4ef31a11ad2c975173865f /src/libutil | |
parent | 313bbc07a8ae9d72c5f728fde490f3cddcc5087b (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.
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/or-suggestions.hh | 64 | ||||
-rw-r--r-- | src/libutil/suggestions.hh | 57 |
2 files changed, 57 insertions, 64 deletions
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; + } + +}; + } |