m1une's library

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

View on GitHub

:warning: monoid/monoids/or_monoid.hpp

Depends on

Required by

Code

#ifndef M1UNE_OR_MONOID_HPP
#define M1UNE_OR_MONOID_HPP 1

#include "../monoid.hpp"

namespace m1une {

template <typename T>
using or_monoid = monoid<T, [](T a, T b) { return a | b; }, []() { return T(0); }, true>;

}  // namespace m1une

#endif  // M1UNE_OR_MONOID_HPP
#line 1 "monoid/monoids/or_monoid.hpp"



#line 1 "monoid/monoid.hpp"



#include <concepts>
#include <functional>
#include <type_traits>

namespace m1une {

template <typename T, auto operation, auto identity, bool commutative>
struct monoid {
    static_assert(std::is_invocable_r_v<T, decltype(operation), T, T>, "operation must work as T(T, T)");
    static_assert(std::is_invocable_r_v<T, decltype(identity)>, "identity must work as T()");

    using value_type = T;
    static constexpr auto op = operation;
    static constexpr auto id = identity;
    static constexpr bool is_commutative = commutative;
};

template <typename T>
concept Monoid = requires(typename T::value_type v) {
    typename T::value_type;
    { T::op(v, v) } -> std::same_as<typename T::value_type>;
    { T::id() } -> std::same_as<typename T::value_type>;
    { T::is_commutative } -> std::convertible_to<bool>;
};

}  // namespace m1une


#line 5 "monoid/monoids/or_monoid.hpp"

namespace m1une {

template <typename T>
using or_monoid = monoid<T, [](T a, T b) { return a | b; }, []() { return T(0); }, true>;

}  // namespace m1une
Back to top page