proconlib

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

View the Project on GitHub KodamaD/proconlib

:heavy_check_mark: traits/lambda_semigroup.cpp

Verified with

Code

#pragma once
#include <memory>
#include <utility>

template <class F> class LambdaSemiGroup {
    template <class> struct GetArg;
    template <class C, class T> struct GetArg<T (C::*)(T, T) const> { using Type = T; };

    static inline std::unique_ptr<F> OP;

  public:
    using Type = typename GetArg<decltype(&F::operator())>::Type;
    static constexpr Type operation(const Type& l, const Type& r) {
        assert(OP);
        return OP->operator()(l, r);
    }
    explicit constexpr LambdaSemiGroup(F&& f) { OP = std::make_unique<F>(std::forward<F>(f)); }
};

template <class F> decltype(auto) lambda_semigroup(F&& f) { return LambdaSemiGroup<F>(std::forward<F>(f)); }
#line 2 "traits/lambda_semigroup.cpp"
#include <memory>
#include <utility>

template <class F> class LambdaSemiGroup {
    template <class> struct GetArg;
    template <class C, class T> struct GetArg<T (C::*)(T, T) const> { using Type = T; };

    static inline std::unique_ptr<F> OP;

  public:
    using Type = typename GetArg<decltype(&F::operator())>::Type;
    static constexpr Type operation(const Type& l, const Type& r) {
        assert(OP);
        return OP->operator()(l, r);
    }
    explicit constexpr LambdaSemiGroup(F&& f) { OP = std::make_unique<F>(std::forward<F>(f)); }
};

template <class F> decltype(auto) lambda_semigroup(F&& f) { return LambdaSemiGroup<F>(std::forward<F>(f)); }
Back to top page