From a8318a394164584be995c9a34602dcd7691976ea Mon Sep 17 00:00:00 2001 From: Speiger Date: Wed, 20 Jan 2021 04:29:08 +0100 Subject: [PATCH] Addition of PriorityQueues -Added: PriorityQueue -Added: PriorityDequeue -Added: FIFOQueue -Added: ArrayFIFO -Added: ArrayPriorityQueue -Added: HeapPriorityQueue -Changed: Micro Optimization for Iterators to reduce Boxing/Unboxing -Added: Helper replacers for cleaner template code. -Added: Heap Methods to Arrays -Changed: Upgraded to SCG1.0.1 --- README.md | 38 ++- build.gradle | 56 ++-- libs/Simple Code Generator-1.0-sources.jar | Bin 12206 -> 0 bytes libs/Simple Code Generator-1.0.1-sources.jar | Bin 0 -> 12996 bytes libs/Simple Code Generator-1.0.1.jar | Bin 0 -> 26299 bytes libs/Simple Code Generator-1.0.jar | Bin 24693 -> 0 bytes .../src/builder/example/GlobalVariables.java | 41 ++- .../src/builder/example/TestBuilder.java | 35 ++- .../collections/AbstractCollection.template | 14 +- .../templates/lists/AbstractList.template | 6 +- .../templates/lists/ArrayList.template | 12 +- .../templates/queues/ArrayFIFOQueue.template | 275 ++++++++++++++++++ .../queues/ArrayPriorityQueue.template | 220 ++++++++++++++ .../queues/HeapPriorityQueue.template | 199 +++++++++++++ .../templates/queues/PriorityDequeue.template | 12 + .../templates/queues/PriorityQueue.template | 58 ++++ .../templates/sets/AbstractSet.template | 4 - .../templates/sets/ArraySet.template | 6 +- .../templates/utils/Arrays.template | 60 +++- .../ints/base/BaseIntPriorityQueueTest.java | 114 ++++++++ .../ints/queues/IntArrayFIFOQueueTests.java | 9 + .../collections/tests/PriorityQueueTest.java | 9 + 22 files changed, 1075 insertions(+), 93 deletions(-) delete mode 100644 libs/Simple Code Generator-1.0-sources.jar create mode 100644 libs/Simple Code Generator-1.0.1-sources.jar create mode 100644 libs/Simple Code Generator-1.0.1.jar delete mode 100644 libs/Simple Code Generator-1.0.jar create mode 100644 src/main/resources/speiger/assets/collections/templates/queues/ArrayFIFOQueue.template create mode 100644 src/main/resources/speiger/assets/collections/templates/queues/ArrayPriorityQueue.template create mode 100644 src/main/resources/speiger/assets/collections/templates/queues/HeapPriorityQueue.template create mode 100644 src/main/resources/speiger/assets/collections/templates/queues/PriorityDequeue.template create mode 100644 src/main/resources/speiger/assets/collections/templates/queues/PriorityQueue.template create mode 100644 src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java create mode 100644 src/test/java/speiger/src/collections/ints/queues/IntArrayFIFOQueueTests.java create mode 100644 src/test/java/speiger/src/collections/tests/PriorityQueueTest.java diff --git a/README.md b/README.md index 93fa5ea..fba0b38 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,32 @@ -# Primitive-Collections - -Simple library to create primitive collections. -Using template files to generate them. - -Project for self teaching. \ No newline at end of file +# Primitive-Collections (To be Renamed) + +This is a Simple Primitive Collections Library i started as a hobby Project. +It's basis is of FastUtil and Java's Collection Library +But both lib's have a lot of problems, and in FastUtils case foundation seem changes to be no longer possible. +So this project was started. +With a Rule-Sheet, and also hopefully more Test-Coverage. + +Currently Cons against FastUtil (will/might change over time). +- No Maps, this is next on the todolist. +- No Singletons, +- No BigLists/Sets/Maps +- No Custom Spliterator support. +- No Reference Collections. +- Some implementations are slower due to not including all Micro-optimizations (this might not change) +- Not as Specific Case Testing compared to FastUtil +- No Java Serialization implemented +- Code Generator is right now not finalized and no automatic setup exists as of this moment. + +Pros against FastUtil +- A Cleaner implementation of Collections that do exists: NavigableSet (Exists), PriorityQueues are Save-able outside of java Serialization and a lot of others. +- More Consistency with features, not leaving a lot of holes in implementations. (Anything outside of HashMaps/Lists have massive holes) +- Abstract Tests to allow more coverage on tests and allow quicker implementation on tests on new Implementations. +- A lot better packaging where each types have their own packages to also make it easier to use the library. (lists/sets/collections/queues/utils) +- Due to package name choice: This Library imports do not overshadow java imports. (Anything after s is overshadowed) +- No Linux Environment necessary to generate the sourcecode if you want to work on it. All done with Java and or Gradle. +- A lot of extra functions that become useful in some cases, like: ITrimmable, IArray, extractElements(from, to), moveToFirst/Last, PriorityQueue iterator. Better Synchronization wrappers that expose useful interfaces. +- More Control how internals work thanks to SanityChecks +- Support to some extend of a Java Specific Feature: Non-TypeSepcific Collection Non Delete functions. (any method that used Object as Parameter instead of Generic) + +This Library also includes my own MergeSort Algorithm that does not need to duplicate the input array. +It is a bit slower depending on the size, but is a stable sort that does not require to duplicate an array \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2b03510..44cd562 100644 --- a/build.gradle +++ b/build.gradle @@ -1,26 +1,30 @@ -plugins { - id 'java-library' -} - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - -eclipse { - classpath { - downloadJavadoc = true - downloadSources = true - } -} - -repositories { - jcenter() - flatDir { - dirs '/libs' - } -} - -dependencies { - compile 'SimpleCodeGenerator:Simple Code Generator:1.0' - testImplementation 'junit:junit:4.12' -} +plugins { + id 'java-library' +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +eclipse { + classpath { + downloadJavadoc = true + downloadSources = true + } +} + +repositories { + jcenter() + flatDir { + dirs '/libs' + } +} + +dependencies { + compile 'SimpleCodeGenerator:Simple Code Generator:1.0.1' + testImplementation 'junit:junit:4.12' +} + +test { + useJUnit() +} \ No newline at end of file diff --git a/libs/Simple Code Generator-1.0-sources.jar b/libs/Simple Code Generator-1.0-sources.jar deleted file mode 100644 index 0cc54335c3aee6da56132384e6fd50073c46dd73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12206 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 D=%Ga0 literal 0 HcmV?d00001 diff --git a/libs/Simple Code Generator-1.0.1.jar b/libs/Simple Code Generator-1.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..e21ac446189d897c7c2e9c4cd4d895475bbfca5b GIT binary patch literal 26299 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 Jo$20x`aiq4fZG57 literal 0 HcmV?d00001 diff --git a/libs/Simple Code Generator-1.0.jar b/libs/Simple Code Generator-1.0.jar deleted file mode 100644 index 7fca31fd8741b0fb0e4dd432e97a3199148f745e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24693 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

