From fd45d85b4149a4d153d9c60f7f77244b3cf29ae3 Mon Sep 17 00:00:00 2001 From: regnat Date: Fri, 4 Mar 2022 13:42:43 +0100 Subject: [PATCH] Move OrSuggestions to its own header Prevents a recursive inclusion --- src/libexpr/eval-cache.hh | 1 + src/libutil/or-suggestions.hh | 64 +++++++++++++++++++++++++++++++++++ src/libutil/suggestions.hh | 59 -------------------------------- 3 files changed, 65 insertions(+), 59 deletions(-) create mode 100644 src/libutil/or-suggestions.hh diff --git a/src/libexpr/eval-cache.hh b/src/libexpr/eval-cache.hh index 40f1d4ffc..c0ca76bcf 100644 --- a/src/libexpr/eval-cache.hh +++ b/src/libexpr/eval-cache.hh @@ -3,6 +3,7 @@ #include "sync.hh" #include "hash.hh" #include "eval.hh" +#include "or-suggestions.hh" #include #include diff --git a/src/libutil/or-suggestions.hh b/src/libutil/or-suggestions.hh new file mode 100644 index 000000000..cb152a1e4 --- /dev/null +++ b/src/libutil/or-suggestions.hh @@ -0,0 +1,64 @@ +#include "suggestions.hh" +#include "error.hh" + +namespace nix { + +// Either a value of type `T`, or some suggestions +template +class OrSuggestions { +public: + using Raw = std::variant; + + Raw raw; + + T* operator ->() + { + return &**this; + } + + T& operator *() + { + if (auto elt = std::get_if(&raw)) + return *elt; + throw Error("Invalid access to a failed value"); + } + + operator bool() const noexcept + { + return std::holds_alternative(raw); + } + + OrSuggestions(T t) + : raw(t) + { + } + + OrSuggestions() + : raw(Suggestions{}) + { + } + + static OrSuggestions failed(const Suggestions & s) + { + auto res = OrSuggestions(); + res.raw = s; + return res; + } + + static OrSuggestions failed() + { + return OrSuggestions::failed(Suggestions{}); + } + + const Suggestions & getSuggestions() + { + static Suggestions noSuggestions; + if (const auto & suggestions = std::get_if(&raw)) + return *suggestions; + else + return noSuggestions; + } + +}; + +} diff --git a/src/libutil/suggestions.hh b/src/libutil/suggestions.hh index 63426259d..705b4cd1c 100644 --- a/src/libutil/suggestions.hh +++ b/src/libutil/suggestions.hh @@ -39,63 +39,4 @@ public: Suggestions& operator+=(const Suggestions & other); }; - -// Either a value of type `T`, or some suggestions -template -class OrSuggestions { -public: - using Raw = std::variant; - - Raw raw; - - T* operator ->() - { - return &**this; - } - - T& operator *() - { - if (auto elt = std::get_if(&raw)) - return *elt; - throw Error("Invalid access to a failed value"); - } - - operator bool() const noexcept - { - return std::holds_alternative(raw); - } - - OrSuggestions(T t) - : raw(t) - { - } - - OrSuggestions() - : raw(Suggestions{}) - { - } - - static OrSuggestions failed(const Suggestions & s) - { - auto res = OrSuggestions(); - res.raw = s; - return res; - } - - static OrSuggestions failed() - { - return OrSuggestions::failed(Suggestions{}); - } - - const Suggestions & get_suggestions() - { - static Suggestions noSuggestions; - if (const auto & suggestions = std::get_if(&raw)) - return *suggestions; - else - return noSuggestions; - } - -}; - }