TmplMould.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. #pragma once
  2. #include <assert.h>
  3. #include <cfloat> // 添加FLT_MIN所需头文件
  4. #include <vector>
  5. #include <functional>
  6. namespace CCOS::Dev::Detail
  7. {
  8. template <typename T>
  9. class TmplMould
  10. {
  11. public:
  12. TmplMould(T init, T min, T max, T accuracy)
  13. {
  14. m_Value = init;
  15. m_LimitMin = min;
  16. m_LimitMax = max;
  17. m_Accuracy = accuracy;
  18. assert(m_LimitMin < m_LimitMax);
  19. }
  20. virtual ~TmplMould() {}
  21. public:
  22. bool CanInc() const;
  23. bool CanDec() const;
  24. bool Verify(T value) const;
  25. bool Inc();
  26. bool Dec();
  27. bool Update(T value);
  28. bool UpdateLimitMax(T value);
  29. bool UpdateLimitMin(T value);
  30. T Get() const;
  31. T GetLimitMax() const;
  32. T GetLimitMin() const;
  33. bool ToNext(const std::vector<T>& ar);
  34. bool ToPrev(const std::vector<T>& ar);
  35. bool ToUpdate(T value, const std::vector<T>& ar);
  36. bool CanToNext(T& value, const std::vector<T>& ar);
  37. bool CanToPrev(T& value, const std::vector<T>& ar);
  38. bool CanToUpdate(T& value, const std::vector<T>& ar);
  39. protected:
  40. T m_LimitMin;
  41. T m_LimitMax;
  42. T m_Accuracy;
  43. T m_Value;
  44. };
  45. // 模板成员函数实现直接放在头文件中
  46. template <typename T>
  47. bool TmplMould<T>::CanInc() const
  48. {
  49. return m_Value < m_LimitMax;
  50. }
  51. template <typename T>
  52. bool TmplMould<T>::CanDec() const
  53. {
  54. return m_Value > m_LimitMin;
  55. }
  56. template <typename T>
  57. bool TmplMould<T>::Verify(T value) const
  58. {
  59. return (m_LimitMin <= value && value <= m_LimitMax);
  60. }
  61. template <typename T>
  62. bool TmplMould<T>::Inc()
  63. {
  64. if (m_Value >= m_LimitMax) return false;
  65. m_Value += m_Accuracy;
  66. return true;
  67. }
  68. template <typename T>
  69. bool TmplMould<T>::Dec()
  70. {
  71. if (m_Value <= m_LimitMin) return false;
  72. m_Value -= m_Accuracy;
  73. return true;
  74. }
  75. template <typename T>
  76. bool TmplMould<T>::Update(T value)
  77. {
  78. if (value < m_LimitMin) return false;
  79. if (value > m_LimitMax) return false;
  80. if (value == m_Value) return false;
  81. m_Value = value;
  82. return true;
  83. }
  84. template <typename T>
  85. bool TmplMould<T>::UpdateLimitMax(T value)
  86. {
  87. m_LimitMax = value;
  88. return true;
  89. }
  90. template <typename T>
  91. bool TmplMould<T>::UpdateLimitMin(T value)
  92. {
  93. m_LimitMin = value;
  94. return true;
  95. }
  96. template <typename T>
  97. T TmplMould<T>::Get() const { return m_Value; }
  98. template <typename T>
  99. T TmplMould<T>::GetLimitMax() const { return m_LimitMax; }
  100. template <typename T>
  101. T TmplMould<T>::GetLimitMin() const { return m_LimitMin; }
  102. template <typename T>
  103. bool TmplMould<T>::CanToNext(T& value, const std::vector<T>& ar)
  104. {
  105. value = m_Value;
  106. int setSize = ar.size();
  107. for (int i = 0; i < setSize; i++)
  108. {
  109. if (ar[i] == value)
  110. {
  111. if (i < setSize - 1)
  112. {
  113. value = ar[i + 1];
  114. return (m_LimitMin <= value && value <= m_LimitMax);
  115. }
  116. }
  117. else if (ar[i] - value > FLT_MIN)
  118. {
  119. value = ar[i];
  120. return (m_LimitMin <= value && value <= m_LimitMax);
  121. }
  122. }
  123. return false;
  124. }
  125. template <typename T>
  126. bool TmplMould<T>::CanToPrev(T& value, const std::vector<T>& ar)
  127. {
  128. value = m_Value;
  129. int setSize = ar.size();
  130. for (int i = setSize - 1; i >= 0; i--)
  131. {
  132. if (ar[i] == value)
  133. {
  134. if (i > 0)
  135. {
  136. value = ar[i - 1];
  137. return (m_LimitMin <= value && value <= m_LimitMax);
  138. }
  139. }
  140. else if (value - ar[i] > FLT_MIN)
  141. {
  142. value = ar[i];
  143. return (m_LimitMin <= value && value <= m_LimitMax);
  144. }
  145. }
  146. return false;
  147. }
  148. template <typename T>
  149. bool TmplMould<T>::CanToUpdate(T& value, const std::vector<T>& ar)
  150. {
  151. int setSize = ar.size();
  152. if (setSize == 0) return false; // 添加空数组保护
  153. if (value <= ar[0])
  154. {
  155. value = ar[0];
  156. return (m_LimitMin <= value && value <= m_LimitMax);
  157. }
  158. else if (value >= ar[setSize - 1])
  159. {
  160. value = ar[setSize - 1];
  161. return (m_LimitMin <= value && value <= m_LimitMax);
  162. }
  163. else
  164. {
  165. for (int i = 0; i < setSize - 1; i++)
  166. {
  167. if (value == ar[i])
  168. {
  169. value = ar[i];
  170. return (m_LimitMin <= value && value <= m_LimitMax);
  171. }
  172. else if (value == ar[i + 1])
  173. {
  174. value = ar[i + 1];
  175. return (m_LimitMin <= value && value <= m_LimitMax);
  176. }
  177. else if (value > ar[i] && value < ar[i + 1])
  178. {
  179. (value - ar[i]) > (ar[i + 1] - value) ? value = ar[i + 1] : value = ar[i];
  180. return (m_LimitMin <= value && value <= m_LimitMax);
  181. }
  182. }
  183. }
  184. return false;
  185. }
  186. template <typename T>
  187. bool TmplMould<T>::ToNext(const std::vector<T>& ar)
  188. {
  189. int setSize = ar.size();
  190. for (int i = 0; i < setSize; i++)
  191. {
  192. if (ar[i] == m_Value)
  193. {
  194. if (i < setSize - 1)
  195. {
  196. m_Value = ar[i + 1];
  197. return true;
  198. }
  199. }
  200. else if (ar[i] - m_Value > FLT_MIN)
  201. {
  202. m_Value = ar[i];
  203. return true;
  204. }
  205. }
  206. return false;
  207. }
  208. template <typename T>
  209. bool TmplMould<T>::ToPrev(const std::vector<T>& ar)
  210. {
  211. int setSize = ar.size();
  212. for (int i = setSize - 1; i >= 0; i--)
  213. {
  214. if (ar[i] == m_Value)
  215. {
  216. if (i > 0)
  217. {
  218. m_Value = ar[i - 1];
  219. return true;
  220. }
  221. }
  222. else if (m_Value - ar[i] > FLT_MIN)
  223. {
  224. m_Value = ar[i];
  225. return true;
  226. }
  227. }
  228. return false;
  229. }
  230. template <typename T>
  231. bool TmplMould<T>::ToUpdate(T value, const std::vector<T>& ar)
  232. {
  233. int setSize = ar.size();
  234. if (setSize == 0) return false; // 添加空数组保护
  235. if (value <= ar[0])
  236. {
  237. m_Value = ar[0];
  238. return true;
  239. }
  240. else if (value >= ar[setSize - 1])
  241. {
  242. m_Value = ar[setSize - 1];
  243. return true;
  244. }
  245. else
  246. {
  247. for (int i = 0; i < setSize - 1; i++)
  248. {
  249. if (value == ar[i])
  250. {
  251. m_Value = ar[i];
  252. return true;
  253. }
  254. else if (value == ar[i + 1])
  255. {
  256. m_Value = ar[i + 1];
  257. return true;
  258. }
  259. else if (value > ar[i] && value < ar[i + 1])
  260. {
  261. (value - ar[i]) > (ar[i + 1] - value) ? m_Value = ar[i + 1] : m_Value = ar[i];
  262. return true;
  263. }
  264. }
  265. }
  266. return false;
  267. }
  268. // 继续保留 TmplMouldWithWarn 的声明
  269. template <typename T>
  270. class TmplMouldWithWarn : public TmplMould<T>
  271. {
  272. protected:
  273. T m_WarningMin;
  274. T m_WarningMax;
  275. T m_CalibWarningMin;
  276. T m_CalibWarningMax;
  277. T m_ErrorMin;
  278. T m_ErrorMax;
  279. public:
  280. std::function<void()> m_OnWarningMin;
  281. std::function<void()> m_OnWarningMax;
  282. std::function<void()> m_OnCalibWarningMin;
  283. std::function<void()> m_OnCalibWarningMax;
  284. std::function<void()> m_OnErrorMin;
  285. std::function<void()> m_OnErrorMax;
  286. public:
  287. using super = TmplMould<T>;
  288. TmplMouldWithWarn(T init, T min, T WarnMin, T WarnMax, T CalibWarnMin, T CalibWarnMax, T max, T accuracy)
  289. : super(init, min, max, accuracy)
  290. {
  291. m_WarningMin = WarnMin;
  292. m_WarningMax = WarnMax;
  293. m_CalibWarningMin = CalibWarnMin;
  294. m_CalibWarningMax = CalibWarnMax;
  295. m_ErrorMin = min;
  296. m_ErrorMax = max;
  297. assert(m_CalibWarningMin < m_CalibWarningMax);
  298. assert(m_ErrorMin < m_ErrorMax);
  299. }
  300. };
  301. } // namespace CCOS::Dev::Detail