af}@fh%Gl=;NCSf4Sp`pyrmI$RT$K8RT<=~ zhg?=RPpjgOG;@C$}n(Sqbou7mA4|@@hY_(q#L9(5|>wBLSZbRACo^OelFNt zbL%w6!!>Z{Qz&nws5UW@{Q}vyS^MHFPi_Cj(s|1?z(ifP3Tbp2=z{}?66G`Tv~)L% z(?{|;g93jL^`nBznm;FjNW=7~SD8r{t8uO~V*Ymkn0DnR0&3yT=r|vChOdY0xy4EQ z2S(?GYeG;mn=+|1WHq0C|v)Sod9HoG*; zu@YJM@yCwHWyTOJ4>E<2&wl(u>mg0APsMRax_3+9Tav+0)*I;phD`K-U|3JaBXF1^ zb3z93iTq71^Q)4<4=e~dOdG;#SEXLKrC$u=WfG(-b8uLzk??*7lFzFfC%mK;k2z6*Cw z!h-e~t*IS>yj*x+O2 z^`IG(6ahof;SB5(6K)QHU=cp2N6aD@ZEhS|)sGW9{pd1Vt`pal3)j=o*`~eE=&Y?L zH%^GumfW$A0)Un9mv ztH*33b#0qeXJkGZDW<8GPq$WFMWb{6plPFGDLCT7#BR*k4%u+VP_ur;S=(s(QS!c* zjli9h-~K`i>(P_!&+A+}U-l{1@-`R$DU-gN6~EJYF-ilGMZIWGc9r52tqD^pAl+aC zmUFlKq*dT@Th6P;Adl5jdGS!Lj4WD(CgaeFvXX%Yckx-{_pr-8iyY%Ph6jvuHP76x>1w*~DMK62Rrmo80|jkchOMp6}k zhBvw--9Dyw${m!mpr1FNPE#GhmGwyloYl4s$0t`w zN@|LCd@_99#tU_bA*+xwgxGO@%#>II)NiWz0aSzGqJVH$zeRyyV!v)BYB8<+kZ~(w zDl!dn+S1@MOv&m3EYQbFL?MzqbBzjN@GOjU_4Pg-B*~yJuNDflMq6_L+JRUTFh<|P zFlE}_EODPO4^#Wy)#}bIQn{ zmDCzFEx!HH5e2}eJrdYx;8tpwqO-D+Nc>{_s_N=$oi#$1E5r7w(~etD2Qb>N%Sk-b zDT9Wil4B0u@|;?e2|{$LIX#S>V=X2xlP;B!_d~zBK0$Q>wt{NFiZrg}!Q1Fj2iYcv z7yPj&M|TeB-0h?X4512p!S&Q3rz8ea=xDZcLnZVqd(B!}sGM{l_LMYZ%9hlxTahi~ zV|!_$TXTX-H9S?TtiNlu#VxYqE2TdllvMWyeyjpvDZ3G1^KeEJ{kPkmVDH zLjvYkUT5S2VG_yEn6!`s%oqhvQ$Z%i3rMWS=p6EE#p>*p+;}V@tfW<;d%}fCP(ZCi z^v$%P+cca*CL=Kl_23w=BUv~#qKKR``7p?hK!k7^CG85;$H6Vc$B_MjRc9M|-6k0J zH&G~@H?xnu3=(ST?0dzPsJIhKFaxM6!qi)+%EirxrS#WV6x7=ZEWw`V^;6Q*uYIsQ zxT3;&>!nvyc|-`%G`#QWGk{IyR1KHULWc6VLa9+L)#6Ui%c-PY;%2KI2moU<)#oj_ zX;IRu23$Xmi$fVUWCCTSmz~fYyKw!OVp=F1-vC7`gU?AK(o0s9!ob-U%BSI78qH4| z?Va=h8>ALem!r{r3o*~5yoxxo=w>yu-L-2)f!{CK(qBz*{m?)Xw6(Kn62>feqU zJ!(FAKkvxQKP}K-Avd(Y2)kUV@dMF2Ja0!Ln3&!%lFor+85JpZjN4ULN^ZTj{e87L z*T-a$tTx1~<=qv1mR&;##=+Z06_LWdw45!H#@!uH}v)x=-@qcwHUd<$ynqL4`~{D+17GdLWza|w;!GU7u&YN;Y4 zib?@vs~F*mrb5#ua6IHxmwuZ+ z1B9JM&wC*#WMkm{Z;1%uq)9oSl8`)HQhUk_U<8J>2zr)<3#g7cKh|bKKBUQpFkrW{ zk?g^IL*>a@VyitT#eweP907tf(N#=or`!>l>w$msp5ge@2=_MC>^!;h>$eI8{RZn5 zP9=^8Z&~ZK71;czm-69#+e714)Y_ zS@GmoDzLv{rV`ORqKnyz|3q; zXr2=N#WIav5Y>ymN;YF13k^SM5I=yPGo>&}te-FLsaZtz$f=VK_zJg8_H8FIKQE4O zjFXhrG<&oA^n*9uhV1;7V>}!CzF1q8pi9s{p^&^|d1J0HlQy90TWF-qt+4-^Mdv_Oi0PL2Ti-%!79oX|>@91LrVnT?NWFk^8~} zagvqn3eilM?|0MTJBb}9Er#`^2igOr*oaxs{4f0in`+3E(LC(Lg0~Q2U6eEzhwnq# z++>o`cd2NV3!_mKZF6K5<>YJnvz1|{_A2}680suFSs9$BY8h#0ZxY7Yzf99}rVfS2oFN8Bn8;zfz$UBq$*v)kG=TP9^18_x+cq*Nmhq!`X4TvDCI5z)}& zOT>K{Ei-Gde-~;`I=D;@uW7PXB?o%-*izTnK%m%+5a^7gs3&L;UmBZNri?66xAC6U z%2n7mC5~{6t=}6TL;@{ZtjF<9GM56=uMpSw&u!B~X8$_EI8;Jx*cBhjg3JvGRg_Q9M-FlBoPS+L1C6{qZ%x}Ryq1ED6 zAu-#jI-|*pUq=LJ4BFR~e+c(n*-j}aqBc^?m2W6)xuTCRK<|jdb+OTHq`E{OH%pt| zO{u>Zp4j(n0J;c1tuU*_u(>AGfYm>!G_oW341I_>S1bss^hMTX)XBB@xOlHM6pKTd z7yJs!>-ZS}@AMfQj}e+nJUY^Vt$dG!XXb{SXYPi*bNYt3bM}V0(`~r>sc;V-ma#wU zK9#=zvkF+S7qscmPjoaHlcARuFfBo5%7ap>+2g^aW{W6@m34AAiCLjUJq=a|d+tS= ztlZQ6=LQZJ$xV>=o{U1U0#kMn2&oIQ;QN&55C(QG9~#v_nrt{!>9 za=Sj}q(ht*3C9q6PUeLNIi-qK$ClHXIc~DkZRE+Oruh@;{KdF8BBI6vwKj7l4A=qI z`4OH;F2(ZZc|!C^$C2~dJoRWTS+M zK<7n>2iF!O-4^wRD zJl06ow7}1^x)YLD8@(4E7V6EuLq_sdI5H3pSkN?dEY9p$n1aWD2JH9kv9_!Z?UZaBL{G z9VZ;>D_kjn)*{Q;cx?Taf6d%72!r+#rAvN9;z*rq(&j{ASySpX2VixJu}kkTv&;N* zs0D}LYN-BZan--aXsG@}sFgIcHu^_M9HFT34T<4DBdIl1$@+8XYdi>fp(1U}#YETG z{Q2>TbxE0|clq7p4v;j26SdS%xNd;DG(H3hkrq*M3p6=94Iw`s%i6CU z`uxBtak1QbXByW$yOCMPwfP2_pk&TH zMgN>?#_dt!vl$z#9P=If4wErt26h;A9nQf~J%_eQA|E1FDpciy4V@sPlKRCy^|^Y=pHb;Nb`8-gG1bm^8f}yJyPL zEmw}6-gpcOqRBO~-jWJZyy^8CDma-xBZjR0Bn{PNPDR$+tV(@7f)Txl79nusiTktD z)l zODom#l~0mugzN;PUHTTL_A(YH=WAr$pjwkBg-h_>MD*9J9I#C+mk=PocrsB+zlLE3 zg#0zjBv2>IA2o{M{$#L#6|sJJQXSGKr2KdI8gsqi=ci>4pqEdB^ksa;pUh|lp5h$- zwa8=rzXft+k#_{rvH2^|!UQDq^ChX&%~^ujl!p8B<;Bf$^=oNDKdztVfC7llhzenE z!G1dc-4T$87DnUeiDKBW+y zO&c@z6*?!-?rhudwC-K#A0>cu(j$e?el+%ExAK+s&z|3k1lZ30P40MnlRN(jWGR?^ z5A6Ka_y4O$iTqhet<_fU7zV!E;OgrfR<6E@PXuhhl%p?yFk{#nZZz!NCT$Y&PALT( z0XJyk9e*?KOw4;`gg2RfH^IKuGV%HR@_^-|RKA)lxX|ktfo+|nyBCSz65%#ANRUW1 zZ^?g($^``jH3qFb-hfJ>pS;Dhebt<0it#G$INGiUKOPv1ITn5UDpofv2y*y~!h0Hh*$wn}<{yW3 zbweE(fvP?)A?VnzCc1&(cQe>xhY(e|sr$sW+Ho004ufydhs>H!P`4svu45v}&!Vod zj6_9p_$Sd!nhMBjgGT(NeX8U7G!t|JPc-yc6NY0k(qSX^+$3xBd+u4Xrr3F+NB#8W zaHMXbYUMkbIIo$uZO!J*8&dl1iS#UtgRx7`kx)Zq8ATL@iqfS?45iqWMYo{Vg+~=S ze?|J=8Rzee&c8ccVP)pO7Yo#vS}n9RD&7W7#J)VX#)$+-m^rqR+R{BPzj>XhmZyV~ zF`0D0YVf4@;sL;4sC$n9m)&WK>*ORZFFS*2O6wOvp+9)mk-9rv!$O;0Z&=#3n6ALL z@nJ!(rQ0Q#t{!)|^`|@n;@=e4X{td0QfXvmV2!?b*-mQBC62Rr$@tB93P!Q&~9qq-i8a8}mss8;$K6!wU#mqw=YWy8T!*;4Thf$%BgJ zqPL8lg`GH4vX>9((K!d}{3Yr|CE*+-(uq>pSc~p!5iYNfL;N@MbbBK;d2WK7G;G2{ znh_8o`ox7TQDlnQMjDvk_=VS54CEvR$U)AA?01thiqu|l4TjU17#LEIxWafJ(B(M! zJh&{w-aruY8j@xH6k&c-xV_YiSS*gjr3T%z?x^WUXxr~`C z&-3t7kCjKw)jF2-evafr^+`I7DbsDl=waj#X)P(t>8mDgnw2MxAt!BZ8emc4EFWB$ z;>QB_sG~>-x2zG8YSyfx0E-mQZ7U)mFpNo~yStE()aQ|7%B)(&N~&Zk*+~oeF(-)B z55$H<{~TA5O)lYC&@T#9F$f8yN%n6HB(>A-d8V9Nn1)g41M$@E+0QAi#=T_eJ##Dz zyU8*8$vtnR*pwzWDBFi-8xuV0T(?}q*DE}L#_S29vv`f%nY&wt*%?^H*ucaUVPpDC zl9^+WWcG~OS+T?UdImI8)bPY`rPDp@IrQqe?srOjnOhT_QtC&W=l@O;!>00;YEN z74thFt@$(IXa86Lx_&&s6DO@-|ET z6$8JZB3~k_>POI_)VSqFB=PJh6tvYa*%aqb7kbgL;n9p8hCth5-BU`#AKcx7m=rdB z_mkoS$RXLR)?%lAn5VQHSJ6N+lNHW1R8|KW9E4M8Kn_zP6 zDXOV+A-I&d^evuJG;jy)U|Qite#GpaJcG?BLJ=J*`o(6F);Qv~_4}GGaWdK-RzMO$ zYSIKHJd_|rQAx!bHq|7qZdMp_JRPONA`+9QXL-P#tFgeTQ;`K%zLr5I>qjw7XDHcH zc)e+21unqS!z&14>XO7VWQcWaw9|b%jfPy(iW;B`=?t3ug#cnd_jcn=##omM{c#xr zdk)0g%Wg^5rs+e4+qZ5j4BHYI%;n7#6r}4QOPrNUSwFuJaDF?nt2iml*FF?i8}uC4 zU_8V+h27`jNw_e9d$f5?bbObyw$2Wslyb)0LRo2bM;5!wJ$ za;5)iE4U?qq!hck?|H*lbfI0Z92!1M%>7sgM$UmBkbjpH0an&6n73iUtPT}H%>^#2 z30#lBAnspPk6g6F_Bs2NT$wx4z~A#AfA=t7i9wA_R`1~p=DvKz1>v*?@tisqb_cdi zs?l=B1oSbD+bv$IM(4v1LY?pfz35t_GWE|*C|!O-X>&2$fYW96Tlf)KD5anEQg8NJ zhb;h-=JG1%v*SQbxZ0g73mpc}?|YP+G#ku9`LGivbI^s1kc#Ahi)2D6nxo8wWPfGL z?PCsmaDf0U=UvbfP&}3$;gi7n8(3niceZBjUM>_YrTU33!8ukjA!JMG7JaCNmCz*) zU-`^DTfCDaN_m>>A0&@?`9fyj=NO1Uek7OkqNm#TQqae0C(9p|aE0LGJeOvh04Nlg zywXWE8>ePV$|$_j<-w^aJ?a@>Z3DEGh5UI?LX+#gDc3G9c2EHsVJ$)n!x3*_t7bmt z(KsSLyZ^bk%h5nlEUv61>$h3gaou3ccEy&HA_(`01U2Bfgd_RzG{^B?gxBSA3rG|e6b%1;!% z!5hR>^vUY3mAHTx!>@0UXh10JWi%x4nD5 z`A`-8xr7*{adk`H@n;GWf1>zK30_Z7O-u+66~g~O1@sQbA3}WErM#iE;M6kXOT3fU zh>k9N%DYjGo#fNZpVN-@1EE_xcj5#u*R8`9Im+QTy2w6ubJPia(w#%C3zsLi+;Fws zk~wM^GZjVz6`F;dcoDTeMwtPIhLC44P)(RudPx@=7WtX5xOw(|MEs(#r*-1YikJ#( zZMh%@1Rn8bAE|4)iB!);GYCZMZwl*x0VO!2E#NdJTAAf>%~b)5TRXqoCwfI0hFGAP z+*NH+Aq~Mtct}w4e#)L@Lcljr6dR(o_%X6w(ShFwh@+rt4R=+B_K6?_f!$}LbYi=w z$lE^z43Cmv+=R9>q`-!n#M`$5ac<>z-hf^*vdH{ApdgA~knWRZsqihM!A>0G_M((fhDp+S_vs$&vWB2_>rHxA3jhZ4IP3fskhw~t?QwtWea`8kVdTo7M0W zJol=Frkp4WEUn!+9vYL5)?k(rc@6S(gqYFtn^mov8`JF+(>z?-Ts3=A(R+$Ryj-WcLqpb@4R&cd5zx=4v5}tW%(pv3 zz^Z|H?XQaa`zb7uKtz#*;)j`y^N&Yn-H86g_lEryBb>EXYXFh__j`)K15qsDhQxdwWK>7q7-!jk#|? z@X(E{l^C^8RqfNwp9?O`&xB4N!rSBQX#~pTw4WToPnr7DO)5QQaF8^o@&P^W0c2^h ziB9X@xlF?!I^3iA&z>#`x}NhPt+M3aiKI=>aei+8hPL-!7Qrn9xqt2Cs}u;1Ta5Oe zvaOw!w(pE)g7`$m3Qgv2pN65&7N?E>}oqf6N}luy_*_;WNdDu!;bX}X~# z#44OPJcOEvr9lPaLgYSNkR+8Z?RW(vga|s7mDQ={nrzVyGVVM;-VxmWO5z^sM^+db8+q%~ zM+ENZ8;Eoh$H$K+Q_sS=o6Q=M*U5;WMtB6y9*eJ+kZtB$5ldpO7@e8HyDAiLj^C;4 zQ`vB8kvnSUwv$z4IN1z{)iO=XA|;ZE%E2pt#((is4KM{xL*2(1R*kYZaSm=VC@gSc z;sp<-p{Gk(NI@5P3kBz~jV+!|y*~q3Sjp`EHV4-vnj}^(du19sHquU}JYPzmvPo{1 zqp;iT;s{x^%;gS}_{4_vJkd$7`UL!I!2HKz9QWVU)VB6E21X7JHvjq^hNiqdH_h*+ z-Q9Q7j`}}p^Z)H@3yOLU7XLe4@jug?G~8CL@tfetLZjT|Fg1QYfI{k(n5*JY!LDmW zYtCcNte4j6ryswE&cfj)+4eMadVG0}knykwXGp&QjkozeA%>y{Nx&HJcYqhw^)zpdIJ^*Jj%$HQgN9&B_#lRyT0Cc=>hs|DMJPL*AUNMD8hN$@ z$-(6uI!-Kvk+`A`H*z$Q9ZSwl^tnsde9Ew3N8jJXx~Z^f^Lb zq{GN**BK!Gk(tQtB{=qW2^n6S^6p+|CtU}HEC_n;7q={4{2(R?J6Gy44 zol_@ zOdE^SvGD&_$$3CEv2A@^MIt3i@1PWs-lZc*@1T?*U3%!fOYgmgF1?5p=^#xM0Rbr@ z0-*!~geF~@BJzdL$K&2yudcVVR&uh|oZmS!XXebzK70SywC(vEMOVSEYZTbV9<5de zg7?iI#y7q2wdn91fX6i2s=KwmsGlPV3n#? z6)z~SMNPj|2WPzhW_H=Yq^CtF76=3q^n5>(B@deUAfgL{9C-H*GjyA(Fi(&wY7svU zpfJOi&9qa!-RgY4zU`7{_$jHjjz}y z4`s8laA+Y_g%GxC5s7Qg=8{QLk*dbQ2wa-1*#}|ns+DPEel5}$MqW3E3Yix zDh*~kjMeFP*Gcsw09ao|ygNUw_C|iqem{UA_P*$ABJ<#)xNQI0cOZBazLKe5E+PZL$wgkQrSAD$&{4rMgEmG!1wqls;ln0-EvX`MBp zSq`g2t~KL%-rkz$2pf~QC0r3(-m2`SP{^c#omNg*hdAZJvKn1`=i!mKFDIOJ5HfCA zJn#NJ;8l1|C($jjh|f*pUvmwE?Kb`Sh)w8uEAlIOM;kKKtV@mV$)wvwVT$#e=Fr(@ ze0DAV22l4)GW!;$ga6~22`O27M%-f--dWSH4e*DrjO-v$q+PQUu~e+1;@`ucj#71) z6vh?64Q)u|_A%Bo^037NW~3s-@jNJbR>VDG?`#Km-0X#_`}xn|`tht&KV;%!Aj--s z@>KYsTtV|~r*JmX8`bSE0$6d>M=toSA)ktQ{y0saXX-xqIqm<)hYI?v_VGU9k1It1 zd^+(_SD1+&DB#T#eE<J21hS>Ac1VjPBt+y5c)yEWDg~RHc!VxHzBdw$ zMQ_C&XpK(gCZ>Pe{~nt80_+u_iyx|W0A(l!Q7UV>v&g_cC`tNQaDIMV@t$od4J0Gc z6AHSUre56?oUYDb+J+Zu{=6k)@Dt^ZnK@>$zDQ*aexBZL_sV<5=M=F;WYXg5<|zZt z#ifdJSHXNul5KSR={7upbMcDhN!&%yxZKX>z z3%dBU*yaJ)w=!O9u@q6++160a)Y~nkw|B8Bi)ba`S*X$ttVQZC=_Kerw?%xSvQHST zFvQ{@(4(zw}>@5-SW zwEAU(3N!AsrF}rbxE-H)c1@mru(o7ewY(pSr{6_k-qrU-TG^%|JM=`DzL=>gk{(l^ zH_^;|>jS3Na9Dqxq7{{MO4p6IuQi9`E~DRD(HxFoC+o*DfY(R!V}Z6o-OmGg7r~`N zF4-$1&&af=pbV$@I_hs^ErPJfDa;y%X=C*q=)AvhFAR(ig*0O;T_VJCZuWhXGFyyh zfFtPz26fguOTCPta5-jJ>7kXl#SC0&&U=PFGpbfkZJ?nk<`<&FTy!cD&e)~p7&G}f znJE`ibD#U& zXd#`IiG^kI`G*)XrK+4uE4tBJP>Y4n{yz zlR=>B3XpNf&4c!>DcGS8Sk)Ht;}vvZY4YmGkG?pcFH3D(?XcrJIo|U}VVAQQw7RRP z_%-vWUJSz_Lahp6T0H`-cS19FbkJTz!S_8R*|_Y=x;H!&*{<4`Nnf&$gHw5wRJQeZ zz^z8-W;8u;Hlyb&Nn_{i=yzeHu&~3=4ywSzc{IQ#cEJ$`D5QWik|y@pm9$bC7iVQX zh)eD31HxON#9JTW;%K)tEk%nvd&+h&pQv3HBkC;KAw$cF$;0HA-VyZiH3;L7+L8A0 zmB(wR?9$T6ebK$m`=pJS=83NKacsa=x5MR|+}mwdtUZUWM*%m)qVtHv)NY7@zUQn= zsuCeA0KS!DMPZhq8BPjz-A>zVY)>@xF15H_9#Fwm>lHpHq^3adl?+K1A+Oi8>+qlW%+Cl!H zw^WdqTOsYPv2h%Gu#-m050|6QbM_B#VX0=(82JY@NcpW?A#;tl>@2d9Ag1go%PkYm z(P-$#ZLG!ux-0QT*2_3T3RR9kJ?2b#qFqnnh5EgX63DT44bm!O{?u`jZ%xxH__}q2KmHU@1_Py>>%O3-;f6oZ%94b0aBi;y8 zb5nVWAU}!;m>t2jw05w6RbOtpXts>WuAp>xkcq-5&Wn2uLdh!7V$8T+uh&9}PNdLBi0}*1E`57rCBC_SM-!egxx?eBsr`wtE*j%Nh%z83-f5DWIa z6SnhPM_~be8A#{c0M|B${t-X_t?^z0fJ)lk$~64=+{Xt;b9d>3%Yc}f_;`|>_7*8c zd^}YyuMq6Y8x{i4lTaz;(!{g~1{QF=yjrbNI-4`Fl*_DgbY!B0R5kQHk6HU@x*A7G zx>NI8>tR_TY$a{RC?#!Hi!@}8A29*f7W72%nDx-#x-Xr(C%JafCL1?t2HeN3ZKn{# zYSEohBY|Ih_xTff^^C%FB0poz2^}CCxx4VtUH4Org0Z6F@?>WhFy2)_uO}qS8o7E^ zz^#1^b7E;KM0i;~`ZBmrM_Y?-IcWx+*C~&wq6YSs$OC^sn}$UhdP(M6sO12nKN9az{+eDN zMN9Bb$)dtnA=?DF?dplh>?rKChb?M+BG@Nq@wq>&pYSe8xI}r&Q7LV@f%jQnZ_hW< zA+wu-t|lBeq>pR$c2XEp*J9qet;QBbbSt<=WVg<26-M@STB=vUU1Oa*Gtfxx6fn!(;Cd#$8F$8olDY$WCH(_9V#YlWt0YH`X&?M!=nsRm|9nhxa$4cf|o;htQ!_H{GvksluQ-vaANF>mxz;23P-rFI`-{d&d6 zVdnk9iC+_8?4gd#J?VRNc1BydI$-5|{0_n!69&VT!7I*+EYHnSlT?JIb80t(^_J7` z>cm$Uh<|*@)lv4cjL5d62%w^*CDQ|7K9PT0X=@#|wV0@mZTKK>RFlycay4DqOIK~u zqt1+MWC6bttZd6R0>p4#yy5B+jF=sC@G&dW$f(n3W{w}HomZ`;+OMIr8c@{$!4T-i zdwZ60N{n{uuKh-0$NQEDeeb%*s&$8@b=X94L}INiCwA^jB!}UUksy7Cq0?mI(;S(? zdC!M-W6+hQNV61uLqpg|F)wJ%^n_JTg#=0QD0PKTL&s4df$jt5ud-;Y_QEEw3~5RQP_C-5pni^_&qJ|#;5 zSGf?}P_y}>$^KTUFcNszof~i+f}tMQR%i^?y6FvbocO@m>}sl-18py?FS!*rDSdbr zu|mx(_`GvF>iC7Z$%JQ98X^r{+BwHA(R+1uui>+N9EzH$p*0Rs#Z;$RBZ)k zHQn9YVk=VSMHL!IW5bh@lPJ1SiGa*WSmaYpT@F4nSy=PCy1{tQJvn>bN)RMDvADT7 zG0=GBil~Z+r`T;Wk;wZstBirYO9dG8S~sPSZrTBcI~_06V##fLY3$hY5gXqmhP$wK zn@!6TW5S*GzOB!Ri08wKXYH+)RyD?Gu;$yX*Zda?I%11>}X8eE=d@?h3t zw91Y9UUu114i?r?!I?w@al^oC4+}GL*&ze^Vtg>tpppd&gsxpm>@i9y#?Fj00a=Ph zLwh(G{I5N%bw+T#Cz=j?iEZCi?)^|#*dF6ckgQy@oj#a!UsAx9v_vf2!&=~Gb{zVl z@dsSup3Xd)EIb_KGfbyz-om3RK%-TnPJu7q!|??bBg&%^1t?}+HC;b6KNqetHq+lD zO<|fvR8%i{*pOZqDi;Wq!qu9_g>*8s6X4+F?YO0x@OHmueXX)h^|nw1eH^QaC=HdY|z>(&obClo8L%hqtGoPxe z0cek+#LGKt9YlGKu1tqxJ5t`!?!RJ6cbkKr~56AI`iPysT-cjcY+}opnKBpMDKbXVVyf01L80n+B-?Zeo&bJLj`$|CA+UL*Gr6t-L z&&hsEx+WC!(g^k(b!90g7|whrlr^_4fBG}95}TLEM~;6yWUC{zxcLDzEWyK+)LJ*D zP?REZAZj6@$uTR%lrzhZv>Jr$Bm518gv)x*7R?6zqqvwlhv7rzAf2lf&$r)5JZ}@U=3>8WPH$!)9M8az6^)$U@<-Xw0!f2Ly&1YfX4&w)% zWZb?r5cw4oUq9lhcluy;9phfCRRTdYRuG_|8q9*Hv;J~!yR`?`Gdblt*p`DRKJ1;= z=QkO}*M_|i`MM4OIO;%9o$k+s6>cnJFWu^!l?}laDRx2 z@AV$%?TU_D8GB_w_F5yOAx0a4x({cj??w+ac3@D+FnX85%D8-m5bfV}fRXPbNW;CfA%6DzUsYh#YN)EfXB(ecVE_~I z`@hxxq7jTrINSPMfEekv_>Y}6?1n6#3-bQ1)|oKyPdlrXjVzwmI+OnWUClF@;GcF@ zvkzJPYt3`f;NKC>;@W=N8Q}-A_$$KyO9-Q4P$h)VL4^VQNcD|>#r!u77e!DQ6_2W+ zc!7r?5A(m`|E8#j%0v}`yI?XR2jO3t=Z>bIZ>*@$GsyV~aHh!f)6Nd(HvX@nCKviV zs4!H0o^xDb00%Od@K-(j3+$h2J*aq8ZIlZuMe6_jl6@9@i;6*w+P&yv^6xMxF}$c$)Ig65YNN<+I)@VWflB@BE}yN2{u!gSt&(Dqx$nN&;zo6LZ45%fAj96Hh}7aylB8% e@qcXK+#&fu5gjQLdg&55@}rHs(*Pcw{rf-V*K1S& diff --git a/src/main/java/speiger/src/builder/example/GlobalVariables.java b/src/main/java/speiger/src/builder/example/GlobalVariables.java index 3f982fa..05fc924 100644 --- a/src/main/java/speiger/src/builder/example/GlobalVariables.java +++ b/src/main/java/speiger/src/builder/example/GlobalVariables.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.function.UnaryOperator; import speiger.src.builder.mappers.ArgumentMapper; +import speiger.src.builder.mappers.IMapper; import speiger.src.builder.mappers.InjectMapper; import speiger.src.builder.mappers.LineMapper; import speiger.src.builder.mappers.SimpleMapper; @@ -15,7 +16,7 @@ import speiger.src.builder.processor.TemplateProcess; public class GlobalVariables { - List> operators = new ArrayList<>(); + List operators = new ArrayList<>(); Set flags = new LinkedHashSet<>(); ClassType type; @@ -42,13 +43,12 @@ public class GlobalVariables addSimpleMapper("JAVA_TYPE", type.getCustomJDKType().getKeyType()); addSimpleMapper("SANITY_CAST", "castTo"+type.getFileType()); } + addAnnontion("@PrimitiveOverride", "@Override"); addSimpleMapper("@PrimitiveDoc", ""); - addDeprication("@Primitive"); + addAnnontion("@Primitive", "@Deprecated"); return this; } - - public GlobalVariables createHelperVariables() { addArgumentMapper("EQUALS_KEY_TYPE", type.isObject() ? "Objects.equals(%2$s, %1$s)" : "Objects.equals(%2$s, KEY_TO_OBJ(%1$s))").removeBraces(); @@ -63,7 +63,10 @@ public class GlobalVariables addInjectMapper("CLASS_TO_KEY", "(("+type.getClassType()+")%s)."+type.getKeyType()+"Value()").removeBraces(); addSimpleMapper("APPLY", "applyAs"+type.getCustomJDKType().getNonFileType()); addInjectMapper("TO_HASH", type.isObject() ? "%s.hashCode()" : type.getClassType()+".hashCode(%s)").removeBraces(); + addSimpleMapper("CAST_KEY_ARRAY ", type.isObject() ? "(KEY_TYPE[])" : ""); + addSimpleMapper("EMPTY_KEY_ARRAY", type.isObject() ? "(KEY_TYPE[])ARRAYS.EMPTY_ARRAY" : "ARRAYS.EMPTY_ARRAY"); addInjectMapper("NEW_KEY_ARRAY", type.isObject() ? "(KEY_TYPE[])new Object[%s]" : "new KEY_TYPE[%s]").removeBraces(); + addInjectMapper("NEW_CLASS_ARRAY", type.isObject() ? "(CLASS_TYPE[])new Object[%s]" : "new CLASS_TYPE[%s]").removeBraces(); return this; } @@ -75,6 +78,9 @@ public class GlobalVariables //Final Classes addClassMapper("ARRAY_LIST", "ArrayList"); + addClassMapper("ARRAY_FIFO_QUEUE", "ArrayFIFOQueue"); + addClassMapper("ARRAY_PRIORITY_QUEUE", "ArrayPriorityQueue"); + addClassMapper("HEAP_PRIORITY_QUEUE", "HeapPriorityQueue"); addClassMapper("LINKED_CUSTOM_HASH_SET", "LinkedOpenCustomHashSet"); addClassMapper("LINKED_HASH_SET", "LinkedOpenHashSet"); addClassMapper("CUSTOM_HASH_SET", "OpenCustomHashSet"); @@ -105,6 +111,8 @@ public class GlobalVariables addClassMapper("LIST_ITER", "ListIter"); addClassMapper("LIST", "List"); addClassMapper("NAVIGABLE_SET", "NavigableSet"); + addClassMapper("PRIORITY_QUEUE", "PriorityQueue"); + addClassMapper("PRIORITY_DEQUEUE", "PriorityDequeue"); addClassMapper("SORTED_SET", "SortedSet"); addClassMapper("SET", "Set"); addClassMapper("STRATEGY", "Strategy"); @@ -129,7 +137,12 @@ public class GlobalVariables addFunctionMapper("NEXT", "next"); addSimpleMapper("TO_ARRAY", "to"+type.getNonFileType()+"Array"); addFunctionMapper("GET_KEY", "get"); + addFunctionMapper("ENQUEUE_FIRST", "enqueueFirst"); + addFunctionMapper("ENQUEUE", "enqueue"); + addFunctionMapper("DEQUEUE_LAST", "dequeueLast"); + addFunctionMapper("DEQUEUE", "dequeue"); addFunctionMapper("REMOVE_KEY", "rem"); + addFunctionMapper("REMOVE_LAST", "removeLast"); addFunctionMapper("REMOVE", "remove"); addFunctionMapper("PREVIOUS", "previous"); addFunctionMapper("PEEK", "peek"); @@ -175,38 +188,38 @@ public class GlobalVariables private void addClassMapper(String pattern, String replacement) { - operators.add(new SimpleMapper(pattern, type.getFileType()+replacement)); + operators.add(new SimpleMapper(type.name()+"["+pattern+"]", pattern, type.getFileType()+replacement)); } private void addAbstractMapper(String pattern, String replacement) { - operators.add(new SimpleMapper(pattern, String.format(replacement, type.getFileType()))); + operators.add(new SimpleMapper(type.name()+"["+pattern+"]", pattern, String.format(replacement, type.getFileType()))); } private void addFunctionMapper(String pattern, String replacement) { - operators.add(new SimpleMapper(pattern, replacement+type.getNonFileType())); + operators.add(new SimpleMapper(type.name()+"["+pattern+"]", pattern, replacement+type.getNonFileType())); } private void addFunctionMappers(String pattern, String replacement) { - operators.add(new SimpleMapper(pattern, String.format(replacement, type.getNonFileType()))); + operators.add(new SimpleMapper(type.name()+"["+pattern+"]", pattern, String.format(replacement, type.getNonFileType()))); } private void addSimpleMapper(String pattern, String replacement) { - operators.add(new SimpleMapper(pattern, replacement)); + operators.add(new SimpleMapper(type.name()+"["+pattern+"]", pattern, replacement)); } - private void addDeprication(String pattern) + private void addAnnontion(String pattern, String value) { - if(type == ClassType.OBJECT) operators.add(new LineMapper(pattern)); - else operators.add(new SimpleMapper(pattern, "@Deprecated")); + if(type == ClassType.OBJECT) operators.add(new LineMapper(type.name()+"["+pattern+"]", pattern)); + else operators.add(new SimpleMapper(type.name()+"["+pattern+"]", pattern, value)); } private InjectMapper addInjectMapper(String pattern, String replacement) { - InjectMapper mapper = new InjectMapper(pattern, replacement); + InjectMapper mapper = new InjectMapper(type.name()+"["+pattern+"]", pattern, replacement); operators.add(mapper); return mapper; } @@ -218,7 +231,7 @@ public class GlobalVariables private ArgumentMapper addArgumentMapper(String pattern, String replacement, String splitter) { - ArgumentMapper mapper = new ArgumentMapper(pattern, replacement, splitter); + ArgumentMapper mapper = new ArgumentMapper(type.name()+"["+pattern+"]", pattern, replacement, splitter); operators.add(mapper); return mapper; } diff --git a/src/main/java/speiger/src/builder/example/TestBuilder.java b/src/main/java/speiger/src/builder/example/TestBuilder.java index 1ac536e..433a882 100644 --- a/src/main/java/speiger/src/builder/example/TestBuilder.java +++ b/src/main/java/speiger/src/builder/example/TestBuilder.java @@ -37,6 +37,12 @@ public class TestBuilder extends TemplateProcessor return true; } + @Override + protected boolean debugUnusedMappers() + { + return false; + } + @Override protected void init() { @@ -55,20 +61,19 @@ public class TestBuilder extends TemplateProcessor nameRemapper.put("AbstractCollection", "Abstract%sCollection"); nameRemapper.put("AbstractSet", "Abstract%sSet"); nameRemapper.put("AbstractList", "Abstract%sList"); - blocked.put("Consumer", EnumSet.of(ClassType.OBJECT)); - blocked.put("Comparator", EnumSet.of(ClassType.OBJECT)); - blocked.put("Stack", EnumSet.of(ClassType.OBJECT)); - blocked.put("Sets", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("ArraySet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("AVLTreeSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("RBTreeSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("RBTreeSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("SortedSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("NavigableSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("OpenHashSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("OpenCustomHashSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("LinkedOpenHashSet", EnumSet.of(ClassType.BOOLEAN)); - blocked.put("LinkedOpenCustomHashSet", EnumSet.of(ClassType.BOOLEAN)); + addBlockage(ClassType.OBJECT, "Consumer", "Comparator", "Stack"); + addBlockage(ClassType.BOOLEAN, "Sets", "ArraySet", "AVLTreeSet", "RBTreeSet", "SortedSet", "NavigableSet", "OpenHashSet", "OpenCustomHashSet", "LinkedOpenHashSet", "LinkedOpenCustomHashSet"); + } + + protected void addBlockage(ClassType type, String...args) { + for(String s : args) { + EnumSet set = blocked.get(s); + if(set == null) { + set = EnumSet.noneOf(ClassType.class); + blocked.put(s, set); + } + set.add(type); + } } @Override @@ -89,7 +94,7 @@ public class TestBuilder extends TemplateProcessor { try { - new TestBuilder().process(false); + new TestBuilder().process(false); } catch(InterruptedException e) { diff --git a/src/main/resources/speiger/assets/collections/templates/collections/AbstractCollection.template b/src/main/resources/speiger/assets/collections/templates/collections/AbstractCollection.template index 21e0b64..8a0b0f2 100644 --- a/src/main/resources/speiger/assets/collections/templates/collections/AbstractCollection.template +++ b/src/main/resources/speiger/assets/collections/templates/collections/AbstractCollection.template @@ -27,9 +27,7 @@ public abstract class ABSTRACT_COLLECTION KEY_GENERIC_TYPE extends AbstractColle @Override public boolean addAll(COLLECTION KEY_GENERIC_TYPE c) { boolean modified = false; - for(KEY_TYPE e : c) { - modified |= add(e); - } + for(ITERATOR KEY_GENERIC_TYPE iter = c.iterator();iter.hasNext();modified |= add(iter.NEXT())); return modified; } @@ -49,7 +47,7 @@ public abstract class ABSTRACT_COLLECTION KEY_GENERIC_TYPE extends AbstractColle */ @Override public boolean contains(KEY_TYPE e) { - for(KEY_TYPE entry : this) { if(EQUALS(entry, e)) return true; } + for(ITERATOR KEY_GENERIC_TYPE iter = iterator();iter.hasNext();) { if(EQUALS(iter.NEXT(), e)) return true; } return false; } @@ -75,8 +73,8 @@ public abstract class ABSTRACT_COLLECTION KEY_GENERIC_TYPE extends AbstractColle @Override public boolean containsAll(COLLECTION KEY_GENERIC_TYPE c) { Objects.requireNonNull(c); - for(KEY_TYPE e : c) - if(!contains(e)) + for(ITERATOR KEY_GENERIC_TYPE iter = c.iterator();iter.hasNext();) + if(!contains(iter.NEXT())) return false; return true; } @@ -107,8 +105,8 @@ public abstract class ABSTRACT_COLLECTION KEY_GENERIC_TYPE extends AbstractColle @Override public boolean containsAny(COLLECTION KEY_GENERIC_TYPE c) { Objects.requireNonNull(c); - for(KEY_TYPE e : c) - if(contains(e)) + for(ITERATOR KEY_GENERIC_TYPE iter = c.iterator();iter.hasNext();) + if(contains(iter.NEXT())) return true; return false; } diff --git a/src/main/resources/speiger/assets/collections/templates/lists/AbstractList.template b/src/main/resources/speiger/assets/collections/templates/lists/AbstractList.template index dce61f0..956b120 100644 --- a/src/main/resources/speiger/assets/collections/templates/lists/AbstractList.template +++ b/src/main/resources/speiger/assets/collections/templates/lists/AbstractList.template @@ -43,8 +43,7 @@ public abstract class ABSTRACT_LIST KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION @Override public boolean addAll(COLLECTION KEY_GENERIC_TYPE c) { boolean modified = false; - for(KEY_TYPE e : c) - modified |= add(e); + for(ITERATOR KEY_GENERIC_TYPE iter = c.iterator();iter.hasNext();modified |= add(iter.NEXT())); return modified; } @@ -56,8 +55,7 @@ public abstract class ABSTRACT_LIST KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION @Override public boolean addAll(LIST KEY_GENERIC_TYPE c) { boolean modified = false; - for(KEY_TYPE e : c) - modified |= add(e); + for(ITERATOR KEY_GENERIC_TYPE iter = c.iterator();iter.hasNext();modified |= add(iter.NEXT())); return modified; } diff --git a/src/main/resources/speiger/assets/collections/templates/lists/ArrayList.template b/src/main/resources/speiger/assets/collections/templates/lists/ArrayList.template index 5a80a8b..5e7a3d0 100644 --- a/src/main/resources/speiger/assets/collections/templates/lists/ArrayList.template +++ b/src/main/resources/speiger/assets/collections/templates/lists/ArrayList.template @@ -65,11 +65,7 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE * Creates a new ArrayList with a Empty array. */ public ARRAY_LIST() { -#if TYPE_OBJECT - data = (KEY_TYPE[])ARRAYS.EMPTY_ARRAY; -#else - data = ARRAYS.EMPTY_ARRAY; -#endif + data = EMPTY_KEY_ARRAY; } /** @@ -880,11 +876,7 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE public boolean trim(int size) { if(size > size() || size() == data.length) return false; int value = Math.max(size, size()); -#if TYPE_OBJECT - data = value == 0 ? (KEY_TYPE[])ARRAYS.EMPTY_ARRAY : Arrays.copyOf(data, value); -#else - data = value == 0 ? ARRAYS.EMPTY_ARRAY : Arrays.copyOf(data, value); -#endif + data = value == 0 ? EMPTY_KEY_ARRAY : Arrays.copyOf(data, value); return true; } diff --git a/src/main/resources/speiger/assets/collections/templates/queues/ArrayFIFOQueue.template b/src/main/resources/speiger/assets/collections/templates/queues/ArrayFIFOQueue.template new file mode 100644 index 0000000..c7aa2c0 --- /dev/null +++ b/src/main/resources/speiger/assets/collections/templates/queues/ArrayFIFOQueue.template @@ -0,0 +1,275 @@ +package speiger.src.collections.PACKAGE.queues; + +#if TYPE_OBJECT +import java.util.Arrays; +import java.util.Comparator; +#endif +import java.util.NoSuchElementException; + +import speiger.src.collections.PACKAGE.collections.ITERATOR; +#if !TYPE_OBJECT +import speiger.src.collections.PACKAGE.functions.COMPARATOR; +#endif +import speiger.src.collections.utils.ITrimmable; + +public class ARRAY_FIFO_QUEUE KEY_GENERIC_TYPE implements PRIORITY_DEQUEUE KEY_GENERIC_TYPE, ITrimmable +{ + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + public static final int MIN_CAPACITY = 4; + protected transient KEY_TYPE[] array; + protected int first; + protected int last; + + public ARRAY_FIFO_QUEUE(KEY_TYPE[] values) { + this(values, 0, values.length); + } + + public ARRAY_FIFO_QUEUE(KEY_TYPE[] values, int size) { + this(values, 0, size); + } + + public ARRAY_FIFO_QUEUE(KEY_TYPE[] values, int offset, int size) { + if (values.length < size) throw new IllegalArgumentException("Initial array (" + values.length + ") is smaller then the expected size (" + size + ")"); + if(values.length <= 0) values = NEW_KEY_ARRAY(1); + array = values; + first = offset; + last = (offset + size) % array.length; + if(array.length == size) expand(); + } + + public ARRAY_FIFO_QUEUE(int capacity) { + if (capacity < 0) throw new IllegalArgumentException("Initial capacity (" + capacity + ") is negative"); + array = NEW_KEY_ARRAY(Math.max(1, capacity)); + } + + public ARRAY_FIFO_QUEUE() { + this(MIN_CAPACITY); + } + + @Override + public ITERATOR KEY_GENERIC_TYPE iterator() { + return new Iter(); + } + + @Override + public int size() { + final int apparentLength = last - first; + return apparentLength >= 0 ? apparentLength : array.length + apparentLength; + } + + @Override + public void clear() { +#if TYPE_OBJECT + Arrays.fill(array, null); +#endif + first = last = 0; + } + + @Override + public void ENQUEUE(KEY_TYPE e) { + array[last] = e; + last = ++last % array.length; + if(last == first) expand(); + } + + @Override + public void ENQUEUE_FIRST(KEY_TYPE e) { + if(first == 0) first = array.length; + array[--first] = e; + if(first == last) expand(); + } + + @Override + public KEY_TYPE DEQUEUE() { + if(first == last) throw new NoSuchElementException(); + KEY_TYPE data = array[first]; +#if TYPE_OBJECT + array[first] = null; +#endif + first = ++first % array.length; + reduce(); + return data; + } + + @Override + public KEY_TYPE DEQUEUE_LAST() { + if(first == last) throw new NoSuchElementException(); + if(last == 0) last = array.length; + KEY_TYPE data = array[--last]; +#if TYPE_OBJECT + array[last] = null; +#endif + reduce(); + return data; + } + + @Override + public KEY_TYPE PEEK(int index) { + if(first == last || index < 0 || index > size()) throw new NoSuchElementException(); + return array[(first + index) % array.length]; + } + + @Override + public boolean REMOVE(KEY_TYPE e) { + if(first == last) return false; + for(int i = 0,m=size();i=0;i--) { + int index = (first + i) % array.length; + if(e == array[index]) + return removeIndex(index); + } + return false; + } + + protected boolean removeIndex(int index) { + if(first >= last ? index < first && index > last : index < first || index > last) return false; + if(index == first) { +#if TYPE_OBJECT + array[first] = null; +#endif + first++; + } + else if(index == last) { + last--; +#if TYPE_OBJECT + array[last] = null; +#endif + } + else if(index > last) { + System.arraycopy(array, first, array, first+1, (index - first)); +#if TYPE_OBJECT + array[first] = null; +#endif + first = ++first % array.length; + } + else if(index < first) { + System.arraycopy(array, index+1, array, index, (last - index) - 1); +#if TYPE_OBJECT + array[last] = null; +#endif + if(--last < 0) last += array.length; + } + else { + if(index - first < last - index) { + System.arraycopy(array, first, array, first+1, (index - first)); +#if TYPE_OBJECT + array[first] = null; +#endif + first = ++first % array.length; + } + else { + System.arraycopy(array, index+1, array, index, (last - index) - 1); +#if TYPE_OBJECT + array[last] = null; +#endif + if(--last < 0) last += array.length; + } + } + reduce(); + return true; + } + + @Override + public void onChanged() {} + + @Override + public COMPARATOR KEY_SUPER_GENERIC_TYPE comparator() { return null; } + + @Override + public boolean trim(int size) { + int newSize = Math.max(size, size()); + if(newSize >= array.length) return false; + KEY_TYPE[] newArray = NEW_KEY_ARRAY(newSize); + if(first <= last) System.arraycopy(array, first, newArray, 0, last - first); + else { + System.arraycopy(array, first, newArray, 0, array.length - first); + System.arraycopy(array, 0, newArray, array.length - first, last); + } + first = 0; + last = size(); + array = newArray; + return true; + } + + @Override + public KEY_TYPE[] TO_ARRAY(KEY_TYPE[] input) { + if(input == null || input.length < size()) input = NEW_KEY_ARRAY(size()); + if (first <= last) System.arraycopy(array, first, input, 0, last - first); + else { + System.arraycopy(array, first, input, 0, array.length - first); + System.arraycopy(array, 0, input, array.length - first, last); + } + return input; + } + +#if !TYPE_OBJECT + @Override + public CLASS_TYPE[] toArray(CLASS_TYPE[] input) { + if(input == null || input.length < size()) input = NEW_CLASS_ARRAY(size()); + if (first <= last) { + for(int i = 0,m=last-first;i MIN_CAPACITY && size <= array.length / 4) resize(size, array.length / 2); + } + + protected void expand() { + resize(array.length, (int)Math.min(MAX_ARRAY_SIZE, 2L * array.length)); + } + + protected final void resize(int oldSize, int newSize) { + KEY_TYPE[] newArray = NEW_KEY_ARRAY(newSize); + if(first >= last) { + if(oldSize != 0) + { + System.arraycopy(array, first, newArray, 0, array.length - first); + System.arraycopy(array, 0, newArray, array.length - first, last); + } + } + else System.arraycopy(array, first, newArray, 0, last-first); + first = 0; + last = oldSize; + array = newArray; + } + + private class Iter implements ITERATOR KEY_GENERIC_TYPE + { + int index = first; + @Override + public boolean hasNext() + { + return index != last; + } + + @Override + public KEY_TYPE NEXT() { + KEY_TYPE value = array[index]; + removeIndex(index++); + return value; + } + } +} \ No newline at end of file diff --git a/src/main/resources/speiger/assets/collections/templates/queues/ArrayPriorityQueue.template b/src/main/resources/speiger/assets/collections/templates/queues/ArrayPriorityQueue.template new file mode 100644 index 0000000..a7b9c74 --- /dev/null +++ b/src/main/resources/speiger/assets/collections/templates/queues/ArrayPriorityQueue.template @@ -0,0 +1,220 @@ +package speiger.src.collections.PACKAGE.queues; + +import java.util.Arrays; +import java.util.NoSuchElementException; +#if TYPE_OBJECT +import java.util.Comparator; +import java.util.Objects; +#endif + +import speiger.src.collections.PACKAGE.collections.COLLECTION; +import speiger.src.collections.PACKAGE.collections.ITERATOR; +#if !TYPE_OBJECT +import speiger.src.collections.PACKAGE.functions.COMPARATOR; +#endif +import speiger.src.collections.PACKAGE.utils.ARRAYS; + +public class ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE implements PRIORITY_QUEUE KEY_GENERIC_TYPE +{ + protected transient KEY_TYPE[] array = EMPTY_KEY_ARRAY; + protected int size; + protected int firstIndex = -1; + protected COMPARATOR KEY_SUPER_GENERIC_TYPE comparator; + + public ARRAY_PRIORITY_QUEUE() { + this(0, null); + } + + public ARRAY_PRIORITY_QUEUE(COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + this(0, comp); + } + + public ARRAY_PRIORITY_QUEUE(int size, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + if(size > 0) array = NEW_KEY_ARRAY(size); + this.size = size; + comparator = comp; + } + + public ARRAY_PRIORITY_QUEUE(KEY_TYPE[] array) { + this(array, array.length); + } + + public ARRAY_PRIORITY_QUEUE(KEY_TYPE[] array, int size) { + this.array = Arrays.copyOf(array, size); + this.size = size; + } + + public ARRAY_PRIORITY_QUEUE(KEY_TYPE[] array, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + this(array, array.length, comp); + } + + public ARRAY_PRIORITY_QUEUE(KEY_TYPE[] array, int size, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + this.array = Arrays.copyOf(array, size); + this.size = size; + this.comparator = comp; + } + + public ARRAY_PRIORITY_QUEUE(COLLECTION KEY_GENERIC_TYPE c) { + array = CAST_KEY_ARRAY c.TO_ARRAY(); + size = c.size(); + } + + public ARRAY_PRIORITY_QUEUE(COLLECTION KEY_GENERIC_TYPE c, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + array = CAST_KEY_ARRAY c.TO_ARRAY(); + size = c.size(); + comparator = comp; + } + + public static GENERIC_BRACES ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array) { + return wrap(array, array.length); + } + + public static GENERIC_BRACES ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array, int size) { + ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE queue = new ARRAY_PRIORITY_QUEUEBRACES(); + queue.array = array; + queue.size = size; + return queue; + } + + public static GENERIC_BRACES ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + return wrap(array, array.length, comp); + } + + public static GENERIC_BRACES ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array, int size, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE queue = new ARRAY_PRIORITY_QUEUEBRACES(comp); + queue.array = array; + queue.size = size; + return queue; + } + + @Override + public void ENQUEUE(KEY_TYPE e) { + if(size == array.length) array = Arrays.copyOf(array, size+1); + if(firstIndex != -1){ + int compare = comparator == null ? COMPARE_TO_KEY(e, array[firstIndex]) : comparator.compare(e, array[firstIndex]); + if(compare < 0) firstIndex = size; + else if(compare > 0) firstIndex = -1; + } + array[size++] = e; + } + + @Override + public KEY_TYPE DEQUEUE() { + if(size <= 0) throw new NoSuchElementException(); + int index = findFirstIndex(); + KEY_TYPE value = array[index]; + if(index != --size) System.arraycopy(array, index+1, array, index, size - index); +#if TYPE_OBJECT + array[size] = null; +#endif + firstIndex = -1; + return value; + } + + @Override + public KEY_TYPE PEEK(int index) { + if(index < 0 || index >= size) throw new NoSuchElementException(); + return array[index]; + } + + @Override + public boolean REMOVE(KEY_TYPE e) { + for(int i = 0;i=0;i--) + if(EQUALS(e, array[i])) return removeIndex(i); + return false; + } + + protected boolean removeIndex(int index) { + if(index != --size) System.arraycopy(array, index+1, array, index, size - index); +#if TYPE_OBJECT + array[size] = null; +#endif + if(index == firstIndex) firstIndex = -1; + else if(index >= firstIndex) firstIndex--; + return true; + } + + @Override + public void onChanged() { + firstIndex = -1; + } + + @Override + public int size() { + return size; + } + + @Override + public void clear() { +#if TYPE_OBJECT + Arrays.fill(array, null); +#endif + size = 0; + } + + @Override + public ITERATOR KEY_GENERIC_TYPE iterator() { + return new Iter(); + } + + @Override + public COMPARATOR KEY_SUPER_GENERIC_TYPE comparator() { + return comparator; + } + + @Override + public KEY_TYPE[] TO_ARRAY(KEY_TYPE[] input) { + if(input == null || input.length < size()) input = NEW_KEY_ARRAY(size()); + System.arraycopy(array, 0, input, 0, size()); + return input; + } + +#if !TYPE_OBJECT + @Override + public CLASS_TYPE[] toArray(CLASS_TYPE[] input) { + if(input == null || input.length < size()) input = new CLASS_TYPE[size()]; + for(int i = 0;i=0;i--) { + if(COMPARE_TO_KEY(array[i], value) < 0) + value = array[index = i]; + } + } + else { + for(int i = index;firstIndex == -1 && i>=0;i--) { + if(comparator.compare(array[i], value) < 0) + value = array[index = i]; + } + } + firstIndex = index; + } + return firstIndex; + } + + public class Iter implements ITERATOR KEY_GENERIC_TYPE { + @Override + public boolean hasNext() { + return !isEmpty(); + } + + @Override + public KEY_TYPE NEXT() { + return DEQUEUE(); + } + } +} \ No newline at end of file diff --git a/src/main/resources/speiger/assets/collections/templates/queues/HeapPriorityQueue.template b/src/main/resources/speiger/assets/collections/templates/queues/HeapPriorityQueue.template new file mode 100644 index 0000000..41fbb90 --- /dev/null +++ b/src/main/resources/speiger/assets/collections/templates/queues/HeapPriorityQueue.template @@ -0,0 +1,199 @@ +package speiger.src.collections.PACKAGE.queues; + +import java.util.Arrays; +import java.util.NoSuchElementException; +#if TYPE_OBJECT +import java.util.Comparator; +import java.util.Objects; +#endif + +import speiger.src.collections.PACKAGE.collections.COLLECTION; +import speiger.src.collections.PACKAGE.collections.ITERATOR; +#if !TYPE_OBJECT +import speiger.src.collections.PACKAGE.functions.COMPARATOR; +#endif +import speiger.src.collections.PACKAGE.utils.ARRAYS; + +public class HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE implements PRIORITY_QUEUE KEY_GENERIC_TYPE +{ + protected transient KEY_TYPE[] array = EMPTY_KEY_ARRAY; + protected int size; + protected COMPARATOR KEY_SUPER_GENERIC_TYPE comparator; + + public HEAP_PRIORITY_QUEUE() { + this(0, null); + } + + public HEAP_PRIORITY_QUEUE(COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + this(0, comp); + } + + public HEAP_PRIORITY_QUEUE(int size, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + if(size > 0) array = NEW_KEY_ARRAY(size); + this.size = size; + comparator = comp; + } + + public HEAP_PRIORITY_QUEUE(KEY_TYPE[] array) { + this(array, array.length); + } + + public HEAP_PRIORITY_QUEUE(KEY_TYPE[] array, int size) { + this.array = Arrays.copyOf(array, size); + this.size = size; + ARRAYS.heapify(array, size, null); + } + + public HEAP_PRIORITY_QUEUE(KEY_TYPE[] array, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + this(array, array.length, comp); + } + + public HEAP_PRIORITY_QUEUE(KEY_TYPE[] array, int size, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + this.array = Arrays.copyOf(array, size); + this.size = size; + comparator = comp; + ARRAYS.heapify(array, size, comp); + } + + public HEAP_PRIORITY_QUEUE(COLLECTION KEY_GENERIC_TYPE c) { + array = CAST_KEY_ARRAY c.TO_ARRAY(); + size = c.size(); + ARRAYS.heapify(array, size, null); + } + + public HEAP_PRIORITY_QUEUE(COLLECTION KEY_GENERIC_TYPE c, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + array = CAST_KEY_ARRAY c.TO_ARRAY(); + size = c.size(); + comparator = comp; + ARRAYS.heapify(array, size, comp); + } + + public static GENERIC_BRACES HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array) { + return wrap(array, array.length); + } + + public static GENERIC_BRACES HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array, int size) { + HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE queue = new HEAP_PRIORITY_QUEUEBRACES(); + queue.array = array; + queue.size = size; + ARRAYS.heapify(array, size, null); + return queue; + } + + public static GENERIC_BRACES HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + return wrap(array, array.length, comp); + } + + public static GENERIC_BRACES HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE wrap(KEY_TYPE[] array, int size, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE queue = new HEAP_PRIORITY_QUEUEBRACES(comp); + queue.array = array; + queue.size = size; + ARRAYS.heapify(array, size, comp); + return queue; + } + + @Override + public int size() { + return size; + } + + @Override + public void clear() { +#if TYPE_OBJECT + Arrays.fill(array, null); +#endif + size = 0; + } + + @Override + public ITERATOR KEY_GENERIC_TYPE iterator() { + return new Iter(); + } + + @Override + public void ENQUEUE(KEY_TYPE e) { + if(size == array.length) array = Arrays.copyOf(array, size + 1); + array[size++] = e; + ARRAYS.shiftUp(array, size-1, comparator); + } + + @Override + public KEY_TYPE DEQUEUE() { + if(size <= 0) throw new NoSuchElementException(); + KEY_TYPE value = array[0]; + array[0] = array[--size]; +#if TYPE_OBJECT + array[size] = null; +#endif + if(size != 0) ARRAYS.shiftDown(array, size, 0, comparator); + return value; + } + + @Override + public KEY_TYPE PEEK(int index) { + if(index < 0 || index >= size) throw new NoSuchElementException(); + return array[index]; + } + + @Override + public boolean REMOVE(KEY_TYPE e) { + for(int i = 0;i=0;i--) + if(EQUALS(e, array[i])) return removeIndex(i); + return false; + } + + protected boolean removeIndex(int index) { + array[index] = array[--size]; +#if TYPE_OBJECT + array[size] = null; +#endif + if(size != index) ARRAYS.shiftDown(array, size, index, comparator); + return true; + } + + @Override + public void onChanged() { + if(size <= 0) return; + ARRAYS.shiftDown(array, size, 0, comparator); + } + + @Override + public COMPARATOR KEY_SUPER_GENERIC_TYPE comparator() { + return comparator; + } + + @Override + public KEY_TYPE[] TO_ARRAY(KEY_TYPE[] input) { + if(input == null || input.length < size()) input = NEW_KEY_ARRAY(size()); + System.arraycopy(array, 0, input, 0, size()); + return input; + } + +#if !TYPE_OBJECT + @Override + public CLASS_TYPE[] toArray(CLASS_TYPE[] input) { + if(input == null || input.length < size()) input = new CLASS_TYPE[size()]; + for(int i = 0;i +#else +public interface PRIORITY_QUEUE KEY_GENERIC_TYPE extends ObjectPriorityQueue, ITERABLE KEY_GENERIC_TYPE +#endif +{ +#if TYPE_OBJECT + public default boolean isEmpty() { return size() <= 0; } + public int size(); + public void clear(); + +#endif + public void ENQUEUE(KEY_TYPE e); + public KEY_TYPE DEQUEUE(); + + public KEY_TYPE PEEK(int index); + public default KEY_TYPE FIRST_KEY() { return peek(0); } + public default KEY_TYPE LAST_KEY() { return peek(size()-1); } + + public boolean REMOVE(KEY_TYPE e); + public boolean REMOVE_LAST(KEY_TYPE e); + + public void onChanged(); + + @PrimitiveOverride + public COMPARATOR KEY_SUPER_GENERIC_TYPE comparator(); + + public default KEY_TYPE[] TO_ARRAY() { return TO_ARRAY(NEW_KEY_ARRAY(size())); } + public KEY_TYPE[] TO_ARRAY(KEY_TYPE[] input); + +#if !TYPE_OBJECT + public default void enqueue(CLASS_TYPE e) { ENQUEUE(OBJ_TO_KEY(e)); } + public default CLASS_TYPE dequeue() { return KEY_TO_OBJ(DEQUEUE()); } + + public default CLASS_TYPE peek(int index) { return KEY_TO_OBJ(PEEK(index)); } + public default CLASS_TYPE first() { return peek(0); } + public default CLASS_TYPE last() { return peek(size()-1); } + + public default boolean remove(CLASS_TYPE e) { return REMOVE(OBJ_TO_KEY(e)); } + public default boolean removeLast(CLASS_TYPE e) { return REMOVE_LAST(OBJ_TO_KEY(e)); } + + @Deprecated + public default CLASS_TYPE[] toArray() { return toArray(new CLASS_TYPE[size()]); } + @Deprecated + public CLASS_TYPE[] toArray(CLASS_TYPE[] input); + +#endif +} diff --git a/src/main/resources/speiger/assets/collections/templates/sets/AbstractSet.template b/src/main/resources/speiger/assets/collections/templates/sets/AbstractSet.template index d0730f3..73694be 100644 --- a/src/main/resources/speiger/assets/collections/templates/sets/AbstractSet.template +++ b/src/main/resources/speiger/assets/collections/templates/sets/AbstractSet.template @@ -14,11 +14,7 @@ public abstract class ABSTRACT_SET KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION int hashCode = 1; ITERATOR KEY_GENERIC_TYPE i = iterator(); while(i.hasNext()) -#if TYPE_OBJECT - hashCode = 31 * hashCode + i.next().hashCode(); -#else hashCode = 31 * hashCode + TO_HASH(i.NEXT()); -#endif return hashCode; } diff --git a/src/main/resources/speiger/assets/collections/templates/sets/ArraySet.template b/src/main/resources/speiger/assets/collections/templates/sets/ArraySet.template index 3d9ce42..8e7f789 100644 --- a/src/main/resources/speiger/assets/collections/templates/sets/ArraySet.template +++ b/src/main/resources/speiger/assets/collections/templates/sets/ArraySet.template @@ -23,11 +23,7 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im protected int size = 0; public ARRAY_SET() { -#if TYPE_OBJECT - data = (KEY_TYPE[])ARRAYS.EMPTY_ARRAY; -#else - data = ARRAYS.EMPTY_ARRAY; -#endif + data = EMPTY_KEY_ARRAY; } public ARRAY_SET(int capacity) { diff --git a/src/main/resources/speiger/assets/collections/templates/utils/Arrays.template b/src/main/resources/speiger/assets/collections/templates/utils/Arrays.template index 020c0d6..208a56b 100644 --- a/src/main/resources/speiger/assets/collections/templates/utils/Arrays.template +++ b/src/main/resources/speiger/assets/collections/templates/utils/Arrays.template @@ -100,12 +100,70 @@ public class ARRAYS * @param length the lenght the array should be. * @return a Array with the requested type and length */ - public static KEY_GENERIC_TYPE KEY_TYPE[] newArray(Class clz, int length) { + public static GENERIC_BRACES KEY_TYPE[] newArray(Class clz, int length) { if(clz == Object.class) return (KEY_TYPE[])new Object[length]; return (KEY_TYPE[]) java.lang.reflect.Array.newInstance(clz, length); } #endif + public static GENERIC_BRACES int shiftDown(KEY_TYPE[] data, int size, int index, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + int half = size >>> 1; + KEY_TYPE value = data[index]; + if(comp != null) { + while(index < half) { + int child = (index << 1) + 1; + KEY_TYPE childValue = data[child]; + int right = child+1; + if(right < size && comp.compare(data[right], childValue) < 0) childValue = data[child = right]; + if(comp.compare(value, childValue) <= 0) break; + data[index] = childValue; + index = child; + } + } + else { + while(index < half) { + int child = (index << 1) + 1; + KEY_TYPE childValue = data[child]; + int right = child+1; + if(right < size && COMPARE_TO_KEY(data[right], childValue) < 0) childValue = data[child = right]; + if(COMPARE_TO_KEY(value, childValue) <= 0) break; + data[index] = childValue; + index = child; + } + } + data[index] = value; + return index; + } + + public static GENERIC_BRACES int shiftUp(KEY_TYPE[] data, int index, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + KEY_TYPE value = data[index]; + if(comp != null) { + while(index > 0) { + int parent = (index - 1) >>> 1; + KEY_TYPE parentValue = data[parent]; + if(comp.compare(value, parentValue) >= 0) break; + data[index] = parentValue; + index = parent; + } + } + else { + while(index > 0) { + int parent = (index - 1) >>> 1; + KEY_TYPE parentValue = data[parent]; + if(COMPARE_TO_KEY(value, parentValue) >= 0) break; + data[index] = parentValue; + index = parent; + } + } + data[index] = value; + return index; + } + + public static GENERIC_BRACES KEY_TYPE[] heapify(KEY_TYPE[] data, int size, COMPARATOR KEY_SUPER_GENERIC_TYPE comp) { + for(int i = (size >>> 1) - 1;i>=0;shiftDown(data, size, i--, comp)); + return data; + } + public static GENERIC_BRACES KEY_TYPE[] shuffle(KEY_TYPE[] array) { return shuffle(array, SanityChecks.getRandom()); } diff --git a/src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java b/src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java new file mode 100644 index 0000000..2b11dbe --- /dev/null +++ b/src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java @@ -0,0 +1,114 @@ +package speiger.src.collections.ints.base; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.util.EnumSet; + +import org.junit.Assert; +import org.junit.Test; + +import speiger.src.collections.ints.queues.IntPriorityQueue; +import speiger.src.collections.tests.IterableTest; +import speiger.src.collections.tests.PriorityQueueTest; + +public abstract class BaseIntPriorityQueueTest extends BaseIntIterableTest +{ + @Override + protected abstract IntPriorityQueue create(int[] data); + @Override + protected EnumSet getValidIterableTests() { return EnumSet.of(IterableTest.FOR_EACH, IterableTest.ITERATOR_FOR_EACH, IterableTest.ITERATOR_LOOP, IterableTest.ITERATOR_SKIP); } + protected EnumSet getValidPriorityQueueTests() { return EnumSet.allOf(PriorityQueueTest.class); } + + @Test + public void testEnqueue() { + if(getValidPriorityQueueTests().contains(PriorityQueueTest.IN_OUT)) { + IntPriorityQueue queue = create(EMPTY_ARRAY); + for(int i = 0;i<100;i++) { + queue.enqueueInt(i); + Assert.assertEquals(i, queue.lastInt()); + } + for(int i = 0;i<100;i++) { + Assert.assertEquals(i, queue.firstInt()); + Assert.assertEquals(99, queue.lastInt()); + Assert.assertEquals(i, queue.dequeueInt()); + } + } + } + + @Test + public void testPeek() { + if(getValidPriorityQueueTests().contains(PriorityQueueTest.PEEK)) { + IntPriorityQueue queue = create(EMPTY_ARRAY); + for(int i = 0;i<100;i++) { + queue.enqueueInt(i); + Assert.assertEquals(i, queue.lastInt()); + } + for(int i = 0;i<100;i++) { + assertEquals(i, queue.peekInt(i)); + } + } + } + + @Test + public void testRemove() { + if(getValidPriorityQueueTests().contains(PriorityQueueTest.REMOVE)) { + IntPriorityQueue queue = create(EMPTY_ARRAY); + for(int i = 0;i<100;i++) { + queue.enqueueInt(i); + Assert.assertEquals(i, queue.lastInt()); + } + queue.removeInt(40); + for(int i = 0;i<99;i++) { + if(i >= 40) assertEquals(i + 1, queue.dequeueInt()); + else assertEquals(i, queue.dequeueInt()); + } + for(int i = 0;i<100;i++) { + queue.enqueueInt(i); + Assert.assertEquals(i, queue.lastInt()); + } + queue.removeLastInt(40); + for(int i = 0;i<99;i++) { + if(i >= 40) assertEquals(i + 1, queue.dequeueInt()); + else assertEquals(i, queue.dequeueInt()); + } + } + } + + @Test + @SuppressWarnings("deprecation") + public void testToArray() { + if(getValidPriorityQueueTests().contains(PriorityQueueTest.TO_ARRAY)) { + IntPriorityQueue q = create(EMPTY_ARRAY); + Integer[] ref = new Integer[100]; + Integer[] shiftArray = new Integer[100]; + int[] primRef = new int[100]; + int[] shiftPrimArray = new int[100]; + for(int i = 0; i < 100; i++) { + q.enqueue(i); + assertEquals(i, q.lastInt()); + ref[i] = Integer.valueOf(i); + primRef[i] = i; + shiftPrimArray[(i+80) % 100] = i; + shiftArray[(i+80) % 100] = Integer.valueOf(i); + } + assertArrayEquals(q.toArray(), ref); + assertArrayEquals(q.toArray(new Integer[100]), ref); + assertArrayEquals(q.toArray(null), ref); + assertArrayEquals(q.toIntArray(), primRef); + assertArrayEquals(q.toIntArray(new int[100]), primRef); + assertArrayEquals(q.toIntArray(null), primRef); + IntPriorityQueue other = create(q.toIntArray()); + for(int i = 0;i<100;i++) { + assertEquals(other.peekInt(i), primRef[i]); + } + for(int i = 0;i<20;i++) { + other.dequeueInt(); + other.enqueue(i); + } + assertArrayEquals(other.toIntArray(), shiftPrimArray); + assertArrayEquals(other.toIntArray(new int[100]), shiftPrimArray); + assertArrayEquals(other.toArray(), shiftArray); + } + } +} diff --git a/src/test/java/speiger/src/collections/ints/queues/IntArrayFIFOQueueTests.java b/src/test/java/speiger/src/collections/ints/queues/IntArrayFIFOQueueTests.java new file mode 100644 index 0000000..1dff954 --- /dev/null +++ b/src/test/java/speiger/src/collections/ints/queues/IntArrayFIFOQueueTests.java @@ -0,0 +1,9 @@ +package speiger.src.collections.ints.queues; + +import speiger.src.collections.ints.base.BaseIntPriorityQueueTest; + +public class IntArrayFIFOQueueTests extends BaseIntPriorityQueueTest +{ + @Override + protected IntPriorityQueue create(int[] data){return new IntArrayFIFOQueue(data);} +} diff --git a/src/test/java/speiger/src/collections/tests/PriorityQueueTest.java b/src/test/java/speiger/src/collections/tests/PriorityQueueTest.java new file mode 100644 index 0000000..755d180 --- /dev/null +++ b/src/test/java/speiger/src/collections/tests/PriorityQueueTest.java @@ -0,0 +1,9 @@ +package speiger.src.collections.tests; + +public enum PriorityQueueTest +{ + IN_OUT, + PEEK, + REMOVE, + TO_ARRAY, +} \ No newline at end of file