You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

InTheRange.cs 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. using System;
  2. using System.Threading;
  3. namespace Preparation.Utility
  4. {
  5. //其对应属性不应当有set访问器,避免不安全的=赋值
  6. /// <summary>
  7. /// 一个保证在[0,maxValue]的可变int,支持可变的maxValue(请确保大于0)
  8. /// </summary>
  9. public class IntWithVariableRange
  10. {
  11. private int v;
  12. private int maxV;
  13. private readonly object vLock = new();
  14. public IntWithVariableRange(int value, int maxValue)
  15. {
  16. if (maxValue < 0)
  17. {
  18. Debugger.Output("Warning:Try to set IntWithVariableRange.maxValue to " + maxValue.ToString() + ".");
  19. maxValue = 0;
  20. }
  21. v = value < maxValue ? value : maxValue;
  22. this.maxV = maxValue;
  23. }
  24. /// <summary>
  25. /// 默认使Value=maxValue
  26. /// </summary>
  27. public IntWithVariableRange(int maxValue)
  28. {
  29. if (maxValue < 0)
  30. {
  31. Debugger.Output("Warning:Try to set IntWithVariableRange.maxValue to " + maxValue.ToString() + ".");
  32. maxValue = 0;
  33. }
  34. v = this.maxV = maxValue;
  35. }
  36. public IntWithVariableRange()
  37. {
  38. v = this.maxV = int.MaxValue;
  39. }
  40. public override string ToString()
  41. {
  42. lock (vLock)
  43. {
  44. return "value:" + v.ToString() + " ,maxValue:" + maxV.ToString();
  45. }
  46. }
  47. public int GetValue() { lock (vLock) return v; }
  48. public static implicit operator int(IntWithVariableRange aint) => aint.GetValue();
  49. public int GetMaxV() { lock (vLock) return maxV; }
  50. /// <summary>
  51. /// 若maxValue<=0则maxValue设为0并返回False
  52. /// </summary>
  53. public bool SetMaxV(int maxValue)
  54. {
  55. if (maxValue <= 0)
  56. {
  57. lock (vLock)
  58. {
  59. v = maxV = 0;
  60. return false;
  61. }
  62. }
  63. lock (vLock)
  64. {
  65. maxV = maxValue;
  66. if (v > maxValue) v = maxValue;
  67. }
  68. return true;
  69. }
  70. /// <summary>
  71. /// 应当保证该maxValue>=0
  72. /// </summary>
  73. public void SetPositiveMaxV(int maxValue)
  74. {
  75. lock (vLock)
  76. {
  77. maxV = maxValue;
  78. if (v > maxValue) v = maxValue;
  79. }
  80. }
  81. /// <summary>
  82. /// 如果当前值大于maxValue,则更新maxValue失败
  83. /// </summary>
  84. public bool TrySetMaxV(int maxValue)
  85. {
  86. lock (vLock)
  87. {
  88. if (v > maxValue) return false;
  89. maxV = maxValue;
  90. return true;
  91. }
  92. }
  93. /// <summary>
  94. /// 应当保证该value>=0
  95. /// </summary>
  96. public int SetPositiveV(int value)
  97. {
  98. lock (vLock)
  99. {
  100. return v = (value > maxV) ? maxV : value;
  101. }
  102. }
  103. public int SetV(int value)
  104. {
  105. if (value <= 0)
  106. {
  107. lock (vLock)
  108. {
  109. return v = 0;
  110. }
  111. }
  112. lock (vLock)
  113. {
  114. return v = (value > maxV) ? maxV : value;
  115. }
  116. }
  117. /// <returns>返回实际改变量</returns>
  118. public int AddV(int addV)
  119. {
  120. lock (vLock)
  121. {
  122. int previousV = v;
  123. v += addV;
  124. if (v < 0) v = 0;
  125. if (v > maxV) v = maxV;
  126. return v - previousV;
  127. }
  128. }
  129. /// <summary>
  130. /// 应当保证增加值大于0
  131. /// </summary>
  132. /// <returns>返回实际改变量</returns>
  133. public int AddPositiveV(int addPositiveV)
  134. {
  135. lock (vLock)
  136. {
  137. addPositiveV = Math.Min(addPositiveV, maxV - v);
  138. v += addPositiveV;
  139. }
  140. return addPositiveV;
  141. }
  142. public void MulV(int mulV)
  143. {
  144. if (mulV <= 0)
  145. {
  146. lock (vLock) v = 0;
  147. return;
  148. }
  149. lock (vLock)
  150. {
  151. v *= mulV;
  152. if (v > maxV) v = maxV;
  153. }
  154. }
  155. /// <summary>
  156. /// 应当保证乘数大于0
  157. /// </summary>
  158. public void MulPositiveV(int mulPositiveV)
  159. {
  160. lock (vLock)
  161. {
  162. v *= mulPositiveV;
  163. if (v > maxV) v = maxV;
  164. }
  165. }
  166. /// <returns>返回实际改变量</returns>
  167. public int SubV(int subV)
  168. {
  169. lock (vLock)
  170. {
  171. int previousV = v;
  172. v -= subV;
  173. if (v < 0) v = 0;
  174. if (v > maxV) v = maxV;
  175. return v - previousV;
  176. }
  177. }
  178. /// <summary>
  179. /// 应当保证该减少值大于0
  180. /// </summary>
  181. /// <returns>返回实际改变量</returns>
  182. public int SubPositiveV(int subPositiveV)
  183. {
  184. lock (vLock)
  185. {
  186. subPositiveV = Math.Min(subPositiveV, v);
  187. v -= subPositiveV;
  188. }
  189. return subPositiveV;
  190. }
  191. /// <summary>
  192. /// 试图加到满,如果无法加到maxValue则不加并返回-1
  193. /// </summary>
  194. /// <returns>返回实际改变量</returns>
  195. public int TryAddToMaxV(int addV)
  196. {
  197. lock (vLock)
  198. {
  199. if (maxV - v <= addV)
  200. {
  201. addV = maxV - v;
  202. v = maxV;
  203. return addV;
  204. }
  205. return -1;
  206. }
  207. }
  208. }
  209. /// <summary>
  210. /// 一个保证在[0,maxValue]的可变long,支持可变的maxValue(请确保大于0)
  211. /// </summary>
  212. public class LongWithVariableRange
  213. {
  214. private long v;
  215. private long maxV;
  216. private readonly object vLock = new();
  217. public LongWithVariableRange(long value, long maxValue)
  218. {
  219. if (maxValue < 0)
  220. {
  221. Debugger.Output("Warning:Try to set SafaValues.LongWithVariableRange.maxValue to " + maxValue.ToString() + ".");
  222. maxValue = 0;
  223. }
  224. v = value < maxValue ? value : maxValue;
  225. this.maxV = maxValue;
  226. }
  227. /// <summary>
  228. /// 默认使Value=maxValue
  229. /// </summary>
  230. public LongWithVariableRange(long maxValue)
  231. {
  232. if (maxValue < 0)
  233. {
  234. Debugger.Output("Warning:Try to set SafaValues.LongWithVariableRange.maxValue to " + maxValue.ToString() + ".");
  235. maxValue = 0;
  236. }
  237. v = this.maxV = maxValue;
  238. }
  239. public LongWithVariableRange()
  240. {
  241. v = this.maxV = long.MaxValue;
  242. }
  243. public override string ToString()
  244. {
  245. lock (vLock)
  246. {
  247. return "value:" + v.ToString() + " ,maxValue:" + maxV.ToString();
  248. }
  249. }
  250. public long GetValue() { lock (vLock) return v; }
  251. public static implicit operator long(LongWithVariableRange aint) => aint.GetValue();
  252. public long GetMaxV() { lock (vLock) return maxV; }
  253. /// <summary>
  254. /// 若maxValue<=0则maxValue设为0并返回False
  255. /// </summary>
  256. public bool SetMaxV(long maxValue)
  257. {
  258. if (maxValue <= 0)
  259. {
  260. lock (vLock)
  261. {
  262. v = maxV = 0;
  263. return false;
  264. }
  265. }
  266. lock (vLock)
  267. {
  268. maxV = maxValue;
  269. if (v > maxValue) v = maxValue;
  270. }
  271. return true;
  272. }
  273. /// <summary>
  274. /// 应当保证该maxValue>=0
  275. /// </summary>
  276. public void SetPositiveMaxV(long maxValue)
  277. {
  278. lock (vLock)
  279. {
  280. maxV = maxValue;
  281. if (v > maxValue) v = maxValue;
  282. }
  283. }
  284. /// <summary>
  285. /// 如果当前值大于maxValue,则更新maxValue失败
  286. /// </summary>
  287. public bool TrySetMaxV(long maxValue)
  288. {
  289. lock (vLock)
  290. {
  291. if (v > maxValue) return false;
  292. maxV = maxValue;
  293. return true;
  294. }
  295. }
  296. /// <summary>
  297. /// 应当保证该value>=0
  298. /// </summary>
  299. public long SetPositiveV(long value)
  300. {
  301. lock (vLock)
  302. {
  303. return v = (value > maxV) ? maxV : value;
  304. }
  305. }
  306. public long SetV(long value)
  307. {
  308. if (value <= 0)
  309. {
  310. lock (vLock)
  311. {
  312. return v = 0;
  313. }
  314. }
  315. lock (vLock)
  316. {
  317. return v = (value > maxV) ? maxV : value;
  318. }
  319. }
  320. /// <returns>返回实际改变量</returns>
  321. public long AddV(long addV)
  322. {
  323. lock (vLock)
  324. {
  325. long previousV = v;
  326. v += addV;
  327. if (v < 0) v = 0;
  328. if (v > maxV) v = maxV;
  329. return v - previousV;
  330. }
  331. }
  332. /// <summary>
  333. /// 应当保证增加值大于0
  334. /// </summary>
  335. /// <returns>返回实际改变量</returns>
  336. public long AddPositiveV(long addPositiveV)
  337. {
  338. lock (vLock)
  339. {
  340. addPositiveV = Math.Min(addPositiveV, maxV - v);
  341. v += addPositiveV;
  342. }
  343. return addPositiveV;
  344. }
  345. public void MulV(long mulV)
  346. {
  347. if (mulV <= 0)
  348. {
  349. lock (vLock) v = 0;
  350. return;
  351. }
  352. lock (vLock)
  353. {
  354. v *= mulV;
  355. if (v > maxV) v = maxV;
  356. }
  357. }
  358. /// <summary>
  359. /// 应当保证乘数大于0
  360. /// </summary>
  361. public void MulPositiveV(long mulPositiveV)
  362. {
  363. lock (vLock)
  364. {
  365. v *= mulPositiveV;
  366. if (v > maxV) v = maxV;
  367. }
  368. }
  369. /// <returns>返回实际改变量</returns>
  370. public long SubV(long subV)
  371. {
  372. lock (vLock)
  373. {
  374. long previousV = v;
  375. v -= subV;
  376. if (v < 0) v = 0;
  377. if (v > maxV) v = maxV;
  378. return v - previousV;
  379. }
  380. }
  381. /// <summary>
  382. /// 应当保证该减少值大于0
  383. /// </summary>
  384. /// <returns>返回实际改变量</returns>
  385. public long SubPositiveV(long subPositiveV)
  386. {
  387. lock (vLock)
  388. {
  389. subPositiveV = Math.Min(subPositiveV, v);
  390. v -= subPositiveV;
  391. }
  392. return subPositiveV;
  393. }
  394. /// <summary>
  395. /// 试图加到满,如果无法加到maxValue则不加并返回-1
  396. /// </summary>
  397. /// <returns>返回实际改变量</returns>
  398. public long TryAddToMaxV(long addV)
  399. {
  400. lock (vLock)
  401. {
  402. if (maxV - v <= addV)
  403. {
  404. addV = maxV - v;
  405. v = maxV;
  406. return addV;
  407. }
  408. return -1;
  409. }
  410. }
  411. }
  412. }