TmplMould.tli 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. //
  2. #pragma once
  3. #include "TmplMould.tlh"
  4. //-----------------------------------------------------------------------------
  5. // TmplMould
  6. //-----------------------------------------------------------------------------
  7. namespace DIOS::Dev::Detail
  8. {
  9. template <typename T>
  10. bool TmplMould <T>::CanInc () const
  11. {
  12. return m_Value < m_LimitMax;
  13. }
  14. template <typename T>
  15. bool TmplMould <T>::CanDec () const
  16. {
  17. return m_Value > m_LimitMin;
  18. }
  19. template <typename T>
  20. bool TmplMould <T>::Verify (T value) const
  21. {
  22. return (m_LimitMin <= value && value <= m_LimitMax);
  23. }
  24. template <typename T>
  25. bool TmplMould <T>::Inc ()
  26. {
  27. if (m_Value >= m_LimitMax) return false;
  28. m_Value += m_Accuracy;
  29. return true;
  30. }
  31. template <typename T>
  32. bool TmplMould <T>::Dec ()
  33. {
  34. if (m_Value <= m_LimitMin) return false;
  35. m_Value -= m_Accuracy;
  36. return true;
  37. }
  38. template <typename T>
  39. bool TmplMould <T>::Update (T value)
  40. {
  41. if (value < m_LimitMin) return false;
  42. if (value > m_LimitMax) return false;
  43. if(value== m_Value) return false;
  44. m_Value = value;
  45. return true;
  46. }
  47. template <typename T>
  48. bool TmplMould <T>::UpdateLimitMax(T value)
  49. {
  50. m_LimitMax = value;
  51. return true;
  52. }
  53. template <typename T>
  54. bool TmplMould <T>::UpdateLimitMin(T value)
  55. {
  56. m_LimitMin = value;
  57. return true;
  58. }
  59. template <typename T>
  60. T TmplMould <T>::Get () const { return m_Value; }
  61. template <typename T>
  62. T TmplMould <T>::GetLimitMax() const { return m_LimitMax; }
  63. template <typename T>
  64. T TmplMould <T>::GetLimitMin() const { return m_LimitMin; }
  65. //change by wxx for 万东:丰富基类方法(要求ar按从小到大排列) 20230803
  66. template <typename T>
  67. bool TmplMould <T>::CanToNext(T & value, const std::vector <typename T>& ar)
  68. {
  69. value = m_Value;
  70. int setSize = ar.size();
  71. for (int i = 0; i < setSize; i++)
  72. {
  73. if (ar[i] == value)
  74. {
  75. if (i < setSize - 1)
  76. {
  77. value = ar[i + 1];
  78. return (m_LimitMin <= value && value <= m_LimitMax);
  79. }
  80. }
  81. else if (ar[i] - value > FLT_MIN)
  82. {
  83. value = ar[i];
  84. return (m_LimitMin <= value && value <= m_LimitMax);
  85. }
  86. }
  87. return false;
  88. }
  89. template <typename T>
  90. bool TmplMould <T>::CanToPrev(T & value, const std::vector <typename T>& ar)
  91. {
  92. value = m_Value;
  93. int setSize = ar.size();
  94. for (int i = setSize - 1; i >=0; i--)
  95. {
  96. if (ar[i] == value)
  97. {
  98. if (i > 0)
  99. {
  100. value = ar[i - 1];
  101. return (m_LimitMin <= value && value <= m_LimitMax);
  102. }
  103. }
  104. else if (value - ar[i] > FLT_MIN)
  105. {
  106. value = ar[i];
  107. return (m_LimitMin <= value && value <= m_LimitMax);
  108. }
  109. }
  110. return false;
  111. }
  112. template <typename T>
  113. bool TmplMould <T>::CanToUpdate(T & value, const std::vector <typename T>& ar)
  114. {
  115. int setSize = ar.size();
  116. if (value <= ar[0])
  117. {
  118. value = ar[0];
  119. return (m_LimitMin <= value && value <= m_LimitMax);;
  120. }
  121. else if (value >= ar[setSize - 1])
  122. {
  123. value = ar[setSize - 1];
  124. return (m_LimitMin <= value && value <= m_LimitMax);
  125. }
  126. else
  127. {
  128. for (int i = 0; i < setSize - 1; i++)
  129. {
  130. if (value == ar[i])
  131. {
  132. value = ar[i];
  133. return (m_LimitMin <= value && value <= m_LimitMax);
  134. }
  135. else if (value == ar[i + 1])
  136. {
  137. value = ar[i + 1];
  138. return (m_LimitMin <= value && value <= m_LimitMax);
  139. }
  140. else if (value > ar[i] && value < ar[i + 1])
  141. {
  142. (value - ar[i]) > (ar[i + 1] - value) ? value = ar[i + 1] : value = ar[i];
  143. return (m_LimitMin <= value && value <= m_LimitMax);
  144. }
  145. }
  146. }
  147. return false;
  148. }
  149. template <typename T>
  150. bool TmplMould <T>::ToNext (const std::vector <typename T>& ar)
  151. {
  152. int setSize = ar.size();
  153. for (int i = 0; i < setSize; i++)
  154. {
  155. if (ar[i] == m_Value)
  156. {
  157. if (i < setSize - 1)
  158. {
  159. m_Value = ar[i + 1];
  160. return true;
  161. }
  162. }
  163. else if (ar[i] - m_Value > FLT_MIN)
  164. {
  165. m_Value = ar[i];
  166. return true;
  167. }
  168. }
  169. return false;
  170. }
  171. template <typename T>
  172. bool TmplMould <T>::ToPrev (const std::vector <typename T>& ar)
  173. {
  174. int setSize = ar.size();
  175. for (int i = setSize - 1; i >= 0; i--)
  176. {
  177. if (ar[i] == m_Value)
  178. {
  179. if (i > 0)
  180. {
  181. m_Value = ar[i - 1];
  182. return true;
  183. }
  184. }
  185. else if (m_Value - ar[i] > FLT_MIN)
  186. {
  187. m_Value = ar[i];
  188. return true;
  189. }
  190. }
  191. return false;
  192. }
  193. template <typename T>
  194. bool TmplMould <T>::ToUpdate (T value, const std::vector <typename T>& ar)
  195. {
  196. int setSize = ar.size();
  197. if (value <= ar[0])
  198. {
  199. m_Value = ar[0];
  200. return true;
  201. }
  202. else if(value >= ar[setSize -1])
  203. {
  204. m_Value = ar[setSize - 1];
  205. return true;
  206. }
  207. else
  208. {
  209. for (int i = 0; i < setSize - 1; i++)
  210. {
  211. if (value == ar[i])
  212. {
  213. m_Value = ar[i];
  214. return true;
  215. }
  216. else if (value == ar[i+1])
  217. {
  218. m_Value = ar[i+1];
  219. return true;
  220. }
  221. else if (value > ar[i] && value < ar[i + 1])
  222. {
  223. (value - ar[i]) > (ar[i + 1] - value) ? m_Value = ar[i + 1] : m_Value = ar[i];
  224. return true;
  225. }
  226. }
  227. }
  228. return false;
  229. }
  230. };