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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  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. #region 构造与读取
  15. public IntInTheVariableRange(int value, int maxValue)
  16. {
  17. if (maxValue < 0)
  18. {
  19. Debugger.Output("Warning:Try to set IntInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  20. maxValue = 0;
  21. }
  22. v = value < maxValue ? value : maxValue;
  23. this.maxV = maxValue;
  24. }
  25. /// <summary>
  26. /// 默认使Value=maxValue
  27. /// </summary>
  28. public IntInTheVariableRange(int maxValue)
  29. {
  30. if (maxValue < 0)
  31. {
  32. Debugger.Output("Warning:Try to set IntInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  33. maxValue = 0;
  34. }
  35. v = this.maxV = maxValue;
  36. }
  37. public IntInTheVariableRange()
  38. {
  39. v = this.maxV = int.MaxValue;
  40. }
  41. public override string ToString()
  42. {
  43. lock (vLock)
  44. {
  45. return "value:" + v.ToString() + " ,maxValue:" + maxV.ToString();
  46. }
  47. }
  48. public int GetValue() { lock (vLock) return v; }
  49. public static implicit operator int(IntInTheVariableRange aint) => aint.GetValue();
  50. public int GetMaxV() { lock (vLock) return maxV; }
  51. public bool IsMaxV() { lock (vLock) return v == maxV; }
  52. #endregion
  53. #region 普通设置MaxV与Value的值的方法
  54. /// <summary>
  55. /// 若maxValue<=0则maxValue设为0并返回False
  56. /// </summary>
  57. public bool SetMaxV(int maxValue)
  58. {
  59. if (maxValue <= 0)
  60. {
  61. lock (vLock)
  62. {
  63. v = maxV = 0;
  64. return false;
  65. }
  66. }
  67. lock (vLock)
  68. {
  69. maxV = maxValue;
  70. if (v > maxValue) v = maxValue;
  71. }
  72. return true;
  73. }
  74. /// <summary>
  75. /// 应当保证该maxValue>=0
  76. /// </summary>
  77. public void SetPositiveMaxV(int maxValue)
  78. {
  79. lock (vLock)
  80. {
  81. maxV = maxValue;
  82. if (v > maxValue) v = maxValue;
  83. }
  84. }
  85. public int SetV(int value)
  86. {
  87. if (value <= 0)
  88. {
  89. lock (vLock)
  90. {
  91. return v = 0;
  92. }
  93. }
  94. lock (vLock)
  95. {
  96. return v = (value > maxV) ? maxV : value;
  97. }
  98. }
  99. /// <summary>
  100. /// 应当保证该value>=0
  101. /// </summary>
  102. public int SetPositiveV(int value)
  103. {
  104. lock (vLock)
  105. {
  106. return v = (value > maxV) ? maxV : value;
  107. }
  108. }
  109. #endregion
  110. #region 普通运算
  111. /// <returns>返回实际改变量</returns>
  112. public int AddV(int addV)
  113. {
  114. lock (vLock)
  115. {
  116. int previousV = v;
  117. v += addV;
  118. if (v < 0) v = 0;
  119. if (v > maxV) v = maxV;
  120. return v - previousV;
  121. }
  122. }
  123. /// <summary>
  124. /// 应当保证增加值大于0
  125. /// </summary>
  126. /// <returns>返回实际改变量</returns>
  127. public int AddPositiveV(int addPositiveV)
  128. {
  129. lock (vLock)
  130. {
  131. addPositiveV = Math.Min(addPositiveV, maxV - v);
  132. v += addPositiveV;
  133. }
  134. return addPositiveV;
  135. }
  136. public void MulV(int mulV)
  137. {
  138. if (mulV <= 0)
  139. {
  140. lock (vLock) v = 0;
  141. return;
  142. }
  143. lock (vLock)
  144. {
  145. if (v > maxV / mulV) v = maxV; //避免溢出
  146. else v *= mulV;
  147. }
  148. }
  149. public void MulV(double mulV)
  150. {
  151. if (mulV <= 0)
  152. {
  153. lock (vLock) v = 0;
  154. return;
  155. }
  156. lock (vLock)
  157. {
  158. if (v > maxV / mulV) v = maxV; //避免溢出
  159. else v = (int)(v * mulV);
  160. }
  161. }
  162. /// <summary>
  163. /// 应当保证乘数大于0
  164. /// </summary>
  165. public void MulPositiveV(int mulPositiveV)
  166. {
  167. lock (vLock)
  168. {
  169. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  170. else v *= mulPositiveV;
  171. }
  172. }
  173. /// <summary>
  174. /// 应当保证乘数大于0
  175. /// </summary>
  176. public void MulPositiveV(double mulPositiveV)
  177. {
  178. lock (vLock)
  179. {
  180. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  181. else v = (int)(v * mulPositiveV);
  182. }
  183. }
  184. /// <returns>返回实际改变量</returns>
  185. public int SubV(int subV)
  186. {
  187. lock (vLock)
  188. {
  189. int previousV = v;
  190. v -= subV;
  191. if (v < 0) v = 0;
  192. if (v > maxV) v = maxV;
  193. return v - previousV;
  194. }
  195. }
  196. /// <summary>
  197. /// 应当保证该减少值大于0
  198. /// </summary>
  199. /// <returns>返回实际改变量</returns>
  200. public int SubPositiveV(int subPositiveV)
  201. {
  202. lock (vLock)
  203. {
  204. subPositiveV = Math.Min(subPositiveV, v);
  205. v -= subPositiveV;
  206. }
  207. return subPositiveV;
  208. }
  209. #endregion
  210. #region 特殊条件的设置MaxV与Value的值的方法
  211. /// <summary>
  212. /// 如果当前值大于maxValue,则更新maxValue失败
  213. /// </summary>
  214. public bool TrySetMaxV(int maxValue)
  215. {
  216. lock (vLock)
  217. {
  218. if (v > maxValue) return false;
  219. maxV = maxValue;
  220. return true;
  221. }
  222. }
  223. public bool Set0IfNotMaxor0()
  224. {
  225. lock (vLock)
  226. {
  227. if (v < maxV && v > 0)
  228. {
  229. v = 0;
  230. return true;
  231. }
  232. }
  233. return false;
  234. }
  235. public bool Set0IfMax()
  236. {
  237. lock (vLock)
  238. {
  239. if (v == maxV)
  240. {
  241. v = 0;
  242. return true;
  243. }
  244. }
  245. return false;
  246. }
  247. #endregion
  248. #region 特殊条件的运算
  249. /// <summary>
  250. /// 试图加到满,如果无法加到maxValue则不加并返回-1
  251. /// </summary>
  252. /// <returns>返回实际改变量</returns>
  253. public int TryAddToMaxV(int addV)
  254. {
  255. lock (vLock)
  256. {
  257. if (maxV - v <= addV)
  258. {
  259. addV = maxV - v;
  260. v = maxV;
  261. return addV;
  262. }
  263. return -1;
  264. }
  265. }
  266. #endregion
  267. }
  268. /// <summary>
  269. /// 一个保证在[0,maxValue]的可变long,支持可变的maxValue(请确保大于0)
  270. /// </summary>
  271. public class LongInTheVariableRange
  272. {
  273. private long v;
  274. private long maxV;
  275. private readonly object vLock = new();
  276. #region 构造与读取
  277. public LongInTheVariableRange(long value, long maxValue)
  278. {
  279. if (maxValue < 0)
  280. {
  281. Debugger.Output("Warning:Try to set SafaValues.LongInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  282. maxValue = 0;
  283. }
  284. v = value < maxValue ? value : maxValue;
  285. this.maxV = maxValue;
  286. }
  287. /// <summary>
  288. /// 默认使Value=maxValue
  289. /// </summary>
  290. public LongInTheVariableRange(long maxValue)
  291. {
  292. if (maxValue < 0)
  293. {
  294. Debugger.Output("Warning:Try to set SafaValues.LongInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  295. maxValue = 0;
  296. }
  297. v = this.maxV = maxValue;
  298. }
  299. public LongInTheVariableRange()
  300. {
  301. v = this.maxV = long.MaxValue;
  302. }
  303. public override string ToString()
  304. {
  305. lock (vLock)
  306. {
  307. return "value:" + v.ToString() + " ,maxValue:" + maxV.ToString();
  308. }
  309. }
  310. public long GetValue() { lock (vLock) return v; }
  311. public static implicit operator long(LongInTheVariableRange aint) => aint.GetValue();
  312. public long GetMaxV() { lock (vLock) return maxV; }
  313. public bool IsMaxV()
  314. {
  315. lock (vLock)
  316. {
  317. return v == maxV;
  318. }
  319. }
  320. #endregion
  321. #region 普通设置MaxV与Value的值的方法
  322. /// <summary>
  323. /// 若maxValue<=0则maxValue设为0并返回False
  324. /// </summary>
  325. public bool SetMaxV(long maxValue)
  326. {
  327. if (maxValue <= 0)
  328. {
  329. lock (vLock)
  330. {
  331. v = maxV = 0;
  332. return false;
  333. }
  334. }
  335. lock (vLock)
  336. {
  337. maxV = maxValue;
  338. if (v > maxValue) v = maxValue;
  339. }
  340. return true;
  341. }
  342. /// <summary>
  343. /// 应当保证该maxValue>=0
  344. /// </summary>
  345. public void SetPositiveMaxV(long maxValue)
  346. {
  347. lock (vLock)
  348. {
  349. maxV = maxValue;
  350. if (v > maxValue) v = maxValue;
  351. }
  352. }
  353. public long SetV(long value)
  354. {
  355. if (value <= 0)
  356. {
  357. lock (vLock)
  358. {
  359. return v = 0;
  360. }
  361. }
  362. lock (vLock)
  363. {
  364. return v = (value > maxV) ? maxV : value;
  365. }
  366. }
  367. /// <summary>
  368. /// 应当保证该value>=0
  369. /// </summary>
  370. public long SetPositiveV(long value)
  371. {
  372. lock (vLock)
  373. {
  374. return v = (value > maxV) ? maxV : value;
  375. }
  376. }
  377. #endregion
  378. #region 普通运算
  379. /// <returns>返回实际改变量</returns>
  380. public long AddV(long addV)
  381. {
  382. lock (vLock)
  383. {
  384. long previousV = v;
  385. v += addV;
  386. if (v < 0) v = 0;
  387. if (v > maxV) v = maxV;
  388. return v - previousV;
  389. }
  390. }
  391. /// <summary>
  392. /// 应当保证增加值大于0
  393. /// </summary>
  394. /// <returns>返回实际改变量</returns>
  395. public long AddPositiveV(long addPositiveV)
  396. {
  397. lock (vLock)
  398. {
  399. addPositiveV = Math.Min(addPositiveV, maxV - v);
  400. v += addPositiveV;
  401. }
  402. return addPositiveV;
  403. }
  404. public void MulV(long mulV)
  405. {
  406. if (mulV <= 0)
  407. {
  408. lock (vLock) v = 0;
  409. return;
  410. }
  411. lock (vLock)
  412. {
  413. if (v > maxV / mulV) v = maxV; //避免溢出
  414. else v *= mulV;
  415. }
  416. }
  417. public void MulV(double mulV)
  418. {
  419. if (mulV <= 0)
  420. {
  421. lock (vLock) v = 0;
  422. return;
  423. }
  424. lock (vLock)
  425. {
  426. if (v > maxV / mulV) v = maxV; //避免溢出
  427. else v = (long)(v * mulV);
  428. }
  429. }
  430. /// <summary>
  431. /// 应当保证乘数大于0
  432. /// </summary>
  433. public void MulPositiveV(long mulPositiveV)
  434. {
  435. lock (vLock)
  436. {
  437. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  438. else v *= mulPositiveV;
  439. }
  440. }
  441. /// <summary>
  442. /// 应当保证乘数大于0
  443. /// </summary>
  444. public void MulPositiveV(double mulPositiveV)
  445. {
  446. lock (vLock)
  447. {
  448. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  449. else v = (long)(v * mulPositiveV);
  450. }
  451. }
  452. /// <returns>返回实际改变量</returns>
  453. public long SubV(long subV)
  454. {
  455. lock (vLock)
  456. {
  457. long previousV = v;
  458. v -= subV;
  459. if (v < 0) v = 0;
  460. if (v > maxV) v = maxV;
  461. return v - previousV;
  462. }
  463. }
  464. /// <summary>
  465. /// 应当保证该减少值大于0
  466. /// </summary>
  467. /// <returns>返回实际改变量</returns>
  468. public long SubPositiveV(long subPositiveV)
  469. {
  470. lock (vLock)
  471. {
  472. subPositiveV = Math.Min(subPositiveV, v);
  473. v -= subPositiveV;
  474. }
  475. return subPositiveV;
  476. }
  477. #endregion
  478. #region 特殊条件的设置MaxV与Value的值的方法
  479. /// <summary>
  480. /// 如果当前值大于maxValue,则更新maxValue失败
  481. /// </summary>
  482. public bool TrySetMaxV(long maxValue)
  483. {
  484. lock (vLock)
  485. {
  486. if (v > maxValue) return false;
  487. maxV = maxValue;
  488. return true;
  489. }
  490. }
  491. public bool Set0IfNotMax()
  492. {
  493. lock (vLock)
  494. {
  495. if (v < maxV)
  496. {
  497. v = 0;
  498. return true;
  499. }
  500. }
  501. return false;
  502. }
  503. public bool Set0IfMax()
  504. {
  505. lock (vLock)
  506. {
  507. if (v == maxV)
  508. {
  509. v = 0;
  510. return true;
  511. }
  512. }
  513. return false;
  514. }
  515. #endregion
  516. #region 特殊条件的运算
  517. /// <summary>
  518. /// 试图加到满,如果无法加到maxValue则不加并返回-1
  519. /// </summary>
  520. /// <returns>返回实际改变量</returns>
  521. public long TryAddToMaxV(long addV)
  522. {
  523. lock (vLock)
  524. {
  525. if (maxV - v <= addV)
  526. {
  527. addV = maxV - v;
  528. v = maxV;
  529. return addV;
  530. }
  531. return -1;
  532. }
  533. }
  534. #endregion
  535. }
  536. /// <summary>
  537. /// 一个保证在[0,maxValue]的可变double,支持可变的maxValue(请确保大于0)
  538. /// </summary>
  539. public class DoubleInTheVariableRange
  540. {
  541. private double v;
  542. private double maxV;
  543. private readonly object vLock = new();
  544. #region 构造与读取
  545. public DoubleInTheVariableRange(double value, double maxValue)
  546. {
  547. if (maxValue < 0)
  548. {
  549. Debugger.Output("Warning:Try to set DoubleInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  550. maxValue = 0;
  551. }
  552. v = value < maxValue ? value : maxValue;
  553. this.maxV = maxValue;
  554. }
  555. /// <summary>
  556. /// 默认使Value=maxValue
  557. /// </summary>
  558. public DoubleInTheVariableRange(double maxValue)
  559. {
  560. if (maxValue < 0)
  561. {
  562. Debugger.Output("Warning:Try to set DoubleInTheVariableRange.maxValue to " + maxValue.ToString() + ".");
  563. maxValue = 0;
  564. }
  565. v = this.maxV = maxValue;
  566. }
  567. public DoubleInTheVariableRange()
  568. {
  569. v = this.maxV = double.MaxValue;
  570. }
  571. public override string ToString()
  572. {
  573. lock (vLock)
  574. {
  575. return "value:" + v.ToString() + " ,maxValue:" + maxV.ToString();
  576. }
  577. }
  578. public double GetValue() { lock (vLock) return v; }
  579. public static implicit operator double(DoubleInTheVariableRange adouble) => adouble.GetValue();
  580. public double GetMaxV() { lock (vLock) return maxV; }
  581. public bool IsMaxV()
  582. {
  583. lock (vLock)
  584. {
  585. return v == maxV;
  586. }
  587. }
  588. #endregion
  589. #region 普通设置MaxV与Value的值的方法
  590. /// <summary>
  591. /// 若maxValue<=0则maxValue设为0并返回False
  592. /// </summary>
  593. public bool SetMaxV(double maxValue)
  594. {
  595. if (maxValue <= 0)
  596. {
  597. lock (vLock)
  598. {
  599. v = maxV = 0;
  600. return false;
  601. }
  602. }
  603. lock (vLock)
  604. {
  605. maxV = maxValue;
  606. if (v > maxValue) v = maxValue;
  607. }
  608. return true;
  609. }
  610. /// <summary>
  611. /// 应当保证该maxValue>=0
  612. /// </summary>
  613. public void SetPositiveMaxV(double maxValue)
  614. {
  615. lock (vLock)
  616. {
  617. maxV = maxValue;
  618. if (v > maxValue) v = maxValue;
  619. }
  620. }
  621. public double SetV(double value)
  622. {
  623. if (value <= 0)
  624. {
  625. lock (vLock)
  626. {
  627. return v = 0;
  628. }
  629. }
  630. lock (vLock)
  631. {
  632. return v = (value > maxV) ? maxV : value;
  633. }
  634. }
  635. /// <summary>
  636. /// 应当保证该value>=0
  637. /// </summary>
  638. public double SetPositiveV(double value)
  639. {
  640. lock (vLock)
  641. {
  642. return v = (value > maxV) ? maxV : value;
  643. }
  644. }
  645. #endregion
  646. #region 普通运算
  647. /// <returns>返回实际改变量</returns>
  648. public double AddV(double addV)
  649. {
  650. lock (vLock)
  651. {
  652. double previousV = v;
  653. v += addV;
  654. if (v < 0) v = 0;
  655. if (v > maxV) v = maxV;
  656. return v - previousV;
  657. }
  658. }
  659. /// <summary>
  660. /// 应当保证增加值大于0
  661. /// </summary>
  662. /// <returns>返回实际改变量</returns>
  663. public double AddPositiveV(double addPositiveV)
  664. {
  665. lock (vLock)
  666. {
  667. addPositiveV = Math.Min(addPositiveV, maxV - v);
  668. v += addPositiveV;
  669. }
  670. return addPositiveV;
  671. }
  672. public void MulV(double mulV)
  673. {
  674. if (mulV <= 0)
  675. {
  676. lock (vLock) v = 0;
  677. return;
  678. }
  679. lock (vLock)
  680. {
  681. if (v > maxV / mulV) v = maxV; //避免溢出
  682. else v *= mulV;
  683. }
  684. }
  685. /// <summary>
  686. /// 应当保证乘数大于0
  687. /// </summary>
  688. public void MulPositiveV(double mulPositiveV)
  689. {
  690. lock (vLock)
  691. {
  692. if (v > maxV / mulPositiveV) v = maxV; //避免溢出
  693. else v *= mulPositiveV;
  694. }
  695. }
  696. /// <returns>返回实际改变量</returns>
  697. public double SubV(double subV)
  698. {
  699. lock (vLock)
  700. {
  701. double previousV = v;
  702. v -= subV;
  703. if (v < 0) v = 0;
  704. if (v > maxV) v = maxV;
  705. return v - previousV;
  706. }
  707. }
  708. /// <summary>
  709. /// 应当保证该减少值大于0
  710. /// </summary>
  711. /// <returns>返回实际改变量</returns>
  712. public double SubPositiveV(double subPositiveV)
  713. {
  714. lock (vLock)
  715. {
  716. subPositiveV = Math.Min(subPositiveV, v);
  717. v -= subPositiveV;
  718. }
  719. return subPositiveV;
  720. }
  721. #endregion
  722. #region 特殊条件的设置MaxV与Value的值的方法
  723. /// <summary>
  724. /// 如果当前值大于maxValue,则更新maxValue失败
  725. /// </summary>
  726. public bool TrySetMaxV(double maxValue)
  727. {
  728. lock (vLock)
  729. {
  730. if (v > maxValue) return false;
  731. maxV = maxValue;
  732. return true;
  733. }
  734. }
  735. public bool Set0IfNotMax()
  736. {
  737. lock (vLock)
  738. {
  739. if (v < maxV)
  740. {
  741. v = 0;
  742. return true;
  743. }
  744. }
  745. return false;
  746. }
  747. public bool Set0IfMax()
  748. {
  749. lock (vLock)
  750. {
  751. if (v == maxV)
  752. {
  753. v = 0;
  754. return true;
  755. }
  756. }
  757. return false;
  758. }
  759. #endregion
  760. #region 特殊条件的运算
  761. /// <summary>
  762. /// 试图加到满,如果无法加到maxValue则不加并返回-1
  763. /// </summary>
  764. /// <returns>返回实际改变量</returns>
  765. public double TryAddToMaxV(double addV)
  766. {
  767. lock (vLock)
  768. {
  769. if (maxV - v <= addV)
  770. {
  771. addV = maxV - v;
  772. v = maxV;
  773. return addV;
  774. }
  775. return -1;
  776. }
  777. }
  778. #endregion
  779. }
  780. }