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 20 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  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 IntInTheVariableRange
  10. {
  11. private int v;
  12. private int maxV;
  13. private readonly object vLock = new();
  14. public IntInTheVariableRange(int value, int maxValue)
  15. {
  16. if (maxValue < 0)
  17. {
  18. Debugger.Output("Warning:Try to set IntInTheVariableRange.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 IntInTheVariableRange(int maxValue)
  28. {
  29. if (maxValue < 0)
  30. {
  31. Debugger.Output("Warning:Try to set IntInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  32. maxValue = 0;
  33. }
  34. v = this.maxV = maxValue;
  35. }
  36. public IntInTheVariableRange()
  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(IntInTheVariableRange 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. if (v > maxV / mulV) v = maxV; //避免溢出
  152. else v *= mulV;
  153. }
  154. }
  155. /// <summary>
  156. /// 应当保证乘数大于0
  157. /// </summary>
  158. public void MulPositiveV(int mulPositiveV)
  159. {
  160. lock (vLock)
  161. {
  162. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  163. else v *= mulPositiveV;
  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. public bool Set0IfNotMax()
  209. {
  210. lock (vLock)
  211. {
  212. if (v < maxV)
  213. {
  214. v = 0;
  215. return true;
  216. }
  217. }
  218. return false;
  219. }
  220. public bool Set0IfMax()
  221. {
  222. lock (vLock)
  223. {
  224. if (v == maxV)
  225. {
  226. v = 0;
  227. return true;
  228. }
  229. }
  230. return false;
  231. }
  232. }
  233. /// <summary>
  234. /// 一个保证在[0,maxValue]的可变long,支持可变的maxValue(请确保大于0)
  235. /// </summary>
  236. public class LongInTheVariableRange
  237. {
  238. private long v;
  239. private long maxV;
  240. private readonly object vLock = new();
  241. public LongInTheVariableRange(long value, long maxValue)
  242. {
  243. if (maxValue < 0)
  244. {
  245. Debugger.Output("Warning:Try to set SafaValues.LongInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  246. maxValue = 0;
  247. }
  248. v = value < maxValue ? value : maxValue;
  249. this.maxV = maxValue;
  250. }
  251. /// <summary>
  252. /// 默认使Value=maxValue
  253. /// </summary>
  254. public LongInTheVariableRange(long maxValue)
  255. {
  256. if (maxValue < 0)
  257. {
  258. Debugger.Output("Warning:Try to set SafaValues.LongInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  259. maxValue = 0;
  260. }
  261. v = this.maxV = maxValue;
  262. }
  263. public LongInTheVariableRange()
  264. {
  265. v = this.maxV = long.MaxValue;
  266. }
  267. public override string ToString()
  268. {
  269. lock (vLock)
  270. {
  271. return "value:" + v.ToString() + " ,maxValue:" + maxV.ToString();
  272. }
  273. }
  274. public long GetValue() { lock (vLock) return v; }
  275. public static implicit operator long(LongInTheVariableRange aint) => aint.GetValue();
  276. public long GetMaxV() { lock (vLock) return maxV; }
  277. /// <summary>
  278. /// 若maxValue<=0则maxValue设为0并返回False
  279. /// </summary>
  280. public bool SetMaxV(long maxValue)
  281. {
  282. if (maxValue <= 0)
  283. {
  284. lock (vLock)
  285. {
  286. v = maxV = 0;
  287. return false;
  288. }
  289. }
  290. lock (vLock)
  291. {
  292. maxV = maxValue;
  293. if (v > maxValue) v = maxValue;
  294. }
  295. return true;
  296. }
  297. /// <summary>
  298. /// 应当保证该maxValue>=0
  299. /// </summary>
  300. public void SetPositiveMaxV(long maxValue)
  301. {
  302. lock (vLock)
  303. {
  304. maxV = maxValue;
  305. if (v > maxValue) v = maxValue;
  306. }
  307. }
  308. /// <summary>
  309. /// 如果当前值大于maxValue,则更新maxValue失败
  310. /// </summary>
  311. public bool TrySetMaxV(long maxValue)
  312. {
  313. lock (vLock)
  314. {
  315. if (v > maxValue) return false;
  316. maxV = maxValue;
  317. return true;
  318. }
  319. }
  320. /// <summary>
  321. /// 应当保证该value>=0
  322. /// </summary>
  323. public long SetPositiveV(long value)
  324. {
  325. lock (vLock)
  326. {
  327. return v = (value > maxV) ? maxV : value;
  328. }
  329. }
  330. public long SetV(long value)
  331. {
  332. if (value <= 0)
  333. {
  334. lock (vLock)
  335. {
  336. return v = 0;
  337. }
  338. }
  339. lock (vLock)
  340. {
  341. return v = (value > maxV) ? maxV : value;
  342. }
  343. }
  344. /// <returns>返回实际改变量</returns>
  345. public long AddV(long addV)
  346. {
  347. lock (vLock)
  348. {
  349. long previousV = v;
  350. v += addV;
  351. if (v < 0) v = 0;
  352. if (v > maxV) v = maxV;
  353. return v - previousV;
  354. }
  355. }
  356. /// <summary>
  357. /// 应当保证增加值大于0
  358. /// </summary>
  359. /// <returns>返回实际改变量</returns>
  360. public long AddPositiveV(long addPositiveV)
  361. {
  362. lock (vLock)
  363. {
  364. addPositiveV = Math.Min(addPositiveV, maxV - v);
  365. v += addPositiveV;
  366. }
  367. return addPositiveV;
  368. }
  369. public void MulV(long mulV)
  370. {
  371. if (mulV <= 0)
  372. {
  373. lock (vLock) v = 0;
  374. return;
  375. }
  376. lock (vLock)
  377. {
  378. if (v > maxV / mulV) v = maxV; //避免溢出
  379. else v *= mulV;
  380. }
  381. }
  382. /// <summary>
  383. /// 应当保证乘数大于0
  384. /// </summary>
  385. public void MulPositiveV(long mulPositiveV)
  386. {
  387. lock (vLock)
  388. {
  389. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  390. else v *= mulPositiveV;
  391. }
  392. }
  393. /// <returns>返回实际改变量</returns>
  394. public long SubV(long subV)
  395. {
  396. lock (vLock)
  397. {
  398. long previousV = v;
  399. v -= subV;
  400. if (v < 0) v = 0;
  401. if (v > maxV) v = maxV;
  402. return v - previousV;
  403. }
  404. }
  405. /// <summary>
  406. /// 应当保证该减少值大于0
  407. /// </summary>
  408. /// <returns>返回实际改变量</returns>
  409. public long SubPositiveV(long subPositiveV)
  410. {
  411. lock (vLock)
  412. {
  413. subPositiveV = Math.Min(subPositiveV, v);
  414. v -= subPositiveV;
  415. }
  416. return subPositiveV;
  417. }
  418. /// <summary>
  419. /// 试图加到满,如果无法加到maxValue则不加并返回-1
  420. /// </summary>
  421. /// <returns>返回实际改变量</returns>
  422. public long TryAddToMaxV(long addV)
  423. {
  424. lock (vLock)
  425. {
  426. if (maxV - v <= addV)
  427. {
  428. addV = maxV - v;
  429. v = maxV;
  430. return addV;
  431. }
  432. return -1;
  433. }
  434. }
  435. public bool Set0IfNotMax()
  436. {
  437. lock (vLock)
  438. {
  439. if (v < maxV)
  440. {
  441. v = 0;
  442. return true;
  443. }
  444. }
  445. return false;
  446. }
  447. public bool Set0IfMax()
  448. {
  449. lock (vLock)
  450. {
  451. if (v == maxV)
  452. {
  453. v = 0;
  454. return true;
  455. }
  456. }
  457. return false;
  458. }
  459. }
  460. /// <summary>
  461. /// 一个保证在[0,maxValue]的可变double,支持可变的maxValue(请确保大于0)
  462. /// </summary>
  463. public class DoubleInTheVariableRange
  464. {
  465. private double v;
  466. private double maxV;
  467. private readonly object vLock = new();
  468. public DoubleInTheVariableRange(double value, double maxValue)
  469. {
  470. if (maxValue < 0)
  471. {
  472. Debugger.Output("Warning:Try to set DoubleInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  473. maxValue = 0;
  474. }
  475. v = value < maxValue ? value : maxValue;
  476. this.maxV = maxValue;
  477. }
  478. /// <summary>
  479. /// 默认使Value=maxValue
  480. /// </summary>
  481. public DoubleInTheVariableRange(double maxValue)
  482. {
  483. if (maxValue < 0)
  484. {
  485. Debugger.Output("Warning:Try to set DoubleInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  486. maxValue = 0;
  487. }
  488. v = this.maxV = maxValue;
  489. }
  490. public DoubleInTheVariableRange()
  491. {
  492. v = this.maxV = double.MaxValue;
  493. }
  494. public override string ToString()
  495. {
  496. lock (vLock)
  497. {
  498. return "value:" + v.ToString() + " ,maxValue:" + maxV.ToString();
  499. }
  500. }
  501. public double GetValue() { lock (vLock) return v; }
  502. public static implicit operator double(DoubleInTheVariableRange adouble) => adouble.GetValue();
  503. public double GetMaxV() { lock (vLock) return maxV; }
  504. /// <summary>
  505. /// 若maxValue<=0则maxValue设为0并返回False
  506. /// </summary>
  507. public bool SetMaxV(double maxValue)
  508. {
  509. if (maxValue <= 0)
  510. {
  511. lock (vLock)
  512. {
  513. v = maxV = 0;
  514. return false;
  515. }
  516. }
  517. lock (vLock)
  518. {
  519. maxV = maxValue;
  520. if (v > maxValue) v = maxValue;
  521. }
  522. return true;
  523. }
  524. /// <summary>
  525. /// 应当保证该maxValue>=0
  526. /// </summary>
  527. public void SetPositiveMaxV(double maxValue)
  528. {
  529. lock (vLock)
  530. {
  531. maxV = maxValue;
  532. if (v > maxValue) v = maxValue;
  533. }
  534. }
  535. /// <summary>
  536. /// 如果当前值大于maxValue,则更新maxValue失败
  537. /// </summary>
  538. public bool TrySetMaxV(double maxValue)
  539. {
  540. lock (vLock)
  541. {
  542. if (v > maxValue) return false;
  543. maxV = maxValue;
  544. return true;
  545. }
  546. }
  547. /// <summary>
  548. /// 应当保证该value>=0
  549. /// </summary>
  550. public double SetPositiveV(double value)
  551. {
  552. lock (vLock)
  553. {
  554. return v = (value > maxV) ? maxV : value;
  555. }
  556. }
  557. public double SetV(double value)
  558. {
  559. if (value <= 0)
  560. {
  561. lock (vLock)
  562. {
  563. return v = 0;
  564. }
  565. }
  566. lock (vLock)
  567. {
  568. return v = (value > maxV) ? maxV : value;
  569. }
  570. }
  571. /// <returns>返回实际改变量</returns>
  572. public double AddV(double addV)
  573. {
  574. lock (vLock)
  575. {
  576. double previousV = v;
  577. v += addV;
  578. if (v < 0) v = 0;
  579. if (v > maxV) v = maxV;
  580. return v - previousV;
  581. }
  582. }
  583. /// <summary>
  584. /// 应当保证增加值大于0
  585. /// </summary>
  586. /// <returns>返回实际改变量</returns>
  587. public double AddPositiveV(double addPositiveV)
  588. {
  589. lock (vLock)
  590. {
  591. addPositiveV = Math.Min(addPositiveV, maxV - v);
  592. v += addPositiveV;
  593. }
  594. return addPositiveV;
  595. }
  596. public void MulV(double mulV)
  597. {
  598. if (mulV <= 0)
  599. {
  600. lock (vLock) v = 0;
  601. return;
  602. }
  603. lock (vLock)
  604. {
  605. if (v > maxV / mulV) v = maxV; //避免溢出
  606. else v *= mulV;
  607. }
  608. }
  609. /// <summary>
  610. /// 应当保证乘数大于0
  611. /// </summary>
  612. public void MulPositiveV(double mulPositiveV)
  613. {
  614. lock (vLock)
  615. {
  616. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  617. else v *= mulPositiveV;
  618. }
  619. }
  620. /// <returns>返回实际改变量</returns>
  621. public double SubV(double subV)
  622. {
  623. lock (vLock)
  624. {
  625. double previousV = v;
  626. v -= subV;
  627. if (v < 0) v = 0;
  628. if (v > maxV) v = maxV;
  629. return v - previousV;
  630. }
  631. }
  632. /// <summary>
  633. /// 应当保证该减少值大于0
  634. /// </summary>
  635. /// <returns>返回实际改变量</returns>
  636. public double SubPositiveV(double subPositiveV)
  637. {
  638. lock (vLock)
  639. {
  640. subPositiveV = Math.Min(subPositiveV, v);
  641. v -= subPositiveV;
  642. }
  643. return subPositiveV;
  644. }
  645. /// <summary>
  646. /// 试图加到满,如果无法加到maxValue则不加并返回-1
  647. /// </summary>
  648. /// <returns>返回实际改变量</returns>
  649. public double TryAddToMaxV(double addV)
  650. {
  651. lock (vLock)
  652. {
  653. if (maxV - v <= addV)
  654. {
  655. addV = maxV - v;
  656. v = maxV;
  657. return addV;
  658. }
  659. return -1;
  660. }
  661. }
  662. public bool Set0IfNotMax()
  663. {
  664. lock (vLock)
  665. {
  666. if (v < maxV)
  667. {
  668. v = 0;
  669. return true;
  670. }
  671. }
  672. return false;
  673. }
  674. public bool Set0IfMax()
  675. {
  676. lock (vLock)
  677. {
  678. if (v == maxV)
  679. {
  680. v = 0;
  681. return true;
  682. }
  683. }
  684. return false;
  685. }
  686. }
  687. }