From 28a836ff5f8af1927a511d4ae1bd6d7de3d51d3c Mon Sep 17 00:00:00 2001 From: EmsiaetKadosh Date: Thu, 6 Mar 2025 16:49:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=AD=97=E7=AC=A6=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .clang-format | Bin 13592 -> 13592 bytes .clangd | Bin 176 -> 176 bytes CMakeLists.txt | 6 +- Chars.h | Bin 5536 -> 6612 bytes Game.cpp | Bin 434 -> 634 bytes Game.h | Bin 2074 -> 4260 bytes Hud.h | Bin 450 -> 508 bytes IText.cpp | Bin 3020 -> 9874 bytes IText.h | Bin 25456 -> 33258 bytes InteractManager.cpp | Bin 18144 -> 20168 bytes InteractManager.h | Bin 7370 -> 8996 bytes Renderer.cpp | Bin 1212 -> 5896 bytes Renderer.h | Bin 6086 -> 13654 bytes Task.h | 43 +++++++++ TestCode.h | Bin 170 -> 1460 bytes Window.cpp | Bin 1236 -> 20300 bytes Window.h | Bin 7408 -> 14290 bytes def.cpp | Bin 3316 -> 1472 bytes def.h | Bin 8400 -> 12104 bytes exception.cpp | Bin 4018 -> 540 bytes exception.h | Bin 6096 -> 7264 bytes gc.cpp | 5 ++ gc.h | 142 ++++++++++++++++++++++++++++++ includes.h | Bin 632 -> 738 bytes main.cpp | Bin 12784 -> 21310 bytes utils.h | 210 ++++++++++++++++++++++++++++++++++++++++++++ xWindows.h | Bin 542 -> 2574 bytes 27 files changed, 405 insertions(+), 1 deletion(-) create mode 100644 Task.h create mode 100644 gc.cpp create mode 100644 gc.h create mode 100644 utils.h diff --git a/.clang-format b/.clang-format index 515fe06a42f59dc581821ba0be6d716449deac30..aecc7e32a3e57c7267f87a3894816c44bb50207a 100644 GIT binary patch delta 14 VcmbP{H6v?7v=O7><`|;EhKg^gC>wy4b;hrqBaw#3!+DX!4{~(m!Xs)2Pl%s;KWb~ zq*EC}fF_3n`6)oQGt^`aAS-|&zMjDm%+LX9G++RcFsqBfJY5DuFr5cBG>4%8XkZao z!~p0VYp`R=;d(&MO$B0*GxC6}av+V6jRvZVh3bJhGL$G+66wfPs0TDB>j+6JY5*Mo zb0Wy+IY0~wjcA}FK+d$D+#sqjc@3YgJSfal7_5L0#3}-YR31Y**y*6SNu2zLMYbN{ z4PxT~J;Xt=0P{A&*U)&t@FB8&z-Xywz!wvsc*Be#R1sKEz~UEMT*2g!V+!JpdPK^h h$RBWTz~YKXr@Mhu8m@>c0!J+*-2o#OtQKdK0|23Foc;g+ delta 28 kcmca&yg+-yUG~YY%mR~Nv!7x&V5nd)V=&yjgX0ko0G}}m7ytkO diff --git a/Game.cpp b/Game.cpp index a9934ed835c2e2bd438c98bdc7971de1734b12e0..27c0215454b6f3e40d352632fcfb63ad36309acb 100644 GIT binary patch delta 235 zcmdnQ{EKBm=frL~+hm4Bh608XhD?ThhCGI91_dCQ%1{oZol#`MfhzJCQh=(;88jF) zf%3HsIun<li7*&Df7e;j;X~$#(02k*B2LJ#7 diff --git a/Game.h b/Game.h index 7e00c90a729af8cce840095a46b76e364f1e6a0a..9c8533d82569768202e6d9137c4c6f14f6d85109 100644 GIT binary patch literal 4260 zcmb_gOK%%h6h7*1EPljQkdSFZkByvOcU+Ig>d&W{~cv?oj;?0}F^G4eddw?6cpd?_tx(O0H8P(oBL zvC2eF@UFjJAvA~h^whtTg=WKAE|90`8*&c5 zSQ96o;A8L1r&}`RWA(lZZ(~J?Jcwgmhh3VJZsQHP=EQ98Vs#^E%u04Am6D?U*Rb0M zVqa*aIo8hA58>}X@qB{!%>Fi37DsO6P~XyZ46xc6a`A|>ViSBbtag#-nbsnO)(8@! zo-PsdOlsrJDKhB77wbkX`XtMUZk$7cH#2B%;TmWa?E4X{SR*3u{~AGqwIK&Gxj^>D zmp(iMZiR}!Sn-YTxI@o18?uMY^1cFt3^!w)*`%-jIDx#0 z+yjq^#O4y46j-z%V>fxG>+UI6nI~;#z;1$w#>J$&;agi|&Pj~!j zFM0NT`}fy>r@uV<@x`y6A^X2w{_y6l!{+O2NA2v-*7nOkT0gbicir39g6+3|z4|$~ zLk}<$#>k7@O%*en7d{%N37Np1=ul}^HSP?}+&A`#7+*4>%(zSS8TeJS@bYR6R)Boo z*Sv=-#s#Y+mjnAfJ2NNTBjmrphdnhP)pIn#YTM9Gago{6s2-HDCVVDx7xm&iF>k&@ z2aVW2bKqp;G@j%<*2VI*e=Ls`!7gG=;e+;F`39Fm230-x9Y{D6W;Js1i`{%(Pq>6e zyo1TR>ixh@c$Hial|we2$P&vietWgN41M33;#G7|HTH9!b8IKs#36Go8{0gcd(dMF?;H|Suvy7#=6f4XqG!p*g0W( z8xw2_tm~aO5#U zezooA@G-+hzrpq#vH9CElcJ^HzZbQVr`pNmX!WO#a-FJHU0g{%JIjPoeLdGtq_~nc vmCBu%3}lCib-AzpkL>E%@!!3ZMb8z725NVKx^e>X{|J8aaN64p0$Tq9yym}G delta 536 zcmaJ;OG^S#6#krPW^@`zYsexOSBOwarfu{f5F!ZLB+NQ|lpq>DXc5v+DEW4^s70+? zM!VWa)FS9t1pR}~kd&gufqS{<^1aTvPM$~4PP=dO%!L+t94a%Wsbw1x_^6b%+)kSb?DUVa3_i61>xv_^D0vR=?uq*eVS}@zr$sIN@^Nn6WA- z3qy)8PFznz$vr3i9lZmad9!fR!hz^Dk;VFua-iMsM)24bF9oTRV46rF{q09`^pwQo zXvP3N^q21i59I3-G$%3ZLR=c49)k5ye~gDu=B%Z#Af@m+`b;5+WfCHT%H+fnZeK{;~Z diff --git a/Hud.h b/Hud.h index 493a557824feeeae1a420940f4f3c086ea776bfc..7791094a623e1bcc2bd8a6d50ad14b3973b9e0f7 100644 GIT binary patch delta 45 ycmX@a{D*nNZpO*gj6D4L40#Me45U*V<_f>7MFQl+X*soEnns5D6dl@BOFU}JFWnCN`GmE^CteV(10 z+r2k)CX^t7&>7$D?(Dqn%rkTT=U@2}e~;W}M`B6jK=vfXXJ0z9FBkZHE^lQbLp(pg z$glX{mt#CR!q~Bl@%goUBTMp?yS|lfM(+{+e~xuy>B&e=u<8JFAIq9-;oCWAbwT4X zX4TK*{6Rjaj?xBZj2&I_o#b;Lxm{E27S7m%JR{88#LkJEaVX#6?-0*Yd4bO%z8~TH zyewdC&q+7IeFwW7WBeS?4&T`S8eFPr(Y*tS=%lEkrKL~eQbbe<#p54|R`4JjWudnk3^~E|3nLVpIRyy<|o|d9z zJ?}SV*YLE5r|Jph;@%c3!m){bkxPBM9>K`S*fPZR|3{2VX92ZAy&iVJ$s0t4&;yjS zxxzEGWmJe~c8YE?_FUf|jl*V}o2+(POisHu3f@OMqUY;sn&Fx-`nEkK5q4UHEtChw zyID?-S%R6Z53k>oGh{sa+M&yS#poBFn5O*LHdmF;k@@#|<%HSDMP=j!d=hIM;=f`L zn_G-KJi#MeNhLmCI(= zUPl|yS9{3JL?^@~o+7V%@!|8Nd&A2wI{of znEpUiNFV1N`5A)eU0n2=RG#6U@qD?$r>8}KpoEG-7BYHsjzfA5sjqIwSne19fuLq$uvPUqjP4yN?z#*{Ly)bWML?vvf zwE9wGlb$1D?rMjG=z=IoD+;ZY*b6a)KEZe9LsIHH1aXQOc!1nL$?o>B^9i14$Ar<* z>K;V_#3A6_-s>i5zvd1@oY-U4` zoWd?yCrAAeaHC>$^VHcpF$<^=rqyoB1ARk%LhGm|+n67-@=)s%yN=!2P;EyJV{rWT z>ZT~isMX48TJ1D@^~4n(QI+c_jy6?L)Qf58K2=c>s*r~|s;-Xm(ctb?QarEFp&&+*<{z(fTT_6K8~TLJI2lp+TO=zH-&tnfr zDK_oLcMZCmW@+M7Vk7o5&+xx#-A=y8n{0=WXY&H$GON`6+mD&ZRueLwOHw9Qt0 zBdHy7_M|QyMmJ<*5|;b>OW@m1cd=LUq+~5y8QO4mq~$dl(wT@+_wNW)lZ;A{L)TW3 z?BHEY*^@X|GBFEoIRweKIU`j6?3nAXFSas$F=ngB+LQLbx*(4O&}VIbl=u35Y%a>cy_0M& z#)0at{#=C;ZGgUY42=8hOL-Nw+m*fzH(o2g_uR&+)PB8niczEaH#J&shjwEe(Jabe zW{li#aM&Ms?|MM=Fye@~gdDhnUdd7OL-v}wnGb~X{{YtsW(^$;S|iLZWnQM!^&ZWR z{U+%4@?0Ca^H9g_behw7)%fZ0E%U?3p(|pWvemTTR;L+_*LCylbQLLE{wel2eEcsz Lr$y@5Wc2?7-gkiq delta 534 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 ZXBQ<~K6|p|smW@3XI$Bhe~=9Y_8YL+RPz7; delta 101 zcmX>xm+?U_KN)|}jg1F)u44Mqq c3@FMN6c{`wJ9x@ZzUZmM4pax@vqRMa02qQ9xc~qF diff --git a/InteractManager.h b/InteractManager.h index dc9dce0f57741a8e01d64a4e66ab7174fe917270..81cc60750d182ea3b9fc814ff579c5ebff440f20 100644 GIT binary patch literal 8996 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 Q2=9}?DbK&U;y(0#10OuI!2kdN diff --git a/Renderer.cpp b/Renderer.cpp index b00bc055e4b1b6b9fd7ef9ca7c372cb9b4b87755..3b49ecd5cdb8649a4f3b135800c31e5013a5552f 100644 GIT binary patch literal 5896 zcmc&&S#Q%o5T4iYD_oFJkRY@OcqoSi@$ML(I)& ziuX0SAy;H8{9TvUg5NoOFJRqNx-ym{tm=XGytMJ1hF_F62mKJERn(6mZvr}_D&shW zriUvjoioZcYgJW1U3bq%u+?H)nt1caI*axpHvZX1PVBZuRdh!WU zdeAAu$XD3b0M|64re6k_y@S6DypBMBD^Sua=AYN_4S&<;N}GcE0J?1BI}BX+!hc4k zdNNXb!4hh<%vb&12gMjqQ#R!?_){nEr4A%#cvROE9#-!i;XB5!F21yJ6!PE+s7J7A zh!Jx0cBnjhJCnDdI>2`bxtCT_dX7fB3E%edY`RA+JPkRtUIZTo54WL@dHVOG*AL!E z!At#oANFN(A0EnJAv2Bsdw|_Vuc)W>eG+E4n@*fpNabg|7dS_+Pvsczw3KTHdA5V+ zmF&v9U(p}IX9@JNJmil4666m;-fEUIPnB*X#80Vu;5I{~Kf@~8Hi7KJXjP+>I*+vG zuD2?mQ?E6!N0>21iQf8UE`D}3AFsLc@n}c;Ca{UvHv*cBp^0Cy9LI87R>jWtVM9(4 zi5_GyXSnOs<7L+8UP@#mU`4syM84tCJ-6C}%Urw5dUZ`Ev&cJc6eDFy>+=KbkvZdY@PA^U#LM$T?bc* za6|@n31hs!z-x7gs#)*xF_DXSl7MW?V%9o(z{ZQn$84q7GE~nwG*ASHIkLV!4m9MH z?_=&P<~FhS2_*7=#@eD&l(k+?#xnTJ_z|sRo2XeG1}VRyF2=JeWBycEFVAQ0dVKwg z+~2gMh>khB6=z~h(zsUdMz62Q@nc>i^PQpY#!@|HRy{{v4DcxG@jb`L9QpGcy{hL; zdBpG(?+D>LF|5~xy6r$W#W&U;-2;kb z9=qDGR4cGq>t{W(QR+qHrP7<#KGs^r$*l!C>*W)i>vBC>0VVsOAwT2RLN74GScdlm zr|6ir!H1cLoHwq@PwlMv7RBQMH$5qcA5pu_~N;&iLQ&aDg_<{8`1ah3O!c5>PP8sr_Cr^wNv z>U7-3ZXRP-@|MQ0Y=sUY1CkTLcxOcXVmHCw*z;|G((buPm!gjGzU2@d1#jAT55yiL zK4(?QwY=aNCdL)!*n99CfD=2JM?oj{y}Vx{vJg#)H+l=mJHY(J-@@$fLL*zDy0%=m z!}BfAPp6>HPr0l0=zwb%56}N8kXidE-adNl(>uvrAKzis-CPmpGkF7RI*>!;XNSNO zhMxJmxG&>4M{dI#Gw7iA0CzzbV{3x@Qr>!Q$xYnnv=)`k$8ZQvcA{XE>`czMD|Yl3 zIl-#!Zz8?D&02(Cr<$g?x8WUZ2e#|EtgK#g$Nr0oYSQbfkI~gv9<`Y}i6>3&rzE;r V<^IyVVFdU~M_BV13qQJu$4_1pg0<|3X?rK;wJCsh?$(tX)`&TQ)qHA-@M5W`D5xc8PXUO7&I7)7*ZLE z88R8FfOH6u&IQs640b?lz@P~vLGmRGr9e85!5YZd2SSBuMoH5Q7^fL!C(W2x=h*oy z_#y)r11C^7J~M6LW>zzB)dQ7t;;`HnsL%*#y*1cSh$@5=Ko-@aSeMR_2zIs}Lps>8 o;XsGvF{Ci$Gn4~8s0sE4x*BnGMY=#g=QHF@P7zI>yj#o{0DCz>3;+NC diff --git a/Renderer.h b/Renderer.h index cef4ab33eb20901004936a86ac4c203dc8d28ff1..3cfdfba9fbd14a6363f086ba31594ead005830a2 100644 GIT binary patch literal 13654 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 A0ssI2 delta 689 zcmaJKb@BKdAeVcv!3%Zi@ zPAkt^vEDv{Z_!b7MxNq%q=3(nYe+NpC=%-%mr0qD2^p7+WND_jvLsbm6;-0rkRs;Q z_qPAPz<7=MWw|3OJUyhZ&@a-PQsS3m_4kf*cypqRM!!0|z`AK>m*h5aIbfIzYim5; zW3(9D6UBx)gE{>;^zK}XDRunpaFhlny4SI&?|9oMH3hGX7@njG{l1v!uGqCorG4gT zt*u$q=IG5$d`YBA2ja#8aW>JR{jY&g1_f0qnhjwmk#G(eN@0UOM}1c^H8e9>Sj+49 z+GQEd(Pjq!_B>t>>fVRcl!EJq*6Gt-pqY}FvzRm-Mw9UzC+TO#XhFu?GF~2mJED2N z2P+C*SQb87z4&1z@ouQMB_k?w!vk>bwpMP8ryF)1f79o&oz;4-aPC!_zlmGipe0vj z*53vG*y&^Y4Rhuj85eO!bHlupQ#~jS#h{ { + friend class TaskScheduler; + +public: + Function func; + + explicit Task(const Function& func) : func(func) {} + explicit Task(Function&& func) : func(std::move(func)) {} + void schedulePop(const bool pop) noexcept { reserved[0] = pop; } + bool scheduledPop() const noexcept { return reserved[0]; } + + int pop() noexcept override { + schedulePop(true); + Success(); + } +}; + +class TaskScheduler { +public: + AnywhereEditableList tasks; + + void runAll() { + for (Task& task : tasks) { + task.func(task); + if (task.scheduledPop()) tasks.pop(&task); + } + } + + void pushCopy(Task& task) { tasks.pushCopy(&task); } + /* 必须是new Task,交付托管 */ + void pushNewed(Task* task) { tasks.pushNewed(task); } + void pushThis(Task& task) { tasks.pushThis(&task); } +}; diff --git a/TestCode.h b/TestCode.h index f4211ebdd859faeb290bb1a2c895741b69387ffb..06a1968ab8ba00ee98606916d6378851f7eef691 100644 GIT binary patch literal 1460 zcmb7^T~FIE6o$|3`YR&PP=|m~q}{N=&BPVkZ$NN7Hoo6=r8zTHSeu{q2wnbIU%G|b5N2I|z=D5LEuzT_ssITgxtgCl=Dz)(3 zs&18?@+I4S&r(gsQ-+_&wd$;HxbayW??9-%2i1%6HB>jRd4YG?Z}vgq_-A;TQ~iW4 z%#m01?`R9K$_z`q6k%sS?SOU38WEGEFrgj0{FcACQxEBO#l3Dp<2Pr{iEc#=xA4lB zx>D91W1n&RO5V|B^;&1_T8Hc=-ucoWV^MGq<5|vAH#+fDmIt27Uu0Sm-x5{}k9kIg zD|`lzEMlv_&)jmd=JqE`VTn&f8T3_=)~gzQMSjsfkR9Czy#=RU(ILOel33{#Nvu_i zjX8BG?knC6Ug>us@f M=EAPtVDl#Z1~fn5zyJUM delta 14 VcmdnOy^3){_2f<_9p+jFE&wMt1WEt^ diff --git a/Window.cpp b/Window.cpp index b66e3e9db869b420a12d29802e5ba94a8624ee20..76fd8c2fd7e6a7090a8bb0158bd5e10e445b3213 100644 GIT binary patch literal 20300 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 KcyHXeI{bff$_+vQ literal 1236 zcmds$&rSkC490u#B2Pi&0!9%OFBnfoFaAsPU`$L5?9T2IaM!G>D8`E~;e+`u9MxaD zfWW~7y_sfbcBbvu_G{4p&+_skUPc^Gx+AQ`{k7sVqA4Q-_B^Ngs0UP>7?Xdmrt8MfuWopHb<%Ldcr$#zFH`BV^=KC^YO-Tz&2G$CiyrnkpTkXRyoXpScPYDi9l`$< zQj!31NG+F}c<_eqdZq(oygbqoHHL`8rfL<3@R6feiIL32Ri-MV90PPQ7RPWD^Nlfd z&%mf-S*7bKy8Z-njeP5t-RxhD3DE4PC6A=DFh5uCHXwa9(==w>_k6 zYzNe!87c#}_SZ-6bB^p3;ol*PXk@1ot@Dz?moo&38h3AEuTfSF Tw*&9r{4PENbzbq-f9UrYCV$gs diff --git a/Window.h b/Window.h index 09d8e2484f554675b0981e5bae3cd6899becb673..da7920aecc8afa1ce624bd53999278aecb34a0f3 100644 GIT binary patch literal 14290 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 D3Yn1Q delta 1231 zcmb7E-Ahw(7=D*?^UQ4D?n~QQv(0JQ2vpqGwA6^){D@4`%Eml3L0YJNAxpZdo1%D# zAc+2ilu=!Y7eZInMc#(sWl-rwblv+qb2{@P<8a{jKIiv-J@50LFWHT@r}<|q9q8OA zV@%`Lrzt}zn!<|`sf06(>W?dyBHm!-W}K=_3yC7ok2Q93F^kG z*OT{a$2FB1%F=C8Xo{kErwcYtvVDWDbDAxjj`1V+$pZ>a@VA*qnR^lC_w!%)S{}rx zuD5)UZnF1?ZWQlzF-E+w>09wYKT;MY1LoZxSS#XKsfb{~?ZykqDYejLZfTZs_^I_k zUwOV$G?P|yPty#ahd9?b*P*Z#VEayq9s29;EEz~532~#hS*CXN>m+y7#1t00kSS7v zi#}4EZ-%3C_oxZF@Vco~%SR94m0=vP$}oCOWn6Fms-cK zcj+31_z`nZ`C|?X-U?%TiJIhwZ(-Q$!n%FGe_NO#=DHYBQb{RNv+9WY{uvqlUZ034 zB{!uW!e>X%fA|%bA%rU~4-{v|-hEli{Z#P#;f(Fwuc~CZRR6bV*A6=ptgpf}O7+}; zc~2ItKGVgb!W(vJyr9=o)lYBEO6I*#SW03u#H32^MA^=X7aLj!zR73vi#1&u{RxJ` z6wS*A%QRSHEiKo5z?`QJi-!Y7QQs8TDYkx^_c$D|3r{Thk7KkUgV*&2ya`@HchH83 h`W7??>!h@rU;Lg-eqX+^@w)~OeQ_zrW6u#U{U6(G7!d#f diff --git a/def.cpp b/def.cpp index f64fd5cbaa04d58290ea39fa9c0f585ad17b4676..67eb6c850468e1b5dbbe5fd3ba14c0ff0888b850 100644 GIT binary patch delta 129 zcmew&d4PMu)5+o-5}PI2ZZUh7G2}C3GNdplFcdMQG88hD0(l^oA5c6G2um4qfKY=W z8O$$cC;_U3>CpnS6M^!j45^d#7}X^efV$Iwq8bc}Kvhr~22BQq$$gB`tO^XZ3|s)m CGaEJl literal 3316 zcmeH}VNVl55QgU~{EC7JIUCVHVqz4Us4+1SD`_fUiL`gLNhPA+C~iR1try`Ki!6Xs{-{7pQo^L{V0;1xDQ|a;OO?UC!z@GNGUXZNhQ4v8^3E~( zj(LxUc2(4C@u6Il1|PgTVv8p(ki$y?g5R7-!Wy3!!VRqHNA;x-~x{gnq^7O%lv y2C98qU->NVoxs~Nb?UNMckaa6-wmUZIU;GYd;A`8wW(vdsP zy{$5}te)U~QuWlf>f(9_cW&adt+sGw9rw1>Cf>)?N9vrqr2j6f^Etg?e7>vtpxIJu zpwY_LuYgYM-Xp9SfL<4WYpMn=U2thZiVf_zg58(ZC*bm_I-Bq3$`#ywfVCamA6KjR zpVxMT~aV6SO~r1>DuQ)smV~bLu))ay4y6T5I?e&u?h!k+S`d zyo$8uwFQkFq(*zR;jb%@%C$`>MZ?iZ(^=Q=oh$1G*LooEc%Hy{BEVYsy$!Dc8z1vv=PzZ7Bm(;eM_0F8dt*m zFj7wy>@}rh+2()fpRhiRE7D+uu~xB)tm>R%Jk5jF3SJTqHB_BU?c$GFxPyDFRhhbo z-I;nG**~Sd&3I~~n#FftO75Nn{Q;t6klf3PYj{)oE@aQ}#~9oOS949Y%2ZQLL#GLR zE~2K-MI>(G-jrHUb*!3KU#lCa6TFtGTj~s6q!F&*6>{o;t4QElk(zVG4bWWByqnq* z&(t$ei>+imZ^5!_dLJu&=$E1lF)3%E;Ur?Kq3(c^(W(KhW+00zwXu~eO-$1m7ZXpG z-X^r79mFQ~TTG87NK=QUXJDC|$lF4zu!c>00*B&D;j!%QDJh*{bW-v{%dMiKGiU^9H4IE~v+-AM3~% z_N_9SRS`-XT1!vp?$Im8+Y&s})KNBz&s*vmGLrehd{{v2Wyn=`O{U(*wM!apg*oW1 zV_k7+T?fS_(2Ua?)AT5vj||xnd)gvI88ux^mUUM;1N!WUJ=BB`fi=(P_s-;!Rj0#f z8-wmgqvBheRc{%!Q7Tn+S;8ndEFFnsTF$piHO$10J)ENvcDlYsBopvOANa~(Z|S1! zd*7q)5y7x0*7AMQ-5csXczg$TkS^K4eSVV;RTaa<<*9?;Bh<*FOT~O=M2Y!GSAw`8Acq@_dF#bWm^|z|0e1rCqchPnms^w*iW4P z0DD<6H$klfTwrQ&&B5`^eaxJ z#}!SPICoV4M|_$+sMUY|_Mcz=o_pucU-NGPwUWC*u0u&3WVYh@khN(I78MV$qYYqV zPR2YTapm`|Oj~e{BUhe^Wtbp3K<9Fr)Pb<#Q&4D>;Wd?85crHX3}skPas)K;=5>h>EmH8O06jO=8BFAa-KZW z6{B+tk;=K1^|aWt!U|+ppZDZGSS3!$Q%hD!$w$lm_+_=UIlcQmh1{g44mtL6Eg)#s z?@!W6{T(4?*=Nu9WRK}ssk~yB@n^YIUfI|a^jxiK?pOT`=HYVz&RsqtDpoye#j2Uo zr+S?@Eq!8HZnSujj8bzVOkIb72v!j{wP-Z?Qo*8wj`O$n+rp?Rn%;7Y1eY2L=xLD6AP8*W@N6nPON$uJE63qAVaMSaONeHSewH^e1)pZ~c|EhlJl8xZ?+_K4C!pq(p@*y-y-IK%X&3XL4jaUt zqP*OBK&0}g0#kAKpE<2JSzl7|?jr1>#btsiULVn!llH5T+#=W_4MwnBm8VR0ax}XP zGEe#IRhxH=*8bEJ!#l5=Z|uBScJ{(k7a#T733m(iwrbz@H3FA_952U%5C*Elw&d#F>t5{=~9B-JU(OC!8}c{T_;o0heR&! zcag~qP>uY$(8w0Y2@ms{HKd<#$vaWt0Jb47b{}~rXZ;rEQ=ZdSJ9oE>;*6ZGhGJ{? gd7Z2>y)iD+L2^iZ;mZ_y(MT3vH?a_xPtP6y1KRrQbN~PV delta 1347 zcmb7EO-lk{5T2ld-KZtXBy}y7M9Zi{5ZMP*chzkEfMALt$E)jU? z6kUprLB|fAJ9O^a%=_-Tt8QP1SN9!f=6Rl(XMI|Dp1gTe@Imb@U8v`c_!1l|y|)h5 z;fLGfnu0~hLk4=G8ar}#NC}}?*vExXNRhW)aSM1= z!rX%;;;=!ZhzlH}7Vk87(TQKdU@B$+N#eXpXO~WndSoDC4OO6r>66gQN~3g-SH&U_ zuF8o~MxkgxMI2yisl}RVE2`|0ZYKApA^@ zX>G#}-s;Uw;%0v*R~;I-~faDDBTSUPiX>cjr4s^CsV8xz80 zXF2Uw`d6Whb#hf6`pKvE{Y%WseM|P0HKxyGKJmdvO$+?GcJ%u@drWNEmo4ynkwIP-p877#EfO?vtS5yy`@W1GsViZq?Lv- LUys5$;!o=fe`xz( diff --git a/exception.cpp b/exception.cpp index 240c22b719dbe2e1a0a81d1be61d803b497ae7ed..c23b1a35281ae32a440e9de1876b1e170a9f001f 100644 GIT binary patch delta 120 zcmdlaKZj+)XYOEz5{4p%Oolv$^vMOx@|;Nwr9fT|L&{_aUR7ot28GEwjIx>~43!K8 z45 J6`5-pxBz?A8NvVn literal 4018 zcmeH~UrPc(6vfYLeu~8)vi}M}m~Ryk^$-;FP(5g_t5jCHVIh9?>UU>%)rfisVi<_Q z*>&!nbI+bVjx%rX+N70SA8Ahm#cC?0Z!1zuuk;7H*HAsiVMH1qr$aI#pB**Ch=Gl((Kvb%Ob=yGqfzh=aGVNMKgO4REA zlzm9md$Nn1l8$u3tb`WBY>BF;)NjF}2kv~Vt~xc0z13T$w`xPiBAvO2u}d6=DU_%} zq)*m7$4FzIWWmjAgIL$dAw4^sh8oN{;c3rNugv`_pC@usa7OT|YKz**^f`=oO181R zB~sBEGj?2Un`>B+F3BjEU-P{{&Uj{3Eb|J!W$ikK_U==(7%&!Th5Ig5hAujBZ|wKl zeb&oV|5xm*+w51+;teFhxov;S+?U(twF|**{uR4(>tJZ>TDC%)%dGiW*9zT2aG8I# z>_4)D(?avvQO-Manh&4NlncRW{`DHMN3y+3XimGxdHZwPOt}!8=3g&6ISg3S2Elpl mV9MOrK5bsR5Zv|`irLC;=gmI5=I_s+c9xr+RL7dwN$dkiCTr9H diff --git a/exception.h b/exception.h index 49926f31ad44f4d6da8272e2c492bfbb704a3603..2952734f7239aee83164c3b34d74d5d1524ac221 100644 GIT binary patch literal 7264 zcmd5>ZEq4m5T38_D=sx@plXdKCZ??>zVw5!)uv+nfc=0#DG3EU=v$ipb@h36Saz@X z0!Ir+E0#L%9Ho9@?6C8{un9c5t;5`rkrk3H>;lJp=iUdx)`p%)f>AG4vT??5>%g$OdR@ zV~lFNVR6ir*0c-lnqWhS=M!AfwF_WPa_KwtHXXbgy>q*nBNN@b+z8*PY;kxU~;+DbaF3*;^4JAfAR zBBj2JV?I9RH90smSelrhk!W6->CwbSiMamRk%3WY6Bsn|Ie#p{N{gdRv!{zES$JK1 zOhT5#p7-Di_mLa3W$hIE+uZe{1e&0IDxe-@F|BRV5xs(c?WHJ)#!@~wng-LK{2mZZgPeU{g1 z^TF$3h;)pB+ABebiZ)DktUmtwFC zu%7;K{a9;p?oNUFeVSr;eEoW64=rx(bPuOqyy(4;w|3lBPN83M+A-fI0@d$vwYvi6 zd8SvKc0VTwmZ2RhOP)`M1?smy#ju#)twa8h6}w#?>P4{C~*EWbpAUHG6MPUte1f__;N+h%@Xop~;|DxB52T vJG86=9Ga-s*|mzZV;lU<#~^#|%3Z^qqo?@~&&pl(soCiv;vq-dIA8t`DuA~; literal 6096 zcmd5=+iuf95S>@|E36<@33rf?Pzn!#ctEsJad`?nq`5Ux+C+}ii>mVJz&Sf!c6|$p z6StKW$CuriGqY!AcKrK~Ji)PJ&Y`@MNCwiC80Wr(awL~Hzn2r4%NWlGc=HkeeVO9P zG2Tt(6zAviLLSL8^Lr_e6L~xMzb7-u?8*o-y2>(EGr%~`=EzXK;v8Y_DfHjReGGeMn7e266WJ8c2AHE3 zw~YjUR%mP=B{PBooXwP$UD<^m`fDT)akUDX7RJ$5i>~?as%2!Tw5DhM32>hQcQet{ z63V!eYlA=U%VsH#`p_zBhifObmg?z_bg(v4tmzom^}vP**FSNj*Di!N$-M)d$rtj8 z)>FFgVaoEEL7#+>$+-*sldFnr4_E4~Wf*+fJ}by2Mf5FUR5dJi#n(sEL-f&GL~?Gf z;{tyuOCpRL!>AWGD$*Gati5&j7)Fu`$% zHR4RpiwbmxGBoeI7^`uS&H;Ipw2F~Wsmv6o#u_4HCezGOwvsODLU|2+`>)iB^?ao=t3)$lJd>GcXJ70)u8g7moqFR2^lRKV3dqhS%lCB4kDE zc>}Jnj$FzItS`BIA)mph80Vq91*aC~dEPs>&!_6x*I`(7Ew{_LO>o~d3(37Ru#j1% z59V<%K~~y5%UxvO`k2>Y-TKmRmu*$>-UQ3WV3twrgZ|&+oRV^=Tzd{_cu< z=xxZS{YS8Vgq>0O8g5%t9hOWC59+qUYN^8l@_Ps?>bAk@sl$qMLac<} zi=A&&yB)r!buF>Gz`4mt3q&yY(T9j<`#m6?9kX3SIYZN!d(h-5Km+2Unh_Z0A~>ue3G<|3%+1y>&;vVEy^+ zgPnE*zX$l~u3WF#2U!bbzxXMr~Rv zv%NWc$skk9vpTYVEB4o_k~gW3Rdj3@y{%T|5wn?hto-ewcJ-+)+)l%Gk-M5y7jmaz jyU6`2R2Oz%M|JeJ=JD%>b_4ukSyne#k6eFXzD4~7&UO+R diff --git a/gc.cpp b/gc.cpp new file mode 100644 index 0000000..95f84a6 --- /dev/null +++ b/gc.cpp @@ -0,0 +1,5 @@ +// +// Created by EmsiaetKadosh on 25-3-6. +// + +#include "gc.h" diff --git a/gc.h b/gc.h new file mode 100644 index 0000000..edacaa4 --- /dev/null +++ b/gc.h @@ -0,0 +1,142 @@ +// +// Created by EmsiaetKadosh on 25-3-6. +// + +#pragma once + +#include "def.h" + +struct IGarbage; +template +class Garbage; +class GarbageCollector; + +struct IGarbage { +private: + friend class GarbageCollector; + IGarbage* next = nullptr; + +protected: + void* ptr; + explicit IGarbage(void* ptr) : ptr(ptr) {} + virtual ~IGarbage() = default; + virtual void collect() = 0; + virtual void deleteThis() = 0; +}; + +template +class Garbage final : public IGarbage { + friend class GarbageCollector; + +public: + explicit Garbage(T* ptr) : IGarbage(ptr) {} + void collect() override { delete static_cast(ptr); } + +protected: + void deleteThis() override { delete this; } +}; + +class GarbageCollector { + IGarbage* submitted = nullptr; + IGarbage* submittedEnd = nullptr; + IGarbage* packed = nullptr; + IGarbage* packedEnd = nullptr; + IGarbage* processing = nullptr; + +public: + GarbageCollector() = default; + GarbageCollector(const GarbageCollector&) = delete; + GarbageCollector(GarbageCollector&&) = delete; + GarbageCollector& operator=(const GarbageCollector&) = delete; + GarbageCollector& operator=(GarbageCollector&&) = delete; + + ~GarbageCollector() { + IGarbage* iter = processing; + while (processing) { + iter = processing->next; + processing->collect(); + processing->deleteThis(); + processing = iter; + } + while (packed) { + iter = packed->next; + packed->collect(); + packed->deleteThis(); + packed = iter; + } + while (submitted) { + iter = submitted->next; + submitted->collect(); + submitted->deleteThis(); + submitted = iter; + } + submittedEnd = nullptr; + } + + /** 只能在gameThread调用 */ + template + void submit(T* ptr) noexcept(false) { + IGarbage* garbage = new Garbage(ptr); + if (IGarbage* end = submittedEnd) { // 后续添加,可能存在线程竞争 + while (end->next) end = end->next; // 理论上不会进入循环,但防止万一 + end->next = garbage; + if (submitted) submittedEnd = garbage; // 参考pack(),submitted会被先置空 + std::atomic_thread_fence(std::memory_order_acquire); + if (!submitted) submittedEnd = nullptr; // 防止submittedEnd = garbage在pack()中置空后进行。此函数是同步的,所以可以这样操作。 + } + else { // 添加首个,一定不会有线程竞争;或先前的已经pack + submitted = garbage; + submittedEnd = garbage; + } + } + + /** 只能在renderThread调用 */ + void pack() { + if (!submitted) return; // 提交链为空,不进行后续操作,防止竞争 + std::atomic_thread_fence(std::memory_order_acquire); + IGarbage* submit = submitted; + IGarbage* submitEnd = submittedEnd; + submitted = nullptr; // 先把这个置为nullptr + std::atomic_thread_fence(std::memory_order_acquire); + submittedEnd = nullptr; + if (IGarbage* end = packedEnd) { + while (end->next) end = end->next; // 以防万一 + end->next = submit; + if (packed) packedEnd = submitEnd; + std::atomic_thread_fence(std::memory_order_acquire); + if (!packed) packedEnd = nullptr; + } + else { + packed = submit; + packedEnd = submitEnd; + } + while (packedEnd->next) packedEnd = packedEnd->next; + } + + /** 只能在gameThread调用 */ + void collect() { + IGarbage* next = processing; + while (processing) { + next = processing->next; + processing->next = nullptr; + processing->collect(); + processing->deleteThis(); + processing = next; + } + if (!packed) return; + // 搬运packed且搬运期间的packed链必须必须完全固定 + // 保证运行顺序 + processing = packed; + packed = nullptr; + std::atomic_thread_fence(std::memory_order_acquire); + packedEnd = nullptr; + std::atomic_thread_fence(std::memory_order_acquire); + while (processing) { + next = processing->next; + processing->next = nullptr; + processing->collect(); + processing->deleteThis(); + processing = next; + } + } +}; diff --git a/includes.h b/includes.h index afb8b7ca989e4ebd129360ec8e5c2dc48dfd5374..307b69e5619c404b0ffa3121c766fcbaf9fe5734 100644 GIT binary patch delta 53 zcmV-50LuUP1mXpd;Rkg9bO31pY?BHBACcim17`qZlMDeJ2UGxI0CNCqlh6SllPLkP LlNA9JlkWkE$s-VM delta 22 ecmaFF`h#V{!^!N79+RgsZkW84No;Z?Qzrm#WeDg1 diff --git a/main.cpp b/main.cpp index 8e8696ce387e1d519aa8144b019e0b57ab531622..9346221f063e3152b698fefb3b4b56f74c1078df 100644 GIT binary patch literal 21310 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 +class AnywhereEditable; +template +class AnywhereEditableList; +template +class AnywhereIterator; +class AnywhereIteratorEnd; + +/** + * 此处无法进行代码编译层面的直接约束 + * @tparam T 满足T extends AnywhereEditable + * @tparam L 满足L extends AnywhereEditableList + */ +template +class AnywhereEditable { +public: + using Lst = std::conditional_t, AnywhereEditableList, L>; + +private: + friend class AnywhereIterator; + friend class AnywhereEditableList; + friend class AnywhereIteratorEnd; + friend L; + AnywhereEditable* prev = nullptr; + AnywhereEditable* next = nullptr; + AnywhereEditableList* list = nullptr; // 指示自身属于某个列表 +protected: + bool managedByList = false; // 指示是否在列表内管理内存,而非列表外管理内存 + byte reserved[7]{}; // reserved[0]: Task::schedulePop + +public: + AnywhereEditable() = default; + AnywhereEditable(const AnywhereEditable& other) {} + + AnywhereEditable(AnywhereEditable&& other) noexcept : prev(other->prev), next(other->next), list(other->list) { + other->prev = nullptr; + other->next = nullptr; + other->list = nullptr; + } + + virtual ~AnywhereEditable() { + if (list) { + managedByList = false; + auto lst = list; + list = nullptr; + lst->pop(static_cast(this)); + Logger.warn(L"~AnywhereEditable() : 析构时没有清除list,导致了析构时pop"); + } + } + + int pushCopy(AnywhereEditableList& list) noexcept; + int pushThis(AnywhereEditableList& list) noexcept; + virtual int pop() noexcept; + AnywhereEditableList* getContainer() const noexcept { return list; } +}; + +template +class AnywhereIterator { + friend class AnywhereIteratorEnd; + AnywhereEditable* current; + +public: + explicit AnywhereIterator(AnywhereEditable* current) : current(current) {} + AnywhereIterator(const AnywhereIterator& other) = default; + + T& operator*() noexcept(false) { + if (current->next) return static_cast(*current); + throw RuntimeException(L"AnywhereIterator::operator*() : next is null, end of list"); + } + + T* operator->() noexcept(false) { + if (current->next) return &static_cast(*current); + throw RuntimeException(L"AnywhereIterator::operator*() : next is null, end of list"); + } + + bool operator!=(const AnywhereIterator& other) const noexcept { return current != other.current; } + bool operator==(const AnywhereIterator& other) const noexcept { return current == other.current; } + bool operator!=(const AnywhereIteratorEnd& other) const noexcept; + bool operator==(const AnywhereIteratorEnd& other) const noexcept; + + AnywhereIterator& operator++() noexcept(false) { + if (current->next) current = current->next; + else throw InvalidOperationException(L"AnywhereIterator::operator++() : end of list"); + return *this; + } + + AnywhereIterator operator++(int) noexcept(false) { + if (current->next) { + AnywhereIterator ret = *this; + current = current->next; + return ret; + } + throw InvalidOperationException(L"AnywhereIterator::operator++() : end of list"); + } + + AnywhereIterator& operator--() noexcept(false) { + if (current->prev) current = current->prev; + else throw InvalidOperationException(L"AnywhereIterator::operator--() : begin of list"); + return *this; + } + + AnywhereIterator operator--(int) noexcept(false) { + if (current->prev) { + AnywhereIterator ret = *this; + current = current->prev; + return ret; + } + throw InvalidOperationException(L"AnywhereIterator::operator--() : begin of list"); + } +}; + +class AnywhereIteratorEnd { +public: + AnywhereIteratorEnd() {} + AnywhereIteratorEnd(const AnywhereIteratorEnd& other) = delete; + AnywhereIteratorEnd(AnywhereIteratorEnd&& other) = delete; + + template + bool operator!=(const AnywhereIterator& other) const noexcept { return other.current && other.current->next; } + + template + bool operator==(const AnywhereIterator& other) const noexcept { return !operator!=(other); } +}; + +template +class AnywhereEditableList { +protected: + AnywhereEditable head; + AnywhereEditable tail; + +public: + AnywhereEditableList() { + head.next = &tail; + tail.prev = &head; + } + + virtual ~AnywhereEditableList() { for (AnywhereIterator it = begin(); it != end(); ++it) {} } + + int pushCopy(T* value) noexcept; + int pushThis(T* value) noexcept; + int pushNewed(T* value) noexcept; + virtual int pop(T* value) noexcept; + AnywhereIterator begin() noexcept { return AnywhereIterator(head.next); } + AnywhereIteratorEnd end() noexcept { return AnywhereIteratorEnd(); } + AnywhereIterator begin() const noexcept { return AnywhereIterator(head.next); } + AnywhereIteratorEnd end() const noexcept { return AnywhereIteratorEnd(); } + AnywhereEditable* front() const noexcept { return head.next == &tail ? nullptr : head.next; } + AnywhereEditable* back() const noexcept { return tail.prev == &head ? nullptr : tail.prev; } +}; + +template +int AnywhereEditable::pushCopy(AnywhereEditableList& list) noexcept { return list.pushCopy(static_cast(this)); } + +template +int AnywhereEditable::pushThis(AnywhereEditableList& list) noexcept { return list.pushThis(static_cast(this)); } + +template +int AnywhereEditable::pop() noexcept { return list->pop(static_cast(this)); } + +template +bool AnywhereIterator::operator!=(const AnywhereIteratorEnd& other) const noexcept { return other != *this; } + +template +bool AnywhereIterator::operator==(const AnywhereIteratorEnd& other) const noexcept { return other == *this; } + +template +int AnywhereEditableList::pushCopy(T* value) noexcept { + T* nv = new T(*value); + return pushNewed(nv); +} + +template +int AnywhereEditableList::pushThis(T* value) noexcept { + if (value->list) { + Logger.error(L"AnywhereEditableList::pushThis() : value is already in a list"); + Failed(); + } + value->list = this; + tail.prev->next = value; + value->prev = tail.prev; + value->next = &tail; + tail.prev = value; + Success(); +} + +template +int AnywhereEditableList::pushNewed(T* value) noexcept { + const int ret = pushThis(value); + if (ret) delete value; + else value->managedByList = true; + return ret; +} + +template +int AnywhereEditableList::pop(T* value) noexcept { + if (value->list != this) { + Logger.error(L"AnywhereEditableList::pop() : value is not in this list"); + Failed(); + } + value->list = nullptr; + value->next->prev = value->prev; + value->prev->next = value->next; + if (value->managedByList) delete value; + Success(); +} diff --git a/xWindows.h b/xWindows.h index 1224074a00f498eca5cbfc37d250d0f693414849..4755984b287b4964cf06f7b230321a5cacdc0c8d 100644 GIT binary patch literal 2574 zcmd6p(N0rA5QgU#ZhQn!AR)y_fzm=P$^{MFh$c#nF>0FA_EZ|6t?dCchIjD2d?PQ! z@89h?oEBQ*g@kOnr@Q;l?94y2v-{`DR%!FD53Fhfi!8L5zGZ^uFQo!Zbk%tx%e z_8lC9Xf`;{#}(l^g{(fa5N?F%}>5x$8Yzt%yzX(x7u#)#Dgd(S>y zr~d*yN6ZK*OvsKyFo)O>qB9=D2G(|xA;`cg{Q78ZFzO&3OkjVYb8d>JoGpX*h&kIu zOH7lWPnaL3y9f4yaSMjJ*mLUksk4{tjP3b^>M`w?FO8?{2yA2yg3n7_qDJRQasTiqNyou9s81R_wfe@7OKz`=+i*777nvW!ihFJ+^$|6!c2JT=Xqv;Tj>%A8xBGR2_HZ{7A?+++SFbA@!S zkj~wP+emR6GjYWfSDc9}rMS{e+-8c~oQc~?aa%KS>r}IZh4LN9YaX86S)C@cPIXV` z=AmR=;a;*%*|s)nhj{NR?Ol~U;c8l4Pu6eNxumKmi2JMQ8Bgo>;nzRZ^h@{t$i5{i z?uJv1@^@>Kthr_{Tb=b@7_ZK{qq>}GF`%lco73NTs-`h@b-=nX5wC@5dR0gLy`xvm mIr{Xj@NcoIyYZ4cQFD4d3~0jWjivjw&wSri>_m^d!~OzI@T@@q delta 193 zcmeAZna48W^u+5bf&~nv3`q<*44Dkc3|0(W44jkaaY|1XXOxmm0?L#CVLn41g93vs z5a%(ZGL$nYOs-=WpL~$ft~!LFh#?UuS`5^m2vnH}HYt@M1gNe8$k$--VNhZ)WH4ed z2GW{9XbrLf2+M)?r7)xe)s+Bs>oI^_QOuCR5DzpV5$KX^pk8GAVLEGp`fEX^0063< BB+dW;