From d2b2cf631f7198b2e0fdf51fd7abf478ca0eb4de Mon Sep 17 00:00:00 2001 From: Francisco Jose Tapia Date: Mon, 1 Aug 2022 11:47:00 +0200 Subject: [PATCH 1/8] adding ciso646 --- doc/equation/Thumbs.db | Bin 103936 -> 0 bytes doc/images/Thumbs.db | Bin 60928 -> 0 bytes .../blk_detail/backbone.hpp | 8 +- .../block_indirect_sort/blk_detail/block.hpp | 1 + .../blk_detail/merge_blocks.hpp | 8 +- .../blk_detail/move_blocks.hpp | 3 +- .../blk_detail/parallel_sort.hpp | 3 +- .../block_indirect_sort.hpp | 31 +-- include/boost/sort/common/deque_cnc.hpp | 52 +++-- include/boost/sort/common/indirect.hpp | 2 +- include/boost/sort/common/int_array.hpp | 1 + include/boost/sort/common/merge_block.hpp | 1 + include/boost/sort/common/merge_four.hpp | 6 +- include/boost/sort/common/merge_vector.hpp | 6 +- include/boost/sort/common/pivot.hpp | 1 + include/boost/sort/common/range.hpp | 8 +- include/boost/sort/common/rearrange.hpp | 5 +- include/boost/sort/common/scheduler.hpp | 20 +- include/boost/sort/common/sort_basic.hpp | 8 +- include/boost/sort/common/spinlock.hpp | 1 + include/boost/sort/common/stack_cnc.hpp | 4 +- include/boost/sort/common/time_measure.hpp | 1 + include/boost/sort/common/util/algorithm.hpp | 1 + include/boost/sort/common/util/atomic.hpp | 1 + .../sort/common/util/circular_buffer.hpp | 5 +- include/boost/sort/common/util/insert.hpp | 9 +- include/boost/sort/common/util/merge.hpp | 1 + include/boost/sort/common/util/search.hpp | 4 +- include/boost/sort/common/util/traits.hpp | 1 + .../flat_stable_sort/flat_stable_sort.hpp | 17 +- include/boost/sort/heap_sort/heap_sort.hpp | 215 ------------------ .../boost/sort/insert_sort/insert_sort.hpp | 1 + .../parallel_stable_sort.hpp | 6 +- .../boost/sort/sample_sort/sample_sort.hpp | 9 +- include/boost/sort/spinsort/spinsort.hpp | 22 +- test/list.txt | 15 -- test/test.log | 37 --- 37 files changed, 152 insertions(+), 362 deletions(-) delete mode 100644 doc/equation/Thumbs.db delete mode 100644 doc/images/Thumbs.db delete mode 100644 include/boost/sort/heap_sort/heap_sort.hpp delete mode 100644 test/list.txt delete mode 100644 test/test.log diff --git a/doc/equation/Thumbs.db b/doc/equation/Thumbs.db deleted file mode 100644 index 443d09230ff0d20fdb1db6fd651a91bcd55437ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103936 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 OU%G(*JpYdFz@Gs2*n_nI diff --git a/doc/images/Thumbs.db b/doc/images/Thumbs.db deleted file mode 100644 index 7572ba63e468b4cf660c748cb4841fabb7e3f6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60928 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

29H=;J*swz`LMlo8xbKWCCJ zHDS8yng6}K;clTo#1a`}jLh&Z$E_|e_)gU8J|DiW=$vssY>aO*%D-_2m+Z~n?>M3b z#$Jk%vS!zHS#Gi7xadpZX>G(SlfbMqQz?^gUqeH~@BZr0rn4J(0{Y-Mdi=9x{+lDW zJ5|1byDVUD=>H<*Qi1JveY9v}A~m`yI-4^#eoPO#prt7$R>-~c((P#lKjJfuVeZgG zbbKHD@uFrgb4*6DZsBnAF?Nw|?1w3x$DRvnXH(^m+v!($S>L0Td{rr~+`k8-fAXR4 z!d;49?xs0)*}bI}vc3-WYMpAg^*pXM+zeY$rv~eo0&u51Hna_)Abg6<)F8_k@WL7 zG-eH1ZL`9Agk>m6z6*TN?Pg}bkK7wbq@Ybg_e$PEEe4Fnk@~8*m(mC#^ig|ajQyxW zOssS|v&eHJPB){Xdr?e_#EG4qxx+bT3IDf@xJ-#dpyP~IJqD%oFGZ6j=tB1FJNNH3(VqH+KmT>B3j7r zj+pT2jXp*qDr9QOlv(FdrgRucZT<{C-uDCDtszcSUtfj0#auFvi!oZNXqZ6BW_TOq z+fW3E=p8c0CLCmSXSH}m7%7bQ-5Q%mSnlhD=WUaJJjq+u^cE2CpZD0-e|od}DkIhO z%I&x#JO-b!)zAVXc%uoz)Q5b&_0zox4|yM{QN9i(F*ezH_|2YJ|LaLwzOR{-)NMNB zzXHzA52*%oL#Up2U@+ z&cOQ*lO|R;LFYgDJ~G#`n~^|eVx=x3^lsOW1O3jDh%Rb!NEMHxRWv=cu(I(Uz65<; zw$~|il}l&)E!NW?{CKIWg^W|eTW;L;t!_ODRsI*9yN1~~0~yXS3@|z>lLU-X`zMLh z9GD%PBeKBP%5ydomst0;miQf97wo6MvL77$UBP_)@e3F27OL;=VIT8zT%d9I@$#En zz*d^`14eM*As#{Hc27~vpdPJxlLlkgt3(c;h=*>FV3YH!@6FaY zJ0%pw2yQ-MI3Qf8-TXk2$2M+Q&t=IKQX@)yRF_4d$bh>K+jwuJQYziXr)?HeT%Dg= zi#stZ3!7RFq_dR`-Zg0pf2SfOpU?NSxHWy?J(mR8Z;XM5f^ly8OQ}XkVBS`yW@d%v z1RU6FC;{e1mwSkX{9qZhmpu_X5;G|qNZ0-EFJSQ4#G@$4(!rrj#+bvP2mBao5NDl% z7dc9%o%`%w=qItvJb{cKlPBb7US^IJf4*d*F>6i+T6M2FAel9%cUCfpjVRoHsy)1{ zD1XD{fAtQ3CrO>k&H}VrAnZG-E$8Y%Z-XTJTqpk+?TPy|m$$u{M;*K$QL;R)&n8MO zX7y-zX5~QdZZMMW$Buc9ddi3jx$*$(vhhKJ*w<^ua55eI(?Kf>X>6hHw5W965aerH zw%5|sbRcOe%G41i=MeF~X0glZfcNg(qYA&i=r1}vMeS!aoZ-XT^>aU9@xhC@uIF=z zxcWAyMd!17Z{8Y+>T0-oM7L&xlGh$e3wbVeGW!ELk6sZ@9b~64~g8t2TL9E9N+^Z z3L&pFI7BpJQ?Y?}3(XVqFx~AoaVm@y`3mx3UmuhtW%&2AU{cWbR?CfNtE7w?y>sA z>_Igg_s0Y2oc$2dpAh6EgmPgOL5@>U`~m`qdU3*r!;6k!^cQp7ZY)3}GKBrpw|GK3`$W>^SBuWvE>} zQuj6JrZ4F%XLLs#EB;y)ZP9_|fH|pNkhe(#R=Pz)_K@S4C@eGGQ*C5CG~ll4;Ew9O z4h^_3YriM9XMk@Qg-Ku`>l$1>chnSwBqgmpKT4$%gV`T>-=|?@AE$Uz`l+Qe86~fd z2ilxzQ{P#9iO==dZVhhG5;Ne;3D9(?ploaZ*#6D; zW4n=WZM>s^aXORct{C-G8Wy|dwe`Z=0>*YOP%#)-mtX^)e0Yr(x@kI5Fu%Wa*Ud{m z3cKFrwjCXgzVfF#EAZ1i9t&btI%Tx((h4rO-z5DEg>Ft7$sgNirx*%n~pGh(2`#L0LhD+ z-BtZHM)-@nff6Fr2q*?_A#`FZdoab=@+|>yaYXQ%)ga<+&@c1HhfE=>`%d*oi9^Rp znjWpYvOWrH$&XxIPceOG{XNH(g|M63F)j3uDmgYRmsYo{PqY+1K%KW)2F#GQ+Nvm7 z0&u6RR3d)U2k=&yZo*!0HjmbYk#EeHr-u(_K4)soSLAew9wB1Z8DX1{fKpK$? z1+UQrK2v@cP?mj7To!A^z9ss~5w4rX@Y@%Xp_t~r@gsfoLd`Noh9{)%$Sl`D?z8pd z0Umi1ELtHGgm*-}yZkUq*sTxv1j~g@D_Y3O!@0R1W$^vo#jd4l|5q6NI-auqNq0H< zjr?l3o&Zy>I0T0ZE_nA6E(FEvBtquG{)Dw%wS0$hrRlbY5n04f(13wOfC*U*d52+B zs#Fn1mn@ZPW%65qB(Dyt&9Z3Z*-?^erEpw;8y6FE)f-4O`%(`1!ZqOOLYL;UkQ;^6 zKnl_9mno9j6F0~rJc<%F%>Mly!|fN{n*1Wnw~?AY&HLFr{ymYH3{_db!Eo_e9BHI* z9GIi0NHr!PK~ZufHPD2@P%<{mQaNAvPc*mVTqCE2Sh5NNZ5LEs?j7Aq`VD&rXq(o; z>foWIKEN`%@w12QZ0z2vBLC+!Tyq-kbAl9x7x~G&^oA9=yY4rh&29$Qa6ZI!PSg?_}tbdw{DWd+a=0n=S z&9+=J;?EkRZ&;qk?b4;q&*UqPQa>V>)U(yyNdg40E>R1yEQhwm(C1@_K;%*LN#`yl z?rg)Q3aM;VR5kpdFUi`VZtNH^*5@*rxvoFwMAQMh0v=5SW0cJJbJeM;;4uZ*;Fo5%LT zy}&us5FUH?_*GD4POe?mG}ZD@d$wWOZeQ-*0Q379s8_@EfX=e60N3xJWSo`VP!5t) zaAV{vB5%GXzkUkaXe8X{{sf=f3eG zsg8bRI>IN>Yf3S}W%?q1s@=P%;E275V2X_GBLhZk@ud?JLUfCj_5&g|I zI0d9oC5=>eCd`nX*V4}d7|?qfxUR4APG)Ne%w;&Zo*m+a<~@-^z#_q+$vMS?$Rcl% z=)q6_ZmTnA#*0Xi)k=+Q{8p85{}g&}+!tC`D%oPbwMSKiN@E68iVgE0%3&U;1^UQq z1CY%z?w!d2@(H0%=nV-(iwhXyq>)kZN98q>)^pU*3h`aP1M8Tibp;%<#5jVuvY6e} zOz|-Jc zSgG_9uGEOd*!zvxd~gmyGrfH9vzx|D(TcROj|>kziJSe*+vM1xS?LU{gUb1XBX$*o zfS2%}gO9k^nobhNMDIt+DKM(b+lcpTdCXDdUQl(cUp#WxsCDKkqHGMBh%)K|-`7EbxXm^*?RilSGlL2|Xg!|=JPY-!V z=O!|bK_MMnUlu)Ps+A4Xaij`l9!^HM$B3y!5L8^S@fb*Aq!%qPyk&i|5E{&=U)1LP zCLcZJ0m^X_&6mG7ePaZ%R-QbI$Gf}OvUS$Gt@J9eWg7OYNbuP-F>Xmn<+Ge^`EUQb zA439K7b~KPJ6E6N6pyfKhS*tcE85O}za86va}wwc5Jn;HJbfqe5WdWPx84m;yc~nq zOBgAKMHeBsH-iM_grkKZHK(Z)jn9Fkza5~bVhLO3+E*o$#ChW-V6_Qj3BL&&c^P zJNzl-B%Bv29BGBID_o7u;aSA2N_^5;`krT->SxAr6s-qyer`e1x&p#{dI@UtMOTjc z)W_EIkOCeSx-oCc8iv>8udLmdcRNEPzQYZ%wXEnMLc*elB$5&G1I`o*klm8LhVR5C z!vr>1XW|>4#X8Mt!5x1t4iae7?p)+I@@_w5vh(yue?frreNv|rG)X%FMew z49|QdY!ndw$aTx+CpO7;Bz7kfw&YOLVN+~A@mwU96533p$&u1hqpbyuzfn;1x)W%A zL-rk9?|rHRNW&5%o5vwzNK_gQy7QKM&k~g$CuRi_OEH&XRz0z*-FQJRH&-VoIwtS$;#&@w3he9c0_N@$*s59| zm9yy-t~WmHT*YI!@G?+KFhg#l3sH#S;*p16+JjJWU_?Q4INq;7q*+n>kQ^iT(h1hE&@Osze~ z($(n8F}V4Ef=Esv3dPPEL}tY0U=AcYI6Cuc4Z!Q-`UO5RP%>EoYoHqrIs|>Br1pS?1*J8MF<)tU@`sZl|u>M7H|ZlVucmQiV`WjeCA za5DsMZryZqfu5suU%;5)6RML5Oh9p;3oT_vo$x!3v{5O@rmMa39rLi5&YT-D6KN=#T_;C$W|p_OBc-C5B5LWWw%O77NF`#{>GEhf|NBvoqJOTR4O#z;A8O z&5F7@5m?42`7RbB);JW~jV$PMVzv%PN0uBK<%6+vfPhn`7v4r!q2t^pDs4Ss7-c8x zGjrihpDyZ#8%#0_&WwKc7}W5!d&9WsFH5!SzWs@-{7`ML%L3a}>Vc36zxkHq%lfTk zH^Va0ai;BIoPhgQ7C-qyu+I<&4qguaa#mO~%%NsYR+#vgqA4fHh)6kdFdEd%R>EsB z4&0D(20?o8+x7kJK3^oXh!t+@5T%bV3+JOAX#H-_4aU9{(Mvfc+q{yQA+4b+P?}XM z7z%`R>2lV4JZc-e8?gqywY9lDjcL)`E|Sw06yt*#^kR=3%9&w5Qt49ldF2i{yTl1i z;<1UvpMr=Wcs=nX+#{{*t2&5<-7mdBC`l8UF!JI=Jor$umu`c@E8BEmn(U@N_7BRx zCIn-piA4?$K_w-{1z{ADD&h>v?Iw_MSO|QX&gVBrJj-CQDy?=-ljxWECs;J>vOnt9g)VQZdaReaEYEz7bT|GOywKTN$+`E#$M4G^7oW3K zh)o{Wg|O2XC0A>Y#5$+ZzK#$|>`D(HdkeQL3QxW~WG6){-!6|fPPGS;aP55R=m2In zIB>3J2s`xJ^a?EHRzEI@C#c^Qf2ieDcLw>xw-QT_4%0rJhoB@&Gt%JUE;7nU!?j8W zc9d7WA#r=z@~KJw2#rnPm3rg;vCj?aAF_H~uZV+WPsU&Sn2dZwr&IUoxi9jbjA(tE zme40xo(y$bJzU8yt1uy_C%Sx)_?TFUv~Hyztzp1)phUDEjUTTp4$|KXM}c(0HOl%Y z(jF!l*Dz*CHhx8zy26LCa^RI5QAPK$n+#9CF@_vfi1}6GmlU0WH~TyTv&>7a+8M>I zH+3jXjW!J%*gu)R+d9%R#)`3Y%rAe8-MaVgj&6o=L3?Sd2Ef3ik_q!!1b!T^#rfOP zwIQQ^+V_wLLJB6^5=lD$$aj_YALJSUj9EEWGV6Xzu2Mes-b03Y8v^ z&UqHPK2H11VsKR;1d;1WB%yfHyKxPCJu;KP&$g;Tz1M}#=(%Y4O7YP^tlTX2owTgt z?^pr1pj8iw4(F&JMql%-${)j@xG&!D_&vEYUzMxAN0a}h9HX{V`_IeTX*v7fbD>29CKQa#kW$GD{nl*aHzPtHE z(<>j~ryo9Q&D?c+?-qG~OWV3+tXP2^;C-{o5S@N>rKk%k+c>ys{UPSp@~-@>-lHJd zq-w#-ir^BLggx~pElmL1Z|0pYu_yOvd-OQqByu7fUTYw^pc$*S)2Grb{(GxZSUGNU7* zGM8VHDUP4w!aj}B?RAamYZ%UX=>bR zPoC%!St~`1&bxau;~G5*9qQvnJYt-;G{+|m{&Dc*a=LFHXOZ3NrtkMQ3bBo8pV{v+ zoT$pls|qr;II}m_Pwy`$FKuea>= z?W;wHOm*rpV_820pK0PQidjLAuIr*i+NE=<7|=XEZau+I2^k4Y@$CV}gqty*T>GvV ziIh3eps#G>s`&(b_G~VmDGt8`ueNvyY}M&q)YNHlqR3U&MDR)m0(zBU(`YZ4!>*z! z#Z0+!yxLgk+Ta1#i_@rb%tt%pbv~_r=+lgDj2wi@P)0_+b!tF{>d&i*`8PXX!0Xei z>9-zf8#;dsyfT!pXOr}Zdi3f96ch9P^}bdlOU<_O*{0ZP;M1;JIo;7}c5f8MFx~h2 z8;dwnUKNLJW4Fw*QJa1Y(4_Hqz5WnPtv~{z6{Z!iz%a^C6jOdss0O3rHd6c9W2+N~ zOi=ZUH`A2}o}v)TkH2?%EwFR4+Jny{u(JlQWW85S!c~5!3wV#Z?9^uEt|zb z-P8CctUm`w?O`*(2-^z z!-ES--PGlfwuY4)D3FD2_* zwHlG;^xL8-VdzM^W8!d%-WucS&ybqQ5T-&hs!{>I!i0pB@+t@VU-Z8QBJ)!5siQ8r zKSSuJmaU-L6&;zmgS{_*zbL;7^A1nr9dU!9@G+wD?d`S41ka(pm z4TCq*mP|{)^tM7OL$>FE9pG!(aley8`_l(}(TDElv^3^c7|0XowT6RgDym!j?SU2H zOnXpA)wZP}#maHq04+#J%gsAb4euA>~Cb{-XRlTxPa@ixS`pW9yX$?3!%DEmy16B@pl0YQNJZ zyZ)eg!BjA3y4pw{4sG^L%8_E+aWLj*I6BIqDmciR)(sLLO@pd#)8h2O{L9!nPHu=rh?m zL)<3=vurvApFz#1E>--6@USuzv{f0WU$Wsvn5M-ljGun4DVMr%8wm&LjV9b1YzMA? z-p3Q`d1!VN`>~$w?(j!cvY0BnoPk}astxORkrLsLQrS)o11I*uT$Cex7M2v;_&Z_{ z$tJa*?I}+H8(3YD+&FyBMw`dH7`~a<4;u;7B(xVfn!JfpLrwa2qQ6#xLb8{JxlElr zoL53Tnm6~D6=w$x71k%65d4sWuxzMf>o|Vbx}gMLBnwxB*_yQwi z^gVj{yKMFtqtj~Sq>)-Y@wL_CIs)CWm*P7Ex?>0KNKkC5?;?U|(%4dFYicQwafg?S zh+1Z^2SQ`=rRX5@u6E)ZOAN?;7K+Juz`7;i?RmL5ByoAfipSetF#6DiQZ{K?`E?6Z z>?psy=T`^q_12wam6F4SjiD@*>YY(^NF{aU1Z_V<;86(eJV zIckJDzHUatEME|k`1Md%3|2}Q;WC_ip#2B)<8UF)w6gIWeXc{PMa&%3r#IK9x3tvU z!8Q?SFEFND&MeHZHWt)Xu`99z$ecCLE?3;iKw`Yvs?pEd4-wp_D>!Xak-vRW=bB~S z_AJWp6k$$53~-p>s2HcB!*cZbq!_TLB>I#-V|XvHGLD)g(L0R&IK!l_w;2$yoB@{6 zB}a1wi>|BhKbzyg&WY!y5kYh~ zxEJtw=Ir8!s?nwC%$e6Mic$BhDEIfxG=M}&f-3XZtEs5Lqm}qc{*(B|LEoITL4Bi&FETRqgx*XJ zO-k>!LhlW%CXa82Cn{PV{4J3}?5U?qK~w7y`}c^XF;RsWJUHJGK! z*g%Zms^03Q&gh`xNLAC`Z&Lln;2478H`+%d#ALZ@=wW>4<`$2i6mi}JMpM%An{ZY>uHbF+_0K4&qkXKB(h#s%BWf*-NHIrVJPZAgS}x!$nIe&d{YW+xePPPj zP9(b${nUJwgdv+q>8Oo}q*rW3@;VT+pd5to8s{eLHypLrVw5B@4r`Z~^c5~@G$lN8 z?>2S=DOx_3H2#TO6ejDaEpeaSRwz(%s%faK-z+A)9l#aWQ;@#cUDvUx*GTzrSA*pDh=Ah|2sQ_x9DBPS6TLf?s z?x!KBn6d#;;KBi%KgjUV;UZgnw_&df&S~&mITixJM5LD6;a_hDz_ScPR0GUm1Zg!p zpnj7*7ZiP{Q>oojtRhY2_$5!3EDXhwpOQYwPD>6a^way!-e8<%dqzS+LO$8b6F9xU zhbstj$}7TuLpi``e*0IbG1nYjz95NcshC@GP0v^>l|&cn(d(Xc6TTD^_x_MLp5JC; zFj*FkcHM2dTtoJSlHxTXs`2l)E>afo7Nba|yp{Y@40aI}U&bx%+%Y1}=IENu)+LI2 zOu{v?yetA2lt1@%Xpku=_H;^tLlJ2*TI`1idug&6)L|}1 zu2(}u-g645MmogQ;PAL)!mXYLt|<5`N{qB}AC8wS3sxQ$_@NqIC^x@;C%A;I!l|;< zlAL0IY!Wz0jtO`fxb|JD%++Yx61G1MO*riVd-ns}-Zm7@*8p z=Zzc9;RvG2gtyiohGC0xTvI3809veir^SEQfARwwULc(Abb0cxIh+=JvvJPf~Sj}iWP((3734(ah z%f6Rj^_PmAiXb35{(n0<4F!yXj$UHY;iqxAH)Gcwj%vk0-01DL{dLwPwFX$tOs(;? z2Enw}%_oO07>=Dg~m(^KRZra~3PG5RVlYxJ4LP>+*HJI`|`n zii&zMt)->`csUF$FPjDhv$M0KVPKR38kb7#3OrWR&Rn1@X`3t`gP-pUgjE&#?<_;U z8NJhQ^Z3uewYY`Lu4oC_G1Mgk~ej71M zfHcb2NVu1hl5*qlQ02zXd>luf{Cp&v`^;p;==tfsrkw~FglQNV8P85ni+=yso2#>o zdguuh@I9k*Tx?Bee)HvJA}Szvl)L={C_)!n#~fy>%l@jM_j@_bp&ZSC$XZ=o94btC zRMOGW@$mHf%~yM!xh7|-pV{0|L4d2JZw;jK=BG<1m-Uaq^Y_G@l1t}+ghzS_eL;?x zF@eW(Pg~G)j{xXKl!HEXg&_|gPgQ6!qM@QD%Zhp*8Ikfid(_rHxXGcfYnld^~8hensm+%)r!dCoo z1Vl+-XlQ6ZTTQ`g)SQ%(n!20g+?gyZVg>^#s;H#%AVhZo5lmDUM5X~6L4w2Ux6~^sfaqw)2CjNH!bx1kjc&Oksd%Iury;L1G=<ScO3i?hF>T zzA$51A4vQJw2&cW3Jemi@VRe}uasDYcLZM^<_F!``2j7OiI!GMG#nV}Qo4(^s*MEf zl*=Xe3d6~G-(|79*H{dv?uM!3L%~H>lYqMa)#JsKT77sgeB?(oMJwW{^qF8WcnmN$ zgQ8S42m^5qyaZ_GZcn5TAXqq*MvS7^xDr1>v+yB3+v;mwJ13&?m}SiNih`^LjY;?G zK|AxOc@Qs-eA|3q*;vLS1uqxnw50N-l3(G+v17Ym5sYXtbdj&k0ZsOqpL*-M37cN6 zI2tAbNilS6J!nPmWsE0eq#SegUi9j><;BDKm{L)1N58*_-$haZxSV9Cxw(1pJ|iQ8 z;TZXs#^m~SNHoX@`3N7O$Zhk78<{vOI!`E@aqA$dj>1Q26i|>^n%~QzQ`$^+Qy~VjXRY0NLlM&oMsD<2HSsg@K>LG_hbe zuA*rsZz)&0Mx4y*P(^G&(o! zYH3P(5`pKAbEHJU_Gg`vbHqsAnVv6!!w==qew1-?&W zKXw6A{sK^Wm@LipXQ_mTD-PBJ$6`9oisPA_Zw*xIrmgxHn1*|%$s-g*^-Eg~N(<`! zh%P51D#jyv=hVbe-mjmG;;dUMyZx(-7>Ep8xR@e-p*-pJ$fxKK*2K{bUYj1LRrS7+sD{;qjTRg6}M|;2+Y- zGS0fm`j3b6HRlf~@Cm#4VZG9*jI&iS+WIyAh9*MJqE9|i8S%aZM*(+H7m*pE`mxc` zNx7na_qF=HXO4dg24BSm*%eHs%m)6Q*q^PW5_Q@LS^7bReq*RvwaxjHty{$&S*O>d z)63CMjGMv}i1^!0r-JJu8?E&8^!+yN4tc>3bO>@B=;A4T9W5PAR}Z<_hr4|(UC(@w z_LK0xz5HiSKRK*5oJDB_&Ixvj>SXUIoC4$pSXdo7@>rru5Ug?c6#5MXlHJEfWR0R% z-fClyy#yta|Dos!mPQSfP>W*5@dE+pz48BYxSJ)wf%-5S=S+QdcYz1c@SPPusuOrI zPjF@r3&zaMTxWYwIBSmSx8G?6$}8D{&?cR-e)$-9=u5^2RS6-D2h#@ypV z$7ihl9pTL!t~fcIFO2PMrNh=WZs_pa9EFU{jX8n7fI+6$1gjs5warTqh#5gV2tci_ z?1=ciS|h}yBG6bOipB>?{aEikz%g|MOUI)w@vj%=;GuwgC)shNdiVtdc3AXN#Q@O| z-!wLyM#QduHZ>47eTWXczLEQmJxW3GqJziBM`2GfrnFpA#U3Hfr3oFx^lfXct6y+IGJjFD`0Jt8d?s9;@?qoFefP^ z(ocj1CnP6(Tg>n89*KQFXj;Cu_}U9e20`)pVZ{6lCB#sAmTaut$im`93CoR%3g5lm z-CKo8j){ZSE@nd%FhQQ_r*grGQW{hYncri~WlSOBB}~G1Xx5@~EG`?}s7K1YFFcr@%l^ zx-hDp|A&;$)_%mu+7EKKQIDwqI?;z)T`=0jC0akSi7XmFG69r}Xk6f05U5{5`idqy z*=ZiPdUUjU{}`tBlB8#CBw=nDTS$M@w`;6`N%1n-l&khC6PFWQu-nL9*K4WMFByER z!hA@`_PoNc6u_w>apmC-9WhebDdk|AD9*#*VTs+;UJ)nt+0^6ET%Ju>7job5^kCgW zX93-kPvp_b(j5!pmeH!v%6q#Wo9I))1tq{x5E6gV3UW?l(gd*>j&nxjJ55o;w!$@S z<=nz{+1j9B7?(Wg94V(Wub=yVzX9gIVG4(Ny!U58$X4m2kZ}Ltfhd=v60f?VL>PW> zGIt?t&vlU7F)C)LDA_f*EQ1XChBIk`tH+0v2%TZ+kt)nrc@=3cHnoo=n= znp}`*gvJ7b)|oi(eU%+XCl6Q~3*Loqx$D2gh!cAh2gO$rqkeD$2To#VVChN z>mPX7OBKDH)g9j{8E^6Rx)89(II_>);KR^aQY{2U(IRHsfIFBk2OzV1Podgnl5{Hf z{t^_{2CGkRHns6FfwD&$?jW5AE@^-H4$Qq>Dt0hY8^irLq9p8Kv&kAo2!z5K7d7H% zA9T3eFRYbxuVY7j3g6Uy+hq*DmM7&@D4m#&^>28R_P&X-*w;a^kA4gg&Q++2&IBu<9?deNMml9tTv!{8MkMNuU9 zp2x%p-=5nS;G`=GhM0fo%u3j!?#58sJCqEkNv#PMB1vn&!Kvy05=0}Zm=rz>v;_tt z%}>IC%I&TAJE{@xO$);f^ag|rn(XGc$+s9`m7n-)80DocUwsN(!-=@V!Xb&klHLNf z&xt&Ou~8#9{fW8F>%%luuf3ST2nZ`dja8>i?JydNPfos46s8~6{&OP;7z|H7bm@kf zevzY#_}#KM=f&xp)~`LsQ?_v1sHx#KuE*gqRy%4S&miK1u6_&za8mujVvxv90hZ|t z4caMA`%juMY$rByDpaY<_;sIr1Ti(sM0HGV2QzHHI+l3VjaQx*G*-9eE+@+IzpxnU zT4S1tP7$QIKxdCAI5GoqLd1?w(np{ZNfgzILf1a3d#s3FH9~uN85-*k3Y&wz?(MU*(bZ{cOmZW6Wp}jF zJ_M10KtvlK&5@`5gh43E5)mX&HbxwfKDR$Tc{%lpT&OgvSO;?%sK|nNKRi4C@utmm zKD?_!^~u_6Nc;;`GF|)~XQcjU29LtE%t(&#`zSG!po#UJgFIe*aoooJC}ed1<>>0~ z0qLb59qVl+C~AlUtPth{v5&$@LFIQpnNe!71W?^zSrOw1AR^O7cnjq0Ag>O3xWINK zSGg@7y!|Jg8gonvK!fHzT{L)bCetL5g=eC3E>(}q&^sCn)Me@$V%!8^(Y)u0{N1Z;TL>?9R~94bbh)uC-woV#VvtkEJ;cr ziSDm6gXf6{(t9hLR78Jr?&vY|8Y$ID38{rAl*l(@S?p)c%{Bs`kN1194J_>Ai6Fx3 zsdETo>;y``AK!op+4bndL28)>b=CyJ4~I4C7{-Dy>E^iR0Bkr6)Ph1tF@M+59B*Pv#%UUYpR6AQ!cR@-vN+G=bvOsg z;;d-0LOXUoiS=7RJgJUnq``K+Q&Lj0Nma~l=m=07(s^Gkw6VGAB_k77Z|)Tm8fvA` zl$2q=#_ADH8Xn*jOT|xCYR66rD3~dp3#A7S4=Zw57cc0o=r%bs7&X{a5HY;T6>wuA zn)d&fb>8Ka&0N4EV>zn9uN8#scJ_NYI{x&9U=YK^TAAeiIM9Uen9ztR2?%VKK%ZVw-T&xrqq`3)A#Z1D9VV+ zc~nQT%<{$D;0UvP+~8vKGamQ5bMG@ag|GRxwjm0i2hG@DaUwog11<}4zTs8$ z)7D<5X#Bm)tD)hB=oK%y`(qmiW_fC0Cus`$->xI`R|TO0ohRh(ovwt(s}qjNK&HV9 zNVqlwglOnn9aJ&=Edq!m`c&Q;P<)ftn#I3iWD}rpx_?~T=c|`WzPF=vvKWlMSvig2 z#z3^RnZLaVkctk`{rDmXlkvH5uZE0L2zjc$|0P=HWQN~~58MfC3e>g(02#_j#W>+a zr;n4IE_arO9tZjce^$y&Q+vESSS7OWFY2#cp{~dTFQgtuWJZx?KB@dt`50s(60>UN zAGkkRsxWJKX+on54SR|w#?SUz^?&$Iej#fFPaX&h0EJ1f+m?<(F|Z99fu#A4G7Pot z;aHFaFJ4=b7L>yBE^#w)uT~8o0^9FtOn*7Y180r;*Ad#R_G?V7)bbMC(3|gb+t*ez zniZ2Sq&5c^#`wu|+eaNk zY)ojPNE16B#JNlTh(Jy2)k6;lvOwe`iy`Ax<^i*1CA$_5w@1f{(C>Q&LwxwX;vIpXk$EyBZ8S{J~ZAxwX1poVq3)xtN%cFeN_7U;h1EMb|?jb68KhK zJ~zkgn5}@k*Xv=T&6m@#o?jvxVScAxQ&2|?6tqW+^QgCvpgiUG^|lGqNdPn7`h7Ik zHnO7wZXzbP-ycj$@|0c?a;?yEPeIEQp}E?%o36x1P|RCYeC`s#S2x$1&bD)(mZu@@ z)bfs90nF|6S`uuw@~4OGC^}<;ukceP^}-U~P{kGyl^U+aX}Xxp^`hG zW>=bpM;nYi>N0%pFi_I`s_7=+?V^t3*xyRoTbeVb#7_s2LRB%>B7r`B%GeB+*1($S z3Wt2*N-8iY6aZ7PrM*(oyxFhWp0%>gjk;Vh7ESeYR+N606KVZYnzf|z(I}^1kyG*0 z^XnE#2tUVIy(|Xi^VnHwTX@wo(0m-gl8Auc!O#a3yj<%gWlS_8gMb}o7-+fKStULV zqQr=pUOk~wC@eABN+Y;=xcRFZOv+K>X|BM&ug#&_ed+P_@nr|MhF6KF)nT=DArU6R z$~s>dm*dYyXDsV+D&B@8GqXk&2%;%^k_o5rexe~frGp^?+kMzAHm7fi_6mPzSH`pa za%<6>KBJY=AY1sQC@u?ATg?%}X&nFh40@i!7e0S~Z}naYJ%&ozmH0#!9MuG5Bq(Fx z@==tSqP#K#N&Kqlao26=;+AchB$47hIz%wC_y zuQyLLg*ze~wk{Clgbt(kUUG&%SJZHv?S&||Zghp~E+P#EtkUOAI&6C^4fcFq@)5O3 z6)Y#?FmwwZZN*SEZodWh-m59Ji&(O(32PAlTM_M;#I%9>{^gMNW~uIy$(L09{Ev&0 zw;}odhjsobX-Sgfv%ln7A|LA2C!X!Lu6FQED0W&ZQ;k`HN9Xw}Ulvbfz#6|@$XGGp z=^4d)J5!pET2hR-YVZmy045 zeoSy34b?Cg+Q3A&J8dYXf(S0Uc$XHYgPU&r3>Pg$*4Bc{gr_ppx;mtCev%Z4&VD(I zy1eg44*cl))2tk(2ybt#_!=YPYotlmKlbB5Gsw|-Ot{c>4a4bhj*}nNR5{)lyb_U$ zvLtjhuXiG=$2jf~z%>4=CBNAPPkW}pj=v^um+qS;l}|nQn6Csv7Jnuvy)U3NjR*bf z($;ozE{dq;q=~?t9o!ayCx})7+ZL1%w9^SBeQXRMNdiDli}?}~77MA3bOpCFbl#3X z4}53;%*Hw@e3MmguA7&Q;?`zF)gBpr_Lx~G{>{q(@@#s8HawqiDWJj0iYZT|f!*MR zs3Pc={B7tV@$(l*jXSHPmi_UEBem3T`a=B+(+15u%eokxj8Jy9A#P+6@mc6bFivx4 z49{@+w}yHi2QkptTMG^_lm&=NrwYBb($FVBR_bFC3dsCTM;QQkB>J!lw;;Xe(2l{v z&peVH*xxC*J4;QOls2$JsuOAb?w6m8j*D5Mve+34gY8TD2JcJ1u#smRNkL~nHidFn zBk}8QsfaeYeO-%gBWGIOFU+IGP`=-Zb-$Tvt}ki-IunG5p(HpG6|Ad;*$&>RW?`#9 zUO7}d!=5aWe=vF4zG4x4<~qLAdGHneiFkxi%MDy7@r!IZovZbS%6cM#9yL(GCYR;i z2+W^_I-zB(E4<;yiTy~%u>of&i2it4!bxcm8$M**-Z5wVi+-&wZn4 zx}ng``|ZyQZcK1Y`jqsku8wU`FtybB*h6d6#Jl8q{K8KWMa%?83BMK2&mc%IrYe6PIr{AnK7xdRSAK z)YP|x*6`HQdSiFAyr^4mn_l022TVQdiaV=-M!g-ggH8b3SZ!WAH5qpKL0U4lB&oDP zGEF8+2673tkgld~Q_$h}qdN9b_*g2(ef(dFFZ%M`n(u{}d)gV>G_y0Noy^|MK=S5B zkxJq_RW-%s_}xNiOIsydYy1h`T|d_4Ur6YABk})gDijSOC#y64VQ?Rb`+(?dc}h%T zN~e3CpN-$L$14A5hNsfzn`*+Ao6oe|o0{fY*mAMLNc9lRWUDK_Et)Z^^JaGOk=9oB zxqfeTVB|S3*p+@Otvb;Y05w&!y zgz7&P7wapp^1P7w2GMq1#y(@|?`)U)en52P#JPdVyxqjr1GBBC0g0WZ60%|={!zM;RwWt-tfDnuB-#XI zl`B!1y(G{+co%xUc%ysw_98vSZ2Y=zuU&cVDEzPu%Embur0aWjNR#0{oW?n!0wSr0 zRi{kmWB~0x(YR5QEjs`cp-vCOk2CSyA|Hl?5`xNf0Ve%6kr*LfGokj6UZX;VsxSMc z$3s>q=Tqqz*P;id;OIQ{4Ifj%{Aaqg9?_h^s2Jbrl zsis;N4;rz(M9vS9eL=_2=XH*8-=m|%Mw!BPzNT2efSx5Fkv~N2RDOFp=DJ?S~22YP{D1;C<0mz+FT_KGUAhYXou){z&fizlKp)ITfv$J4)FzprTa zTBlL;7#$#PJ!pW<+?)73`$9x_wv5v$eeaGC6x+NLIvHEKTUN4_v92=HufpFHv%&-j zxq{()crtrauI;k}YhKb7qDR;!XR7y%{#xDdRY7X&nuB(@<=vBS(;ngTnE3&+O_S|w zYEY;NApN9IEKGDnz<<+p1|HtEk5X=r*g|>kUf}5MzNEKPAf$=R_nkVf>g{-+%VQV^ znX2ExYQ0~tae8bT*uB$ctt9I*n>g76V%7O1Y8npZFuZInSII3EYa*3yaw25QYY^Sz zF9MrAaL5H(CjA?E0M%l#9kZSy4JeoVu9NR(O2Y2Q9YY3wmHg-QoaaY{&FY$=ZExit z;U%Y4tIsy%T${9Qgoy=qEiU-&6a5vS2;5|3EE_XLf#%YFHg#0773Mv^*Ke7qWk74? z(Xo*mav$XJ?NH{1bNoEZ>bKp$r4d|xTgg7!Z}?1s&OZ`^bF$BJG3O&MRK4 zf34m%JVV{D4Xnv*ZGMur_@T|bz;w2)H%rf*ZQtQr7H^|DV1;B0~u_0qcv9sy;GrOP^Ho z7}P4ui=@8x@vVj8w)%H!s`1N2l5VhPK=N060n_^lTyoQSN+||~NrZEe`Qmwt{=sNQd{k84$8%Le6`Lt|ME@4+_Tgc*{M`~HNvN)07f^chy$!;wC(^7Fn%-ZpR%wZILEfXR;5yN>kml32fzg15)*(kcQX7t4W zxv!MT(uXKuO%w0>%<_1yjOT**wU(_KPk=_C7g(*h&)1)LL~_*My-P-nqD;LwD#kf< zH83}K_4`Lq8`)H?iNkG|C4xveKRir+ZF}2ob*<+82RB6gSU>>SNsVD$;R^@5Rw0Na z3}eM!$->OjIi#M!1E~DZA%uvhUrG#N_sI19E6<1Y7W5a)0m{50RrTnrKAY}eMmFY9 zEr*BKOpIc9WjJm-J^Q|}OK38!JpqI>3?d~IJNB2fBBa22W zvQ2!QXt^-pVCh?^UCT}y<~k@Bm7gsudAGMul#mqn>SfL3VBs6a@7X2qPW7@>3#Emn z2cq&d%^Yw0L)qVzFN_pXQRoFag?o3ocq$6T&XxYXYwi^=s(VY2m|+;Qcz$qDb4$y| zQ#b)Q&X}M#Z`Eeu&~PzoX^goVYO2lPtzUTG;e9MgJd4A@_i{vg<>5l}*T5d#VcR|8 zupkbnCyObSd>G2`2`ZU<+^gtxBelpbdtgb%O6EOW$}g;T=ak{?jC9oaD|43l2AlQ7 zHa(Kp0TCW`J=XA%fMnCOan@%QmOA^Uh(uiF%_lpyDy_&*91VbG8<@xtW7Y&K5D>lA zyhas6fsscj3*X*!{l?A-bF7i&;}-yNlJ9M9Cf(HgQ8L%Eo&u$J(Wo;J4U2QneNI}m zw?uXP4T6%mG|KwIO7G$fzWkK`p{v2R9>#Q-*5G$cAWB#KEhBIq-oQ{Q=37Ap?FHvP`lpZ>ROg5DY>HLt$^Iv0FdpAazr zXf_%?>z8^}J|4VuxK!j2#6WEj)Y1&Kf5Md)X-s0F=1C>Nb;L)|_yw1l@re<^>!@zl zax72Wxx5mX+YOA;MPQA>WI)*3@Uz~oxTg27=zBZHsL`}A@D5O=l%(@>CFnsNr&NZ0 zpUEr|M75N$5GhKKwhuIaWT-G&w`G+*U==*SU}NH$j@{5#VX+e1+;W(u{5B^Em{2Nc|MS7+(T~*o$fv$f zBy{H#1x@&#5r!?NLz}+bpdM2QzS6in00TY#gM24>CN4m;D zxO>74(GXkjtpZELTo*=1KS87(SIlA;-B196Dab@DJ*Ew?S{U&A<#EDcGkb~*<6#^? z3E>~bX%0LrhDNftAdUG|1@!eUgCR9DA}aHgbb2Z3u*Mc9rdbv#j(3qw)5c}G zc{1Wy+YyI7U8Y7_kIp4cecIZuHryY0IYX}W_zBrw1vWt=c|d%pVxZGzK+;~mq*0O& zmgPN$FG(t-h!(}RNIV%XmKTRP1YmX&HlItnfdhda(XuUX@KZFK^*J5L$KkLPvGmK> z;Y_sEpvtUQ&uQ_cHCI6O!M%;vR|nJM6g=2+yz=6YqauP`pvzziqtf>Q{ne;py3<*7 z%Ip@Ci3}?EnlSwsuY|=GZ60as{bBT-@e#FD;o(tRVQ{H!&SN-?HUg!Fu(%bQ?yQE) zw2;~41-!Fj(fy?1l@7;v97K07acnYH&mrZmJDZr6HZ9trFZCTwiLn&TwBq(#iu)@k zp$K@xpw<=?Xc=fL1yHG!&uLl|)aNx01WKjf)$(?g-(OuK4OFY<2=rWM>% z+wE{UV*6u0k!Uz4YJ>anA^s;yPhL#BXP2{QXxz1fSO*79!8*G*1g zG_?j19lsRX5|h5;oxHE%{kt_A)SP`j<`rQs>D^pk5ELsfnW5jUVv7RVV3uuAKVQ$T zΝ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 M$^93^{Xe??2QCTn=Kufz diff --git a/include/boost/sort/block_indirect_sort/blk_detail/backbone.hpp b/include/boost/sort/block_indirect_sort/blk_detail/backbone.hpp index 1c2fdfe..df98efc 100644 --- a/include/boost/sort/block_indirect_sort/blk_detail/backbone.hpp +++ b/include/boost/sort/block_indirect_sort/blk_detail/backbone.hpp @@ -14,15 +14,15 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_BACKBONE_HPP #define __BOOST_SORT_PARALLEL_DETAIL_BACKBONE_HPP +#include #include +#include +#include +#include #include #include #include #include -#include -#include -#include - #include namespace boost diff --git a/include/boost/sort/block_indirect_sort/blk_detail/block.hpp b/include/boost/sort/block_indirect_sort/blk_detail/block.hpp index 9c14b61..c7a2571 100644 --- a/include/boost/sort/block_indirect_sort/blk_detail/block.hpp +++ b/include/boost/sort/block_indirect_sort/blk_detail/block.hpp @@ -14,6 +14,7 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_BLOCK_HPP #define __BOOST_SORT_PARALLEL_DETAIL_BLOCK_HPP +#include #include namespace boost diff --git a/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp b/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp index a4185b5..3feae2f 100644 --- a/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp +++ b/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp @@ -14,12 +14,14 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_MERGE_BLOCKS_HPP #define __BOOST_SORT_PARALLEL_DETAIL_MERGE_BLOCKS_HPP +#include #include -#include -#include #include #include #include +#include +#include + namespace boost { @@ -103,7 +105,7 @@ struct merge_blocks { this->merge_range_pos (rng_input); } - catch (std::bad_alloc &ba) + catch (std::bad_alloc ) { error = true; }; diff --git a/include/boost/sort/block_indirect_sort/blk_detail/move_blocks.hpp b/include/boost/sort/block_indirect_sort/blk_detail/move_blocks.hpp index 6b556bc..71a6488 100644 --- a/include/boost/sort/block_indirect_sort/blk_detail/move_blocks.hpp +++ b/include/boost/sort/block_indirect_sort/blk_detail/move_blocks.hpp @@ -15,10 +15,11 @@ #define __BOOST_SORT_PARALLEL_DETAIL_MOVE_BLOCKS_HPP #include -#include +#include #include #include #include +#include namespace boost { diff --git a/include/boost/sort/block_indirect_sort/blk_detail/parallel_sort.hpp b/include/boost/sort/block_indirect_sort/blk_detail/parallel_sort.hpp index b11993d..71c74e6 100644 --- a/include/boost/sort/block_indirect_sort/blk_detail/parallel_sort.hpp +++ b/include/boost/sort/block_indirect_sort/blk_detail/parallel_sort.hpp @@ -14,6 +14,7 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_PARALLEL_SORT_HPP #define __BOOST_SORT_PARALLEL_DETAIL_PARALLEL_SORT_HPP +#include #include #include #include @@ -159,7 +160,7 @@ ::parallel_sort(backbone_t &bkbn, Iter_t first, Iter_t last) //-------------------max_per_thread --------------------------- uint32_t nbits_size = (nbits64(sizeof(value_t))) >> 1; if (nbits_size > 5) nbits_size = 5; - max_per_thread = 1 << (18 - nbits_size); + max_per_thread = (size_t) 1 << (18 - nbits_size); uint32_t level = ((nbits64(nelem / max_per_thread)) * 3) / 2; diff --git a/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp b/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp index 31ce3fe..0b59120 100644 --- a/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp +++ b/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp @@ -13,15 +13,19 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_BLOCK_INDIRECT_SORT_HPP #define __BOOST_SORT_PARALLEL_DETAIL_BLOCK_INDIRECT_SORT_HPP +#include #include +#include +#include +#include + #include #include #include #include #include #include -#include -#include + // This value is the minimal number of threads for to use the // block_indirect_sort algorithm @@ -141,7 +145,7 @@ struct block_indirect_sort destroy(rglobal_buf); construct = false; }; - std::return_temporary_buffer(ptr); + std::free (ptr); ptr = nullptr; }; } @@ -223,7 +227,7 @@ ::block_indirect_sort(Iter_t first, Iter_t last, Compare cmp, uint32_t nthr) uint32_t nbits_size = (nbits64(sizeof(value_t)) >> 1); if (nbits_size > 5) nbits_size = 5; - size_t max_per_thread = 1 << (18 - nbits_size); + size_t max_per_thread = (size_t) 1 << (18 - nbits_size); if (nelem < (max_per_thread) or nthread < 2) { @@ -233,8 +237,9 @@ ::block_indirect_sort(Iter_t first, Iter_t last, Compare cmp, uint32_t nthr) }; //----------- creation of the temporary buffer -------------------- - ptr = std::get_temporary_buffer(Block_size * nthread).first; - if (ptr == nullptr) + ptr = reinterpret_cast + (std::malloc (Block_size * nthread * sizeof(value_t))); + if (ptr == nullptr) { bk.error = true; throw std::bad_alloc(); @@ -271,7 +276,7 @@ ::block_indirect_sort(Iter_t first, Iter_t last, Compare cmp, uint32_t nthr) // thread local buffer for (uint32_t i = 0; i < nthread; ++i) { - auto f1 = [=, &vbuf]( ) + auto f1 = [=, &vbuf, this]( ) { bk.exec (vbuf[i], this->counter);}; vfuture[i] = std::async(std::launch::async, f1); }; @@ -322,7 +327,7 @@ ::split_range(size_t pos_index1, size_t pos_index2, uint32_t level_thread) //------------------------------------------------------------------------- if (level_thread != 0) { - auto f1 = [=, &son_counter]( ) + auto f1 = [=, &son_counter, this]( ) { split_range (pos_index_mid, pos_index2, level_thread - 1); bscu::atomic_sub (son_counter, 1); @@ -334,7 +339,7 @@ ::split_range(size_t pos_index1, size_t pos_index2, uint32_t level_thread) else { Iter_t mid = first + ((nblock >> 1) * Block_size); - auto f1 = [=, &son_counter]( ) + auto f1 = [=, &son_counter, this]( ) { parallel_sort_t (bk, mid, last); bscu::atomic_sub (son_counter, 1); @@ -364,7 +369,7 @@ ::start_function(void) } else { - size_t level_thread = nbits64(nthread - 1) - 1; + uint32_t level_thread = nbits64 (nthread - 1) - 1; split_range(0, bk.nblock, level_thread - 1); if (bk.error) return; move_blocks_t k(bk); @@ -443,7 +448,7 @@ void block_indirect_sort(Iter_t first, Iter_t last) // //----------------------------------------------------------------------------- // function : block_indirect_sort -/// @brief invocation of block_indirtect_sort with 3 parameters. The third is +/// @brief invocation of block_indirtect_sort with 3 parameters. The third is /// the number of threads /// /// @param first : iterator to the first element of the range to sort @@ -460,7 +465,7 @@ void block_indirect_sort(Iter_t first, Iter_t last, uint32_t nthread) // //----------------------------------------------------------------------------- // function : block_indirect_sort -/// @brief invocation of block_indirtect_sort with 3 parameters. The third is +/// @brief invocation of block_indirtect_sort with 3 parameters. The third is /// the comparison object /// /// @param first : iterator to the first element of the range to sort @@ -479,7 +484,7 @@ void block_indirect_sort(Iter_t first, Iter_t last, Compare comp) // //----------------------------------------------------------------------------- // function : block_indirect_sort -/// @brief invocation of block_indirtect_sort with 4 parameters. +/// @brief invocation of block_indirtect_sort with 4 parameters. /// /// @param first : iterator to the first element of the range to sort /// @param last : iterator after the last element to the range to sort diff --git a/include/boost/sort/common/deque_cnc.hpp b/include/boost/sort/common/deque_cnc.hpp index eb3b31e..8445d50 100644 --- a/include/boost/sort/common/deque_cnc.hpp +++ b/include/boost/sort/common/deque_cnc.hpp @@ -14,13 +14,16 @@ #ifndef __TOOLS_DEQUE_CNC_HPP #define __TOOLS_DEQUE_CNC_HPP -#include +#include #include #include +#include +namespace boost +{ namespace sort { -namespace tools +namespace common { //########################################################################### @@ -61,7 +64,7 @@ class deque_cnc // VARIABLES //------------------------------------------------------------------------ deque_t dq; - mutable spinlock spl; + mutable spinlock_t spl; public: // @@ -94,7 +97,7 @@ class deque_cnc //---------------------------------------------------------------------- void clear(void) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.clear(); }; // @@ -107,7 +110,7 @@ class deque_cnc void swap(deque_cnc & A) noexcept { if (this == &A) return; - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.swap(A.dq); }; // @@ -123,7 +126,7 @@ class deque_cnc //------------------------------------------------------------------------ size_type size(void) const noexcept { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); return dq.size(); }; // @@ -134,7 +137,7 @@ class deque_cnc //------------------------------------------------------------------------ size_type max_size(void) const noexcept { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); return (dq.max_size()); }; // @@ -150,7 +153,7 @@ class deque_cnc //------------------------------------------------------------------------ void shrink_to_fit() { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.shrink_to_fit(); }; // @@ -161,7 +164,7 @@ class deque_cnc //------------------------------------------------------------------------ bool empty(void) const noexcept { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); return (dq.empty()); }; //--------------------------------------------------------------------------- @@ -172,7 +175,7 @@ class deque_cnc //--------------------------------------------------------------------------- void push_back(const value_type & D) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.push_back(D); }; @@ -184,7 +187,7 @@ class deque_cnc template void emplace_back(Args && ... args) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.emplace_back(std::forward (args) ...); }; //------------------------------------------------------------------------ @@ -197,7 +200,7 @@ class deque_cnc template deque_cnc & push_back(const std::deque & D) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); for (size_type i = 0; i < D.size(); ++i) dq.push_back(D[i]); return *this; @@ -211,7 +214,7 @@ class deque_cnc //------------------------------------------------------------------------ deque_cnc & push_back(std::deque && D) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); for (size_type i = 0; i < D.size(); ++i) dq.emplace_back(std::move(D[i])); return *this; @@ -223,7 +226,7 @@ class deque_cnc //----------------------------------------------------------------------- void pop_back(void) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.pop_back(); }; // @@ -237,7 +240,7 @@ class deque_cnc //------------------------------------------------------------------------ bool pop_copy_back(value_type & P) { //-------------------------- begin ----------------------------- - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); if (dq.size() == 0) return false; P = dq.back(); dq.pop_back(); @@ -254,7 +257,7 @@ class deque_cnc //------------------------------------------------------------------------ bool pop_move_back(value_type & P) { //-------------------------- begin ----------------------------- - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); if (dq.size() == 0) return false; P = std::move(dq.back()); dq.pop_back(); @@ -268,7 +271,7 @@ class deque_cnc //------------------------------------------------------------------------ void push_front(const value_type & D) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.push_front(D); }; @@ -280,7 +283,7 @@ class deque_cnc template void emplace_front(Args && ... args) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.emplace_front(std::forward (args) ...); }; //------------------------------------------------------------------------ @@ -293,7 +296,7 @@ class deque_cnc template deque_cnc & push_front(const std::deque & V1) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); for (size_type i = 0; i < V1.size(); ++i) dq.push_front(V1[i]); return *this; @@ -307,7 +310,7 @@ class deque_cnc //----------------------------------------------------------------------- deque_cnc & push_front(std::deque && V1) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); for (size_type i = 0; i < V1.size(); ++i) dq.emplace_front(std::move(V1[i])); return *this; @@ -319,7 +322,7 @@ class deque_cnc //----------------------------------------------------------------------- void pop_front(void) { - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); dq.pop_front(); }; // @@ -333,7 +336,7 @@ class deque_cnc //----------------------------------------------------------------------- bool pop_copy_front(value_type & P) { //-------------------------- begin ----------------------------- - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); if (dq.size() == 0) return false; P = dq.front(); dq.pop_front(); @@ -350,7 +353,7 @@ class deque_cnc //------------------------------------------------------------------------ bool pop_move_front(value_type & P) { //-------------------------- begin ----------------------------- - std::lock_guard < spinlock > S(spl); + std::lock_guard < spinlock_t > S(spl); if (dq.size() == 0) return false; P = std::move(dq.front()); dq.pop_front(); @@ -360,7 +363,8 @@ class deque_cnc // end class deque_cnc //*************************************************************************** -};// end namespace tools +};// end namespace common };// end namespace sort +};// end namespace boost //*************************************************************************** #endif diff --git a/include/boost/sort/common/indirect.hpp b/include/boost/sort/common/indirect.hpp index a55ef82..6b9b116 100644 --- a/include/boost/sort/common/indirect.hpp +++ b/include/boost/sort/common/indirect.hpp @@ -129,7 +129,7 @@ static void sort_index(Iter_t global_first, std::vector &index) }; }; -template > +template > static void indirect_sort(func method, Iter_t first, Iter_t last, Compare comp) { auto nelem = (last - first); diff --git a/include/boost/sort/common/int_array.hpp b/include/boost/sort/common/int_array.hpp index 22c3b0c..dfc339b 100644 --- a/include/boost/sort/common/int_array.hpp +++ b/include/boost/sort/common/int_array.hpp @@ -15,6 +15,7 @@ #ifndef __BOOST_SORT_COMMON_INT_ARRAY_HPP #define __BOOST_SORT_COMMON_INT_ARRAY_HPP +#include #include #include diff --git a/include/boost/sort/common/merge_block.hpp b/include/boost/sort/common/merge_block.hpp index 9a7b118..1a7eb90 100644 --- a/include/boost/sort/common/merge_block.hpp +++ b/include/boost/sort/common/merge_block.hpp @@ -14,6 +14,7 @@ #ifndef __BOOST_SORT_COMMON_MERGE_BLOCK_HPP #define __BOOST_SORT_COMMON_MERGE_BLOCK_HPP +#include #include #include #include diff --git a/include/boost/sort/common/merge_four.hpp b/include/boost/sort/common/merge_four.hpp index edfb2ff..6b791be 100644 --- a/include/boost/sort/common/merge_four.hpp +++ b/include/boost/sort/common/merge_four.hpp @@ -13,12 +13,14 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_MERGE_FOUR_HPP #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_MERGE_FOUR_HPP -#include -#include +#include #include #include #include #include +#include +#include + namespace boost { diff --git a/include/boost/sort/common/merge_vector.hpp b/include/boost/sort/common/merge_vector.hpp index 84afea5..aaba93d 100644 --- a/include/boost/sort/common/merge_vector.hpp +++ b/include/boost/sort/common/merge_vector.hpp @@ -14,12 +14,14 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_MERGE_VECTOR_HPP #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_MERGE_VECTOR_HPP -#include + +#include #include #include #include #include #include +#include namespace boost { @@ -99,7 +101,7 @@ void merge_level4(range dest, std::vector > &v_input, template void uninit_merge_level4(range dest, std::vector > &v_input, - std::vector > &v_output, Compare comp) + std::vector > &v_output, Compare comp) { typedef range range1_t; typedef util::value_iter type1; diff --git a/include/boost/sort/common/pivot.hpp b/include/boost/sort/common/pivot.hpp index 3fa924b..6422a34 100644 --- a/include/boost/sort/common/pivot.hpp +++ b/include/boost/sort/common/pivot.hpp @@ -13,6 +13,7 @@ #ifndef __BOOST_SORT_COMMON_PIVOT_HPP #define __BOOST_SORT_COMMON_PIVOT_HPP +#include #include namespace boost diff --git a/include/boost/sort/common/range.hpp b/include/boost/sort/common/range.hpp index 072d98a..73dbd5a 100644 --- a/include/boost/sort/common/range.hpp +++ b/include/boost/sort/common/range.hpp @@ -13,13 +13,15 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_RANGE_HPP #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_RANGE_HPP -#include -#include -#include +#include #include #include #include #include +#include +#include +#include + namespace boost { diff --git a/include/boost/sort/common/rearrange.hpp b/include/boost/sort/common/rearrange.hpp index 5c65c4f..fe48ee6 100644 --- a/include/boost/sort/common/rearrange.hpp +++ b/include/boost/sort/common/rearrange.hpp @@ -13,13 +13,14 @@ #ifndef __BOOST_SORT_COMMON_REARRANGE_HPP #define __BOOST_SORT_COMMON_REARRANGE_HPP -//#include -#include +#include #include #include #include #include #include +#include + namespace boost { diff --git a/include/boost/sort/common/scheduler.hpp b/include/boost/sort/common/scheduler.hpp index 33074a4..6e54db8 100644 --- a/include/boost/sort/common/scheduler.hpp +++ b/include/boost/sort/common/scheduler.hpp @@ -14,15 +14,16 @@ #ifndef __BOOST_SORT_COMMON_SCHEDULER_HPP #define __BOOST_SORT_COMMON_SCHEDULER_HPP -#include -#include -#include +#include #include #include #include #include #include #include +#include +#include +#include namespace boost { @@ -55,14 +56,21 @@ struct scheduler // D E F I N I T I O N S //----------------------------------------------------------------------- typedef std::scoped_allocator_adaptor scoped_alloc; + template + using alloc_t = typename std::allocator_traits:: + template rebind_alloc; + + typedef std::deque deque_t; typedef typename deque_t::iterator it_deque; typedef std::thread::id key_t; typedef std::hash hash_t; typedef std::equal_to equal_t; typedef std::unique_lock lock_t; - typedef std::unordered_map map_t; + typedef std::pair pair_t; + + typedef std::unordered_map > map_t; typedef typename map_t::iterator it_map; //----------------------------------------------------------------------- @@ -184,7 +192,7 @@ struct scheduler //-------------------------------------------------------------------- // Metaprogramming //-------------------------------------------------------------------- - typedef value_iter value2_t; + typedef util::value_iter value2_t; static_assert (std::is_same< Func_t, value2_t >::value, "Incompatible iterators\n"); diff --git a/include/boost/sort/common/sort_basic.hpp b/include/boost/sort/common/sort_basic.hpp index 68a6f54..35121ae 100644 --- a/include/boost/sort/common/sort_basic.hpp +++ b/include/boost/sort/common/sort_basic.hpp @@ -13,10 +13,7 @@ #ifndef __BOOST_SORT_COMMON_SORT_BASIC_HPP #define __BOOST_SORT_COMMON_SORT_BASIC_HPP -//#include -#include -#include -#include +#include #include #include #include @@ -24,6 +21,9 @@ #include #include #include +#include +#include +#include namespace boost { diff --git a/include/boost/sort/common/spinlock.hpp b/include/boost/sort/common/spinlock.hpp index 450ba6b..5944e21 100644 --- a/include/boost/sort/common/spinlock.hpp +++ b/include/boost/sort/common/spinlock.hpp @@ -13,6 +13,7 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_SPINLOCK_HPP #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_SPINLOCK_HPP +#include #include #include #include diff --git a/include/boost/sort/common/stack_cnc.hpp b/include/boost/sort/common/stack_cnc.hpp index d4d6e53..e040b1d 100644 --- a/include/boost/sort/common/stack_cnc.hpp +++ b/include/boost/sort/common/stack_cnc.hpp @@ -13,8 +13,10 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_STACK_CNC_HPP #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_STACK_CNC_HPP -#include +#include #include +#include + namespace boost { diff --git a/include/boost/sort/common/time_measure.hpp b/include/boost/sort/common/time_measure.hpp index ef00dd4..2660c7b 100644 --- a/include/boost/sort/common/time_measure.hpp +++ b/include/boost/sort/common/time_measure.hpp @@ -14,6 +14,7 @@ #ifndef __BOOST_SORT_PARALLEL_TOOLS_TIME_MEASURE_HPP #define __BOOST_SORT_PARALLEL_TOOLS_TIME_MEASURE_HPP +#include #include namespace boost diff --git a/include/boost/sort/common/util/algorithm.hpp b/include/boost/sort/common/util/algorithm.hpp index db7607a..abe2d99 100644 --- a/include/boost/sort/common/util/algorithm.hpp +++ b/include/boost/sort/common/util/algorithm.hpp @@ -13,6 +13,7 @@ #ifndef __BOOST_SORT_COMMON_UTIL_ALGORITHM_HPP #define __BOOST_SORT_COMMON_UTIL_ALGORITHM_HPP +#include #include #include #include diff --git a/include/boost/sort/common/util/atomic.hpp b/include/boost/sort/common/util/atomic.hpp index 15906fe..00af766 100644 --- a/include/boost/sort/common/util/atomic.hpp +++ b/include/boost/sort/common/util/atomic.hpp @@ -12,6 +12,7 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_ATOMIC_HPP #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_ATOMIC_HPP +#include #include #include #include diff --git a/include/boost/sort/common/util/circular_buffer.hpp b/include/boost/sort/common/util/circular_buffer.hpp index 2fc7e97..3778e66 100644 --- a/include/boost/sort/common/util/circular_buffer.hpp +++ b/include/boost/sort/common/util/circular_buffer.hpp @@ -13,6 +13,7 @@ #ifndef __BOOST_SORT_COMMON_UTIL_CIRCULAR_BUFFER_HPP #define __BOOST_SORT_COMMON_UTIL_CIRCULAR_BUFFER_HPP +#include #include #include #include @@ -70,7 +71,7 @@ struct circular_buffer circular_buffer(void) : ptr(nullptr), nelem(0), first_pos(0), initialized(false) { - ptr = std::get_temporary_buffer < Value_t > (NMAX).first; + ptr = static_cast (std::malloc (NMAX * sizeof(Value_t))); if (ptr == nullptr) throw std::bad_alloc(); }; // @@ -84,7 +85,7 @@ struct circular_buffer { for (size_t i = 0; i < NMAX; ++i) (ptr + i)->~Value_t(); initialized = false; }; - std::return_temporary_buffer(ptr); + std::free(static_cast (ptr)); } ; // diff --git a/include/boost/sort/common/util/insert.hpp b/include/boost/sort/common/util/insert.hpp index 219fa8a..485e25b 100644 --- a/include/boost/sort/common/util/insert.hpp +++ b/include/boost/sort/common/util/insert.hpp @@ -13,10 +13,8 @@ #ifndef __BOOST_SORT_COMMON_UTIL_INSERT_HPP #define __BOOST_SORT_COMMON_UTIL_INSERT_HPP -//#include -#include -#include -#include + +#include #include #include #include @@ -24,6 +22,9 @@ #include #include #include +#include +#include +#include namespace boost { diff --git a/include/boost/sort/common/util/merge.hpp b/include/boost/sort/common/util/merge.hpp index 5fc90c0..943e979 100644 --- a/include/boost/sort/common/util/merge.hpp +++ b/include/boost/sort/common/util/merge.hpp @@ -13,6 +13,7 @@ #ifndef __BOOST_SORT_COMMON_UTIL_MERGE_HPP #define __BOOST_SORT_COMMON_UTIL_MERGE_HPP +#include #include #include #include diff --git a/include/boost/sort/common/util/search.hpp b/include/boost/sort/common/util/search.hpp index fbe056e..f051666 100644 --- a/include/boost/sort/common/util/search.hpp +++ b/include/boost/sort/common/util/search.hpp @@ -9,8 +9,10 @@ #ifndef __BOOST_SORT_COMMON_SEARCH_HPP #define __BOOST_SORT_COMMON_SEARCH_HPP -#include +#include #include +#include + namespace boost { diff --git a/include/boost/sort/common/util/traits.hpp b/include/boost/sort/common/util/traits.hpp index 68e5cf0..622a99c 100644 --- a/include/boost/sort/common/util/traits.hpp +++ b/include/boost/sort/common/util/traits.hpp @@ -12,6 +12,7 @@ #ifndef __BOOST_SORT_COMMON_UTIL_TRAITS_HPP #define __BOOST_SORT_COMMON_UTIL_TRAITS_HPP +#include #include #include #include diff --git a/include/boost/sort/flat_stable_sort/flat_stable_sort.hpp b/include/boost/sort/flat_stable_sort/flat_stable_sort.hpp index ac9c517..8ebfdfb 100644 --- a/include/boost/sort/flat_stable_sort/flat_stable_sort.hpp +++ b/include/boost/sort/flat_stable_sort/flat_stable_sort.hpp @@ -13,6 +13,14 @@ #ifndef __BOOST_SORT_FLAT_STABLE_SORT_HPP #define __BOOST_SORT_FLAT_STABLE_SORT_HPP +#include +#include +#include +#include +#include +#include +#include + #include #include #include @@ -21,12 +29,7 @@ #include #include -#include -#include -#include -#include -#include -#include + namespace boost { @@ -299,7 +302,7 @@ inline void indirect_flat_stable_sort (Iter_t first, Iter_t last, Compare comp = Compare()) { typedef typename std::vector::iterator itx_iter; - typedef common::less_ptr_no_null itx_comp; + typedef common::less_ptr_no_null itx_comp; common::indirect_sort ( flat_stable_sort, first, last, comp); }; diff --git a/include/boost/sort/heap_sort/heap_sort.hpp b/include/boost/sort/heap_sort/heap_sort.hpp deleted file mode 100644 index 9e89d00..0000000 --- a/include/boost/sort/heap_sort/heap_sort.hpp +++ /dev/null @@ -1,215 +0,0 @@ -//---------------------------------------------------------------------------- -/// @file heap_sort.hpp -/// @brief Insertion Sort algorithm -/// -/// @author Copyright (c) 2016 Francisco Jose Tapia (fjtapia@gmail.com )\n -/// Distributed under the Boost Software License, Version 1.0.\n -/// ( See accompanying file LICENSE_1_0.txt or copy at -/// http://www.boost.org/LICENSE_1_0.txt ) -/// @version 0.1 -/// -/// @remarks -//----------------------------------------------------------------------------- -#ifndef __BOOST_SORT_INTROSORT_DETAIL_HEAP_SORT_HPP -#define __BOOST_SORT_INTROSORT_DETAIL_HEAP_SORT_HPP - -#include -#include -#include -#include -#include // for std::swap -#include - -namespace boost -{ -namespace sort -{ -namespace heap_detail -{ -namespace bscu = boost::sort::common::util; -// -//--------------------------------------------------------------------------- -// struct : heap_sort -/// @brief : Heap sort algorithm -/// @remarks This algorithm is O(NLogN) -//--------------------------------------------------------------------------- -template < class Iter_t, class Compare > -struct heap_sort -{ - typedef bscu::value_iter value_t; - - // - //------------------------------------------------------------------------ - // function : sort3 - /// @brief Sort and signal the changes of three values - /// @param val_0 : first value to compare - /// @param val_1 : second value to compare - /// @param val_2 : third value to compare - /// @param [out] bool_0 : if true indicates val_0 had been changed - /// @param [out] bool_1 : if true indicates val_1 had been changed - /// @param [out] bool_2 : if true indicates val_2 had been changed - /// @return if true , some value had changed - /// @remarks - //------------------------------------------------------------------------ - bool sort3 (value_t &val_0, value_t &val_1, value_t &val_2, bool &bool_0, - bool &bool_1, bool &bool_2) - { - bool_0 = bool_1 = bool_2 = false; - int value = 0; - if (val_0 < val_1) value += 4; - if (val_1 < val_2) value += 2; - if (val_0 < val_2) value += 1; - - switch (value) - { - case 0: break; - - case 2: - std::swap (val_1, val_2); - bool_1 = bool_2 = true; - break; - - case 3: - if (not(val_0 > val_1)) { - std::swap (val_0, val_2); - bool_0 = bool_2 = true; - } - else - { - auto aux = std::move (val_2); - val_2 = std::move (val_1); - val_1 = std::move (val_0); - val_0 = std::move (aux); - bool_0 = bool_1 = bool_2 = true; - }; - break; - - case 4: - std::swap (val_0, val_1); - bool_0 = bool_1 = true; - break; - - case 5: - if (val_1 > val_2) { - auto aux = std::move (val_0); - val_0 = std::move (val_1); - val_1 = std::move (val_2); - val_2 = std::move (aux); - bool_0 = bool_1 = bool_2 = true; - } - else - { - std::swap (val_0, val_2); - bool_0 = bool_2 = true; - }; - break; - - case 7: - std::swap (val_0, val_2); - bool_0 = bool_2 = true; - break; - - default: abort ( ); - }; - return (bool_0 or bool_1 or bool_2); - }; - // - //----------------------------------------------------------------------- - // function : make_heap - /// @brief Make the heap for to extract the sorted elements - /// @param first : iterator to the first element of the range - /// @param nelem : number of lements of the range - /// @param comp : object for to compare two elements - /// @remarks This algorithm is O(NLogN) - //------------------------------------------------------------------------ - void make_heap (Iter_t first, size_t nelem, Compare comp) - { - size_t pos_father, pos_son; - Iter_t iter_father = first, iter_son = first; - bool sw = false; - - for (size_t i = 1; i < nelem; ++i) - { - pos_father = i; - iter_father = first + i; - sw = false; - do - { - iter_son = iter_father; - pos_son = pos_father; - pos_father = (pos_son - 1) >> 1; - iter_father = first + pos_father; - if ((sw = comp (*iter_father, *iter_son))) - std::swap (*iter_father, *iter_son); - } while (sw and pos_father != 0); - }; - }; - // - //------------------------------------------------------------------------ - // function : heap_sort - /// @brief : Heap sort algorithm - /// @param first: iterator to the first element of the range - /// @param last : iterator to the next element of the last in the range - /// @param comp : object for to do the comparison between the elements - /// @remarks This algorithm is O(NLogN) - //------------------------------------------------------------------------ - heap_sort (Iter_t first, Iter_t last, Compare comp) - { - assert ((last - first) >= 0); - size_t nelem = last - first; - if (nelem < 2) return; - - //-------------------------------------------------------------------- - // Creating the initial heap - //-------------------------------------------------------------------- - make_heap (first, nelem, comp); - - //-------------------------------------------------------------------- - // Sort the heap - //-------------------------------------------------------------------- - size_t pos_father, pos_son; - Iter_t iter_father = first, iter_son = first; - - bool sw = false; - for (size_t i = 1; i < nelem; ++i) - { - std::swap (*first, *(first + (nelem - i))); - pos_father = 0; - pos_son = 1; - iter_father = first; - sw = true; - while (sw and pos_son < (nelem - i)) - { - // if the father have two sons must select the bigger - iter_son = first + pos_son; - if ((pos_son + 1) < (nelem - i) and - comp (*iter_son, *(iter_son + 1))) - { - ++pos_son; - ++iter_son; - }; - if ((sw = comp (*iter_father, *iter_son))) - std::swap (*iter_father, *iter_son); - pos_father = pos_son; - iter_father = iter_son; - pos_son = (pos_father << 1) + 1; - }; - }; - }; -}; // End class heap_sort -}; // end namespace heap_sort - -namespace bscu = boost::sort::common::util; - -template < class Iter_t, typename Compare = bscu::compare_iter < Iter_t > > -void heap_sort (Iter_t first, Iter_t last, Compare comp = Compare()) -{ - heap_detail::heap_sort ( first, last, comp); -} -// -//**************************************************************************** -}; // End namespace sort -}; // End namespace boost -//**************************************************************************** -// -#endif diff --git a/include/boost/sort/insert_sort/insert_sort.hpp b/include/boost/sort/insert_sort/insert_sort.hpp index d40302a..c03a96f 100644 --- a/include/boost/sort/insert_sort/insert_sort.hpp +++ b/include/boost/sort/insert_sort/insert_sort.hpp @@ -13,6 +13,7 @@ #ifndef __BOOST_SORT_INTROSORT_DETAIL_INSERT_SORT_HPP #define __BOOST_SORT_INTROSORT_DETAIL_INSERT_SORT_HPP +#include #include #include #include diff --git a/include/boost/sort/parallel_stable_sort/parallel_stable_sort.hpp b/include/boost/sort/parallel_stable_sort/parallel_stable_sort.hpp index 1a09898..9f1ada1 100644 --- a/include/boost/sort/parallel_stable_sort/parallel_stable_sort.hpp +++ b/include/boost/sort/parallel_stable_sort/parallel_stable_sort.hpp @@ -88,7 +88,7 @@ struct parallel_stable_sort //----------------------------------------------------------------------------- void destroy_all() { - if (ptr != nullptr) std::return_temporary_buffer(ptr); + if (ptr != nullptr) std::free (ptr); }; // //----------------------------------------------------------------------------- @@ -157,7 +157,9 @@ ::parallel_stable_sort (Iter_t first, Iter_t last, Compare comp, return; }; - ptr = std::get_temporary_buffer(nptr).first; + ptr = reinterpret_cast + (std::malloc (nptr * sizeof(value_t))); + if (ptr == nullptr) throw std::bad_alloc(); //--------------------------------------------------------------------- diff --git a/include/boost/sort/sample_sort/sample_sort.hpp b/include/boost/sort/sample_sort/sample_sort.hpp index ded1781..df1a85b 100644 --- a/include/boost/sort/sample_sort/sample_sort.hpp +++ b/include/boost/sort/sample_sort/sample_sort.hpp @@ -13,6 +13,7 @@ #ifndef __BOOST_SORT_PARALLEL_DETAIL_SAMPLE_SORT_HPP #define __BOOST_SORT_PARALLEL_DETAIL_SAMPLE_SORT_HPP +#include #include #include #include @@ -288,7 +289,9 @@ ::sample_sort (Iter_t first, Iter_t last, Compare cmp, uint32_t num_thread, } else { - value_t *ptr = std::get_temporary_buffer(nelem).first; + value_t * ptr = reinterpret_cast + (std::malloc (nelem * sizeof(value_t))); + if (ptr == nullptr) throw std::bad_alloc(); owner = true; global_buf = range_buf(ptr, ptr + nelem); @@ -331,7 +334,7 @@ void sample_sort::destroy_all(void) construct = false; } if (global_buf.first != nullptr and owner) - std::return_temporary_buffer(global_buf.first); + std::free(global_buf.first); } // //----------------------------------------------------------------------------- @@ -370,7 +373,7 @@ void sample_sort::initial_configuration(void) for (uint32_t i = 0; i < nthread; ++i) { - auto func = [=]() + auto func = [=, this]() { bss::spinsort (vmem_thread[i].first, vmem_thread[i].last, comp, diff --git a/include/boost/sort/spinsort/spinsort.hpp b/include/boost/sort/spinsort/spinsort.hpp index 0e9f2d5..726341b 100644 --- a/include/boost/sort/spinsort/spinsort.hpp +++ b/include/boost/sort/spinsort/spinsort.hpp @@ -13,12 +13,8 @@ #ifndef __BOOST_SORT_PARALLEL_ALGORITHM_SPIN_SORT_HPP #define __BOOST_SORT_PARALLEL_ALGORITHM_SPIN_SORT_HPP -//#include -#include -#include -#include -#include -#include + +#include #include #include #include @@ -26,6 +22,12 @@ #include #include #include +#include +#include +#include +#include +#include + namespace boost { @@ -82,7 +84,7 @@ static void sort_range_sort (const range &rng_data, //----------------------------------------------------------------------------- template static void insert_partial_sort (Iter1_t first, Iter1_t mid, Iter1_t last, - Compare comp, const range &rng_aux) + Compare comp, const range &rng_aux) { //------------------------------------------------------------------------ // metaprogram @@ -416,7 +418,7 @@ class spinsort destroy(range(ptr, ptr + nptr)); construct = false; }; - if (owner and ptr != nullptr) std::return_temporary_buffer(ptr); + if (owner and ptr != nullptr) std::free (ptr); }; }; //---------------------------------------------------------------------------- @@ -477,7 +479,9 @@ ::spinsort (Iter_t first, Iter_t last, Compare comp, value_t *paux, size_t naux) if (ptr == nullptr) { - ptr = std::get_temporary_buffer(nptr).first; + ptr = reinterpret_cast + (std::malloc (nptr * sizeof(value_t))); + if (ptr == nullptr) throw std::bad_alloc(); owner = true; }; diff --git a/test/list.txt b/test/list.txt deleted file mode 100644 index 0162042..0000000 --- a/test/list.txt +++ /dev/null @@ -1,15 +0,0 @@ -CMakeLists.txt -float_sort_test.cpp -integer_sort_test.cpp -Jamfile.v2 -list.txt -sort_detail_test.cpp -string_sort_test.cpp -test_block_indirect_sort.cpp -test_flat_stable_sort.cpp -test_insert_sort.cpp -test.log -test_parallel_stable_sort.cpp -test_pdqsort.cpp -test_sample_sort.cpp -test_spinsort.cpp diff --git a/test/test.log b/test/test.log deleted file mode 100644 index e529dce..0000000 --- a/test/test.log +++ /dev/null @@ -1,37 +0,0 @@ - -Performing configuration checks - - - symlinks supported : yes (cached) -...patience... -...patience... -...found 2544 targets... -...updating 20 targets... -compile-c-c++ ..\..\..\bin.v2\libs\sort\test\integer_sort.test\msvc-12.0\debug\threading-multi\integer_sort_test.obj -integer_sort_test.cpp -msvc.link ..\..\..\bin.v2\libs\sort\test\integer_sort.test\msvc-12.0\debug\threading-multi\integer_sort.exe -msvc.manifest ..\..\..\bin.v2\libs\sort\test\integer_sort.test\msvc-12.0\debug\threading-multi\integer_sort.exe -testing.capture-output ..\..\..\bin.v2\libs\sort\test\integer_sort.test\msvc-12.0\debug\threading-multi\integer_sort.run - 1 file(s) copied. -**passed** ..\..\..\bin.v2\libs\sort\test\integer_sort.test\msvc-12.0\debug\threading-multi\integer_sort.test -compile-c-c++ ..\..\..\bin.v2\libs\sort\test\float_sort.test\msvc-12.0\debug\threading-multi\float_sort_test.obj -float_sort_test.cpp -msvc.link ..\..\..\bin.v2\libs\sort\test\float_sort.test\msvc-12.0\debug\threading-multi\float_sort.exe -msvc.manifest ..\..\..\bin.v2\libs\sort\test\float_sort.test\msvc-12.0\debug\threading-multi\float_sort.exe -testing.capture-output ..\..\..\bin.v2\libs\sort\test\float_sort.test\msvc-12.0\debug\threading-multi\float_sort.run - 1 file(s) copied. -**passed** ..\..\..\bin.v2\libs\sort\test\float_sort.test\msvc-12.0\debug\threading-multi\float_sort.test -compile-c-c++ ..\..\..\bin.v2\libs\sort\test\string_sort.test\msvc-12.0\debug\threading-multi\string_sort_test.obj -string_sort_test.cpp -msvc.link ..\..\..\bin.v2\libs\sort\test\string_sort.test\msvc-12.0\debug\threading-multi\string_sort.exe -msvc.manifest ..\..\..\bin.v2\libs\sort\test\string_sort.test\msvc-12.0\debug\threading-multi\string_sort.exe -testing.capture-output ..\..\..\bin.v2\libs\sort\test\string_sort.test\msvc-12.0\debug\threading-multi\string_sort.run - 1 file(s) copied. -**passed** ..\..\..\bin.v2\libs\sort\test\string_sort.test\msvc-12.0\debug\threading-multi\string_sort.test -compile-c-c++ ..\..\..\bin.v2\libs\sort\test\sort_detail.test\msvc-12.0\debug\threading-multi\sort_detail_test.obj -sort_detail_test.cpp -msvc.link ..\..\..\bin.v2\libs\sort\test\sort_detail.test\msvc-12.0\debug\threading-multi\sort_detail.exe -msvc.manifest ..\..\..\bin.v2\libs\sort\test\sort_detail.test\msvc-12.0\debug\threading-multi\sort_detail.exe -testing.capture-output ..\..\..\bin.v2\libs\sort\test\sort_detail.test\msvc-12.0\debug\threading-multi\sort_detail.run - 1 file(s) copied. -**passed** ..\..\..\bin.v2\libs\sort\test\sort_detail.test\msvc-12.0\debug\threading-multi\sort_detail.test -...updated 20 targets... From bec9266159e5ceab1306a6c946cb1f520915a5c1 Mon Sep 17 00:00:00 2001 From: Mark Santaniello Date: Tue, 16 Aug 2022 16:17:29 -0700 Subject: [PATCH 2/8] Bugfix duplicate symbol error in time_measure.hpp Summary: Test Plan: Reviewers: Subscribers: Tasks: Tags: --- include/boost/sort/common/time_measure.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/boost/sort/common/time_measure.hpp b/include/boost/sort/common/time_measure.hpp index 2660c7b..595f60d 100644 --- a/include/boost/sort/common/time_measure.hpp +++ b/include/boost/sort/common/time_measure.hpp @@ -39,7 +39,7 @@ double subtract_time ( const time_point & t1, const time_point & t2 ); /// @brief return the time system in a internal format ( steady_clock) /// @return time in steady_clock format //--------------------------------------------------------------------------- -time_point now ( ) { return chrn::steady_clock::now( ); }; +inline time_point now ( ) { return chrn::steady_clock::now( ); }; // //--------------------------------------------------------------------------- // function : subtract_time @@ -48,7 +48,7 @@ time_point now ( ) { return chrn::steady_clock::now( ); }; /// @param [in] t2 : second time in time_point format /// @return time in seconds of the difference of t1 - t2 //--------------------------------------------------------------------------- -double subtract_time ( const time_point & t1, const time_point & t2 ) +inline double subtract_time ( const time_point & t1, const time_point & t2 ) { //------------------------ begin --------------------------------- chrn::duration time_span = chrn::duration_cast < chrn::duration < double > > ( t1 - t2 ); From df83d0e33748e172137b3b069c8ca92fb33cb592 Mon Sep 17 00:00:00 2001 From: Mark Santaniello Date: Tue, 16 Aug 2022 16:17:29 -0700 Subject: [PATCH 3/8] Bugfix duplicate symbol error in time_measure.hpp Free functions that are defined in header files must be qualified inline in order to avoid duplicate symbol errors at link time. Bugfix two cases: - boost::sort::common::now() - boost::sort::common::subtract_time() --- include/boost/sort/common/time_measure.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/boost/sort/common/time_measure.hpp b/include/boost/sort/common/time_measure.hpp index 2660c7b..595f60d 100644 --- a/include/boost/sort/common/time_measure.hpp +++ b/include/boost/sort/common/time_measure.hpp @@ -39,7 +39,7 @@ double subtract_time ( const time_point & t1, const time_point & t2 ); /// @brief return the time system in a internal format ( steady_clock) /// @return time in steady_clock format //--------------------------------------------------------------------------- -time_point now ( ) { return chrn::steady_clock::now( ); }; +inline time_point now ( ) { return chrn::steady_clock::now( ); }; // //--------------------------------------------------------------------------- // function : subtract_time @@ -48,7 +48,7 @@ time_point now ( ) { return chrn::steady_clock::now( ); }; /// @param [in] t2 : second time in time_point format /// @return time in seconds of the difference of t1 - t2 //--------------------------------------------------------------------------- -double subtract_time ( const time_point & t1, const time_point & t2 ) +inline double subtract_time ( const time_point & t1, const time_point & t2 ) { //------------------------ begin --------------------------------- chrn::duration time_span = chrn::duration_cast < chrn::duration < double > > ( t1 - t2 ); From dc5c4e289d2fdba01c51d80d8e3118d1bfc5e88b Mon Sep 17 00:00:00 2001 From: Francisco Tapia Date: Thu, 29 Sep 2022 18:39:15 +0200 Subject: [PATCH 4/8] Add files via upload Adding inline attribute to several functions --- .../boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp b/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp index 3feae2f..963712c 100644 --- a/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp +++ b/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp @@ -105,7 +105,7 @@ struct merge_blocks { this->merge_range_pos (rng_input); } - catch (std::bad_alloc ) + catch (std::bad_alloc & ) { error = true; }; From c33310699da3d7bcddee5a65fefa4145568f7806 Mon Sep 17 00:00:00 2001 From: Francisco Tapia Date: Thu, 29 Sep 2022 18:43:00 +0200 Subject: [PATCH 5/8] Add inline attribute --- include/boost/sort/common/file_vector.hpp | 10 +++++----- include/boost/sort/common/indirect.hpp | 6 +++--- include/boost/sort/common/time_measure.hpp | 12 +++++------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/include/boost/sort/common/file_vector.hpp b/include/boost/sort/common/file_vector.hpp index 1dc62fc..ec2bb0e 100644 --- a/include/boost/sort/common/file_vector.hpp +++ b/include/boost/sort/common/file_vector.hpp @@ -43,7 +43,7 @@ namespace common /// @return /// @remarks //----------------------------------------------------------------------------- -static int generate_file(const std::string & filename, size_t NElem) +inline int generate_file(const std::string & filename, size_t NElem) { //------------------------------- begin ---------------------------------- std::ofstream ofile; ofile.open(filename, std::ios_base::out | std::ios_base::binary | @@ -73,7 +73,7 @@ static int generate_file(const std::string & filename, size_t NElem) /// @return /// @remarks //----------------------------------------------------------------------------- -static int fill_vector_uint64(const std::string & filename, +inline int fill_vector_uint64(const std::string & filename, std::vector & V, size_t NElem) { //----------------------- begin ------------------------------------------ std::ifstream input(filename, std::ios_base::in | std::ios_base::binary); @@ -115,7 +115,7 @@ static int fill_vector_uint64(const std::string & filename, /// @return /// @remarks //----------------------------------------------------------------------------- -static int write_file_uint64 (const std::vector & V, +inline int write_file_uint64 (const std::vector & V, const std::string & filename) { //--------------------------------- begin -------------------------------- std::ofstream ofile; @@ -144,7 +144,7 @@ static int write_file_uint64 (const std::vector & V, /// @return /// @remarks //----------------------------------------------------------------------------- -static int fill_vector_string (const std::string & filename, +inline int fill_vector_string (const std::string & filename, std::vector & V, size_t NElem) { //----------------------- begin ------------------------------------------ std::ifstream input(filename, std::ios_base::in | std::ios_base::binary); @@ -189,7 +189,7 @@ static int fill_vector_string (const std::string & filename, /// @return /// @remarks //----------------------------------------------------------------------------- -static int write_file_string (const std::vector & V, +inline int write_file_string (const std::vector & V, const std::string & filename) { //--------------------------------- begin -------------------------------- std::ofstream ofile; diff --git a/include/boost/sort/common/indirect.hpp b/include/boost/sort/common/indirect.hpp index 6b9b116..8664ccc 100644 --- a/include/boost/sort/common/indirect.hpp +++ b/include/boost/sort/common/indirect.hpp @@ -72,7 +72,7 @@ struct less_ptr_no_null /// @param index : vector where store the iterators //----------------------------------------------------------------------------- template -static void create_index(Iter_t first, Iter_t last, std::vector &index) +void create_index(Iter_t first, Iter_t last, std::vector &index) { auto nelem = last - first; assert(nelem >= 0); @@ -90,7 +90,7 @@ static void create_index(Iter_t first, Iter_t last, std::vector &index) /// @param [in] index : vector of the iterators //----------------------------------------------------------------------------- template -static void sort_index(Iter_t global_first, std::vector &index) +void sort_index(Iter_t global_first, std::vector &index) { typedef util::value_iter value_t; @@ -130,7 +130,7 @@ static void sort_index(Iter_t global_first, std::vector &index) }; template > -static void indirect_sort(func method, Iter_t first, Iter_t last, Compare comp) +void indirect_sort(func method, Iter_t first, Iter_t last, Compare comp) { auto nelem = (last - first); assert(nelem >= 0); diff --git a/include/boost/sort/common/time_measure.hpp b/include/boost/sort/common/time_measure.hpp index 2660c7b..ab25005 100644 --- a/include/boost/sort/common/time_measure.hpp +++ b/include/boost/sort/common/time_measure.hpp @@ -17,11 +17,11 @@ #include #include -namespace boost +namespace boost { -namespace sort +namespace sort { -namespace common +namespace common { namespace chrn = std::chrono; @@ -31,15 +31,13 @@ namespace chrn = std::chrono; //*************************************************************************** typedef chrn::steady_clock::time_point time_point; -time_point now ( ); -double subtract_time ( const time_point & t1, const time_point & t2 ); // //--------------------------------------------------------------------------- // function : now /// @brief return the time system in a internal format ( steady_clock) /// @return time in steady_clock format //--------------------------------------------------------------------------- -time_point now ( ) { return chrn::steady_clock::now( ); }; +inline time_point now ( ) { return chrn::steady_clock::now( ); }; // //--------------------------------------------------------------------------- // function : subtract_time @@ -48,7 +46,7 @@ time_point now ( ) { return chrn::steady_clock::now( ); }; /// @param [in] t2 : second time in time_point format /// @return time in seconds of the difference of t1 - t2 //--------------------------------------------------------------------------- -double subtract_time ( const time_point & t1, const time_point & t2 ) +inline double subtract_time ( const time_point & t1, const time_point & t2 ) { //------------------------ begin --------------------------------- chrn::duration time_span = chrn::duration_cast < chrn::duration < double > > ( t1 - t2 ); From 5f177009df7ab0d10e35817b82278a65666965c7 Mon Sep 17 00:00:00 2001 From: Francisco Tapia Date: Thu, 20 Oct 2022 19:10:05 +0200 Subject: [PATCH 6/8] Add files via upload --- .../sort/block_indirect_sort/blk_detail/merge_blocks.hpp | 2 +- .../sort/block_indirect_sort/block_indirect_sort.hpp | 9 +++++---- include/boost/sort/sample_sort/sample_sort.hpp | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp b/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp index 963712c..8f260a5 100644 --- a/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp +++ b/include/boost/sort/block_indirect_sort/blk_detail/merge_blocks.hpp @@ -105,7 +105,7 @@ struct merge_blocks { this->merge_range_pos (rng_input); } - catch (std::bad_alloc & ) + catch (std::bad_alloc &) { error = true; }; diff --git a/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp b/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp index 0b59120..04ea42f 100644 --- a/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp +++ b/include/boost/sort/block_indirect_sort/block_indirect_sort.hpp @@ -276,7 +276,7 @@ ::block_indirect_sort(Iter_t first, Iter_t last, Compare cmp, uint32_t nthr) // thread local buffer for (uint32_t i = 0; i < nthread; ++i) { - auto f1 = [=, &vbuf, this]( ) + auto f1 = [&vbuf,i, this]( ) { bk.exec (vbuf[i], this->counter);}; vfuture[i] = std::async(std::launch::async, f1); }; @@ -327,7 +327,8 @@ ::split_range(size_t pos_index1, size_t pos_index2, uint32_t level_thread) //------------------------------------------------------------------------- if (level_thread != 0) { - auto f1 = [=, &son_counter, this]( ) + auto f1 = [this, &son_counter, pos_index_mid, + pos_index2, level_thread]( ) { split_range (pos_index_mid, pos_index2, level_thread - 1); bscu::atomic_sub (son_counter, 1); @@ -339,9 +340,9 @@ ::split_range(size_t pos_index1, size_t pos_index2, uint32_t level_thread) else { Iter_t mid = first + ((nblock >> 1) * Block_size); - auto f1 = [=, &son_counter, this]( ) + auto f1 = [this, &son_counter, mid, last]( ) { - parallel_sort_t (bk, mid, last); + parallel_sort_t (this->bk, mid, last); bscu::atomic_sub (son_counter, 1); }; bk.works.emplace_back(f1); diff --git a/include/boost/sort/sample_sort/sample_sort.hpp b/include/boost/sort/sample_sort/sample_sort.hpp index df1a85b..c5b4cb9 100644 --- a/include/boost/sort/sample_sort/sample_sort.hpp +++ b/include/boost/sort/sample_sort/sample_sort.hpp @@ -373,10 +373,10 @@ void sample_sort::initial_configuration(void) for (uint32_t i = 0; i < nthread; ++i) { - auto func = [=, this]() + auto func = [this, &vmem_thread, i, &vbuf_thread]() { bss::spinsort (vmem_thread[i].first, - vmem_thread[i].last, comp, + vmem_thread[i].last, this->comp, vbuf_thread[i]); }; vfuture[i] = std::async(std::launch::async, func); From bce7b59d29eb63b06fd2b6acaa6053ede7e439dd Mon Sep 17 00:00:00 2001 From: Gabriel Matte Date: Fri, 4 Nov 2022 16:55:12 -0300 Subject: [PATCH 7/8] Remove "not" operator and change for the "!" operator --- include/boost/sort/common/spinlock.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/sort/common/spinlock.hpp b/include/boost/sort/common/spinlock.hpp index 5944e21..5287ccb 100644 --- a/include/boost/sort/common/spinlock.hpp +++ b/include/boost/sort/common/spinlock.hpp @@ -70,7 +70,7 @@ class spinlock_t //------------------------------------------------------------------------- bool try_lock ( ) noexcept { - return not af.test_and_set (std::memory_order_acquire); + return !af.test_and_set (std::memory_order_acquire); }; // //------------------------------------------------------------------------- From 2e6674d63f2f541a3fd32f50d593be0c71f686f8 Mon Sep 17 00:00:00 2001 From: spreadsort Date: Sat, 17 Dec 2022 17:18:17 -0500 Subject: [PATCH 8/8] Delete non-critical --- .../boost/sort/spreadsort/detail/float_sort.hpp | 2 -- .../boost/sort/spreadsort/detail/integer_sort.hpp | 6 ------ .../boost/sort/spreadsort/detail/string_sort.hpp | 15 +++++---------- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/include/boost/sort/spreadsort/detail/float_sort.hpp b/include/boost/sort/spreadsort/detail/float_sort.hpp index 8d20bef..8682afd 100644 --- a/include/boost/sort/spreadsort/detail/float_sort.hpp +++ b/include/boost/sort/spreadsort/detail/float_sort.hpp @@ -777,7 +777,6 @@ namespace spreadsort { float_sort(RandomAccessIter first, RandomAccessIter last, Div_type, Right_shift rshift) { - BOOST_STATIC_ASSERT(sizeof(boost::uintmax_t) >= sizeof(Div_type)); boost::sort::pdqsort(first, last); } @@ -819,7 +818,6 @@ namespace spreadsort { float_sort(RandomAccessIter first, RandomAccessIter last, Div_type, Right_shift rshift, Compare comp) { - BOOST_STATIC_ASSERT(sizeof(boost::uintmax_t) >= sizeof(Div_type)); boost::sort::pdqsort(first, last, comp); } } diff --git a/include/boost/sort/spreadsort/detail/integer_sort.hpp b/include/boost/sort/spreadsort/detail/integer_sort.hpp index 77576d0..fad55b3 100644 --- a/include/boost/sort/spreadsort/detail/integer_sort.hpp +++ b/include/boost/sort/spreadsort/detail/integer_sort.hpp @@ -390,8 +390,6 @@ namespace spreadsort { //defaulting to boost::sort::pdqsort when integer_sort won't work integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type) { - //Warning that we're using boost::sort::pdqsort, even though integer_sort was called - BOOST_STATIC_ASSERT( sizeof(Div_type) <= sizeof(size_t) ); boost::sort::pdqsort(first, last); } @@ -437,8 +435,6 @@ namespace spreadsort { integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type, Right_shift shift, Compare comp) { - //Warning that we're using boost::sort::pdqsort, even though integer_sort was called - BOOST_STATIC_ASSERT( sizeof(Div_type) <= sizeof(size_t) ); boost::sort::pdqsort(first, last, comp); } @@ -481,8 +477,6 @@ namespace spreadsort { integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type, Right_shift shift) { - //Warning that we're using boost::sort::pdqsort, even though integer_sort was called - BOOST_STATIC_ASSERT( sizeof(Div_type) <= sizeof(size_t) ); boost::sort::pdqsort(first, last); } } diff --git a/include/boost/sort/spreadsort/detail/string_sort.hpp b/include/boost/sort/spreadsort/detail/string_sort.hpp index fd67a55..e0c3f74 100644 --- a/include/boost/sort/spreadsort/detail/string_sort.hpp +++ b/include/boost/sort/spreadsort/detail/string_sort.hpp @@ -699,8 +699,7 @@ namespace spreadsort { string_sort(RandomAccessIter first, RandomAccessIter last, Unsigned_char_type) { - //Warning that we're using boost::sort::pdqsort, even though string_sort was called - BOOST_STATIC_ASSERT( sizeof(Unsigned_char_type) <= 2 ); + // Use boost::sort::pdqsort if the char_type is too large for string_sort. boost::sort::pdqsort(first, last); } @@ -725,8 +724,7 @@ namespace spreadsort { { typedef typename std::iterator_traits::value_type Data_type; - //Warning that we're using boost::sort::pdqsort, even though string_sort was called - BOOST_STATIC_ASSERT( sizeof(Unsigned_char_type) <= 2 ); + // Use boost::sort::pdqsort if the char_type is too large for string_sort. boost::sort::pdqsort(first, last, std::greater()); } @@ -751,8 +749,7 @@ namespace spreadsort { string_sort(RandomAccessIter first, RandomAccessIter last, Get_char get_character, Get_length length, Unsigned_char_type) { - //Warning that we're using boost::sort::pdqsort, even though string_sort was called - BOOST_STATIC_ASSERT( sizeof(Unsigned_char_type) <= 2 ); + // Use boost::sort::pdqsort if the char_type is too large for string_sort. boost::sort::pdqsort(first, last); } @@ -779,8 +776,7 @@ namespace spreadsort { string_sort(RandomAccessIter first, RandomAccessIter last, Get_char get_character, Get_length length, Compare comp, Unsigned_char_type) { - //Warning that we're using boost::sort::pdqsort, even though string_sort was called - BOOST_STATIC_ASSERT( sizeof(Unsigned_char_type) <= 2 ); + // Use boost::sort::pdqsort if the char_type is too large for string_sort. boost::sort::pdqsort(first, last, comp); } @@ -806,8 +802,7 @@ namespace spreadsort { reverse_string_sort(RandomAccessIter first, RandomAccessIter last, Get_char get_character, Get_length length, Compare comp, Unsigned_char_type) { - //Warning that we're using boost::sort::pdqsort, even though string_sort was called - BOOST_STATIC_ASSERT( sizeof(Unsigned_char_type) <= 2 ); + // Use boost::sort::pdqsort if the char_type is too large for string_sort. boost::sort::pdqsort(first, last, comp); } }