#pragma once #include #include // 添加FLT_MIN所需头文件 #include #include namespace CCOS::Dev::Detail { template class TmplMould { public: TmplMould(T init, T min, T max, T accuracy) { m_Value = init; m_LimitMin = min; m_LimitMax = max; m_Accuracy = accuracy; assert(m_LimitMin < m_LimitMax); } virtual ~TmplMould() {} public: bool CanInc() const; bool CanDec() const; bool Verify(T value) const; bool Inc(); bool Dec(); bool Update(T value); bool UpdateLimitMax(T value); bool UpdateLimitMin(T value); T Get() const; T GetLimitMax() const; T GetLimitMin() const; bool ToNext(const std::vector& ar); bool ToPrev(const std::vector& ar); bool ToUpdate(T value, const std::vector& ar); bool CanToNext(T& value, const std::vector& ar); bool CanToPrev(T& value, const std::vector& ar); bool CanToUpdate(T& value, const std::vector& ar); protected: T m_LimitMin; T m_LimitMax; T m_Accuracy; T m_Value; }; // 模板成员函数实现直接放在头文件中 template bool TmplMould::CanInc() const { return m_Value < m_LimitMax; } template bool TmplMould::CanDec() const { return m_Value > m_LimitMin; } template bool TmplMould::Verify(T value) const { return (m_LimitMin <= value && value <= m_LimitMax); } template bool TmplMould::Inc() { if (m_Value >= m_LimitMax) return false; m_Value += m_Accuracy; return true; } template bool TmplMould::Dec() { if (m_Value <= m_LimitMin) return false; m_Value -= m_Accuracy; return true; } template bool TmplMould::Update(T value) { if (value < m_LimitMin) return false; if (value > m_LimitMax) return false; if (value == m_Value) return false; m_Value = value; return true; } template bool TmplMould::UpdateLimitMax(T value) { m_LimitMax = value; return true; } template bool TmplMould::UpdateLimitMin(T value) { m_LimitMin = value; return true; } template T TmplMould::Get() const { return m_Value; } template T TmplMould::GetLimitMax() const { return m_LimitMax; } template T TmplMould::GetLimitMin() const { return m_LimitMin; } template bool TmplMould::CanToNext(T& value, const std::vector& ar) { value = m_Value; int setSize = ar.size(); for (int i = 0; i < setSize; i++) { if (ar[i] == value) { if (i < setSize - 1) { value = ar[i + 1]; return (m_LimitMin <= value && value <= m_LimitMax); } } else if (ar[i] - value > FLT_MIN) { value = ar[i]; return (m_LimitMin <= value && value <= m_LimitMax); } } return false; } template bool TmplMould::CanToPrev(T& value, const std::vector& ar) { value = m_Value; int setSize = ar.size(); for (int i = setSize - 1; i >= 0; i--) { if (ar[i] == value) { if (i > 0) { value = ar[i - 1]; return (m_LimitMin <= value && value <= m_LimitMax); } } else if (value - ar[i] > FLT_MIN) { value = ar[i]; return (m_LimitMin <= value && value <= m_LimitMax); } } return false; } template bool TmplMould::CanToUpdate(T& value, const std::vector& ar) { int setSize = ar.size(); if (setSize == 0) return false; // 添加空数组保护 if (value <= ar[0]) { value = ar[0]; return (m_LimitMin <= value && value <= m_LimitMax); } else if (value >= ar[setSize - 1]) { value = ar[setSize - 1]; return (m_LimitMin <= value && value <= m_LimitMax); } else { for (int i = 0; i < setSize - 1; i++) { if (value == ar[i]) { value = ar[i]; return (m_LimitMin <= value && value <= m_LimitMax); } else if (value == ar[i + 1]) { value = ar[i + 1]; return (m_LimitMin <= value && value <= m_LimitMax); } else if (value > ar[i] && value < ar[i + 1]) { (value - ar[i]) > (ar[i + 1] - value) ? value = ar[i + 1] : value = ar[i]; return (m_LimitMin <= value && value <= m_LimitMax); } } } return false; } template bool TmplMould::ToNext(const std::vector& ar) { int setSize = ar.size(); for (int i = 0; i < setSize; i++) { if (ar[i] == m_Value) { if (i < setSize - 1) { m_Value = ar[i + 1]; return true; } } else if (ar[i] - m_Value > FLT_MIN) { m_Value = ar[i]; return true; } } return false; } template bool TmplMould::ToPrev(const std::vector& ar) { int setSize = ar.size(); for (int i = setSize - 1; i >= 0; i--) { if (ar[i] == m_Value) { if (i > 0) { m_Value = ar[i - 1]; return true; } } else if (m_Value - ar[i] > FLT_MIN) { m_Value = ar[i]; return true; } } return false; } template bool TmplMould::ToUpdate(T value, const std::vector& ar) { int setSize = ar.size(); if (setSize == 0) return false; // 添加空数组保护 if (value <= ar[0]) { m_Value = ar[0]; return true; } else if (value >= ar[setSize - 1]) { m_Value = ar[setSize - 1]; return true; } else { for (int i = 0; i < setSize - 1; i++) { if (value == ar[i]) { m_Value = ar[i]; return true; } else if (value == ar[i + 1]) { m_Value = ar[i + 1]; return true; } else if (value > ar[i] && value < ar[i + 1]) { (value - ar[i]) > (ar[i + 1] - value) ? m_Value = ar[i + 1] : m_Value = ar[i]; return true; } } } return false; } // 继续保留 TmplMouldWithWarn 的声明 template class TmplMouldWithWarn : public TmplMould { protected: T m_WarningMin; T m_WarningMax; T m_CalibWarningMin; T m_CalibWarningMax; T m_ErrorMin; T m_ErrorMax; public: std::function m_OnWarningMin; std::function m_OnWarningMax; std::function m_OnCalibWarningMin; std::function m_OnCalibWarningMax; std::function m_OnErrorMin; std::function m_OnErrorMax; public: using super = TmplMould; TmplMouldWithWarn(T init, T min, T WarnMin, T WarnMax, T CalibWarnMin, T CalibWarnMax, T max, T accuracy) : super(init, min, max, accuracy) { m_WarningMin = WarnMin; m_WarningMax = WarnMax; m_CalibWarningMin = CalibWarnMin; m_CalibWarningMax = CalibWarnMax; m_ErrorMin = min; m_ErrorMax = max; assert(m_CalibWarningMin < m_CalibWarningMax); assert(m_ErrorMin < m_ErrorMax); } }; } // namespace CCOS::Dev::Detail