/* * File: mn_strategy.hpp * Created Date: Thursday February 17th 2022 * Author: yangzilong (yangzilong@objecteye.com) * Description: * ----- * Last Modified: Thursday, 17th February 2022 11:23:44 am * Modified By: yangzilong (yangzilong@objecteye.com>) * ----- * Copyright 2022 */ #pragma once // m帧里面出现了n帧才会报警, 降低报警的话可以提高n的值 #include #include "helpers/logger.hpp" template class MNStrategy { public: MNStrategy(const unsigned _m = 0, const unsigned _n = 0) : target_m_(_m) , target_n_(_n) , current_m_(0) , current_n_(0) {} void set_target_m(const unsigned _val) noexcept { target_m_ = _val; } void set_target_n(const unsigned _val) noexcept { target_n_ = _val; if (target_n_ >= target_m_) LOG_ERROR("mn strategy `target_n` gt `target_m` ({} vs {})", _val, target_m_); } void update_m() noexcept { ++current_m_; } void update_n() noexcept { ++current_n_; } void reset_m() noexcept { current_m_ = 0; } void reset_n() noexcept { current_n_ = 0; } void try_reset() noexcept { if (current_m_ >= target_m_ && current_n_ < target_n_) reset(); } void reset() noexcept { reset_m(); reset_n(); } bool check() const noexcept { return current_n_ >= target_n_; } bool update_and_check(const T &source, const T &target, const bool do_reset = false) noexcept { if (source == target) update_n(); update_m(); try_reset(); return check_and_erase(do_reset); } bool update_and_check(const bool do_reset = false) noexcept { update_n(); update_m(); try_reset(); return check_and_erase(do_reset); } private: bool check_and_erase(const bool do_reset = false) noexcept { bool check_status = check(); if (check_status && do_reset) reset(); return check_status; } unsigned target_m_, target_n_; unsigned current_m_, current_n_; };