cp-library-cpp

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub suisen-cp/cp-library-cpp

:warning: Variant Utils
(library/util/variant_utils.hpp)

Variant Utils

Code

#ifndef SUISEN_VARIANT_UTILS
#define SUISEN_VARIANT_UTILS

#include <cassert>
#include <variant>

namespace suisen {

template <typename ...Types>
class Match {
    public:
        Match(std::variant<Types...> &&v) : v_(std::move(v)) {}
        Match(const std::variant<Types...> &v) : v_(v) {}

        template <typename T, typename F>
        Match&& with(F &&f) && {
            if (std::holds_alternative<T>(v_)) {
                assert(not matched);
                matched = true;
                f(std::get<T>(v_));
            }
            return std::move(*this);
        }
        template <typename F>
        void otherwise(F &&f) && {
            if (not matched) f();
        }
    private:
        std::variant<Types...> v_;
        bool matched = false;
};

template <typename ...Types>
Match(std::variant<Types...>) -> Match<Types...>;

} // namespace suisen


#endif // SUISEN_VARIANT_UTILS
#line 1 "library/util/variant_utils.hpp"



#include <cassert>
#include <variant>

namespace suisen {

template <typename ...Types>
class Match {
    public:
        Match(std::variant<Types...> &&v) : v_(std::move(v)) {}
        Match(const std::variant<Types...> &v) : v_(v) {}

        template <typename T, typename F>
        Match&& with(F &&f) && {
            if (std::holds_alternative<T>(v_)) {
                assert(not matched);
                matched = true;
                f(std::get<T>(v_));
            }
            return std::move(*this);
        }
        template <typename F>
        void otherwise(F &&f) && {
            if (not matched) f();
        }
    private:
        std::variant<Types...> v_;
        bool matched = false;
};

template <typename ...Types>
Match(std::variant<Types...>) -> Match<Types...>;

} // namespace suisen
Back to top page