#line 1 "misc/interface/action.cpp"
/**
* @brief 作用のヘルパークラス
* @author えびちゃん
*/
#line 1 "utility/monoid/length.cpp"
/**
* @brief 和と長さを得る演算のモノイド
* @author えびちゃん
*/
#include <cstddef>
#include <utility>
#ifndef H_length_monoid
#define H_length_monoid
template <typename Tp>
class length_monoid {
public:
using value_type = Tp;
using size_type = size_t;
private:
value_type M_x{};
size_type M_l = 1;
public:
length_monoid() = default; // identity
length_monoid(value_type const& x, size_type l = 1): M_x(x), M_l(l) {};
length_monoid(value_type&& x, size_type l = 1): M_x(std::move(x)), M_l(l) {};
length_monoid& operator +=(length_monoid const& that) {
M_x += that.M_x;
M_l += that.M_l;
return *this;
}
length_monoid& operator +=(length_monoid&& that) {
M_x += std::move(that.M_x);
M_l += that.M_l;
return *this;
}
length_monoid operator +(length_monoid const& that) const {
return length_monoid(*this) += that;
}
length_monoid operator +(length_monoid&& that) const {
return length_monoid(*this) += std::move(that);
}
value_type const& get() const { return M_x; }
size_type length() const { return M_l; }
};
#endif /* !defined(H_length_monoid) */
#line 10 "misc/interface/action.cpp"
template <typename Tp>
struct action {
using operand_type = length_monoid<Tp>;
using action_type = Tp;
static void act(operand_type& op, action_type const& a) {
//
}
};