// #pragma once #include "TmplMould.tlh" //----------------------------------------------------------------------------- // TmplMould //----------------------------------------------------------------------------- namespace DIOS::Dev::Detail { 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; } //change by wxx for 万东:丰富基类方法(要求ar按从小到大排列) 20230803 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 (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 (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; } };