From 774e7a0e34aae27fc98fa5f454e1250ded39dd74 Mon Sep 17 00:00:00 2001 From: Andreas Pardeike Date: Sun, 7 Apr 2024 20:49:35 +0200 Subject: [PATCH] improves QuotaCache --- 1.5/Assemblies/CameraPlus.dll | Bin 55296 -> 56320 bytes Source/QuotaCache.cs | 51 +++++++++++++++++++++++++++------- Source/Tools.cs | 4 +-- 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/1.5/Assemblies/CameraPlus.dll b/1.5/Assemblies/CameraPlus.dll index 3b6a14a8099bfe8fad6e76bfa6e085a148093ebf..fce5d0ac1553b2d3dd53587e3175393c98b8e716 100644 GIT binary patch literal 56320 zcmce<34D~*)jxioW!5A^HfFK_2}@v@ERwJb0!bi(fFS$Q8ir&7Bgs5rCSh?%3}RIj ztJJ0L#jVzATen)Zwo0{HTdZ1rt#(m-ZC`7xef71rueIXud(M4kNdVjTegB_-KF)dW zS?;;#-h1x3=iX-qmu|R%3?ee|`Rp^Ihw+Hl41n#cc+^J^dY&8ou(ss6(W|yb z6P4X@YfC)bRoNDf#jKvn&5_D@Z>%yJtDL`VWo4Ju9;wUA^NzDsFJC~^exXjSFJ1e! zRBP|kn93Y|645K5uwkjcN+}Fz{NS>lVLO?|f0f{Z&VL4N`ck?l^MnMDuL_kZJWa_E zq@>Y3JTNEud+;wrBTmBmm&lbw3$q04dLp}efWQAT0C>`OyC1;huaam}T|5zQ1Ey?4 zUwM396?PiTOLsa=I%$Dz(8)nJb`X_(nFt#HSAV1QV35cgI#oS&qmOM1twDijNjLj2 zn5G__$U8*Yt;i3ISL%Lr8YCkl>!ME z=(HNZtR7b2s7kWEfpucGC$KKh8H?t&e)idCq9ar^$)p`H z7xfDqK6ArmJjq^%vA$$uj?Xml$b}oM^0?Qt6Zjii3QY5qGyFx4>gfdz*Lv3LZx~_b1e*>yEZSSUtHN0SeN6{6~6_1?iTuGP#8}vy8=Bq z2g6_pTpyf^@-{s=Pe=@Hl2=bQ3XP#n%Nav-Uh_t$daQHVPdw($vz@~{W@fjC^UmP;}5e2=$MF8S=x1bFy=mHh3j5yY8chC!(*I67q z15!0JN-nE_<5c-yz#gCl7lU?dRp12=QMp2bOF+ui-Ok`r6nap(ybmf(BmTvdvK-gv zE6W+IEKm2il(Jk_2KO>UO&IK-Gy^PbPMnE$LS-mp4DjJOMi1prA0pNVFEsVy;4)M} ze1_Gg?(bX9n7{8VegyhfsK-k6ScOLjI(1o-th6k+8Z;w*5qD<|iovx2exU}}p=hlK zs9CDY8&EErJWnATnK30(t|+e?t|!@w49)rig!F)g(ef(l*(jl7MU$KaFBRW4&e-PV zzTMjhFfi9@g-9Wp+Z@|`W{t;ZTAM(q){2E2EW`xn7|!S_tfR0fV_nz`2xD0=RF7dI z>SQbNIYfh3ciOet76)C7`WVgv2%i?*47J{18=ybfE|3RF_nE;6o=!D5%os*h!45oO z*%giJf?H5DbmL6Z5!{O68Xw0~qG|btaV7$AFbX0f@rE_rlX*FXTJRiDpcWgKx0Y8R zCS7!euJ4DhnZZsl>WYJ1cnsvF2m{ROXB1*^ue4Z<#e6Bk0JHiTg&3SIEoQOUuoPi{ zS^bQLo*pi$hfB@j!VsHO)7@$9+fxccKhlk09GD(7u%!)PZp`>yaHRxtAg|R6F#7x* zKSFkpuLZFUctZ{SEMr*kQfH_v{vKpQEj%2L4-|pnA1G!+cuq|EF@^)~Q~(#>iMlmk zOq|b)_l4TjT8)2->cz#uUEl_H132S38g=(|L5FoN6 z736sc!d7n(t$X{J7}}w9A~2dY`FipK&}3};zQo)Xy?;13{eCv=LZ+baMUz~FuE}3k zr$0m&f>^KK0j^T~LOBcx!hgLzqcAWfmtj5-(TX!Qg8RWlT$A<=AbrtZU?34r@q(8? zf|Igp&VZ_em$7!XB~->k?+o4A&$9ys1CQ60>-zT5s4pb$t26jz$nRwu;;v53uox~{ z(9d&OqX$CLb+426BeRzA%OPMPi}5n%OwMPyLOsB1iC01Xykmy{m=^Mf&P?mjc~v@@ zdZ8LgR#sE2$_r2~sdMSPKAq!3b1IG{Fu=|#y$^$t-n+2M2x}r^mu?+|4K*dY^%Xpm zR|4qPRe;vjOowf{bq%9mO{3SQN`-{wiv{iEE-2$_5L8?oFr0o+5CNQ_hTsG|)CLin z7I*04uh&6I$gc-h_+`9GVHXx*f!@ozkk?t0=akOYI1E2T0?HQ*LM)}cZ2OHdG3JyDl^~BXrjf@OtIHl^7cGH}{8#)!HJBN<4A^c7okah-4+dB@`_w#CX5U)Od)|4)gzt#SP#r8Sy7$u?8k^QQo5qr(92}JRnEj_lwHQlpy~y9 zof*6lqtcJnj|3m1XtK5ZA_BH^yjSu5xT_k>>ghxrHQL zw`;??K9*IQoE9{rd^?~FOP=Ae?f{}EzYgf(ZNu4jXBNR?!Z)%Ai0RHg1Z=NI!mq3x z^qglE3kW^n7_^253xCBgV3*CB)6WSt#V@pAX#ZJ+8Ocp-fFr>qZt_y#RYo78&k6jA z=l%cePl%8v7Ugv4Dh_@V{l=nPmbEC^tM60BVBwpgbK>6xH+VNB;~#VB9+UA;a4pX5wxLcw>I4QVp)?+5 z<}5a#HfMbNvJ}P|?qv;H$XRT`KyUA2j4!922+vG*jk*51>*ffM6wST|D(V5N4z0&<}$T0WV>E9SYV4fbz+O{oiBcVSrkve*hr^ zn>9Su3_Yp~OTv)wYl`}rU7H&av4Dsf{Va?XSQf+{XrEtnx&i$!z<(Q{24|+}n(z>bn&rXAAn5HM3+??sKr#43fEt%`fGMH=acs#fEFeaMkAuf~ z*AsYxz<=-0oi-wvKr4X(mJNv#sq9yTmg6XEl(l(!wvp&quj&}*lN+JAko(1*74ce) zQ#&F7{fA+|w*DV6Ogsq~dIp3`x7q#S}y}+*RM+c8z?!VCf8=T+<|o& zX;-0Py#kpU-4n{P5B>ZlsC}=pLZk0Bewcl~;)kQ}*Zj!p=e6i3`jzUZx6n}i^q`wu zCEZQd=CpnT$lX-fZ-FIW2hfw;O2ZgE$@=YXnzk6ODH3mhY#kNJOx3F7o1o-~2J}!E z(!;d0OZKvZu#x{V8CqO&I*Bc{@WB^uP6f~Sog4y$QO68$RaA{1PBTscqo1o42mc-I z*LdSEG4Cyu`?*q@Jl0H+xk{S6Jw*EbG%>n0jxp}%CLp+|0+C}wW9I9DL|3* z{|?#__7L}+lJ7Y%=6-MWOg+g0&dXUg{tPtZa)=k)?;$S{F>sk5tSY~r{11?B4SKM< zLdNT?@HG60_ZyR%bQvDfgMWaCzGo^l#$SXktcUZP{CtG3*7rW7LtFgHa-WH;kQ z4(bm0gE=BMgDLf(pms)XCR4vSlzJ*tFH%%W>zu{Z9}lG>R+@3mi7N2 zplwCL;y2@`Wy{QEN*gG!1{Y9vU*<9OyzH8dO!*cl6`oW_nwazhrA&3LnJI6vP-RMJ zK9h1>SvD+S%2Y+k6FadroAK3IGRf0H@n4RBsKxhzUO7o)+k7l7yny1}1s-}U^gRn% z%k!YHg-Uc$M$Lyq)iBRiQ|`{FNuH6Z(+qm$l&q$iXV=-5snh>Qctz=CEKYU-9>;kb z1{R~JC)rbM0vwr>2=>n>;bX%&7Qc&%Rkh~$;%Z0mPblXm-ebxzE%;|VQPJJBUaD`j z{u6{ek72!!rw6owM!7EV#IJ-Qa#6y>$BV5GATVB;;`J!6fANea%7SdX#Y~k)|Cmto%{=GCqDuZvh`P# zlwLN*9*%*zY)li3S@qA1`5PO<)s7oW7{m0T#+-R#W0)+)@Yu~ujonSDu?zmU*vX5v zW<>n^AnQp+4%`A441Nq|;_m>}-uRCPRq+=WTc3bYb86XTEL!!#7Sxj59lcx4z555) z!C~;+AkwPpA~SdlgaR}186FlcA_mXqb1C)lcetd1Z`;NTRfcUtXCSD9UgRir1Pv78 z|H+~zO5n2#I8Ypq;kK*D7C$gouB+69^B~YX+krkzHK`if!%>4}?P``2+C1?bkL_l* z6tC;!q)_WnYHaI=RN&C_xfRx?D%iacM`lZ(uq{RLXx5EfPHE5u(_HZ_sfuz{7<7YJ zs3F9AP+*Ii)(5>T7|@d(BPu+Ynl(H%xSR3vZIQE3s|w~S>2KK5qQRyeYFZb}V-46O zI5GvU@h zf2We?yeA|7vqAD0xJIx86_psV@F3O;Rd~~Org zgM9}}7kNEE5xr8|!UE_n@E+56sv3(6bB+xk$)~6ss{mDM@IKPpCn7l56uArB1und8 zzA0-wJn=hHy|E)ZXJbQ$mMa`hMfR5lRbWxPBPm34Gv9_0d`owJliIU|rE-ZtAMdBk z9GKh3Zfh6W(YZ)-Wzy}U_@KX!Q(C+;;vETZka!0XKK1d=2F5&oRCxM$fce=Z&&ocY z53qTU!h`#d2lq?GZ@&bko9$rkznQD@&Y&kHW~I0i1Hn}(p{#Bj3HWdJSVibDpAQ`L zJj~}mHtzqMuG@Y7-}JELGESST>^}DKewFUu5FU3>Pt!Qjy}6G=nI0^*`=-%Zs%vU7 zOIC|c>dgb3&Z0D_ae&i5l)9S+ILYEtEb`pU6sO2>J zZsSLip`9QqP;H9s5!T2`! znW9bQNwQ_R$W$IntO_-jr=N5T?0p4au=t#j7^JJ~q`K_Q=LEX0<~p2^^7_b{xeJINPPLZVAA$jNK?FnRWZv=c zTZ(>ceWq@eNEfA#@O}Bqma|_psn`!<6I+^X4W-pptsgHv`k*1 z>GrsT6Z}@8&S6Tcuh5y1xosnkE8{V z7o`O-W=^^W5vP>?`DM*PQ^BxiC0isD{5{bA^I z73vng^yEFY8Ty>oL=>xPUE`fr2qpd&k9{d!rlf<_AX_y6d>5zMC@`&B7RHx#{sm!& ze0L1#g)-7Ggt!^&F_U^YPqmq2VWg9Bs zn=@(JJO~e^!QoT1AR<1D2~NdB4UJod#hsW23IZ$Nec^aSWw6tz3CbJhs^oMqaXJQE z?@i7SgdtuVIXAfQLMRj*4vTYxxYu>&6(W@dv+7LFAZXskb!*(oQ>Bh5a3`6o%ljsL z;i_sw0j6uiI?qPWMrq%mYE&y1AHg<`YxT{TaGckyS*TZAq$hIFN{*tstl1#CLMv>4 zx&amBy&}J)sO~@pNxzky0|hlXx^*oY#Xit2w0?mX z)%);4*q~eRK^jh%<8ul=58#6tm)DFx#&gCm0OHRM+LgUCo?_xlLx|sD;(J4g*E7+` z%|0A@!-awfdTi&-g} zluIvTSVm)v_-z!zj?e7-CI;B)=(`&aW9EOL4|@Cq*0Bt=bhE~72Dd}B+7U0$!_9dh zP^cXnJ{Ez{6~yV*JCjFIy$d}HXlx#o6gX`&@~JRC022Jerq*9ziVz){av8kkr?2EQ6Hpo;F`){gYY z_WFKY3LwK+iyCqTuD)|M&;;cVwMA{c>Gm12#oIkOViPR!yr@y@R_9-~R?PS64yQW2v#oMyVp|P&&7zE{b26q*E^x?u zK~G>ku38E_$W#%bkf6z{3p~OwLEaZ+rrN3Q0l0xPFhl{nft8sC7G@eaP4ppcOSgk7 z|IJWZRp3qTMN@qr0WfkNBi!7rnWjSc)dP;p9Mm}nL$WP@@v}G@1lu4yz`JLBcLwLJ zGk!}3N07xk!VHetHskMP@QsWczO+70&c}3gbfixcScaS*4t$Xr+&lxtRSZt;D`xlK zg~u`H&w16fL*B-pXFLKt(ZNdixRjQCfq7dpvM(~em1UzWy9u(1bGQ`d(l#z_Mrq87 zhez4gJ$GcuY03!BYs5OWeCqg{mCk{!pz;__#Mp*L8S-m}%+sdtFy!m?y8KGx0M7i{ zF+W4A6D@}75|}0DK<6M$cFoPWzU%_S$Q&BwE1sbaC4f_X3~W8v1x<)IHkH7pQ#axV2Wq(VVlm(EdWj_JGhyYgJ!&DC&;$f>}CnHIoNMlAniA$w%=eP zPVP52M9>7Wo9n`F98k)GaV|c$;`38{-oppJ&YQt@DO@|sh5^SgB`p?K}kvhOiCN59QG76pd3~tOKr*5 zzmV#O5*s;KtSluqH7&+n$ZoSdB~oaMD383EM|)_T!$F?-lkJn4KC(~Bh^2gzEzR;t zLDN2oZ4*ApwUtk@A7p$|w2DvO1Vh*-vChpto+|Ol+d+j--igP+g&?MVGUHl=5dGJ_y7FpQmT=>4)G=_`uhm z!viDB72s=^;F0+qg0-7n2*KLavwh)WCIqAkoasQ8f}z1nBui3~Nd3}HDaldLq`XEX zOH-137D*Y^e=fUllC8)RElY{!Wr_Ox5Fxl52k=l!29Zma4EJxwBj~!GWRe}P-F=AF zc;&@Vtsq`BY6az@i>z*jID3+dHLJ13NfS~-zTc;I`VzfAImArXSv~Iffh)Hye;r@n z`&7y>n1%af3`V5bviZxj6x&vc;S#2&OPFR~z*=RpS`Azxp_~Sy~`H%O0 z(JJG>YeLkf)&$#-wI&3WHPMW^@KLM@uC3Mt`)y`Th*nt>-+&#wCa~L^ee6;wU&dvg z7g-W_ZdR^nf`OZI!sP_} zKQ9FgiCEz8`zjlvCy@c#{&Ou8Fi*^%fxC2044I}9!|Rxvr|U@mJ9*{(2wGV1Gp>VfOLdi;q4GYL<^)54s(%5k^no zqbzWokN$vrcw!%Q(^Q=ZnI6^@*UiccIAO)%kS@aKHGKYo4}8@HdH5;|^B2&ax$fc@ z_OcIPnGXG-*}T-T=YRJ@GyX*jTpPQa$*(f1^E~cj&Zp64;(Tt<&({sOd?;eW^ANWOSLDvk zfF$XAm=wGOOnxObG{Fgj#9E7-djF+(D#xuVaP~=CH?X>ZXoH{sob}ntb;*)!KNqo* zl-QkFV%4Mc0!N?lOH+JAxQrTQ9(F(Psb@(z=BZXj9~)kW&0Nnq*j4FC?tPYRWwz4S zIrZUAA8%KAN`zA%7Ez1l`|MJj`V2bb)xbCSlUg?&DYatfF+W>mrB)4hD{IvV3VnR< zHXTpM+CHh)4f}g$-H5TWZXSgtyl#+;nSJakvThE8irfcDrgPvHZYXueOFgF<^0G@E zlGEHX^dzz-_}p!*4Q6C2@_Vagu#5lnqr(?*}Ob;AQ-f#}ADm(k70|5$fj;yE4z?8=$0;3DSBXk2|K z03*pS1nhSm3m{iAd6=Po-8ctQHT;&n5M=fCe7GU6%(H%xITZp%@N!#J-Zm=vMpW7+ zzt_xGmt$nTmh;wBD%lpu*5+r);c6D|)tsB~6T`H*;u||)?q+E4 zru>#YG)5=y zZ8+vnPqK=vwJs>^Xj*wjlSUd!@;g`BF{N%&-Q-D=>t`~>L7jk0;GARoi5|xD3M5lw zSN6oCu`LOfSh$hsWglp(SJDV{EFZM7r>|Z#AI}=#e;NzCsngob!uZp%AFX}k)@l#x z(BHMm{3RW3{TY1VDukh+H}LriKBMtL_xbm?ay`Rx{K44qZhbrd60XOTr}E1xopf;l!;b`>k^go@5j9mZ_sab8VkiBk;LI{7O%r%n;4kx; z@)v>M5X#w7esLJnCzX|saZ*_U!;<{&YA1ao{ze`pZc7%4D>>BqOOqLbGu-3iS~1gf`^XbyZTIJ~wyqrR-QzMEl@-nSrOsDIF#MU1 zN8kyJgO@gzaF3przI39lk1F$6TOY>9N!v= z{Pc~{ue$v73|jZo92tkNmNZwj(eMiPgbvYGJDywFFoxlql?+QUJ3eZazWf7y@zVEv zJlbJEAKfXo1xr}wSCwqTf4JGgABcrlq4hFyPOVZXb%)XB<9mR0Z*iU_<==T#Y%o{~-=W)BekQqgB8NJJ7E@H*( zA$x_pA9nibfzYe?_hY=}7gl@WhZpAgX>28aIlbl2tPqBjBZ4fsYR3^6M3B!#I&l4vS(m zJ{iGqldPbJDtIl=eb$GtQ9faqDji?~2MJW7or@y^zkQS)n6i_u^ku$)y2E{&h6- zyr47oC6~gAM9Y&>FCX6k<$8CQ9vS;B{AxBJk~za!ayV{6x!yCyj0N!B55~s%6;>(O zAsZVl*qc%>fcIxC`H9UNC)lGlHeRrqw&X;?F0iqXU>!DAE!ZuBl^}y+ohwAkNbLEH zX@ZTSDT0j&uw@lAO|UAdS4pP|cAiL%ra6LLD?J)Z^91|7@WxW3V1E)`6@FRCEj%Gw zs_?}Q#_qCt3uMgd9Nb!R}o!*`<~8KVobBzMqd!W-#e-cEd>CDTGbU7LlS zhu@HMdyC+T>!JUqEZ&9mb>Yo{3$Le(Z~@MeO6OPTKEbNp%)6c*&8l|`Jt@2q(uZ5| zFVS$l-GbeQJc6;O#p*loFNc)j z@zdhsSG0PvN&>m{G^>c=rxO_dpt2k=ti7w((_eIk{U*cH9SmzqS!M#{r_tJx0oZU$ z-YZ%GU0cp@N(sZhoX26w>7G}#(R6RlXvb*k7=6?nO*=+TNBQYMBjCL`M@~SWMmeJS zZfKrH-**Laoz5#f2Z@>>EA zR4{k7z_MYl;P<<81U{6*<=9x}-W}w!QN(rkO=M^Z>>15;Esxu(mGWuc5XwtJlK>xa zb9s4T2;z%o7}fp0Qvq)l zSS@glK%c-70t-gXfy_vOH{~>;d~wcFz^bw90WYa+0}O#%KnKRK5BQ7T)hBB&I%Bz$ zwK1+3M)gu>0ydv#>;k-;cA*zfPJB6s>3dQBDND#C-Vnhmj8kDF@dxz!ypwUSKk0I*-7MD4$+t04Bww-uALz6&kMqww68!4X?VlcrrG0AXmv9{p;L? zl?W+xVacot-p7}xF$b{LGA8x(<$7oYPEm|49_vDG z@fRDrG+2^XK<(ocZ)DlnykdG$VI_B0cwNKkZJW2o8_F9_`Bf~*wlw4g=m&y5?S7ze zMqUa1+{T_LU96YTt7*wO;MI)hdQa2UW80mjbgy97(4`~J$Sb3Nq_K^86*PMSOI|~J zM|9;?(F+Q5KUvtRSJU5Y?9Q@oV55++K+@gg*#T^UU11ZEVuW{dtqyvRI0SGdnSJ5okm}^ zvA^dXG^f+;Hnz!oU*2@OKP~wXu!jXZ2&*5aviF8wAg`K!FS6s#33!fT{!6-ITXZ{;=8>3oc~`_N451XH6l zpB_!~-piX$FK6*usD_W=sK@bG(G2mN7-%Lw-U5n|#LD^ev`+Y0T?dLI(z69}31E`MPHbjo=Fix{xj%cdlz0{aRtdTTbTW3~wcU zLon6eDq1jwdDqYf6DRmq(K5lVM5ekwZ#A_F#x4BKv4(aD_B1``(vZ*nWDr)uSF>oH zSL0gx!#u%IPos78R3l@my>&FMiLt%ZN@wfqsME&o(HMKs#%?$3eCw#HSxH8WslN48 zXJe0>Q+*p~rj4EFnCja|^KI-furJUu8yn-C>iZ&Xu(7qk&ZdZsZ3os$-8Oc)^K5++ zJ!WGXEZaox`KtAUuxt}8x3NhEV^`bQY^nFWVAs%w;78s~^d}p;tYo$?ObZvVmTPE5 zu*KI#l`RUJJ8HSFgPuBFVGW)y__omeg$g@kSi3Ju{3TDWH?{a9?>TgZjh#Jqn{OLE zwn*`IRqph~sQCNR^nKL3 zAxrXNx-(1iV){-R<9|=}h+t}T_v2qW7CSZW!+siA&zS1Ne!5XG)rb9byTYUo`{{0* z$9>pO586EL!+!dkjd36L(`SOIKJ2HQ4cvn2!+t7CV-8485=>ck33b{STXqRu^@WUO zm(aa}Da$UQhZQE4T|$rBJhto-`iaeB%Pyh77g@`j8e4V=RS3qmIDpNzc|5n5(k>h0 z)-R>`t(n#@rA>mV)-R>43X|3^CH_ZpdEU8oXt8^#k;YU}{zl zkgJVbP_uG?h7H03g6*TA`2@7!k~A%O8P(dnO%4tB0`ms(7TUbK9B1p7(d{VwXyL!W4mlD-+a?|kPc_n`wBg4^Bm~WSLn?_ymxHg7Ofq;|4#E9z+4^N zy7JvCDc8o>d#Gx=lrp1KBQjcyptGMxdI`Dh%=+<~%#s;fl9*!+B*F8Ai=8#E2IH2Oei z`J~D6pWs!AYEh$$(TYy(xP4S*4L28DJ_9;6`Z`+I>5M|I^|MlLaf(86{;E!&EDZ(jhal z1NIxZLt#BvhZvrWzE89%&7Kh~smAD}AX_kRU)A2k|Y%rmZfr+U2v9%ay4z|_p% zi@xi0s4_!QbuTX0L0>Y8ZkNEVW-6PKT~@86dc?KZ6H-ud z?-+Ip?!Hfjj1dMg?vM9F84gRz*4XQPy)%;9Y>D@qJjPYzLemu#O%<*+I_& zPNf&M|HPj2n(Q^X^zej*C_j(b^qTfCVp1^`R&1bmw8DyZ`XH@GX*)->O%<3gu!nBZ zXH_KW5kQSz1l)^X8ne#p#Gd;Ej-#{j1N|C-&(ccc9vW@j61X35Le>5B2)*KZ2%|i! z;xJ^!d!GS3;(iIRFnB*8Yo0CKu<>cpo1m=A(X_C!xinX+A)|DhHqMqGInIIaYICjm zLVtvQR`C#RH-1&ITziDBDSilT{TXd-H*TM}LECQJS-JsrS^s_XM&2gvW4bOB(RLee zwhSTgR;iEQ~QAaGju7+J-JtE2aT`ieNDU0*gWh`&4clIR?`5V2i%U^N=>^B z_pF*`;4V|sUd27DrmdLxiguUr$;j8V`;6_wj%tq>UoClCJ8Zl-;RC?4L$m0x@j>3- zP=46^sn$uq%y|j-{jd0P^~1(9n5h?yv&I$ZJ)kc{`OoE*`d!BRBPRjAJ7F5&Unb1f zS!c68T6=opV!$I4EA`imy(5?=qCNJ-r>Cy z+*ixLtCyN@jQOFyN9Jgvd8qv7dcFB2@9$y%yW?h2R9k|Z&ZriFk43c`arfD%%`N*7 zupcn0y*1)9eWv*<$TXVq5vFlizj5S9W0Afox5_wZJW^E$_(sWeBWey*x1fBjYo)Q* z{Au|%!=rsYw9D9U-d=UF5!FVNUS?=|xn~w>`hS&QZ(OH+Ro=sBtHb+4&<~G%&A89JJMf0_h&eX&JL3Y|-_9HNkr6f~hluhA ze8k+X7ZpAZ_*UpCz{YVuH}~p)ulS|;vC$hi3i#PL-1=jd-!fk_wvT$(dCUA30Zvs~{?r=OsSB|^OaYQt~Ebkd!7R@h<=9fkD5z&daH_-VT(fJ$Eb42v~ zM)Z7ual2H5kB#~-#|MZxe{*;o?BO5io)O3Jy}{-Z!>Jj3pHhl)v2(QJPu?lc{pN_g zvz^=Zzr!~sqVI5T?Uuk|{Y7JMpc3%W(st)W?W-l*oIPmqFrvhrr8}J0X|XYToFD7# zw^8ld!o5z89y^=`Mnlzp=R3x!);$ItdEpjAFU(*&j_Lq8HqqS>fMc-Ol zsdtLz(b{#mwH>W}4Qu>Gu=#r!i$ctLtX}u5lJXY>{zE9aC~H(K@IGoC{fzr# z$A0%#U31<#+UNB+$Bqbi_kueD<=f{zHRpp>4WPVH!rb3`11MiUE`a~d)mx!? zD6fa)OnqU=a+Isw%&idkH5bc|@^*moCzL(TT@HqyL61j2I�aU2GfeJXmzAw^QT& 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 maxRetrievals, Func fetchCallback) + public class WeakQuotaCache(int maxRetrievals, Func keyConverter, Func fetchCallback) where VALUE : class { - private readonly Dictionary cache = []; + private readonly Dictionary value, int count)> cache = []; private readonly int maxRetrievals = maxRetrievals; - private readonly Func fetchCallback = fetchCallback; + private readonly Func keyConverter = keyConverter; + private readonly Func fetchCallback = fetchCallback; - public T Get(S key) + public VALUE Get(KEY key) { if (key == null) return default; - if (!cache.ContainsKey(key) || cache[key].count >= maxRetrievals) + var rawKey = keyConverter(key); + + if (!cache.ContainsKey(rawKey) || cache[rawKey].count >= maxRetrievals) { - T newValue = fetchCallback(key); - cache[key] = (newValue, 0); + VALUE newValue = fetchCallback(key); + cache[rawKey] = (new WeakReference(newValue), 0); } - var (value, count) = cache[key]; - cache[key] = (value, count + 1); + var (value, count) = cache[rawKey]; + cache[rawKey] = (value, count + 1); - return value; + if (value.TryGetTarget(out VALUE returnValue)) + return returnValue; + return default; } } + public class QuotaCache(int maxRetrievals, Func keyConverter, Func fetchCallback) + { + private readonly Dictionary cache = []; + private readonly int maxRetrievals = maxRetrievals; + private readonly Func keyConverter = keyConverter; + private readonly Func fetchCallback = fetchCallback; + + public VALUE Get(KEY key) + { + if (key == null) + return default; + + var rawKey = keyConverter(key); + + if (!cache.ContainsKey(rawKey) || cache[rawKey].count >= maxRetrievals) + { + VALUE newValue = fetchCallback(key); + cache[rawKey] = (newValue, 0); + } + + var (value, count) = cache[rawKey]; + cache[rawKey] = (value, count + 1); + + return value; + } + } } \ No newline at end of file diff --git a/Source/Tools.cs b/Source/Tools.cs index c6c26bd..911f345 100644 --- a/Source/Tools.cs +++ b/Source/Tools.cs @@ -29,7 +29,7 @@ class Tools : CameraPlusSettings static readonly Color downedColor = new(0.9f, 0f, 0f); static readonly Color draftedColor = new(0f, 0.5f, 0f); - static readonly QuotaCache shouldShowDotCache = new(60, pawn => + static readonly QuotaCache shouldShowDotCache = new(60, pawn => pawn.thingIDNumber, pawn => { if (CameraPlusMain.Settings.customNameStyle == LabelStyle.HideAnimals && pawn.RaceProps.Animal) return false; @@ -46,7 +46,7 @@ class Tools : CameraPlusSettings return isSmall && (CameraPlusMain.Settings.includeNotTamedAnimals || pawn.RaceProps.Animal == false || tamedAnimal); }); - static readonly QuotaCache shouldShowLabelCache = new(60, thing => + static readonly QuotaCache shouldShowLabelCache = new(60, thing => thing.thingIDNumber, thing => { var len = FastUI.CurUICellSize; var isPawn = thing is Pawn;