From 4782ae61f156ea0acebacbd4a69d4106dbc0a7fa Mon Sep 17 00:00:00 2001 From: Toshaan Bharvani Date: Sat, 8 Oct 2022 21:52:13 +0200 Subject: [PATCH] add missing sources Signed-off-by: Toshaan Bharvani --- SOURCES/OpenCL-CLHPP-2.0.12.zip | Bin 0 -> 106113 bytes SOURCES/OpenCL-Headers-d65bcc5.tar.gz | Bin 0 -> 55627 bytes SOURCES/cl.hpp | 12934 ++++++++++++++++++++++++ 3 files changed, 12934 insertions(+) create mode 100644 SOURCES/OpenCL-CLHPP-2.0.12.zip create mode 100644 SOURCES/OpenCL-Headers-d65bcc5.tar.gz create mode 100644 SOURCES/cl.hpp diff --git a/SOURCES/OpenCL-CLHPP-2.0.12.zip b/SOURCES/OpenCL-CLHPP-2.0.12.zip new file mode 100644 index 0000000000000000000000000000000000000000..087e6015f99d80c56a2746e52875fc74b6634715 GIT binary patch literal 106113 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%0A&$X9Dyal}|%5w%cJ*p56Bf~NHfMtiN&eJMbu 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 L@NkxOl9c~H)EXQ? literal 0 HcmV?d00001 diff --git a/SOURCES/OpenCL-Headers-d65bcc5.tar.gz b/SOURCES/OpenCL-Headers-d65bcc5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..dd3b71d7cd4a91b54407113f7fe6ae87ec4ae69c GIT binary patch literal 55627 zcmV)iK%&1NiwFP!000001MHpabK6Fe!1Gyu1hN6e^>zKb`+q@RYM;YC31Ubx-fk1w zdrjY03-|xz)9+}@?c-y(N&dPT^lz8TzTWBHU3Qn@`EqdE3A#&t(7Ov)-Ttx%Uo0=W ztCRohJpcLmb{~5eZibWA4ch*`rK$sGUy=s1hx7Bk*#6<~W&7{wy-xeP{=cfw#m~RF z{eNxypC)neIohATJgytl;QqfSZ2xY%Uv2+xzjOZGA5w|`=Iy@@Hus0%K76Y!PfnmG z*hT9wetV*6E$x1}#6Oqpos*O8oV*t35@V z)%IzBa(JtX%JpQ_hVy(5)ZV%CV#l^3R|9A|34YkwLvn1Rn`@*AE3t!Ss`7`#l z)*5P~@b+;3XNUClpRcw5;Y7U)_!|Fzt`Gk7|9`;eceMX&=HzM%W$&~SK46%ny4l4uCWW2@JIU18|?#VXtdpEozu4VJ$vC*`qit~@0f^} z?Lm7CUbM|N(GL3%WJG)I4mva~d|rmT1o|j8*x9Y4V6zONgGwGSom2|TiS{X#vAsAClXKViE{%m3m&6#VqAkQhY*sR0- zUW>zj9HJP?d;6jVJIK>AxP_dqgC}hpYr%aS!gtA*<@qU&l4x`PM%!=ilBXaJnV40y zPvYqIkd&${%OMoJ_ySZ~u+d%_u4cKfv@654+&4_fN6Wjh7oPUfa2#XiS*EMmjyAMs zBg?bw8T@Ok8M9B?duuj&qlHjmkWTo#i&+UEn-QzbaD_GJhG8iScUzvN{VrTachOSI zLJjSH`#Fp^P$F#?#*fjSHR>KRxME_~(PNYZ2|lWoizW0;KW8T=e~IoOnLEw*?YTJ{ zPJH;^&B9HikZotk#Fw^kXvG|_w_w|q97oAr6s`-ZB6txR1iV5Lh5OR08DD%g)j#&uyQUgD>i6bu z+xT{-+0}O?xwzXg?Y@idRfU6=`b*Yfs1+ck*4t%(8eXR)nG2u8B_y^BZliU?>o)aB z;MP8vjtkD-@Az#+ar@7YRcYLRHQ*(4F12($H@e@+#X)uKlGsn^D%k}fgmoC1#23|S z3GTqhN6Cx7+CD;WpBJMk;na)N<`oDY#HelKQ zHeNAzr1-XyMl#jCTL<@FtAb4TiZYa{fC1avzlY02&DhxcqLwNurlgFI5%eplm0y(8 z=n*0$N!og2*KoMI3uAv7he49L7PX{<)r!S+5SRIn+f{QVL1YaPjM}?t&!*;4AA_Bm ziU`be7wy6?u}yqGt#YNBN`nS9TgqO>`72eek_w78LHr_Y+A7JFf~5^3-Q>_*9lTfn zJvmJ!1o6FE6&2o3l@Od&u!d2Cg7+!H%cYp5G_An0H;bg2CZqzMw(+n2JsZ+W9DJkc zro#4z+p;XBoM5D>=-tx}K`n5Kw_xbZDg2JED>MHuFv_$tFmfr?Lp=js<-jFKwvSOY z5>i96NNU5oQK1O3EPT=fMvI%(HZBdA1Qo`5kT0mLbQoF>UB@`g^Ca27*EFSCtMxiBfotYg_#dpySeSA_*kdl^p9GL8X1!&2H1-uWCl`A(0^WMR zz5Cj#-tJgUmr7LrqhP_z5Sjg^K86lYDLYPM(m1^5H7L{NZ5-XRp_uF)Za%+hRngMS zv0fsd)`RCWV`}DKPK}@W1K0Y+)CN7W7)+@$S9^3w*@Mz2cgXnCLlD;sp`nugmoz8; zotCnga-oplezp)S%8cV}tPLTm=jL&&F?TT>nyyO~rTl3Zsge1?8k+vh_WZHEn2m%~ zOBZ0q2g8~eR}+)QIz?<~Pv_RebQ-}{w}?&6sc&EXrwO)aOeXfwVAJ3J81RKtqFcQp zW-mP79{Y~z+6xEjMqIW&f!)}y$5OVPPa+P7w7TT;T-d9`dqd;ZC{ zLB}S>T%5^^B4$mEYZIExnHrEw%Y{FNHzal`#8?*H#e8l%o>^`9mR?emtA#Zgu_9hO z#+0i0BUjRssWF$mUF13fmsONzxyHo0o|z-a_Z4JnJO*8|$79#@D$+{&WBzOo!Fe0r z!u3tZu^m}%L1XgGB?*sOE2jc=*W8o6JXq+%BeH~ zaOZ@r&JD-2a>J=LIC3QwgG|m$=xUuNjc)0eN6%i+wb=(~t&tD^T}WHM)ooK;ns4vZ zTtK(FI>pT=hQ~Bql3qugo;06biW}N9&-~ewaXpIrX<;rWgbk=g_wZiw7L3 zFIU#g5c+t|k@~`YqCMwpu_Q<8OKQTh^hkZlOrLqPg-3XeR*%$|)Q(x$B1(_cmy{cs zV{3+vqt21~!Z~SulKR3O&B**&%#r%SIH`|m^+|nUoJ7kQN9xPbFA5@xR-e?DkGAvP zA6Zj#<`R{O9H}qJT|4$-F34`HPwESDmIu}=C}pcp>dW=SzA`3Mx0-XLzF>b^=t~KX z)EDH0jes1fFU)TmlwKY=QeUnoa(4!C9jPyAxFJ@V)_~NPsWtZ}P)MOkv<9TUr0sys zNG94Ebem(Qg7;wkjM&e$2I`?t*;P}%Jr^qK!uU8q6=F)Bogp&G~W=7b3!vLWz%M95P?i@l~OFVo7p_Rb=XUsbr9eIv5 z#9A?b9-8K;92&OHJ9%)&2B6uNg!15XY)ssS2%mpSHR(C>z%c*l%_?~XTM}d9$A_Q4I3lM1yg*A+F2MuNP*+#vZ z2t>~-no`&lqqVerL8GiPg@F%?zKq30&{ch}Yd`*|wO@CWb>rByB3W;@scAQE zVp6}I^VIws^Wv;8U3jLyfFNCHZopF&%lKoMn8&77G01miyevFT`CeoC3@1x~e4pUw zjtL=|V~(IEhoEa+c_<=g_-q?;;<;gh}nzt(PEb7PuV~6 zUA6Qn`!DiM=~MP!^~i% z;u?lAyb*PX$W!)TDV| zaGD13MV@jvUy?rMaGD0z1-?r)W8>ObfmfJxNu~05QK=j0=Cetliuj~gUx8}3oO`R4Br<@O4u=Ln| z2fl(O>n*yJ^Wo7pi&>;gA&l<{M?1)~1FfG#F$eOby&4W%VQN~ZN1m#`%lo;ei zQz1ANA)ik`p7I=wPlqEP498;jEgDMnsK_J_(2kJ`rJ~4F&Y{j{ja|wG@|1I^^4S6t zk^jDED0HMzn#j2NqN&g$&-ZqTc*;4rAExpkyuee=q1txG`txiLzDVl=dC^oTt|*F! zfqD9*b6_m`)**Ibpuwi|!Kf~jB2P|*X8hb3zBfIYbMDKXL%u>{c=ps9mdyxx`BZ3H zlN6ou@~KchsHJhv8#3oY&a+LFB6k!nat^b_6#E>UDyLf*dCEED9Bz<-7-PgbLa5}A zhLdg#Vq1TamxL8v(sMSgffX}Hd5)%qumV3IJ@-To7I~_1s$q>l81j_mr<%e8c(D&a zp0fOuAM>77=t7XEET64Dvrz;ync`wfWhw=E%JTD=)0pHw*g+W_6Lj%*KragWZ9Ee>1g~ z<`l<}huw1f$c~%5zi~8nlg9?n0FWcDy!OVX;Vm4IvHr zNz)8A=gBER!!uzR$_B}7r{(N8$pD_*b+gSJ$am<~==^d7@sczQ!@=b=PaKd-(qrbf z#xS;On)jfVqycu=!35|={h4X7?J6?3BZPl}h_xZ*t`LU&H)Xq5g~wB)skU;sPcMe+ z6_Ktz_NehNC35gud3=eJEI5Zd`NYc%&R}GHutuPoKNa+nOFn;1>rwg6jEV+-*GIBdj^C`MHM4Zobw7^f=*v<&XgP8i%9x-2foZX=Ena_HsYX`;m z>3lX0A}gbprh4lT`8f_ggnM?5UZ!L|#oI?J^^~41Xdb#V|9;V?P;!o=hUyfmw6JiY zaBwFR$YNk=eo$anP(KC5qHC#fb{oa_RF3v=fzo-7Twq^%=(1|f^$T(6z~ngFWB#;& z(5^nWjER#GU5;LT;tE5p(_F|;3FRp6=4MN68A^sRMUI@_!Xz)`2UM$dRk;F)uBb|C zOv$PpuVkZKm7er!{e@(wT#fDuXmYDujqV8Ot`e;a=$;BaLj%fM5glqCnn>D=`O$Kl zRj;3-8x5yhY{PLO{C8OTd{$7c%@{mpTLlEDw8<*4`^ojpDFKr$#$Z0)6S>5^!D>#d zde0NtB{m)=t$e zldHaqxLN^xSwkfEqM{J_HCgO#&Dz~r;?Rlh);I>Yl3Jn+h`~H4W+8PWtk>W?9GA5Z zWk3vuZnXInBIWUpd+Zu;%HicFtecX~{T(z=z9y~u$p&5Q?}9bxPBmAUp{C|Ij=2c9 zsW~`&LBlf}_h}374B+skWE@#BVBAR5=$muNdYjc2RQ6%dZ`!RH!FIE*Mn_p1axZ*L zL;uP&(o=p|!R)jxX>Dm5o!4qn4RQ0F#Lg|KLC-8+e!yByRM3i@*J12gW^BU(p6E;` zhK@tIN_SPdd8nMT=KVM6hxxs$l7^_vh#b-KfWG-?PXR62nxmR5qTO<;S6_hkDyUkz zh?Zt{udWrdjA&^HV5sI8(aLE#oXD4)5iFvmncT@@YR%Z>qY`@AJYsa7l?ssxG|Kg^ z$Rc`GX)-ky(cu?t;1KR@CghH4s1GsfY-ma6bPzR_ef9o}^kiH`m8yxM!&<6JnvG~l zBlfCBfoQ4v4M0^$j@G6hig&72?%ZKh;>>O?6a7oxf}FFiRbOSRvC z()Ew%;ETpTsa&?KD=11Pw|X`>yVjae5~XvdAXIPH@-vh&HZE+4OhIR&vywm~7XV zOotKG>!@RYx%g`JHownx=!4Mh}-h;2&Yhc5k0DIcIiiUFTK(+D%|EH-&%Q0 ztW!siJ2R#8>^eIpsCo$oW=X+zQEqkbQ04asD)yUgkZYNSk{D{RhDjr z%H@`iVWcQKWLrB?R7dqJFU4PnsE&X6*=MEg33_?kcZN20yol-)$|7@P0>;EHl(L;s zO@$HdP-xmZZ1)J;aw15zOQC5k(pZjCn+%vsfGYJK!hNWPo5N$se$8pG1@ZCs*!X?) z>;iE1I~&+P9(ORZpI2r0i}nzFW>wQf{k&kqe!VWPo53?w zWs8ws-UptcDm$h0@)qz6Q<- zEp5+S=nIBe615(h{hV9vrlFW!+^X zP_yAW8;6%EJx|V-5 z7AI_iYc)^Wi4?^cC!7Ii%oJSuQjKr+suxhjx-Xb9`)&b4y7(L+-}CrfpuZod1_Oz-Rzo;cbkrgq9pQ0yoO)Wn|I$;SxP#GW~htP-qQ+tK__shB|X zYrD)m?Hpm6w!^iLK5qIoljdQQSxl7f*!&yG+4GELBWIh``9uh{H+Hs&&}H z+G3c(?wWL7_Az(@HR(LbXLfJ`P1SkIS%vuhm1Y9dkui zR!pGWmPmmm(5eZPV(Bw$-M2QF_TAFRbYO3A3M_#hS{s~M>rpx=?nD_nO`yjaWTF$~ ziTVk&W&%a$Z0c?(fu7hv)4Iw*PfegVmk6A4+Y^D-&9%0FO5M68(1r=LcKWxQX1fvH z%3?UG=$xIIxvAB_d`)Sfa{HtD3^?&>U=W75~y(&tBhi=)i{gsTxtr{ z1!#(oEqSFK;XSFf+lCcs46kvDCr=(E^PrSV#wmW*Y_+lkOSxp6;sly8#mfc4Wh7ow z-t9)}c73^Ioc{<4L^!>+h0_zLasCTX>{JSDH=;e60s(zh((i1KcE@)P0vR{b$ zDDDi8fpSusLF4}LIB2(KN|i&PahG@uv|+yBmOyhHP)#DVa3CR!TcGw^?&I6WITLq@ z#8W(d1}MYY&+1^Loq1OQK>;Ih9MF8+T?Onk{?rOf#rqt55h2yz(^s$u*TgLp9_Zr4noQbyF(wj2I@?iIMt9II; zEi(1wb2P@f)98LS8Bc;9EJ6p9S;yMl{KnbsWvEB5| ztCN>=>y<=zZT}b4L05xpJ9;0(BF)RJBG-5^vMf^G*|OJkfor&JP8nk}c3=#hly=w< zgpIT#;H|VEh`JyUSo^RoD7wS`u?2%1{rvGqwr!@{e_Cp?)PjKVTC{2`?f$cwT;^H` zFv6--@Mkm8bTk*WpTZ<)+Yj#lPG-C8!5`y4Q+M9K-!bU`COg9+;w=t2!~(3~pa({< zD8bqPDLAkl*kn89QkdlbBo5JC8`XB6?6Uf-YwWMZjd`qg-NfmSA#SrVHWOZen(nqg zP<;4!F5jJkDBkLi&b_&WZPtTrD6_yq;WJ)5fcTxyK;rIhvG}9i)d#|j$zPVjg!`q6 zI|SH~4eNl#)%>}q7-Xe4Tg!C_Y_9EC6Is|qLkp944^CZ-W*EBu2216yICm|2%PAQo$Y^~0anD9xr0`@M%rlaNu_*tU8AqHeO^?D;HY7T?nx4sGo`po` zyP=+=p)1bT3S8}%3UXa!v)B8 zlsr!z9sb5Ra#mK5PYMsmV6}u-qGIKZl|0b>r6gKyJa{_^=3W26o8^{lD#wl{<2%W* zQu+h3VD3Il^F!W48zQ(h_R`WhOV4DpXbu)?ld>W_6}*$7ge8la#H2v69SS&8GRIWO zW)y3wVk|C9Ns?Jhllnnh9ov0UJN*gUGaUEEles^9+>tH6cW3ayo6S%KX7YcMO$dun zb<>&u3B7vDq0%&L|F$>+P2nyAZ`K>Qb9X0OGwT4xp-PH|e z+6ru@^g%ZSS-LH#6YI(OC~W5X_(?u1^ObyZ^Oq4I4wpJq33gkV+iVs^D99p)6#uTT z9>f?$mkyD+>oJW)CEi$ji@`%f_ zHcW-ZW_&rKj!wQ6!LoAn*=r`j8r2#}*Z4|EuiiF<=B&Z#EMKrP+DX5W-7G2Z% z%v4o08S~pK=B@vtH0dmEBeGzj6(fGK7_=Z;jxpm78p%1h?6} zD~UZvTMZX;8rrDe#Pj@CC1c@D8`X_O5A_C5t%JU97b&3r%zznqL7!+A{ftAHWrUsQ zZ3B^S9J1VHc3Z$U4%hzFJ`C28u(H2-EK>Zjlsje$R-rdH$>J=?2ltDBPSh!flGl)H z@oSwW%a{knOz3pUo!2(YX`F?$!9gtS7m%c~aDY_;Dvwz&%P$$gwkemQX!OTE%y~w+ zl4c2|io5lW;_8FA(iqyrD@zrysW?J$nJHNA-PA9XuHy|EAqhYr&cOJerGG#VD_LCV#B^RYTD_M$P-5x%n0VigFHU%=l zlN*Fsw}xVk!xb`wT$AahFJ}+iUS^n>lb($A*HSSSg@Y{C5@k_@fW+oz;?bBHS2`rr-513?T3Zk)QFqxwagX#1uOui!2Ta9>G#$nnL*63diC$ibY z8p-+`ezD9Qn}Yaq)mO-^YJkbNTz&nLb>3aD+6eEmqyrSocvD5?u|aruL1>f8&ZOx2 z@#|KSN-e>@36@Q$DtF}HjUPZ!WiXz#Q;9B}%{N@C5C4|i@U{+~xfnNIWmZVtGo5^!iO|0K#OKK!)Ph*s3QfhoYqm+Bz9KYB zIYy~wWJMvT^55otJuS~C`z`J3VZbp@^p(@2EYgCReMkHo&aTd6G3)0P8wP^M%; zyfE4iatxe#e}v^55W=t+2cY-7fyM*)Q2M$IVVfanMFu>6&T<7jt8Hl5UFv!HXW@@v zk@pkj_pm9w0-L#JHp%2Bs_j7d_*D>l+yW{VjR8o_~GrQe9pmZwqgU8 zK2Xu_5O+U}EahUlicdEiPNGjpo_ywqv%L8sdcUm@N&LHJ^W*6&!l^efR1-boP4;;T zeA4DvN`$9*J{c#^WQr@JBzDufFupL1(QxS?%#_7odi3Q}A99#HO#P9GYof>A_re3Z z#E=#o)Rac~qA(YQbGRGVFsT!xlh@st8ic(gX_+*BR9Y4> z7a|IGre5E7NB+OaQ+bM$!5z;vLKh*3Itha*CiolVf>X^zg3GZhFKSc_QGz7zM2f+f z&d4YvC!MI_|aGScg{&xXkUYmO?Y}aHaSwQ1nn9L_FM8fEkQvtplxJK zrKBXMA?!Fk=D2UXm*961V#-|vIURz0nQdIZay*G4v#xbw=7h3QA~Sf!`P~@V=x69AGh{w9=xFu~fQRUr(Tb z+U3r>i)+5Gn5*-J$*^=+?Ypb#eQJF1`clCulSe#h-Rc{1HfQQ7qn662q>Pd03h25w zBhMv?jO4LVrmx>*@;gt=ajs0ALS$sgmAjZU<~h?(UP@9lENrQ$u%ba>1;=371pp`d z`^oI%IcBW4PjLR^kzTfZDw!wf`qrBda#*!2Ek--Hb<5HMbn{rb%x35so3VDwCuNK~ zi`!g7oH@oRL!2j9hxw8OmT!zxhFCb=@{Dn8^T~!~xn|^NHFEsJAR{PQdSioC(Hd+LDpZ9>B`C}jcEIbB;;h7R4@HVbi8CnoLkM=+&1__GyTA*lq z?m$fk5KG9ABOOEEa9rMgQl6iDpGAkESWIEc71th1E+RofJ@M z#PV#g)bN{!-BwgT^S;^>L-$Q~%3ClBbge#f;m7&ZH z&hvIZP~R{#IqhnnoK0WZxZux9CWeCIi5AG0^|m{{Qx5koGiCen!$BD*f)Z4x<68sY ze&#$O`|n1RTUVU>$}m+^VN+v)6Ofo-ITzrn!ewdM@+^y;OPFMztUQyCX-vWQ6sJC1 zjQcy=T&7#I*d#se?#w>blU~&RZ7&VLtkQExqof=|ptKQFoq{jJo={!DZN(Z`fWwxu zJ4DSU+vAy(mpl8&b6w+!u@*FQS@v5K8CN9cvLr2ZdA*?Bi94J5>m=T~sJANlmZaZu zmyB7-tEH7ML{c*ul|1v-tbv*UR000}PaBBgxYH1tEu?Ou@p;(5J}OBan9-{oPom?Q z{ayxX!8D0!_gAknOO}}#MQ207^d1qr!xExDeOyY0r1%y3lj&p5&GkXb^;gNgHgsy* zN+%73{2r(k_d}N340*aC#SPKr^nyhsS+|@MBUCVUbD7Z1A~AL=?td@2`~6fS>rRW0 zYEk!J()njuffrzvykoe+_$@JZ&o*x4Q(I;}7MhLUj0%mVon>7}nA+QwJRR~`+T)=i$eF>!vOdLQ$-q+=8M@lVDo#Ad4{rs!3+ws;bcZd?tExf^jREaf63tUe0Z2lu1Lg2l|E z3S|TQfN)?XyMPJWf4>SJ#b8c3Ht$C`6? z?*=eNz$op;#nrn;J*)sAZ#^`7*wF3!BcBk??=iBL1@6$BKMLk>_DZ}JeAtyDRDpc$ z1#=kY+ed6qSczztv*#dT>3+^}-=o62l$8L~G|e|P8Xak7}P$>%Yf z`N2n7L0C^`GMs;Qfz1aX2}XEDS-_?g6or>VohA?Pc>`)4w@26_;-vZ!U5o{0&ixYu-#NFMUqr z_vElRD)pu}mjB9Za{zewcw?LftF#3K*0#ZhAT3lK-UznDutEO0aJrQ zzGp7X*nC;$B!|gFkF4{r*ri0?!R2;CQnq^whmV9Q3%?>+#8y$BluloxmHZNn@bU|s zY|qh_qD!1@ZB?SLNpdySXoHlwVPD(^iC=@GkE}`Ws7B{%mvr`1GQhHoB(UkGX|`=@ zldR&&Ct!2jdy|{+Ic{?{Qaeq}CyeefYU>ebumK>N%myZPKkA8PJvnrN2#m#E7=ecV z2zoC7@KIjmQ*6&qbE~N9y1~byfuZ}}~QuLcMExBdRUQ?3k;D}C>Q;uyT8NArP9%>a;aP* z7vWF$v&nc8FiP^yn&bYSaA~(d8IJ=nITmB!MDk_Trfwhp5np!MJK#|C3!^o%jRjta zPcL@fAd1JyB6I{U0*`yxKu@5LybtR%=8sXvPDehu7C-y*d#XoZ!IrQO0>|VQGcq%m zVQ2t%3x)-mI~R?H=YBq){_y(s=g*(_Tx##$WOny@#7hRRTg}tPWvB59+ALtekVMz` z%=>=}f5!cw?iAY8CvWY@{fz!h_ipBKUm!FB&ya(1++~4qE+U$Nk5{wbF6J7^WDB9= zY5{bnkJ*b_hc!Dd*h#I^?9c|l`)2p;)lC zU_Ui4>$}VYfZYHyOVqmV@6!?1FM!x4wm5B zQ2ryXb!C4Mg7?Rj8Znus)Ib8B*Py)$cTMn{NrelO>BZ>__KT9-d94ra9f3h~KjSK> z7r=T48EUx)*g%f75v#Mch55X(r_#KV%19etO$ZQsk8bO4ttCZgj40+Gbz`t*D?ekXozVsMSC8 zYNvm@X|@}61qXswQ$R1Tx+X9Qx=-D=jLi5`j2PKOkWcAL6|58k?9b=TUaelc?l#&s z31R%ENh8joi?*P8>Xpo_MA zHn9k0)eg%$*6X~jVdvzKb_f~5mQQ7K(0goX%0=TM2ls_d37LU=P7Mf~7q#<-K-sxD zNx@184Sqe{Ac`uY{$S}WA6!6i;ZgOzKJANgFNXI*IYV&;|WX`RdHpQ(!>-b62N znwMRD2!q9KDj}Yk7L_NWMdh2Jg-IF-&swcdt14=@IBJ@tM#fn~hgv)pEF5z#>a|UV&8j7oeHZ+W#BP-;m6strE>-gF}p0sCm|DUtE|F3dj@c$ib z{D05zZ2W&4|KG;{XY&6!DgHm_Tk!um8~>m1)HzS$|8sKq|C|E;Kj)kB|2didzXLmH zmjCZC?ksb1`~QwoKr{S*$EuqxHZlh1UpfWkL(Z0C18iRBU(MVqZ=T!p=a@WyCt04q zIFtf=TF~>CPANiJx5H+7{^~hBf9ZS|Hl{L5!}?^B0%9vgmi=`75vF6LQw;`E%Ck`CGAPPvrS?zKZ8>J+xT2=g;{np1(9& zSMdBf-+||kKP&qGz8u3S4t!TGm5jc?EdSr3lkoo?IF-`I z|Mv{f#{akR|84w#3IE^E$FSLA=$kHj! ztyfMgAT9~rxoMx(tR6zg(L8DisB|Zx9`=@mPWKZ=fp2C;ixEbW0qnZtbXOrhr7z`} zcSnV9{G5e>;2k6U&+lqE>o1!-DE%L~{EikjApDh7-(xBR5q!0P|1lr=3GIFsyq)|6 ze~=2FN`8Vr%;U#QP^bIh+Bi!H<&hm;GJEs#?8*v%oYxl`qP=d_F6}OHLRwqK9~y7B z=GY{(C#gQsZ1~e}&M*4&@dZx68lQi8J*50e_(^TPN&fIu(aLOB9FhmnVMST!|=f1HO{EHhpuIghaf5(?P4FIzfOT%(5Tif>s&WZfsngfjh`FPgIfE;u3+*`<8L=m2tKlU4VS?kwwXNz&<8amfumwnw21M~)_Wo@H z-nWs8M5!8*paT>;?MB70I-p-y>EhO9$OzCV@n@&86*B5BjUQ`*#Hhb(V!K6g81YV1HUepO`c}{zxcv;p^QHUX{lL=f ziLI^LEr>I>KmTEC>vA&p0{HhIYn{5ew*rVYb8iU9(nYrglAdYh&6iK^{Xl>B8SU{P z2^qd#`#!_gOJVMNhJjPkQbWN4LlA8t*f3k7aiN?ZL`LxDXk4YNHyr1D8 z7txShMkSwA?|2w&XofcW#_h4Q8WN*t+#Eccs9f`lTWFb#q0Jl@r?(jrS)T?TiFWk~V0^Tnch?_-j!fEtk=O8yxs%!+#CN}|B za{9kBra;(}LldwFBj)>RDLttc@O*QhcM2yF#{DJT-ZGFkhM&4v%kp`r0iQg9zdQGB z76xZGwK3bhos0msh#Qvp5IHMtzDfj%#{ioqy)0WG2sqsd9dD4y|7>h@-1Th9(pkXc zhD>T3o_sqHn;}|qh%D2`mSo$oHK0!->&8ItZ2>K)Hx{g*bXJeu6;TVuhlet}rAP)_ zFmUwntpLS=Z{~`e8K>8^|B{>v8$#z~WouH?Xp=;Q4#zp!a%n^!|Gx61y87dN&i4Ap zFz4I=(CbOv3os2sW*YKUx2e<-NZDH1jKaDnLA1m5%#*-K`0t+lEA26Ug-P(+9EJ7l zPzp!bcXBS`_wuZ^|Lfhw_j*lF*7=Wvk|F<#v)TWBj%Ty~yV?K!UGM)IH+>rCwhbQs z#k84|dw&JJh~kzLMlM986xa6rEDH~kcY}r zknCBSw-SM4X$J_Xp5~>r0X38Z2VpnWH92lRqHi|Y8M$8)p-u!Ozj8{)S{OQ(%}5l2 zFg!H=v;~?gtlUTDW0R>1#Af`62F^TqC!2`vleQ>#ZD|$VnL_i4P3d>3r7XX6T)CvPalNew+A-ps*;j zU!0ugD^psNdN)w|#X#`H$4WDa??wauB?CSrOw6Rd8&Mza&^g^mM$pjsw@{tE%yn~S zS~TrbXDd}kaS0z>k)g{!OgV>S8S>{PHO`kMoot1NLqW|y9d{zISQ>vD$he`k6{{F`Q_YBX*|F`k~{l5KwJf@E%8L0^v z_CVfy90oB5?DM_fzh{HV_&?_C-u>h;uFhSG9|auS2y))qW%WvZhYdXVHSorLSOxB- z=}htHj!3Z^r+Og6SGnDcCKqLt@ntwYs46kquVB(BKV`jvj}yhm9tT)rC@z~0nCSJX zjCbwTuWn9Sjo#TchK-&z&xr+jwiV>z(-x2ySwc|u$G0}* ze}QtbySFU$nV-@Zr&K8`vF#B7oP$*fkZjf4TI(#mP1GPBDSP2POlFVLTQ~4{${D~e zBt;Fxf~PbJ$wzW+0wQXRGfDE`2xQ1;G~su4-%^s!0E>o>WHOM2Va(r&klLFLH2SL3 z?Ok`Yp)O7ZG&LE zh-xL3p!$y$I_sVb+xyXBAQ*bW)9rQxK2OMkW;q_wD%%0(dmA(QA-Q`&Bt9Et8BJTH+_(8qk4udPcCACtoIE-L4V5X%j0* zmq0zE)4?>c2F1`PJw_+?Wmz*~#I^uhhw?9f&^XRtv*-h~G5f{+c5x7ol<_*t)G2}c zLx!l69srz{OX~!AD&o}dlU1E6be47))$e;y%#E&=rngZpoAKu8n~ z7h=dL&^&Zb)vC-+mvw7S@;gXu+zF4HP-KQ*-sn!)^I8XijJVMq#RpMW=`qpuRKt zMfVXL2r%llf&~zqK-6%9T44I2j@pp?F&~6qqm%IiqZ086{BDoh@&h)YXnp(m$6c{l z6Z?<=hl+#eH8FW4TaS>rt=1}C=V~|5drmBMU*?>K#LnAwiqe+AfbmC2tGSnT;x4Tq z!Q^suw{=Dr$tJ<;G#k1alQ%hLegK~4TMBfW=w9t%_&lGN;`SqP)x9wD6s17toBRxU z3D@L4T1VBkE^RKLICIi3X0^E5Wzw1FV5r=w--)-jdw~x{vjsHyGLA%|?(W`Q&VAE1 zkK(t;7OK&h0?hD~?vSxq2aLFKr%#&qfJTcC_nft2B=VK&P4(j0h2?{IAB&YY_#4_T zve>tls@LRGE@#j_ptfo8zybp9!*tu~W;a`)Z8W`@iRVvV>x(Q~ zk-EgzwZ*d7?!+lcSrhsHJ4k2gzJQam`5b0LCB>Y{7P!xwgw*`gR`uks8ijGuIzL_u zF|`F}IZpW@%yG*gP{MNtYn~jA=MEhTjiccr?u?ZyoK38TKi`N0)poNjx zKk)4{)uE~jc*kDrh~{hl3w3Wr-8PYDfRaXAjLzaXeM4bKa%Y8ilx>t1jjZa3wWHV|sT?j5^CE%@A^1tJQ(9<4kx{Y%!ArfJ)@O^xR|DYEDSe8#ms~%E zAAru}70+(+N=l~yaf@^F<+Yoa1!v6Io`gq30{k89ngMGO_uMi|rUQ`4>u9zPQbN{$ zr%!#G_DSgeOQ9;DQ0L8><<+r-19L%7k)-mR9At#Vl05LO+my zA|F^sb={Z&zVMSEBqY8%;sg%0of39f^zfkayKuGJ#%S`-i9dNGi1C_zNwZ3mV%4Xy zj*G-ZPpg?b_I31$X-&2SC|$mKT(Em3sW^2ANQpD;0>wE;`IwwljU{Fo^|8pXL=u9W zpLG{?U}!XH>BmSPX4anwS(|c(+Q3IuD4O7{1Qo-9rMB~G!0NhC3sURY5W*YhQI!aX zBPT>@?o?+4;~Sg)TEG-H-RvmMi4D9P`yd)rz57|$rXFA@s*J`$xOEdNsN|GCVW59uy5ShJJNWAuSJaVZ9{ZevCn=be^&dmc$v1?+KOVD#TP3UK z7mbw5l$Mx!qCL4*Ma+R4U6ps%c7lu*Nu=RlwPN`tv)Y{zhXQ${C?CHxhA6^$BA{8+Kbq6xqtX9zsfNHP={H>blvB!C07xmga=i58a zv#`4D8%YHf16~BW#5BzAJ0YJ4(1D$Lo$9jq5u)9`obaQiEv9|TD zi}36%kNZu6banMxYG?U}0h4fRaIpI2Ypt%mZX4a^C4>d`#7hHhb#s@rdYasd2`y~| zg!jhCk_$W)$;DD|e1S`yfq;Y5Wgi3jciAtu+cabAvQB^k+3C5rUuG!5oHG>>+dcWZ zt#euivSe+60gn5ZW#6H2RHo2_2AE1Gfe0o3(Wv1+r%OjphWF7<7**kM5;A-q*6>Wp7S-_~vLKhJKevkOsGVOWf2 zmQIUapQ;FeZn2maZ7^~>w1G|g15x49)2lNewnv`U$!8O!ArqTc_GpPv&EfSY0Tvr$ zR2&yAymi7}9K^u%Bx6yGXnhXubS5VOrXU9`4#3D1c%oBkGhHZAGB!M4sOJ$lgnNPsiK|XjkfaX-!^ZgUFBqTyR!^Vs#Q(s#A0oo`&ndqNf(G?LM|Y$&GsXKC{qRAq#|2~%e*26YJCJG zh@U4kuSmZD5XOsA#d2gG;zl+pO#x20eXvEgK8;9*Qfu!|Ryd$i>yV<>T7_1X4(RUa zEYZ-^=66c~6rpfgyD5AmOwcD17*OU@3@W$C*m;qZ9lCx(sp)$#RIFOL1(4Fg!i3Jf zxT&dfS2q_IvO&-q<5Cx$2+eGL=#;NhpIjZWR%u$O^S`+>yUaXVSZ@JF=6Efs=!@~t z8=8|RUh@5F`|~~Z%nO_>?;STdr^p0jTWNW{lD#)tEYm3c{B1x925~Xk^x?rx1Qb*P zRh1r5M$oyd4MThwl+xh?4rJ7$@h1vIbwXGJC#JrR>DeD)#;DHd@Av!Y9e)_+YoCW3 zTc9L+P^=ZWi69w7MN-VrYJ<|oK&&NQ7Dc*`>Y$gQZ7FdYzswVKT>E_}Vb7WNB4``? zR%B$Cm1!JRzywB?^Z&`LMMpFz6%1tGm|1in3~++~quZf0xf}fp4kPzG<*Y63P82D5 z3k+q!HAy9h`|<-u#KXz73HLdrukr3NCIWyM2Ncz+ciLepxacN01EoW8X?>D9=^4!Z zINgF&V77dpko&UiO{z2oARTZ_Vo)X;)`Ob@KK|Z?--dz!cR(4n}?O8YL8s zh+O+q@9JnS@?`Qs(u^Sgyf1q^??*ww1s{6c^u+esLQ^p@S^@&e*cE=BrWp zi1U%mt>wW>lM)n6WDPqf4LXJ->w#%6#M7FAZ)?I^c&9?x@(jHUE}cdbmo92l5s9YXi+cl;}!%gE6Grr zoVe?cLJlm7qat=G^tB`|w0LMy5T>6Q2mu<5YExN!D*ut}%>&Ite=@6%0!6#LoEM#- z2GjgXUI+5y_w`evK)_lj_m7_4uw3|P4@fHGI{=_9!#k7}q0KG)Esqpe+fn`Js=3vR zu+X$FPS|9C6b7kvw9oOyh-OSK2Ui@1?}nriqZJ^dNEth5m|)2L3yI(vBWH;NhWR)P zwKPf{L9*`gIVf46)D&?oZUZT)g#oJ8dR;{p#^92Di{-@51b&%= zr=dyS(_?K^$^$F@Qh7hhu!E7=WrRuReL8mnZDATCs-p~A!E+F2@6GrlL9RKEK~Hv5 z(sjv8#}{b~JQZpTCAh8v^dY(fFXKw`VmJsh3T3a`OU-RixY1a8)~&Kia}Ix-Bb0E9y!!R>HhKB{eEb!sQbq>5SwkYVB+2iJ}nG&&wAXY@q5JT{<-w7uf~O z2EsREbtL@{%2O%0v^z-(onuszq~=KG9aq)-eK+jO+cM>hKk+Yw6wb8*?>0p-&@zA- zPsx`s@K1P*HM*(l{&i#{*TF<1q)I8XJa`R-=~Y5^d{S%bD-IVR z#|xi#lkOl`%tb7MVLZdb6+}vICI8?hwCPP7?;k_w>6`C+g1s>W#>|4Tpw9^-mOaX6 zJ6?EZH$$vv0G7z#P{mqC0do2T0UC?t(4Jk;XuDZHubmXNFy~f`zJq!m%DLc6WhwqJ z%T|i;88q0>ArzY^ZU3V={MV&uSQ#9%%hPNREly%amw9@iUPgrmXXm0($|7O(n3IiT zPvIVM;dmC5Jw%FKO7?!KJE9F>l`HwB@Y#bjB$uLE)G-T>Qv}*+#vfu=J&T(bpF}=2 zq!TBZkuRYikIsx!XYmnuAMu3uD(b!OC{yl<(?_T(Z_8@BXAG$h^^0Zf)$38pJTwZd zX;WjU4tcc{MwmIIZllpgq)&{zW6sH?UegSkD#g&Z**lt%s28!CU~Xv2VQ~MCJ-Nf^ zGafEQ2-`$n0p5~w=_|SGgU)4(SGug#o+h)ZXn(zB*i$b?!*IM6QbBEXjC=!GK_UV8 z>H=12y#j=%dV=LrW`8E&Oc)S4GhuTh2h(PkP<0O!J6#%MZH8x+Ze z_w&Y%IQ1MBU~6J7+t#t96ParEIKyH|P9%!S2jj9FaF*z`SxA>Oz{CBzjRz7AF)mzu z37!e61;%dMygpKv%~}1QqHu%}DZPlrOO3yh)N7qy_-Hhz&XgiHjD7jCCy$A*n+DMu z_DbtSG+iv(d$pErn^qz=j^$0ETB2NGGOZBOW(}em4y3IKQ=m$P!8^&b6%(WPX-<}+k@C-|yN9uPSljwBIe z=)MH2bbJJE%P8&7R@~hAK_eFgnx-{ZSmh#$kx6dK7QH1d{(GmbV{_XTxOm^@R%+P9 z6$fsjod*;VuT>Bt?_Gxul88RwwLyOWuSDC;^N)N=*3u__wM;c_DfAzkG83p+8{W^R z+#Ie#IxBwGB^R6jy<@}h`}xX!g>T|1Wd3&QVa*D*G0>ouR($RAWP6iKPgnxT@H2ryk>%Qj$}ryPs@Q(?G*V`L>y4-whFZ-18|kYezg zw`s+{cmLD)UQ6h?!hE`!G$&@HR`XFm4KC(RQSA^<&&+UC_%6Id)Tfp$ayk$exVw9g z92jvRA9K(7IdTX;BWNqD#zg>i$A#?l2rP{gLwT%6mdyl2pRW8AyB>w)GCJdXnJRIxY`u*|3f|AcoL+|CZUFuX{aYck%ee@!)2EBM~9~-Uy9t znC8l5W-=#T*oR|-s2b!LCIXW^f^H7dSrf=vDM^wuPK!!jkXVWmtF$vDv>coCJkAA2 zm!CQKMQr?;F$fM8%{Pw}mR)jr9NjM)W*e3mZIakA5c9=0NZV5TfDgv1R)FxP4ANw< zYr}O>iSuv%;=fiDseoctJMZuansE#>mLyvVh(nP-q4oJa0Z(qJDLR$swtGxdYX>zM z_qK+9&)~YBgD7M^n+3rO)8QV6dxo&Hx&RIDgm0x1{EZ`U>ucoL zNKFFVQu)!$S_l5I80?1Pf){qp^*?x=Vi_IpiN#7>i3D8oYJY-O7?kL)Tv$~{U(rmo z3ReIXXO!w}yr*syy)K>=z=h{ULUw<-o2Tob#dUKuPJvcDbI*K6I!XixyZaH4WhS&= zbZ<;LTpZC##w^tc=AO%n&7t7@{5c#21jH{1=s%@OriZy4tpV%R3ft2?SM0YLQ!pSP zdy>H|gD5&PV`llOsilQ>%^e7o8{wN0nb0b&E@E)~2BV^I?{XLZoFIXHT;g_-y(57F zMtvN?^{|4Ko=%HAEwaX-g2rSd1&9c%asXK7I3(xe3(KW-B_a-HeQ9Et*|_Hr=eu)4 zC0-v~<0$e-wsKws@~=JF?)oUTYDYxx-Q3P2?07UOGG8h;XII}!1tv$|X4%3lF4L8Y z$RQ50k@SelLXd6vsnEd+^+OR|o@~#&hVV2xE9~9w{lA8YJiR9XJsywE3EepR9uoy5 zFrLaA){uG9*T#3R{-pwi%Bp72#$Rac-O6?0WO@4@PflY+HQ!UKJvj0~K%NlwFgw-K zS4qN%LMWJzTZVBH{i8a9u@elVWe^&n?*MMv{vYj6F$HNma%9BEGqmIF@%6nI`$%(O zX*l75?PW}?1L;s`(;t=q6N{0Sj-1qRj|;%x-NL?L(f6pM8)V~3HyqM%*wtAL=V}p0 z?T`^q?UhDDJs%$Q{Cjg82RAP3^KzLh@Hb1HH|}Ld+w$?g_xdr3P%+n5hn-s)e48FS zG5Bft^9N1t%bbl@FrG$UVY49{S8x$tGc^c;D-=;|@(?v*gzj$OEwJ76m<*L7A{bgu zH9gKzWg@rfK1?6xnj{T8iru5b03F08$yCDOv)zHzebzU#*+U{(irvnH;ak>Rb%aK3 zsUK|zH=HeC;#ZaXR!R2}79Hz?f*MW}k$%Pi1K307KgmziKN*l+!T0dyGh))~AB6am z>uDU=g5u84txR}6*^;#hTEE;K*Pz7{-DAmYXuMLkBT57pmwmNzUb!o(t0z_9t93v8Fd+X~X5!yqC?>0(X-{%&Hd;Z#eVW;JP{sx#mc?oUwj%@ta zd*+?&e|FaGc-{18gZ{rVbG~`?Ff|$TJHAr5q#kf^l~43M4gT=b;c<`PWlkFF^r_Ux zQNXuT%ik9R_)>F%0iq1<<_gC)Oqpe=Qy+M@Tka1ilCR09g`a5Ti({C1_a>X)xN3B% zaeArJ$4I(6Z;RhHOnD$Na!Cy*?ewq3+6B_1XW#lU_fS$>^cAv{fC+DnQ#LELeG;?>-+xm#g{w{yWYUJ>JRd+n0#+nBAlQY{#xMt<*b{aOX`+B=Bn*RH?xm_c&P{4G~ulwJf5?v6^(+|-6!{yMWJX62_Lt^j&=0N2Gc+BiUl#bbO?KhDBFAf9S z=4PFoJ_{C%a`RYvmQlra(oP*aKX->zjk?j*NtuJHC!623<|Dd zZfgHr3Es;$HWT-w@ElRG`E~b`iZ}=V!(jyOn$AouuE3TmZbA65#UK&o@BBl7+f>sn{_#EjPQy0=K^&U zDAwq%blBwp5xTeaQv~5HZQ#3s=DTAVOzRx@mR9Qxg~a}!2!;Wh_?6G;$)81AH$&0k z*}B>bk!`u+*f670SZiI^2od(&QM#c$#%hmfx{-@Pa|&;#MN6a-3Z6n==U8NWaIk0I zzd#!r|6d5k*zo<^GgM-?y&D!c1D~wL8mG~)*6u36SD05!3_vWBzZ;e|Ve!qvTLT$H z>_-<_t2RnF;w_6Qae`TyJ!nth=A43%{$OVw-M5NN)PE3+afbg3!Kn7(#H|l@_pLU{KYFB|I#x!o_JKkdL}y*LiFqqzkX_-w`#U7=sb8Ff9n1R8!XfC?5j?> znM9cLL(BKfbK0`kEoQw$$wgGHS`2RnuJ;vr|18{vm}gA$p!AKC=*^Fy_U(ehq(S4c z+f`OSm6%kL9rUGGIsGNBEY;$oTSpkVZIT=ii@?Dq@+9EhUTAi}=N*2qD!PKrCVc_~KSB|AZPuJMzGEZrz=@U(RC>k7=3g`lgaYt|TED9uP? zZ{0GTiQESWI?rNN4>BZNYVUom)#JH%p1S|5goufiJgjtW8q*cnD@oHoDraRarT>Dg z`%&RZYv(Y_i=Cv)<-6J2Sx%_Y6}IZVlI=kcgITU7nSG^nSxON%Oe!CScbu8&;i?P+ zOXInFSTi~^b(w9)QV2B*6mv-(MYdj&Or~$=teOOmxMO50wCKGn;0{JZ-H$Sx0@o0n z>qxTQHsdzAH(r)Q5FK@7TjQE0e4!en0;&D*LnUurnfi2Nu;fQ(S}E>0nWr>pYOtdA zDolqs64N9x5>z4LM7hXeYiw(&ztl)-pLEPZlR`-3) zx(ymxdk593{OLdnX*~GwQn~$gOZ_ySd9QI~2P6H> zBHcXfg-N_ft21=VJoSmX240al9p{voc5>t@S_)DPNODF=*v1|MU3X$d4i!PR%1ak ztexGSub5&)oDLX&l`TA$W1BQe?XcVJgOI-T-#$(2TNgIX&(&w%ISQ*lj3#r`VIAu# z?e1b&X!lKVRZAtxY9s9?am^Ctcpk2F4gL9UxX%IMQkCcJpWT8&(Oxk^`(OnamB zrC$Ld-=|D{igH3M*(7#%-kgl)7;UR1N?+VCt?HSdJz3=4dHE9bzto9{uP z_18XvZ}g=)S3oq0fI?d_@V6dgX1jr16C|Y>;7~4YD}>3GAM+l&4U~H(I$I6>sxJs z=aa&hYZ}?O&c)*5h2Jaqpoh^_bfDz*aA+pny@U5~%VPyi0U&Qt2X4Qm1UX8P%BOcmLpvsu2c&CV`It9S;T-I<=L-T@RPVyQKY{&-Y^EySwlACKaV+@#Y18MsECkYT~bUcE@PB_n0CtQq_ zLG$RE;dY$XdPWSYB+54eZN6)o0qi~>63#<_b1F^imW|W(NwY&->%~pUB zr!m(DgQ1r?&M2GHb3ooo5}zUHkTJNMgASX0+ilvDz#&C5&jU+VAa1LHTU$~f??Bb* z+?)Gk0^yZF=ZUV)qN~L?H{^o&Q^z#28xLqgv&wDfd|Rg#n+ImLTb=m+iusUtu{_tx zR!Jq}_sO?ur{yiXK{>qCq<|5{9^33TN5rvJ#3kO)!t??GUoG*b?5Fe4Atr`^OUK(i zYq3Hk#$YmyQXwKELJppMNVW@6FDjsI!m&GKFh!I(?x1tqLPsat2oFM3_foPNx`c-t zI7Y5hSI#7=-6JX=V-}_kZQq4smf0U|I(6EaXq8UYpghoALeHp+1unmX8`HVR@=l!7 z2;FFQ7Q-iRW)_QM$);=jQ}j430+FxrO;N?09!^tVNNW82^(NQ5)VYp z4hSUN6G3CW;^}yg23rt{KfU+rR48E~XfiVrUW8)e^TZT)dSG|b)Z7V;MtciCHE<$Iui_5{Lg@UI}1_@CywygL{3RDEdkKBZE7Ee@J)-@VhbhG))SB z<&aRoSA%K>Hy^a16$vr{gJj|tqpF9qoEh}OK?OjdWadeH2@p|Qj7qoFDmF&ywEbgi z2qgv^~-6_{@f z=^+6HhsVsquxt*;M(J|$fS|z;3Rah+N<@VYi1IhsoFHkOfTK*RPeuaWO0T2L=jXek zCij@)vem!UdrUDm_gGw2YwFHX<`RQ%_~^)TQIJoDb0Y;>nNvPH?!j~=OoF6X1&+9Zu34Z8OVl4S&`|nYoBg|YA5^l(prO-8 zR18?2xB&6plDe!JvR+)i9m+?fAvpZol#$+j2s*{K;H1N>%)MA8C@w?%FocPjXV+re zF(by57>V{$_5!9ljTnw<->7^z1c|87yDZEm4S>2#&gjtFEZBUbfvyu%mxgiOCO}mh zJ9d6J@1rW`!oPEYtQrj5-tR77>48<9Weqs%utG7L4X;;`0DNR_FE|lHje5|70 z-af1#;5PG7yyhLp%_EJZ?QODr#4njLp(zV!^3PWyrZCtvzAJ*Bi?)>O5iqgQcCw0MG7}4Hr|1Th=vwE%#vc~#TA{V6$oI&MiJ)JN z_Q&WV^6qJo)WS)rhXd{*QCLOp3sbNQ@vv{;0=4$21z>J=yR;Z0*%8-$hthnM^a zMP~FdR8l>_5=|q8uVI}nga^?P`I(Vp+PW-X(2>ivrcsZ30{X?mwpjJ2IZVjs%yCAs ziS@APcOx-%_vrv!501b!?al=x7XrpUrV6gfT=ASJOBlNA(pTn9m{UC`Y+mBY!5i@e1r-t$K_CijZ; zmyT;vj@`htjK)(XzQ*?_o?T!c?T&?0!Hs?;EkU{F^3pLgh2MOC-g4zV;;%zr1z!0O zvutTEJ^2sCMi_#7B~80cTB(t0)bS@Vk@Y@P-ekfHmz?EWl_9#@J_tdS!;2rmch$=t z;~3;mdnYl(TVDip+CFF(iXo6OEE++ueehi-rpR#@MzQ%6--iW~cTw{(=2G`rWtr!+ zgM>L!%N{dbabm>Bj9k(10c&=MzIhPUp?qV1$S(Y9{T`>BIL9u>{2y1U@Eqi}c9JzL zHR){-Ve(Vu0^^>#-T{55JxG!%OLsE=Q0cX$qu z!-^!;MkVKYJLnD;Zg;&h{XW&IHTDhVlaj=|g(r=ed5MU3mMxUwtO+uxNM+fX!XD<_ zUJu#?*GN5CNNPpXn;119iLbR*jlrci#e{lO?LvCZPj2gr}`C-&1Z!L^w_1?jqe$n!B5BVSB4ZYT>E^NiJwZ(GM=z-FF}Ae#>g<{^4x_Yc7XFP5n`E^ zKdhj5c}?{gZ%ZgL5X7{yn0Qe&J*IBHMV3E;7T?EwGVi1)o4_EGGgvX38~$K?)t)z* ze9+jq{O;f$$~k*j-(8$H4X1JIVY^v!&4+#F%8~x&wkaBiCu5G|6J@S(%`J*8s<0S4 zFX8$(m2 zS3L6xrJ@Z++lv0QnSoXWh+0Ft&qDUjP{#{lV09wY$y%0Q8lYM2jAU7zr3b{cVr?Z$ zz41oB^pfth&_WBG4=b44e0OiT?&Fm^83ABxzBL6!Fx4@_WrpLuURv?z8FX#ytXXpS zBbvUt&Fk~i(Wva<-8_txnbT>x=$!VxiFv(B$hs9hHZ5Ax6zEleXNQ5K8J%c6op~aM zAQJ@=xg?b=hoS`CJ$OtfH$CjLC-ol!WB8wxB*oISc!^n%#WEE2ioE2jV;goYuG~$$ ziz#j3S5pNowvBe77W8-tCS|MHphkMV>n#nE@#Ah+(Mf1w&Q{PFBY3*wX=SpC@A`@l zYUrGTQR!n_kZ?yl>+9kSA215KNU#C%tT;s}UN+M9X1)lzuEasltG&O`A8}UkV zws|C26~X$GdE|;S_F{93k;nL*G`s-h8zU|sa1A5@@2)pHxyQ$C~dq@+W6});p@`XNNY^*E8HBZGkf)<;Nm#|UHOG%@;g?D{GPbf z783JxT5jlZ;SSgavMmDvwLR|Q)q-uV`3tt&X_uXbxuW7-9$cSic&GV0t>;LWN|Ktq zm8m0$lg0H1)$8l3*p5?MXCZRcKh4f6-5z5~dORR*7`M8^u@|M|z`K8SYL6+u9^3Maz!pLiuiowq*$Y`)?0$sQl zq`(8$=EOx~!+i6}hSQBPm&p&9tFTa0#n{EIf;yYfyj6OqA*zSoj^M^$e183DY3UT{PC)5FGIf%16ANL=A){yN;nI>^lSCMm^K~v=UfBhw&Wr|07^>M#b z=Bz&cy+UA{i2tdW{X4YyWX^u2o*j^XA93cK&-_n4ihtQZezli>>o^zP5;gaJb=~9} z@0Lw?yiB4wPb$4b)V620)`^=(at{w)ljHFi_7_I)6vD7#G@udzorfX>AxVHNX64(} z!hUAS>%t2RG7)l#!o=hPN72#G&H-+oL~HZwxHlv3*t?1gHkXppJZq_HHV2j3`AXQyE0nln#Uk9})#6iA<#Y zU`~J;z@SDHCmgNi1EdpL;W+@HQwZ{Jdm7|i*DH80BAyZp^gS-o8I(}6t{PYC9N$J+ z-beAK*)ViivYMTKYf^(bIU&~mrGX;UF18dbxgZRg{DywA1eo<{V2+jn7~bx+aQD_6 zV$AdJcy4+&9XfMg@&+@Z)t`GW=E($pxVWloZ|_+TQpRz+%Dg90y@#Qp|H859K6gd# zF(qDq7&FK@C;dYCvcN(yQQpES>M8Nk0gt`#-#CzMtf)!8 zJ>YSa?q%+~6+V$9CPq)%)=4t$IWHzm*RIa4GMhm4Si8dNG|f zOkm#6#1Q@KxK7Bh#o=9^Z3H{5Wjxo|NMWndYyD_?0CV<-*ptE?eM3KUObiUX>vebe z>_QXyJA2kIr~Ki|!&rDuT1DWHwIeq?1#8fT&2pBy4lCNw73x2nP&nFq(4UTFRk8v^qVW`)RCjtik(41tJ-KS4al)j_4zDvtnH7gUV7+94N&=+3s(7e_p3G+t)2gF~TcpkXgx=W{~RMf&E6(K?<_0R`wrkH8Q^ z;;8(aNHMFGz`!0O1#C1Z5ApBj@U)l|qSSZZnDRS(XTu{rsYkOl&+J`iB8ix$=V7FYG8~Fp7_@%~Pf58)28``0dU#=Q_rV>` zmHLN1ip_m53u>eYTGZh3dsVd6JFB1zVL?Kk|53BpIbPxmdiJ=tu?Tr;r$FSJ-J}Mb=`$M5x(aq6PE`PL{jT`er9_EpB~I zRaxa_Q9>NIj-SB^ap`wH8QJi8q*Qr{1S%|T2|$7jCk&@bUA=jeKb7=HCXhGZgc1wj zXABmA@M`k~ROfO|bnXxYS$B2qF^mTEm)%Y`vAolB2+1UE@!eue)c16#c|{i*0hD5R ziE{=#Q0}m>MO1AL)%;!YGD#9{(aBOrX;A$HSG!{{$rd`Fc6$|7 zYxu)BVr&ULZ_LZ}Lw+f;8;GHQWcG|%G7-&Vhr)pK??BIuu+UJ3Kj!)#Rz!ou8VV1d zgK}i6+V4SKuFn`XZJjXjp0D-P6h98GLiCk3-MJsP;_YQrKJ6u0Q&n%b13HKUFnI=9 zfTz6qv|~I4h?^Z41kDe5VI;_2E}Iz@Yj!|PjjXYIWgwm4!g~bMF<~byrXK>uO z2btcu(weGynR4MPqt1O4NEhD=I@tk$;G!~S0ffPB1xYQr@Kuy$&8-FrSaM0pP@bQY z(84b#5O&({k9-mk^nR3qtvpoHRn|j?GFhWi#TU**P`MOO(m(l5H#n* z9htrEp3I*1+)c&cg_ynS8H@W$F}J5#as^ZVWX=XBa6d*=EyteOQUbfRqIz?wA+9Zs zz*_YbhmujLdAu0mfA~l9It`X*GSHahE2;ge?vnjZ{iZW@D;%I+Caj}84B$jQ%@@yHsY{^2 zs1B-e6>63Vt%Ch_L7YtHT)&btH)Dy#JK`O@Xs%g-jlzZ%*^Y_U3c;&lhvbxvdyXdl zocfP~_KCc!bIzy^_Iy-XOi@Qt;>bV?N8}<-OQ|C=>B<3@3F*`_LrlK#(~cf&CAQW_ z_N}%pv@r>JEi<#x zv^89T*Pw_OV^{(#`n-x2gYgA$JWFs52rZ-IGCyHqr)YnDN#v8{1Tq%VVHW%bb&Eki z;Re|LVF3PVcc<83M&m`zOI8?j(KSN?CL3QEfPkY(U zC8n7O0%^g!a}t!I(NlV)`vn0uc^lJ1@&(e#~&ll#293yIS?D zeDf@P)#;WA?g)Ep5EZNv6eX=%5@XSna88gcD&axIKN~Wnh-Z=w1Un;FULC-Q!7oY#Jlm+*LQCRk_U>JNuKR(X*aEY$8Ll#4 z?+>mqD0i{H{qmg(k_m^TX=?s`D-%Kas0;n>)UJ~`T%0L6J;hO_T6$U;nPXnYON){5 zb=wF@Wo#!5(xZoE}nR1N&hLC6zcNiI^Hu^X@xe77Y z+}u-3kTog0vk1}W zCv*>yMGMCBiwVnRh&XEgIOTBo@*ZcEcFR$>I`=r;7PV!`dV0JQzdIioB$nzk)%RpM z!T=8AaYm0-9kg5FLkyfgx%SnLJXsNiojrgld7VH>`NkmN^Jm|&WzAlQ@kw03 z`A7HNd%b0+u~fFGD@aV{>r-WArfD@A3{Jczx?Q8EYqINB6xa^c_}XZeU)ND`a@aNf z{M-5MBSv?D6u7$&_~P{8O2%{DMLQ^cfQmbLq&j~eiLkgJUOaw~mE1PEdpM)Gq1Pn! zis`?biw3z}1fbq-2l3nM#&LNSn>Li%Hj~Gkt+fl63c654+eX|-J1$Ua-Rl?{Z;+AWkxz*igpjHk7@odHD?2rYuCxx+fW$_lQU3W-puFBa z5*>nSHJ1lb6DfoBPS-0~ScsbmtoDn1+7OdRh8OWn;5OTT7XSXYnD-D<{?JcsJucmg zPEon{#nGt4=Ay!q01Hb4~*!A zohYYl%R0F(_=**dH#o77V~H?fVVQ&tk5C#fEMp2v80W^;;BMkT^=Rl{a;603>cQi| zs-n2@n#B-y-ksn&CfX@Z4PtAB1)d`_qCbtZNe>@pF^Z#1FlzNpjVsKeA+;>V)2Ov3 z**W1L(V_QP8MHeAsxRMYjy}-X?^_HrEnA0a&Xt;T4JGpaS=9Fnc^4gRVhPwwhu4a|YS;TIx z;1vErXoWWY>}IG@`U|XQP)R}Tn(2rWY|)T+w(m1(Dn_T19H!6OxK;F2q;Fky)&JP^>#U0Bh#V>o_hDR4Ay;xjpd(lhs)LwkA1Ic?1c4x z&TTiBO#QbO|E1JZVP(cB>Fotl_3f&hJc3yfG(Mu(iX%cOB^h9Ns7 zA}M^8%9>Z!_?vs^^m_xb%>GwH`O+`>cRsm$Zaa6bOR>m{9gKzO z^nd*I23y_JFtlIMCT zOHE?@A;erR()cQhrCLY|&sw00V_HPZ&JTNT8r+y-!4Cmyn_UnwcISK+0pn2L0G*RO zG?S%U4*ZmrWeQKt;w+tM_>Oj8WTImam9MZO{vDR)ElMEE7nXC4{+tcAWgRJjF;LYUV3L?@tN%6Y5Y6UOy3CNbNF$MxHiP$e0U*wA zmBv+n-{cWOv%am$#I0IKxBk;&R6{FhbK}dLoZ~Oe3fN0oWv`0cJ6J$rf(b+xfGaEG z6dymaOZ^)I3yqKJ^LuT5|7LlZiZYADB7Tl13szzEmQDVbMPIn3PHy4GMDvkCa>KOQ zLuQ(ybn#VEMQ-NCMADCSO$=%XOJ?>qOIcaI4zftEeX)g$7H`XP&F@Vc#{>HJgX)sZ zx!^c?-Z@rGl#CTR18ZXzhrc|VWql+(B>o^9FP&%b&#5GZ<#w@L_lCRBq&J_9t`yls3mr*9)4(jyWADzkwSji zSiEU}il*YC8rB#iaDx^Y9Uo`g2t$dv6`Q|&+r<7fLqY`Fhdn@wOS?m&xL>z4On2Fv z;lG_J!GKyA2#7m`e`tfKUq1$&p8dy`y5p-Bd{q)+hha!(O!vqfztcH9bMyN{x(^c+ zbG2&vgMvxNT%^Pivc)!D(~T5m1{+!rudfNB0*5t-#2~=m1^8d&lN-sxnL^gUdjYwq z9!wdXGT1-h%kxNe7*fZAgcqW)qM@*pq1hhtKOnIAltOtK8AxpY^2U4~>*;UmT=y@& zXrlfY{fW{T#+Wns1wJweYYbb7l%Ru2#g72*m1;^5gVMaBy=H?ty0yuZ`mW4wp05-{Y5#ou^$h+nIx)7h_1E2B^U}l`n#~SRjX6Jy6{-9_8qsoB_T&W& zL^9WLzDS#*@K);I6qh9)F5?K9$?ey;i=|bqm(q5-kM}y6CR{0sc1;QG+<-96pAE!1 z&nf)a9xo@wmQY32;dfZ-V-??ORsR4kyScM)$StC@@`Cyxxa}XuZA~g--cD{iMCwht zkX9$5Su3uYoSH2i^G!oljx!#%P2g`6CpXuVsUd9Zw?KYezyq;qy}1F-8uN5*I;%4S zhp#tlZ|w~VG&S!X1^f-X?OuRZ#$Zd7#~ zhqJ`k{V2uPpf{o1%zAKSbVLs&$K&|2_q|hXp{-`h1j7F-nAA;m+aSx6|*$zuAZPz&G!9x1g)Mb3wkxy~xPa{3G{etL-0d>Y6|#q@^)CIc_V2vT1gGxtjA1lKLuRIqnOFl9l;r zl_`spvB@(RS33)*bq^+|_2sUDv54HQL`!Bivjm0q`oBoQt^WU2j= z1L#3b?A8SjnSG6=U?k>PSVvB4lIp_dh(Cvtli0+{}mK6rRJ$uExWXp~ThW|LB!(?}|qQATjFMHIJ5TweVN zJM6@jn11ZcrT|E+!v;P)6KNW~ootd!5CC>cD> zNb2@O^-oz|7;!FO>`X+6bq;<(k=RshD#F{G8ZBt6B>rX5qrr0u&4(L;4LKjVio5od z+%x0@!n`KDg~lk63}?63Ygb$R`j0HqgWid^@p6m3vm<5uz9;8AVsNPcXa>>m*DP8PjA2g)~{5%b?!(ZEThOi1Z#v#Rqg>LTsr_%fu_ zVrgrRkZYx;ky6#gx|X>{VV2QsCStNQ2ErOb+$*J1Nrr4^=UkeA7D zc-QO5Qfd85R)s2~D|Nd)F%}zN&VIRB+w8*ifKk&sC0>M!yd%ZD*voqX??O04$Ix6# zR}rGXx~O$buddO6SN|Ns*3wAY3unKZ&+nmaMmD8H-;eUKBIN|nlCmlLX-*aCD2e>W zpZE)#K>x3Rt8u3;!PvT7bP4^AkLrX<<1@JKYA#8?ICWUnieW7E_<6(+$u5yMyt`~` zZpTtS#ad$WS0;vtNSOb_l7xH~qJG&@WlXACugEUX_UK(Zh>a}!wEteg!O9(Z=FF7& z_meM=d3=TVIPy*jhff3tHu#xJH^*MoWFQyp-C1Bd79}Ba2kc#hv}uQIz4Z4eAlq+O z6r_{ULz<~P^M!{|8+;@~`R+!pFXup}dN4fc$7@&Zlx~&^&Y`O=$NKSM3lh%%RAuF? zhYjhG7_*D#hh3ir7tyF>13>IxQH(87Ecj|pfXW8DAH#!rhPssU%Py)yQS}@oP<9$; zo$(*A?BNqxiu6p8?))*u7d{AF<1??-bhRtcYjhF7(pemlPuU-KQLmR6<#ZsZ_GY*OYfmOhb}X@&uAtquvl`a^1~3PXT7 zZmmp1fW3;v`+FfG;H=LiIbesEm~fQ+L`c3)(-2ZUjq#E4csrS*rwQJ)qb^9r4tM`_ zz0BR)cYxnL8>-D;GaqO1OVVD6*jW#-}Z$M48Y$RS1?>j18up z6`_(r(KmI@1XQXMP`gU7k|H_WxT%t&R=!LOi*+0WFlG=YE zf}~;`h_}YLX4GU>r%Bg{_J&4iJKUzlSBHn1g0_SWgPE;e$@TG*^==u+tfAN=GFhZRm$A*oZu>10CF_J-=KJlJEIO5eWYvYq4Twr~knr2H@bZQuAU2n>gd9COS2@FI6!hc0t3pR+uDr8b)vZdB{mtxQpdKQ!*w9LBS0w0Lr;e^BYp zR8!ZEnbaZV0HOQpv>@c#ZCx+X0uo1r>=kK2$V-BE|7k+RED1?K7nz*pGSk4456s&; zYGH}VEXNr}L(2#bS!Bh9&8T>=GbgRc#TrlAhjEB&*JpFBxi1u?uxeT$%8S7%2xX=n zc|*ZALZplIG}Tb@HtREbvp&*?PRACgBuMeUqbsAoW_Z)pU$l{4jOC7Qc+a3!Iu6BYtm;gD z50jr1gQweAiLF+{nwxv7)LKmZ+;HRk*Z?+~z|_ZPds*eBH~q*PhY3udHkBkbI_eIv zX&Aq@@-}EyeJ~Xx+dfmow#d>->!HQ{LZobZ@#5op^amYuEX!~(Qu<=ElBiBqm4+xj zQzV7cZrOJJJsF1V96?H`LA8Pgs=Mh-k{IZvJ?0=jXNvHYR}cnOSYqlyY|`N(67LadaW~V z@TGkA(#w~M+k9VT%uYU=u50lT-Yy}2Kk@uPaB??5Ha%FER8WXB=@ zmm|v~gm0a0t+!mz+ijTgELpOLMn{dEgX|BvoE7?&59_*A7;j$Y&g4*=7dQ1bWiC$@ zx@76fzc+Qc*Jg=#B>E%=>Q0+Gzz`so{*ze0_J7*h@Tp_@W;U0P+t~jAV}PLrz7Wwx z|0iG!J^&DoUtd^#g84>zC(|&GObk*^yqo*_?d`BT?b>wdti)wSzhlXAC3b6U+c{r(kT>TF`_H#MS zBLaMH#P?u_?i6iYA3W>O1b{Gw+koB#XXUC}o2Xf`wkAq)leyKR#;)_+y==Qe*D)m) zs?)S~wq(+^W}~aqU&E~0@!9KRsk`i!ezGt{`)gjmY7k)dCMo{^88V-mA)-<5E_ugzDKwa2CbFp9Z7V+{;W`!#IQACz-iuy0H8nZ`xykURt6 zP*H;=E6~TlJQ|qvs5xZ|(svjm1uAQC)DFHJuJ>SES^s!AT#xf_pjR=#9S#jAtI`Gy zrM43H3F&%XK3MP(7Z6w&JuUe<0A)`E-CMGg(4)ILcul))!g$^3?BNSi-Mu;krlIZc zz*P3W0jIym4CRz0E!ZZ}GkE57Jmqy8IsNb^!wGfz{bdEgB2MRD+n^h8wH~__K7Rc> zy5Ehc#3g$;3NXT|h!bz^)--Z#DUQEyv=m3z*zq-9Dzlf;tgXWT{!niGQfhdkaBy-V z*5Lt&T)AAIKQ~Tcc=&mL+_$ta^l1ifP;SIu^FNG9!RHWY4n?-}3 zlXygWV(j7VG#_Q@fkusOT&^5Y zXOn-KzW97O;~N9x7dcI7xU;vy2U_cD-*@YsG{Jp;qiat9&prpE- z+~HIxI9U6}eGuuYftt5uG4-82HLMpl9TiLJl=yf!WYQEWHa!JQb;Ub_jJTIKYK`R? zsh+Zxm&))J;>m&M1_fz~xQpnhQEFHt8t+UfGtrvWE-oI`$s5~fQJug9p=R$3mRBVH zDnKH=H8Qi8s7{6)w)?aMIM8bW7!eKFAZmLvnp?VE9(agH1m8~uu9&ElYKghN*PNu< zp?xPml{o3$53#RXl;qGX^u!=FRH4N;gh2XNU+(^{RohXmv+}-+ZBk9jd{k=X;NZ!H zU-xr!-*@o`I4R}R3PqmETW)YM6CX>K7Bws^jYL8Rmz<#=O9z%FJsj+Y`(xD^Z zBij|@3P80ETNeEo!G0r0^A2yP?)U;RdCc1t1Nm$Oc2-r)-Xc`tGwX32F?$_cWGV-4 zCNgjdppA@-1hXR~YeFAsqhJ&`;Ekoj5_DDyQdgWsf>W%WXYRAxCsZ` zK}z!vRT0ztRVxg@Y+@jB95>gfi_(Rc$xIp7$H)<|yp8xs=t#2TQK=^a_*ogP)AKXD z!lm*!c<6}A={MkLiWJbla=)Z!xY%cEf(JONUYZ&lAz**#m>3uWIT4mqpR-wiJil3fuGJd6>r}zjk+ym_)4lP0f6T&u zL}sqBfZjlZu`uw7yMR=aru(o5BnA< z1_`l^0fhLliJOI}Fm2=taSu@xmA8|#y_D;t5^{_v&IK{lpZOP26B$I9cWY!$_mv)N zmp%Z6GH*qgW_EVd*j;XUSwgKgZS$)JF)eybDW;kh-RrwUPxk}|Gn#5m=4%KVJnd`L z>t!g=*l5SsVb8|_oRvDqjg+a)enUg%e>9{?(W~o_#z3j7mL8Grf-Nh<4E&`kWO2j0 z8KO}oXe2Bg%80{gMT|&gpl6M_7tnLopr@yVoEl~~X;|2yr~Yg6(-tkG&gIzPY}DUn z(*RZ0+1R(X4=y%VDwOoq4PR#2^6B*z;CQ&sNu8I6gNjh*4FIDVWWlV*(b-*oT^x;1 zNcwSi7lH#b6~FdhKnsJ!(zrsKC%|b1D#PtKcr8>=Zew}i5wZ-f`XA+I>QIio7<)<2 z%cN(6Uj1MPWjb8EqzZ-(soLr)oW2BTKLb$6WPeK7MCToU6{Owab$wn}Kk8v7jBEYN z>wye3)j-tJCT;(1A@uwU@grdMcdjKW8ZR7kYf#O|i(w;h^Z;=VXoE7S1i%zUl@jgX zCYPgK^BQA}#IWMbV0VamjW9d3{mkIk8#}`4LABs`ov41kDyu8q8?-+X9|zlC`_luT zH3K%-APoW}0M6_JAPlY}12)h5ppilim$cID0P~tAj)1*Z-C2iE5sRg@^``Wg!%iiQ z8dj87=KTKrg4apZaG-uEaKX^NY?%_F{a*dkTAw$(Uy$x|)5slxMjBdw(94Vn#09PIra|X9l8%kXmd((A)$Zb4Ns)C#d z3h=zyZ#+YHx83h<#X_FCA8rw#Z{lIRda@?F@Bz}*^CHb%VcLTcgLNancRU%?ABJGI zdHSu&P5y{XKa@lYzBB2s4887_GCkJ<Gv^Zi zjhf~Y(fio}`o??Trpc>YwD%fzicDmDbfJ)IWzGr2-}Zy>7^HhLxexF&)B2}>0^UV= z;7>6PmU!peoA=1rfK2ellkP2&6Bz&Ew+qo$vLG*f80&w-AchV6zBPNKB#I&+C&?9HFfg0n-7x})nnAHa`J$3XchJ^~&_2c_eU_Y|Gl z{s|72TWCgkYxfn;?~5|GUc)Gp9Rwi5-c$2{{hsd3_*G3<#NzW>_&I;^bjKlFGcxe3 zK|;2Pn9v6A7%*qS#v=o?mBI7sbXe%m{?yuF#RM1X5W55bRg8(7(rfE|4~{3+-7o_n zXT&<$>)|#@*KX++S3dKPJ!PU?BA1vT4W*#M_k6civ*EC=)j8lSMVQg^? zdv=T3)pa~5+q-#?jjn6OfFG%DH$$VBJE3;5D)10Swe zr$Wf|@azWzn;iYq(H^0${JniA*OKkNqv(Sy^?-0-5$Mo^U=hgs#&q8_96PgNRfPL4 zAWZ+DyOk`mGmX&jz0&-g7BFrRPna}#N@fnDb$exa9Brr#A!!hmV#;tabScDIf=yxo zX@an|hjqJhWE|}pn^YKnGpuiN>Ihl9gEeCPQEhOhSWxs2)yYT-oA1}ZkcQN86^SLo zXT>%s(Ts6jGI2z{G|XVd2^f~~l8Ls~h=rbE6>S){;{C@O2h z9f#Bjoy2uafzFJPZUL#EDguDRqIgL8m>z*ma(y!6=wC zvLnmZVP*U4GYPDv2QP4g0hW2lyGVO5YaD3~itVD3?goF5bDl>lf0uxY0xQnw$@oa8 zIa)N&SH;E8MN-NL=M zTpa&^el6D525>xMd3@ zY~7?pa2^Hvj0HAYf)lN{MS8XfU6xq`f%5P&RqEBh^Z08Gq#><$)caoSu#u9_c?LCCr{Q5SMYZL`IINTNQ853RGzh2P!*&D+(Z zJYj(<>Ji?0GEoI~bImWfQ8@I#?@PeJCT&x+F_Hc2$q9r6z5a z(HA?6?X$PmQA6s|eU@hG+=epnVxO7PvB>8UPxf10HiB}4vPt#fvtD86+I!7luW$^z zxr^4TUESP_Ja~(Uuh25jgSAV?2wr}A&@`MMPloS6Rd{Epk{>*D<|K`1!Z<1Z;u6@)TJG_bmO}8ZHQ`RqgEzujsropV!9i4gKq@TqW~D zg^lFM%Q%%u5Xn|!mH;df9G>Ls(?OeNbh4ib;Q?u z+vKm{7^RxImdVZb4z{eh6}pZF=!DEOs)zP zMqtCQf3?NS){W=5gi{C)T{CwXSf&Ec&5*+?K2`X=Ky3iq5fmJ?N#TNN(ReXP)ZXlEJT>S2CY9EQ@=_&a7v z&g)k|s&`wzE6d7vVd*MH_fWMu9m5OQ_B!M5HIw$Vv(H0vWZQQAeM#icM^QzZ!Ykr} z=BZYMd(P_ewqec@g^hPHiEiQA73bI$-?`+<8fDz6R%ET3Q&V0*v` zPLY{pemo8gUS*CRlQ5?#U^(3>$<)xx^<|lqA`IoGk60~^2i<*ama-z1mJ2h{-;$lk$cxHPWaP$= z2Uz6B`@$S>t3>(-lbtd2^DHdZea08(4bfSu9aWd+foyzeX#pb4EdUcjG0ov6&A4ll1Mi%iTap{TS zpd}MHAI0jL^5PZF&xtY%!QiG^;d1v$!%&<_6y$2DTWuNH3H8#?#5P6U$PBrtlNHs4 zHVzYBOHG&&O%6&GSu;mPHvD1-ML4mj3X1^t3X40+?zHKW5_Cy1oyY=R3a^X>FfAb! z=``(-On*`|SDUU;#TBseDp5W9l%!SY0}&daOeceE$q^XpMTR!C^-HFx!1{JwT?hJm ztLs`ph3K`cTA!mXU0rp@WE}zDlilb?P&qQY!@a6ksIlsyfz}hCL@!xS9?nKRt@sn8 z3|87!=+b)}ndI){Y148Xne=gGk5;C-TRDZZdo7s~qy2K3=$PP?xf4v{;koj29(2Fz zDJTEKJ;=%D0w<7uEL2YK+L>FBHb<(v&BOU4SHOZH6?eE@sd<#4hj`=GkbZmmm+(4wvQoJMxo3nhM#*erT%Y@zbdli zHv3#AOQfuXQ$0Dw`=V$IAaQ29Z+qauetQZ9Y3E1a()UQ=(0eMWGlaBkmJ3zUrNcLa z4SbG5C(mN#NOeNY$QaGgxs{9J!$ga2DOHjt%tU|Rd9-HtQcn@NK{*t_0? zeovvHc0+nLc!s`IAT~LTH5I>5t4)gcoyL z_z>t_c{w|gDxzRzLgnwt-O|f;K7;x1C4ZU^m4Di=DN?5YU2@O=T5{kVl#Pn=?WgEh z$MRHUeOR10s-JmIg3P~$^~nCw<*9rqX-#r(=CtkXd=YwDFUNbaPp7(kC|0|<%3GOz z{OO&k{rqc_=qp`G55uK@-%?-e*;Ai&c;er6P?mZk_o3Y5^?-Ls+Vu15{cXpMDfURF zmJ5T?Cm@f4EtXLMrrN-!^YlY#)3YR@E0}ao*WK$HxpWVgN9q|3T+$1Be3Cn-_w*cj zv-GIV>V@CiNdj>l8I-&ikX`xM{z^h&MnjTwN5SH+mfn}!|qQl*V1a+ zWx&*XPCUDCYO|VCoYkSl|4EI}#Eka+VZ^LBw2UgVO2=pX$` zFXa-g{L$Q&L0|z^gNDJE^wraSzvH=9f}w0@JQYWS2Qj?e5DC4wzViOQQocrawThdg zbx$+V%n0kn+@YiV@}NrDI1jkm(eAi%_4q)FL-aIbno9fU@X&VfMy{-U80;3`ao_M~ z5%6y=-R&gy=JvfYv$yNPXBWLpC)N)&&Y)&P?c{15G@-}CW4nS~&UX4vcaU19B2q0X zngRH<>eoEZwv4LMh{$d6z=M~TQH-$!>?-(0^8y{W5D=S zegb!bw{<{ni^+q!bjN)F(AE1Ld&ge@7NuR~6Zc8K9h5rC`U>mDA4I=sMUId6cVX?& z_L#4>r?}-Mxb&uw9s4h_7&dKlZKux^9v&kk zTUi~DAHChr^mV7ljV()?i#V@ut6*(IHJ9&wylm=x8$rpXBak0LCfo`iKWp_!IUpvoUyPm8CAMQDW&A0= zlQ}BDe55y_CezeuvD|8?cow~(HSzr(IDUhIPpz!ko;OM8tLW?dw(04)NunM&klOhb z?rx@RN$qf!!gUFn^yme{e-)1JK3QC_n&>!rM>*(e$t(I z@-*?pN0IvH*DILr>&6cr-z|*J-AR=?PC7r$zcoX4AlW-@hK%q%<)Ei~yMF(%jZveZ z9tFN1vVgT(`9F_|s3>ldSJ}|q3HiEuGo^JC(0VUaM-n-=M*%nlZsLgUx*xmFaBKkE zx%=Hl@`z5M{5+HaF&XheV#a87nId1dgv<`3n+gb=PUfl__dWe)a`|uC7Pq^`F0Y@$ zQekvkGD@N+KB)!?>hzU6YMys2F48f+Knuv=PnsoJv1 z`M-JwS?M||ADWjf`!a0{MWe4=n-^p162Yukt!lM}9v7QD8@4$9Ut5n?1+H+o>vHq{ zl+LRG{v2Hv>~yvHvv1SCihzyFZD;Ju&+~G*#VeNe8~u5=?b>CPPzmP+e;2#1%_Ss3UDnRpW2~QVEonVJnOW#$Xe-gk2uXKNZ zngMS%Bt#38VI^ntBLfNy)p2KQDx4iI>K(Q%bJ*$rVE@0m1|_2Y&#plpy>|F*c$$Hn z)%EhN01>B;2mI#d+xIts@2?R}vzrTArj(J*r0#aG@y1z2Z?%i1>P%k!CDSVKPswL) z2lJaNRc8eiIlrn?P4xPL+w;#~YA_Lvl_4ST$NZ! zRT=hN!+^KHP}+8Arq^&}Xin&hs;8j3HUT?pj4u?+WC|UDse%{y2%wq%$?;|7n-hH} z``lUCMsYFVrm7eM{pSRCNY|db8FS1GcT9>0#62?`{2#L%?ia(tmET!LI+zMJ;9zC; zCTTCI4nIRr4#%4SV+GGC=bMR(nxRvIhY-nqy!v@sB-V8SH`Y>Jl*rpQZPdF=}vP= z0O2BZd9<*+`l)I1SGs1Z`EQ~>_3waLw{+C0qBa|8hhKf!=eS1hb_jp#+xNN-Ms-aT>{|EIvD%9xy<3)tyA7bDeILhs1Fu75+ZTDBypr6afFH=txFuOiyNgBAsUe*8WAEACq`tl`-Qi> z!15v1%Wevmfe(I_cPyCsc!-m8_^4zEefd&y-wzrZjH^w z=u@IuJs6maA**9MU?u9<3Bbm}+T%MRiur69tD8})WBh1xeRT|zAlUnxMtdkY&;!PG zgwwoea@I6ReeL<6jgU)Uvb@xlKjZ-G_$HNKcVp^5+@VXBUSE1;mv;NUxd&^5Keo$1 znNK}vw`LG$e>3^_>BQ}KvX5-w5i+{NR))N1?KFHz~ZuW)(xkJLG>n-un_y3}- z#W=LFnB8p_^IWoL%_hiza%RJv-kzQr^Qb=x3g>;o1Oa@FLdS#P?gH{LFq-yR!2r0k zVs@W9rDf~vd1g+Ny?j^kgReQbg%XYZ9Of$rOv_wvz8ODbjA!w>%6=GM7M|QOhZ5j@ zKqK*5b37Q_N8z3A8tnWW#y(8=$$rcyZoE^x%XG%44e6JY^tyO$vIf7zw8x@ zwGA#xR=aG_dDgpj-|L3~d8n}j9cRdCMyTB|*9$t)`lk~h&VQ;dik(ugR_ed|M3-F7 z&iz>n;VFRVFPx+7dzt9BzJXK)87&^CdJS>#sqJ%)8?+|eYXS&?11GvX2^2k>4sHlO zgwVN-T3TyuZc7NdDZq82VC>36h>hC|PxNq|gX@%tG}S2S>kr;`aFsEM1bY$c`gHh! z0Y4l_%a-%ugrFVy_GNth6M2s8E`va_pFiJ`&VB4-veXQPy}Q*$yiBkdE++pCZGliY zJCX=kfGPk+K|L$eS{Ih&r0k&WK&qi2{C zRwYx&HcYC-ql*N}PnZgi3|MQyZUqQu@22_i3NRBgYW4M?Vtm%wj|a5K}5esf~?y}>?bZv=xP_{G#UJDo$pNyBX)dNo1@pj#LlF{+?5+Py!|x zDdm1QQIAG zubC~dcs~Fbw2W@nHS@1QPdHo~<{#oikcWVQ!*dce6yxN%HPWd3ga@EKl)_H%I2myU z3cxR8W>iYbc`WHcbF?U*`Q1Sy$0x{pXxjGtC36$bP%Gr{W$)vusfUXyYfVXf% za8sBl^Dv~67d8AsXQn=+NNks0LMzV?P)siu_ZbnfE+mZWx9vP!c)k=}EkOrDUwO$_ z2P3cpK}JZ)@bN_#-&@8-#Lv%#H5VBkF{CM-u}3Qvc_9)a%sv)m(FptQvn{8BGD+10 z|MXoXiwpaP@MrX4Tvbs~HHQL??c4kdp^R8fvp$BmOZs|ScpSNW>vc^nvZFE>HVg{Y z6mRP|1#?<944#nMALaE2iC$558(k8lt0n=TG0N%u1wBy|An~Oy+goIgJ+hM6!qLOu zmz``4|4oQCE3E%~h*VUo)XC*W)Dddr@}hRb5zI7$hYC=Ek8hC5SMl6u-?jrfZD$!f__)L~@Ekjq*Yn&m#-HID^TRpJKz=;~+bV8t z4q3ddxzD>L`{O=(e3*_u$oC%Pjcw{b2EmR^pa={j#iJvTlIY;U3-QoV zc-{VNPAb^5*aqsQ7i>$D@Ft9y6X95}=UK+k_<0db0xNV-TRXj{){(R*yJz}zzq1Nyd%YPJofe0SzdiE8+&D zE-~HM=qN0*Rx|plP?TYfFq{jR#_8r7zek_^w>vB6IrE4J70R&3rx+)<3GB`Irltw; zRN#5@yBEFB2Y29H^)Y!c{|XTYyaGp(G@e7!z!7khwEPPL%zxV)UBD(Ue~l6*bop%` z!#R8oG|2-bKzVTCB(?dDWbSUay`~3cskhpRLs2(Y{R)lTML~?5@qGQCk$+@A42fTy zYHv?gm*U+EoMIRRQr&Xk$(_RS zw0HGR(dE0~`I?Pe=nD!m>$bt)IuEZdz=3mNbOrOWV!KwZLGn2T7h*Q7I`)5JCfO}g z*_#f?>GODhC^76yreQQ7QsBQa-hyiIfQvj)90;X}<+R&(5E*%5#B17W7I_}*Pu$hk zr^bo;2;lQ>Ep0wFOQ^GwVGaYo0?Hm&g}>9!O9l`n_0tqSI&#`LJa?#cJGcAm5S!KTN^ z)-A&IN^>oMV`)qFTwE&(0~nBzlusF!79>s0p^M7r&SNcZ|F9#Xh9X7(>V(1~T$EtC zjgd!peVA1dG%Bu*uO77a18!-x=PdF(1C?OWDoOiheHCO|NVbVGuM&YP)kgi-ycbP1 z$x5bl(sb=-_|1^OOt*E0Y}rflJ!Z`=X`;678IdYo2@9i)HEarniBJo47zhes7O1v5 zHezo*e42|LO(8bmWPrHdbyC5Qq$kNleIPpwtS1#J$EPkV61l>-=a3|TzH%b zzZAlavAe^peN&24rXMehjxx@S?8^BBi~-T~r!hz9WmtbV8axu*qS+FM7!+FXXKXKO zf`zEo*$@CTDlxoMrPg%cwbvT)gkKJ0qdPcWWUf45Qq^(U37FvcRWSr8KFp_7RxC9u zR<*+P2#e-*w8?ChY2Q4lt6*$)He<_t9mb;W)m$T@bi2)-3X!i;^X^y_R^n3CLX)Gh z-Q!=Zvz(PsRBY?s#3hqkc=*(8l+aX$kND7y~0<4gR2p4{KqQ|aLKx2I_Fnk2QD{idn5`u7VCmT!UT16lcu~##OYFrNL0O-+v5;!cC?Yudd=$voIX4$l)D0G2_;vf)X z$CPbF9kgZ$~M`EAqTk+Zk2Bx*x8Xh2)COUJY1)oe60T+38g6$p!d>mPLXLl8yE z{J9gbD>1jHsGIacGKquT6tayqTxEj(F{fo)l` zz?pA}CtM$pBA#?Pokyes+1lO^cpcxyGzXi*n2<;ZSz-^Mf*4H+g|o$QO1D6$vlj`k6W%Ds zMiR#`hx!=fjkQBpl1_Q!mQJy{fd*(|b|GK;?y#q1dQ$V&UU%-dC~Cs)Bp67sM`Z-@ zufnjDJBc+|NE_QaS|K^@J1kHO60x!_<1>*Cig=M&9#JT4h+Ky1^iRUn8IHX-FYCdn-Z+wkVHb%Zb1r(*2J;pf_ZUI4fpQ%5ip}u$%t!1UJ}4vN za|9hN#5oq0V}9z*(zIv;Ee>FIIu9}(VGJDa8XZ01_~RM=U4(=d0FrZJX}r8%yTzoL zJzXT8tzRuAQIyaNnM8vpP=jfR#?wDFBX-R(cyBuv2n;;53=r+p9Yu3S`{T%-p9fKj z*HLD|#;rnQGM`X%y(dcQGu~#M+^8SoD0KPbQjzZwTpvOhS|w4D`zrJ%;Yv7^rmD-S zeQiiQ!5m*mb|DLe8EgPYAOLYdTlu^B{@+1Yj^raRVC@hzYCYHZbk5{)b=#_KPlZva z9#3&wSfX8Ma~#fU1+X3go%|cGh+TARGKL)d>k;VjG4GXGUSv+r|Kv2>Dmj@&GQ)j+ zgHCcUZx(IM&8$ft%u@ zd158bZkJPOw)W~f>Fzxz!TXHNhk4>lRdo24d*5eZg8cIXGm|T#8Pwx9_h$66PhWGV zH<{H7B5iFGZw21?KyqtwqjKp1a>;^(^wMchAtq7{+8fBOnU`|pug4=I6=YH>0jiIX zA0Q=;jQ4P6IPU8qe+qZFzV8bE*l*=f8Wuy?wan>ZRS|wC59lFU^6w_}8@+D*Zm5J| z65z6qTb)r~$E$=s3?`(C??@XrZ0M7-#>eX7kFO!Qez(8qV!jr%0q0-`))Vh}+r%CY{D2#D|ifd>5%IV3a}t~qyWmc zqGlttAvwrrh5Thj6&!0AJ_LKsBdzV0;*4l#+dUwy@S0KTonn@12}*{{+$;*pY&`2Z zr&)8e9NwJY$RK+Mqv|+Oi7_9GaNt{t98t3@8ZW2@rH1qKC=i;J*{fbt21C(8N`?Ek zOCt(0H4P9`!z|hxzJuSRZ(5iUINl%ulKRyBBma-l#LX@LefyC4k!^7wUY#Zs9zHwR z@k^^1)+>XVU#a&G;DB5isKF!=)?FQyF;saKZB#4D-kdW|zc6rT>^FGUqrP!8`KLM% zMvqZb(X?**e9fg4ww<(XwPwiwSJ`z1MYT0+6cq&lCBqO7IY>@JJOfA&1W|HMLy#at z&M+!4h$M#`MRLwLi8ACM8Ocb_3^@!F?woV~hx_oq+=s4JyJ}Uh-CeuCUDd0*zbVr0 z+`Hh1_@QE0ZdqS=XiL;oLaivv&$xSWa)#WNq_q*EDktFLj#R8y!JSsl0|gpr_pdD; zdr8i~`uhSJ3SzZ9H~GLP)?|6qk`~O(^Gdph$Xt2cA`R4vA5~^p)yR?3w*F!M%lL+? zk|&!-$-3KgA>B@F(Gh%eAYDK6?D*x2shG{nK>y?h-0Q9fRcF&5F2`0^zh9t%Sf(c2 zCHWw97CK*fw(aYRtB}MN(H^N)g}D(%riq{Fu2FsEMTv|=9G(SznyT` z*hAsxf0oC;t{=F(`|v1q`~w@IwYIQkRa6i`w*0)=A*<;hf$C$`;;m%`9_tm7M%-Zv zo?rzfL%5C3UK-)zoO(g3D;z({bG)^%q*}D# zj9#?DU6SP9He5kEA6{Gfvz8}9irMMEWmBvf609ag#V_U_L?#4u?CfZKQySX&Yr^vF`khpR;&VcGQDyT-R?#AKBs;HEgs99%&Dsvc zcL_LTZg51TxTL>FRE(n^GF8C~B;iHt_g&CgQyMd-a5Q%u(e{9dOsj|JqYr*3c z<4gA&;J|c=3Z};1rqQ0NerU=nlMBSGRKEW?%)Ov``l?V`{T2efY3jstWI(T*Iy158 zy7H4cbZ$=}j2`eFBP1@%=-QndP}I-(*Kcu~;so!NHJZ^t`+lg4tv;5W}SV z2>FUPyz_vwb9g#Fb%?8gqm$*;Ga(^@dId*Pb;myQc3$7zil17%1>)HHWKKcys4gMr zfn%NAVn46n+4o^WE*xQITSmkr1I2&H#fUTh>M9_jNp^n8bJcJ$vE~2OLE=^@n^p>e zeP&3Osf;bs@m|LT$EvYF|1OUv-=DEOB){_7Qwq&+^>u8FsD_dvl4RMi)!)Psj0dMH?Z@G%(vwVs{9&{Tl2HrRLlw@r>OnN2>8%6zHgpXPf;`QSyyI*NLNYuD7sJ!WSL>bLvB zGOI<2ER8$gcq+{FRw`P{egTNGPHv;%QQS>Lbo*j^(+OgQG^^YdEfUnHR6F<|;;3fLecwy$_lE8hH z8|CX|BDRp!dqGLUh1argY<08Xc2I7^_{Ae>0Xx6MZQc zKohxDu%n5_Y{PKvAr)H)(k((L8^zpbUm@k#McN&~Oz>L5iKKb?kWXXCoJ};_3e0bO zaJi$DePE)!(px45wG8T&OLy7INpvUxns&N|1sypEoLZuw{NA>MI9u!}X3rjT#XqWw zg>2w{C*#b5Z1)K)T=R%#ZpziMo}ku(*n$n*Di`k7Qx0&`3CCGlV)L&1*>N?Cs@SSC z;|z41k0a$jx-cGQSQbV`ms7lnb#NTu1}D%D<^B8A@s4po9*IHl3_DJD2_$`h>&8HD zH}RPKpF<5(aMDX40CE(S?LB}Kr+reMpCrw` z=!eoXLMri@d;DQsYtSpjJ1!eIvHyL!Q4So-;!Q_LM}s-L+lRZT_m)8a8QWqaSYD*8 z!}CNW$=Jgr5AxZ29B4o#&`(N+c_B?ZK+oXoy7g5X9nY^-hvhG2Nyj7jfw=>eAl4oE z-KWt0#)yMBC?}88J+O5KOrE7q76D59MGQr?`yKcoup!jaw<=J@Lr=6+zLnyhAO;{CQSXF5l?MAYB?$cSjD}P>X12P8b z)|j)n6JD5iRG`F$wBfgB;=l8FZruXhOt}XWPa54(x>bSGvd-qytqYl)KGBE^a>a2F zLt*rLLN>trTpyp^%*r812BVma<}s46zSGC}-)fYAjx69^o`d$J4-^uZ&%3{0OT78g zMuG^9pxK zjkPa_>NEM6@$H@x6$|lKRzd9oRhQ~>btS1|O`i(yncK+(G4HIJZ#+W=fh>eKxP ziI%lbSPa8o3+D=#+xRUk!IT0E5)m&?-ZUl$aDHAYq)j+)FUCX{kV7I6as?SFQ)5nH zriT}pwOE}QRN{SSK-KzbpRk($D80J2hSBB-Po0xV*(`Kz&Ra1Jv6v8IEEz|7YYF=hF3?E58+u^)EaMuv?I*d98$sc2Fr9B)J2S|*KrODo zSI$eS=JpNl0Rm3~~6Any4I{5d+p4mbg28fDmkrVsr*!S1K9z5OHc4%9WO8zLZOpO6euWPipdD7N&!KlLS2&0+DU7L<~4(g|fIz7XtgF zzZ~XtW*%30TpMzt%NVc?ELiU+Snuo6#Mvx1ay4Hnw!dT3i|WOlN+}zrBN_IUE4(jp zEtDb{?m;STU%QXP6hROhP{p^6AE2A(y_o9IcQgB0jR8dv=R=PwZV#ucfK}U@Fx~st zhq}fr6~&)^p}pJ_G|bEWcUk-OQ%}>i zf@se;*Rr_;`8=v^(`06Y1o`q>ZK+*rzMxW*0J;o)Scm~Bru^s$d+$mTDUvVky!dZY z`Ple#DVyxqvp*RzUbZ=EpZ$c#w)zz^*a_doKCYLZ&xr&;4JFzafbFuv?Xtu97vqy- z^U^OU08@S3I;>JXpd1Dfil9e7-_kwY{vk|pEh<8V7aF|K;e`P&jCf(b_IO7Dj70V8 zt<=Ep*>}bowMIu!E8OZPImiLD-So9pfroDypw!D5fpdtwNu&(B!-QC(? zi<58Rae6KIwJ+B!RckPOq|j_O8o!h#GR>tX0qQ0$gBq#P7j%M+B|9{m1ZlNxEtcsHhE&K1J>e@|k7fOB zbI0M4s%l&eB?g74TBm>(NPxdpK$@$g;Me}Cc9FSsojP0kjHu~~kuP`CTS_{#$fE4s zoFEB=d1;yR3mao^Rf{ftMhuEzxBW)zHEA?76lsndsgWD0B^#*&iLSvK2L1+TV$DRu z6X<-Fv@LF-f{g6*U#=k&+x%w<#MC07M}Kxlw3jVufFPBWgsq|-mkBf#lV*B$Ej!@M z6C5)C6*-K?bALPeg13rNMN04*z-}%R5zY5YziT!rs4O`fqNYYmbF%4ac!a>-5ExTg zdO#UN&fZY%u3hU>zIl|mm$c{@C*t9zod#sW%Nol%5m6RV}`hl;%%=T8cM3+CB_#`13saocRR_Kn}wZ zJ26ll4c8j)5u3{; zi4x(vedh)<8F@4JGE~+J{KfV0MESO?*b9gzO-ZKYF7ul@tya1yfO0}|$%!s3;=JVX z6d)m-FI=fLL3~72%csT(8T_`20hDx@Ey`G|ZP&h>T5iZII2l~*fB4(hH}2qEwssQP z|EhDWQX-^u9(1?>VwwfnNttI4{^<}gY0r5ublz6!bjIcQ)cE@rq%kMD-0BRtV5Le^ zbCdB-ihX|;{Vq$gwgr}#I3G93ld7>Sj*@Y_=QF``kPnwa)ZFSvJ6%6FnZimfWcG@- z3Xnn$VB$f;wYfPjo>DS=26bSfJ8a$8(`3@?GfSe>>(W}2>eKwsfDg`kts3Q5(ta+s zN1G0bYwKv)@mn7+b?rBAO9mvl(&}b80~x+Srj=JjhpqXoFMfYM(o2xn3vL)M^ElOS zt$2ADNG!w1x%0((%_hjMcdQ0 z!IJn0?p664;a*d_$s=2(22XcUyRft2KYyZ=a8vwU^Kk?-2<1hS|M|Z`Pr|A>nz(S| zt?2iJLJn+}qlOOaQewBEk1j>0eOkOx;V0h6&FtmG{L0#9-hsdjaZY~_ek0O!B9SWC zD1%p;p@1RbI1Q(LCsZ`-5zc`VAsYG1qKA?p{U-fQc?;mVm)-Mv{QLrDG36V*mlDb) zFXB7ZPuH57MM~RW0#*H&oPiIkQ>JZ&#G>Eu*`z5AVDa#*AEUErK6fm*#IsouOo8te z+>N(R)PbXOdlbsp2`livkP#izkkCo;)km}iBiaZNZC>n2x*O_mS%5m>K7*n<{xuCG z`UnL_)pC@mh+g{BGQ1a(?Ym2bC=mtpHG4x6fEvC%cHQ7URf^O{;QVMXM+`VW2F&rQ z_31OZZGTKoDRo=FU9aF{p98j~FXkIHwzMi*b3JFXwIp>SZPmtgBpK3e)pK=tPzv<{ zkGVcJImgiP&#RCn_`vNa1vOPGP@;$)l(PLH9+J&Bgk5NF_!p`}^>wQxBFYAu^)2n2 z&9eL3J49xiq8J|>+4z$H56X^%!Ym8=wheblb+D)bo_K@XSY-S;&wac$bTKm}aj zTc!ND!SL4~NVRZ*!#VeaBYdQq5vxqGKjuW&~VI^Mnk1rWU_NJFB=k})ESm>SQBqzI+*u-KO#o&x$NsMA?6BQN%e4|bm zWL!}TaPAQc?6b)u>K+Q15H#EF=2S;T(~_))Y#{}Vx{S6|d_&U|!l{z5Rh4fuflZpy zVEAE;1kxP$-u(yo?wfVCN;^u}a8+kYmPl6f*b0BVNol4o@6ZB<+F_iVMEoFSh0FHW zpHx`OP5>8`P6u^PSSQF(Z__TB&D3Y9rolQ@ zJjw{#VV_{67Ghg@HmgJhsNtXT;NS4zKlk9j_YxTMe9K>OA=Oo^d+2dP+vBHO=ga$0 zWsG=QfS7v>jUH)CCg@cMfm6Gg++skTRSLf3(4HC5*8T%_`k*b9-CBg9dh}?A-Bc6Q zR(A)0FW;dnSMV*k?+N*Am?N#Tq&Pi@F@bE1svI=Eprr|p>-+;}8o!!_tfI)ELn?P9 ztUS5bn=Z>&v1(S!A{J}*9R#9h*cFX6> + * #else + * #include + * #endif + * #include + * #include + * #include + * + * const char * helloStr = "__kernel void " + * "hello(void) " + * "{ " + * " " + * "} "; + * + * int + * main(void) + * { + * cl_int err = CL_SUCCESS; + * try { + * + * std::vector platforms; + * cl::Platform::get(&platforms); + * if (platforms.size() == 0) { + * std::cout << "Platform size 0\n"; + * return -1; + * } + * + * cl_context_properties properties[] = + * { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0}; + * cl::Context context(CL_DEVICE_TYPE_CPU, properties); + * + * std::vector devices = context.getInfo(); + * + * cl::Program::Sources source(1, + * std::make_pair(helloStr,strlen(helloStr))); + * cl::Program program_ = cl::Program(context, source); + * program_.build(devices); + * + * cl::Kernel kernel(program_, "hello", &err); + * + * cl::Event event; + * cl::CommandQueue queue(context, devices[0], 0, &err); + * queue.enqueueNDRangeKernel( + * kernel, + * cl::NullRange, + * cl::NDRange(4,4), + * cl::NullRange, + * NULL, + * &event); + * + * event.wait(); + * } + * catch (cl::Error err) { + * std::cerr + * << "ERROR: " + * << err.what() + * << "(" + * << err.err() + * << ")" + * << std::endl; + * } + * + * return EXIT_SUCCESS; + * } + * + * \endcode + * + */ +#ifndef CL_HPP_ +#define CL_HPP_ + +#ifdef _WIN32 + +#include + +#if defined(USE_DX_INTEROP) +#include +#include +#endif +#endif // _WIN32 + +#if defined(_MSC_VER) +#include +#endif // _MSC_VER + +// +#if defined(USE_CL_DEVICE_FISSION) +#include +#endif + +#if defined(__APPLE__) || defined(__MACOSX) +#include +#else +#include +#endif // !__APPLE__ + +#if (_MSC_VER >= 1700) || (__cplusplus >= 201103L) +#define CL_HPP_RVALUE_REFERENCES_SUPPORTED +#define CL_HPP_CPP11_ATOMICS_SUPPORTED +#include +#endif + +#if (__cplusplus >= 201103L) +#define CL_HPP_NOEXCEPT noexcept +#else +#define CL_HPP_NOEXCEPT +#endif + + +// To avoid accidentally taking ownership of core OpenCL types +// such as cl_kernel constructors are made explicit +// under OpenCL 1.2 +#if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) +#define __CL_EXPLICIT_CONSTRUCTORS explicit +#else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) +#define __CL_EXPLICIT_CONSTRUCTORS +#endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + +// Define deprecated prefixes and suffixes to ensure compilation +// in case they are not pre-defined +#if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED) +#define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED +#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED) +#if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED) +#define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED +#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED) + +#if !defined(CL_CALLBACK) +#define CL_CALLBACK +#endif //CL_CALLBACK + +#include +#include +#include + +#if defined(__CL_ENABLE_EXCEPTIONS) +#include +#endif // #if defined(__CL_ENABLE_EXCEPTIONS) + +#if !defined(__NO_STD_VECTOR) +#include +#endif + +#if !defined(__NO_STD_STRING) +#include +#endif + +#if defined(__ANDROID__) || defined(linux) || defined(__APPLE__) || defined(__MACOSX) +#include +#endif // linux + +#include + + +/*! \namespace cl + * + * \brief The OpenCL C++ bindings are defined within this namespace. + * + */ +namespace cl { + +class Memory; + +/** + * Deprecated APIs for 1.2 + */ +#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) +#define __INIT_CL_EXT_FCN_PTR(name) \ + if(!pfn_##name) { \ + pfn_##name = (PFN_##name) \ + clGetExtensionFunctionAddress(#name); \ + if(!pfn_##name) { \ + } \ + } +#endif // #if defined(CL_VERSION_1_1) + +#if defined(CL_VERSION_1_2) +#define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \ + if(!pfn_##name) { \ + pfn_##name = (PFN_##name) \ + clGetExtensionFunctionAddressForPlatform(platform, #name); \ + if(!pfn_##name) { \ + } \ + } +#endif // #if defined(CL_VERSION_1_1) + +class Program; +class Device; +class Context; +class CommandQueue; +class Memory; +class Buffer; + +#if defined(__CL_ENABLE_EXCEPTIONS) +/*! \brief Exception class + * + * This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined. + */ +class Error : public std::exception +{ +private: + cl_int err_; + const char * errStr_; +public: + /*! \brief Create a new CL error exception for a given error code + * and corresponding message. + * + * \param err error code value. + * + * \param errStr a descriptive string that must remain in scope until + * handling of the exception has concluded. If set, it + * will be returned by what(). + */ + Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr) + {} + + ~Error() throw() {} + + /*! \brief Get error string associated with exception + * + * \return A memory pointer to the error message string. + */ + virtual const char * what() const throw () + { + if (errStr_ == NULL) { + return "empty"; + } + else { + return errStr_; + } + } + + /*! \brief Get error code associated with exception + * + * \return The error code. + */ + cl_int err(void) const { return err_; } +}; + +#define __ERR_STR(x) #x +#else +#define __ERR_STR(x) NULL +#endif // __CL_ENABLE_EXCEPTIONS + + +namespace detail +{ +#if defined(__CL_ENABLE_EXCEPTIONS) +static inline cl_int errHandler ( + cl_int err, + const char * errStr = NULL) +{ + if (err != CL_SUCCESS) { + throw Error(err, errStr); + } + return err; +} +#else +static inline cl_int errHandler (cl_int err, const char * errStr = NULL) +{ + (void) errStr; // suppress unused variable warning + return err; +} +#endif // __CL_ENABLE_EXCEPTIONS +} + + + +//! \cond DOXYGEN_DETAIL +#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) +#define __GET_DEVICE_INFO_ERR __ERR_STR(clGetDeviceInfo) +#define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo) +#define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs) +#define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs) +#define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo) +#define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo) +#define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo) +#define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo) +#define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo) +#define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo) +#define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo) +#if defined(CL_VERSION_1_2) +#define __GET_KERNEL_ARG_INFO_ERR __ERR_STR(clGetKernelArgInfo) +#endif // #if defined(CL_VERSION_1_2) +#define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo) +#define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo) +#define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo) +#define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo) + +#define __CREATE_CONTEXT_ERR __ERR_STR(clCreateContext) +#define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType) +#define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats) + +#define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer) +#define __COPY_ERR __ERR_STR(cl::copy) +#define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer) +#define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer) +#define __CREATE_GL_RENDER_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer) +#define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo) +#if defined(CL_VERSION_1_2) +#define __CREATE_IMAGE_ERR __ERR_STR(clCreateImage) +#define __CREATE_GL_TEXTURE_ERR __ERR_STR(clCreateFromGLTexture) +#define __IMAGE_DIMENSION_ERR __ERR_STR(Incorrect image dimensions) +#endif // #if defined(CL_VERSION_1_2) +#define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler) +#define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback) + +#define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent) +#define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus) +#define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback) +#define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents) + +#define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel) +#define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg) +#define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource) +#define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary) +#if defined(CL_VERSION_1_2) +#define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR __ERR_STR(clCreateProgramWithBuiltInKernels) +#endif // #if defined(CL_VERSION_1_2) +#define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram) +#if defined(CL_VERSION_1_2) +#define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram) +#define __LINK_PROGRAM_ERR __ERR_STR(clLinkProgram) +#endif // #if defined(CL_VERSION_1_2) +#define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram) + +#define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue) +#define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty) +#define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer) +#define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect) +#define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer) +#define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect) +#define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer) +#define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect) +#define __ENQUEUE_FILL_BUFFER_ERR __ERR_STR(clEnqueueFillBuffer) +#define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage) +#define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage) +#define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage) +#define __ENQUEUE_FILL_IMAGE_ERR __ERR_STR(clEnqueueFillImage) +#define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer) +#define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage) +#define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer) +#define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage) +#define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject) +#define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel) +#define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask) +#define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel) +#if defined(CL_VERSION_1_2) +#define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR __ERR_STR(clEnqueueMigrateMemObjects) +#endif // #if defined(CL_VERSION_1_2) + +#define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects) +#define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects) + + +#define __RETAIN_ERR __ERR_STR(Retain Object) +#define __RELEASE_ERR __ERR_STR(Release Object) +#define __FLUSH_ERR __ERR_STR(clFlush) +#define __FINISH_ERR __ERR_STR(clFinish) +#define __VECTOR_CAPACITY_ERR __ERR_STR(Vector capacity error) + +/** + * CL 1.2 version that uses device fission. + */ +#if defined(CL_VERSION_1_2) +#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevices) +#else +#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT) +#endif // #if defined(CL_VERSION_1_2) + +/** + * Deprecated APIs for 1.2 + */ +#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) +#define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker) +#define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents) +#define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier) +#define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler) +#define __CREATE_GL_TEXTURE_2D_ERR __ERR_STR(clCreateFromGLTexture2D) +#define __CREATE_GL_TEXTURE_3D_ERR __ERR_STR(clCreateFromGLTexture3D) +#define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D) +#define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D) +#endif // #if defined(CL_VERSION_1_1) + +#endif // __CL_USER_OVERRIDE_ERROR_STRINGS +//! \endcond + +/** + * CL 1.2 marker and barrier commands + */ +#if defined(CL_VERSION_1_2) +#define __ENQUEUE_MARKER_WAIT_LIST_ERR __ERR_STR(clEnqueueMarkerWithWaitList) +#define __ENQUEUE_BARRIER_WAIT_LIST_ERR __ERR_STR(clEnqueueBarrierWithWaitList) +#endif // #if defined(CL_VERSION_1_2) + +#if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING) +typedef std::string STRING_CLASS; +#elif !defined(__USE_DEV_STRING) + +/*! \class string + * \brief Simple string class, that provides a limited subset of std::string + * functionality but avoids many of the issues that come with that class. + + * \note Deprecated. Please use std::string as default or + * re-define the string class to match the std::string + * interface by defining STRING_CLASS + */ +class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED +{ +private: + ::size_t size_; + char * str_; +public: + //! \brief Constructs an empty string, allocating no memory. + string(void) : size_(0), str_(NULL) + { + } + + /*! \brief Constructs a string populated from an arbitrary value of + * specified size. + * + * An extra '\0' is added, in case none was contained in str. + * + * \param str the initial value of the string instance. Note that '\0' + * characters receive no special treatment. If NULL, + * the string is left empty, with a size of 0. + * + * \param size the number of characters to copy from str. + */ + string(const char * str, ::size_t size) : + size_(size), + str_(NULL) + { + if( size > 0 ) { + str_ = new char[size_+1]; + if (str_ != NULL) { + memcpy(str_, str, size_ * sizeof(char)); + str_[size_] = '\0'; + } + else { + size_ = 0; + } + } + } + + /*! \brief Constructs a string populated from a null-terminated value. + * + * \param str the null-terminated initial value of the string instance. + * If NULL, the string is left empty, with a size of 0. + */ + string(const char * str) : + size_(0), + str_(NULL) + { + if( str ) { + size_= ::strlen(str); + } + if( size_ > 0 ) { + str_ = new char[size_ + 1]; + if (str_ != NULL) { + memcpy(str_, str, (size_ + 1) * sizeof(char)); + } + } + } + + void resize( ::size_t n ) + { + if( size_ == n ) { + return; + } + if (n == 0) { + if( str_ ) { + delete [] str_; + } + str_ = NULL; + size_ = 0; + } + else { + char *newString = new char[n + 1]; + ::size_t copySize = n; + if( size_ < n ) { + copySize = size_; + } + size_ = n; + + if(str_) { + memcpy(newString, str_, (copySize + 1) * sizeof(char)); + } + if( copySize < size_ ) { + memset(newString + copySize, 0, size_ - copySize); + } + newString[size_] = '\0'; + + delete [] str_; + str_ = newString; + } + } + + const char& operator[] ( ::size_t pos ) const + { + return str_[pos]; + } + + char& operator[] ( ::size_t pos ) + { + return str_[pos]; + } + + /*! \brief Copies the value of another string to this one. + * + * \param rhs the string to copy. + * + * \returns a reference to the modified instance. + */ + string& operator=(const string& rhs) + { + if (this == &rhs) { + return *this; + } + + if( str_ != NULL ) { + delete [] str_; + str_ = NULL; + size_ = 0; + } + + if (rhs.size_ == 0 || rhs.str_ == NULL) { + str_ = NULL; + size_ = 0; + } + else { + str_ = new char[rhs.size_ + 1]; + size_ = rhs.size_; + + if (str_ != NULL) { + memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char)); + } + else { + size_ = 0; + } + } + + return *this; + } + + /*! \brief Constructs a string by copying the value of another instance. + * + * \param rhs the string to copy. + */ + string(const string& rhs) : + size_(0), + str_(NULL) + { + *this = rhs; + } + + //! \brief Destructor - frees memory used to hold the current value. + ~string() + { + delete[] str_; + str_ = NULL; + } + + //! \brief Queries the length of the string, excluding any added '\0's. + ::size_t size(void) const { return size_; } + + //! \brief Queries the length of the string, excluding any added '\0's. + ::size_t length(void) const { return size(); } + + /*! \brief Returns a pointer to the private copy held by this instance, + * or "" if empty/unset. + */ + const char * c_str(void) const { return (str_) ? str_ : "";} +}; +typedef cl::string STRING_CLASS; +#endif // #elif !defined(__USE_DEV_STRING) + +#if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR) +#define VECTOR_CLASS std::vector +#elif !defined(__USE_DEV_VECTOR) +#define VECTOR_CLASS cl::vector + +#if !defined(__MAX_DEFAULT_VECTOR_SIZE) +#define __MAX_DEFAULT_VECTOR_SIZE 10 +#endif + +/*! \class vector + * \brief Fixed sized vector implementation that mirroring + * + * \note Deprecated. Please use std::vector as default or + * re-define the vector class to match the std::vector + * interface by defining VECTOR_CLASS + + * \note Not recommended for use with custom objects as + * current implementation will construct N elements + * + * std::vector functionality. + * \brief Fixed sized vector compatible with std::vector. + * + * \note + * This differs from std::vector<> not just in memory allocation, + * but also in terms of when members are constructed, destroyed, + * and assigned instead of being copy constructed. + * + * \param T type of element contained in the vector. + * + * \param N maximum size of the vector. + */ +template +class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector +{ +private: + T data_[N]; + unsigned int size_; + +public: + //! \brief Constructs an empty vector with no memory allocated. + vector() : + size_(static_cast(0)) + {} + + //! \brief Deallocates the vector's memory and destroys all of its elements. + ~vector() + { + clear(); + } + + //! \brief Returns the number of elements currently contained. + unsigned int size(void) const + { + return size_; + } + + /*! \brief Empties the vector of all elements. + * \note + * This does not deallocate memory but will invoke destructors + * on contained elements. + */ + void clear() + { + while(!empty()) { + pop_back(); + } + } + + /*! \brief Appends an element after the last valid element. + * Calling this on a vector that has reached capacity will throw an + * exception if exceptions are enabled. + */ + void push_back (const T& x) + { + if (size() < N) { + new (&data_[size_]) T(x); + size_++; + } else { + detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR); + } + } + + /*! \brief Removes the last valid element from the vector. + * Calling this on an empty vector will throw an exception + * if exceptions are enabled. + */ + void pop_back(void) + { + if (size_ != 0) { + --size_; + data_[size_].~T(); + } else { + detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR); + } + } + + /*! \brief Constructs with a value copied from another. + * + * \param vec the vector to copy. + */ + vector(const vector& vec) : + size_(vec.size_) + { + if (size_ != 0) { + assign(vec.begin(), vec.end()); + } + } + + /*! \brief Constructs with a specified number of initial elements. + * + * \param size number of initial elements. + * + * \param val value of initial elements. + */ + vector(unsigned int size, const T& val = T()) : + size_(0) + { + for (unsigned int i = 0; i < size; i++) { + push_back(val); + } + } + + /*! \brief Overwrites the current content with that copied from another + * instance. + * + * \param rhs vector to copy. + * + * \returns a reference to this. + */ + vector& operator=(const vector& rhs) + { + if (this == &rhs) { + return *this; + } + + if (rhs.size_ != 0) { + assign(rhs.begin(), rhs.end()); + } else { + clear(); + } + + return *this; + } + + /*! \brief Tests equality against another instance. + * + * \param vec the vector against which to compare. + */ + bool operator==(vector &vec) + { + if (size() != vec.size()) { + return false; + } + + for( unsigned int i = 0; i < size(); ++i ) { + if( operator[](i) != vec[i] ) { + return false; + } + } + return true; + } + + //! \brief Conversion operator to T*. + operator T* () { return data_; } + + //! \brief Conversion operator to const T*. + operator const T* () const { return data_; } + + //! \brief Tests whether this instance has any elements. + bool empty (void) const + { + return size_==0; + } + + //! \brief Returns the maximum number of elements this instance can hold. + unsigned int max_size (void) const + { + return N; + } + + //! \brief Returns the maximum number of elements this instance can hold. + unsigned int capacity () const + { + return N; + } + + //! \brief Resizes the vector to the given size + void resize(unsigned int newSize, T fill = T()) + { + if (newSize > N) + { + detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR); + } + else + { + while (size_ < newSize) + { + new (&data_[size_]) T(fill); + size_++; + } + while (size_ > newSize) + { + --size_; + data_[size_].~T(); + } + } + } + + /*! \brief Returns a reference to a given element. + * + * \param index which element to access. * + * \note + * The caller is responsible for ensuring index is >= 0 and < size(). + */ + T& operator[](int index) + { + return data_[index]; + } + + /*! \brief Returns a const reference to a given element. + * + * \param index which element to access. + * + * \note + * The caller is responsible for ensuring index is >= 0 and < size(). + */ + const T& operator[](int index) const + { + return data_[index]; + } + + /*! \brief Assigns elements of the vector based on a source iterator range. + * + * \param start Beginning iterator of source range + * \param end Enditerator of source range + * + * \note + * Will throw an exception if exceptions are enabled and size exceeded. + */ + template + void assign(I start, I end) + { + clear(); + while(start != end) { + push_back(*start); + start++; + } + } + + /*! \class iterator + * \brief Const iterator class for vectors + */ + class iterator + { + private: + const vector *vec_; + int index_; + + /** + * Internal iterator constructor to capture reference + * to the vector it iterates over rather than taking + * the vector by copy. + */ + iterator (const vector &vec, int index) : + vec_(&vec) + { + if( !vec.empty() ) { + index_ = index; + } else { + index_ = -1; + } + } + + public: + iterator(void) : + index_(-1), + vec_(NULL) + { + } + + iterator(const iterator& rhs) : + vec_(rhs.vec_), + index_(rhs.index_) + { + } + + ~iterator(void) {} + + static iterator begin(const cl::vector &vec) + { + iterator i(vec, 0); + + return i; + } + + static iterator end(const cl::vector &vec) + { + iterator i(vec, vec.size()); + + return i; + } + + bool operator==(iterator i) + { + return ((vec_ == i.vec_) && + (index_ == i.index_)); + } + + bool operator!=(iterator i) + { + return (!(*this==i)); + } + + iterator& operator++() + { + ++index_; + return *this; + } + + iterator operator++(int) + { + iterator retVal(*this); + ++index_; + return retVal; + } + + iterator& operator--() + { + --index_; + return *this; + } + + iterator operator--(int) + { + iterator retVal(*this); + --index_; + return retVal; + } + + const T& operator *() const + { + return (*vec_)[index_]; + } + }; + + iterator begin(void) + { + return iterator::begin(*this); + } + + iterator begin(void) const + { + return iterator::begin(*this); + } + + iterator end(void) + { + return iterator::end(*this); + } + + iterator end(void) const + { + return iterator::end(*this); + } + + T& front(void) + { + return data_[0]; + } + + T& back(void) + { + return data_[size_]; + } + + const T& front(void) const + { + return data_[0]; + } + + const T& back(void) const + { + return data_[size_-1]; + } +} CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; +#endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR) + + + + + +namespace detail { +#define __DEFAULT_NOT_INITIALIZED 1 +#define __DEFAULT_BEING_INITIALIZED 2 +#define __DEFAULT_INITIALIZED 4 + + /* + * Compare and exchange primitives are needed for handling of defaults + */ + +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED + inline int compare_exchange(std::atomic * dest, int exchange, int comparand) +#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED + inline int compare_exchange(volatile int * dest, int exchange, int comparand) +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED + { +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED + std::atomic_compare_exchange_strong(dest, &comparand, exchange); + return comparand; +#elif _MSC_VER + return (int)(_InterlockedCompareExchange( + (volatile long*)dest, + (long)exchange, + (long)comparand)); +#else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED + return (__sync_val_compare_and_swap( + dest, + comparand, + exchange)); +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED + } + + inline void fence() { +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED + std::atomic_thread_fence(std::memory_order_seq_cst); +#elif _MSC_VER // !CL_HPP_CPP11_ATOMICS_SUPPORTED + _ReadWriteBarrier(); +#else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED + __sync_synchronize(); +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED + } +} // namespace detail + + +/*! \brief class used to interface between C++ and + * OpenCL C calls that require arrays of size_t values, whose + * size is known statically. + */ +template +class size_t +{ +private: + ::size_t data_[N]; + +public: + //! \brief Initialize size_t to all 0s + size_t() + { + for( int i = 0; i < N; ++i ) { + data_[i] = 0; + } + } + + ::size_t& operator[](int index) + { + return data_[index]; + } + + const ::size_t& operator[](int index) const + { + return data_[index]; + } + + //! \brief Conversion operator to T*. + operator ::size_t* () { return data_; } + + //! \brief Conversion operator to const T*. + operator const ::size_t* () const { return data_; } +}; + +namespace detail { + +// Generic getInfoHelper. The final parameter is used to guide overload +// resolution: the actual parameter passed is an int, which makes this +// a worse conversion sequence than a specialization that declares the +// parameter as an int. +template +inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long) +{ + return f(name, sizeof(T), param, NULL); +} + +// Specialized getInfoHelper for VECTOR_CLASS params +template +inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS* param, long) +{ + ::size_t required; + cl_int err = f(name, 0, NULL, &required); + if (err != CL_SUCCESS) { + return err; + } + + T* value = (T*) alloca(required); + err = f(name, required, value, NULL); + if (err != CL_SUCCESS) { + return err; + } + + param->assign(&value[0], &value[required/sizeof(T)]); + return CL_SUCCESS; +} + +/* Specialization for reference-counted types. This depends on the + * existence of Wrapper::cl_type, and none of the other types having the + * cl_type member. Note that simplify specifying the parameter as Wrapper + * does not work, because when using a derived type (e.g. Context) the generic + * template will provide a better match. + */ +template +inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS* param, int, typename T::cl_type = 0) +{ + ::size_t required; + cl_int err = f(name, 0, NULL, &required); + if (err != CL_SUCCESS) { + return err; + } + + typename T::cl_type * value = (typename T::cl_type *) alloca(required); + err = f(name, required, value, NULL); + if (err != CL_SUCCESS) { + return err; + } + + ::size_t elements = required / sizeof(typename T::cl_type); + param->assign(&value[0], &value[elements]); + for (::size_t i = 0; i < elements; i++) + { + if (value[i] != NULL) + { + err = (*param)[i].retain(); + if (err != CL_SUCCESS) { + return err; + } + } + } + return CL_SUCCESS; +} + +// Specialized for getInfo +template +inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS* param, int) +{ + cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL); + + if (err != CL_SUCCESS) { + return err; + } + + return CL_SUCCESS; +} + +// Specialized GetInfoHelper for STRING_CLASS params +template +inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long) +{ +#if defined(__NO_STD_VECTOR) || defined(__NO_STD_STRING) + ::size_t required; + cl_int err = f(name, 0, NULL, &required); + if (err != CL_SUCCESS) { + return err; + } + + char* value = (char*)alloca(required); + err = f(name, required, value, NULL); + if (err != CL_SUCCESS) { + return err; + } + + *param = value; + return CL_SUCCESS; +#else + ::size_t required; + cl_int err = f(name, 0, NULL, &required); + if (err != CL_SUCCESS) { + return err; + } + + // std::string has a constant data member + // a char vector does not + VECTOR_CLASS value(required); + err = f(name, required, value.data(), NULL); + if (err != CL_SUCCESS) { + return err; + } + if (param) { + param->assign(value.begin(), value.end()); + } +#endif + return CL_SUCCESS; +} + +// Specialized GetInfoHelper for cl::size_t params +template +inline cl_int getInfoHelper(Func f, cl_uint name, size_t* param, long) +{ + ::size_t required; + cl_int err = f(name, 0, NULL, &required); + if (err != CL_SUCCESS) { + return err; + } + + ::size_t* value = (::size_t*) alloca(required); + err = f(name, required, value, NULL); + if (err != CL_SUCCESS) { + return err; + } + + for(int i = 0; i < N; ++i) { + (*param)[i] = value[i]; + } + + return CL_SUCCESS; +} + +template struct ReferenceHandler; + +/* Specialization for reference-counted types. This depends on the + * existence of Wrapper::cl_type, and none of the other types having the + * cl_type member. Note that simplify specifying the parameter as Wrapper + * does not work, because when using a derived type (e.g. Context) the generic + * template will provide a better match. + */ +template +inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0) +{ + typename T::cl_type value; + cl_int err = f(name, sizeof(value), &value, NULL); + if (err != CL_SUCCESS) { + return err; + } + *param = value; + if (value != NULL) + { + err = param->retain(); + if (err != CL_SUCCESS) { + return err; + } + } + return CL_SUCCESS; +} + +#define __PARAM_NAME_INFO_1_0(F) \ + F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \ + F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \ + F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \ + F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \ + F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \ + \ + F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \ + F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \ + F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \ + F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \ + F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \ + F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \ + F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \ + F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \ + F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \ + F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \ + F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \ + F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \ + F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \ + F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \ + F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \ + F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \ + F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \ + F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \ + F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \ + F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \ + F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \ + F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \ + F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \ + F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \ + F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \ + F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \ + F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \ + F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \ + F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \ + F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\ + F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \ + F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \ + F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \ + F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \ + F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \ + F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \ + F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \ + F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \ + F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \ + F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \ + F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \ + F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \ + F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \ + F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \ + F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \ + F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \ + F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \ + F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \ + F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \ + F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \ + \ + F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \ + F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS) \ + F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS) \ + \ + F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \ + F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \ + F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \ + F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_int) \ + \ + F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \ + F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \ + F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \ + F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \ + \ + F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \ + F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \ + F(cl_mem_info, CL_MEM_SIZE, ::size_t) \ + F(cl_mem_info, CL_MEM_HOST_PTR, void*) \ + F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \ + F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \ + F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \ + \ + F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \ + F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \ + F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \ + F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \ + F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \ + F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \ + F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \ + \ + F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \ + F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \ + F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_bool) \ + F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_addressing_mode) \ + F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_filter_mode) \ + \ + F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \ + F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \ + F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \ + F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS) \ + F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \ + F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \ + F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS) \ + \ + F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \ + F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \ + F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \ + \ + F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \ + F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \ + F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \ + F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \ + F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \ + \ + F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \ + F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \ + F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \ + \ + F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \ + F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \ + F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \ + F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties) + +#if defined(CL_VERSION_1_1) +#define __PARAM_NAME_INFO_1_1(F) \ + F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\ + F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \ + F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \ + F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \ + F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \ + F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \ + F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \ + F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \ + F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \ + F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \ + F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \ + F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \ + F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \ + \ + F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \ + F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \ + \ + F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \ + F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \ + \ + F(cl_event_info, CL_EVENT_CONTEXT, cl::Context) +#endif // CL_VERSION_1_1 + + +#if defined(CL_VERSION_1_2) +#define __PARAM_NAME_INFO_1_2(F) \ + F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \ + \ + F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \ + F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \ + \ + F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \ + \ + F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, STRING_CLASS) \ + \ + F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \ + F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \ + F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, STRING_CLASS) \ + F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \ + F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_QUALIFIER, cl_kernel_arg_type_qualifier) \ + \ + F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \ + F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS) \ + F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS) \ + F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint) \ + F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, ::size_t) \ + F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \ + F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS) +#endif // #if defined(CL_VERSION_1_2) + +#if defined(USE_CL_DEVICE_FISSION) +#define __PARAM_NAME_DEVICE_FISSION(F) \ + F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \ + F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS) \ + F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS) \ + F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \ + F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS) +#endif // USE_CL_DEVICE_FISSION + +template +struct param_traits {}; + +#define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \ +struct token; \ +template<> \ +struct param_traits \ +{ \ + enum { value = param_name }; \ + typedef T param_type; \ +}; + +__PARAM_NAME_INFO_1_0(__CL_DECLARE_PARAM_TRAITS) +#if defined(CL_VERSION_1_1) +__PARAM_NAME_INFO_1_1(__CL_DECLARE_PARAM_TRAITS) +#endif // CL_VERSION_1_1 +#if defined(CL_VERSION_1_2) +__PARAM_NAME_INFO_1_2(__CL_DECLARE_PARAM_TRAITS) +#endif // CL_VERSION_1_1 + +#if defined(USE_CL_DEVICE_FISSION) +__PARAM_NAME_DEVICE_FISSION(__CL_DECLARE_PARAM_TRAITS); +#endif // USE_CL_DEVICE_FISSION + +#ifdef CL_PLATFORM_ICD_SUFFIX_KHR +__CL_DECLARE_PARAM_TRAITS(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, STRING_CLASS) +#endif + +#ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong) +#endif + +#ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, VECTOR_CLASS< ::size_t>) +#endif +#ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_SIMD_WIDTH_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint) +#endif +#ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint) +#endif + +#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint) +#endif +#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint) +#endif +#ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint) +#endif +#ifdef CL_DEVICE_WARP_SIZE_NV +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint) +#endif +#ifdef CL_DEVICE_GPU_OVERLAP_NV +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool) +#endif +#ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool) +#endif +#ifdef CL_DEVICE_INTEGRATED_MEMORY_NV +__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool) +#endif + +// Convenience functions + +template +inline cl_int +getInfo(Func f, cl_uint name, T* param) +{ + return getInfoHelper(f, name, param, 0); +} + +template +struct GetInfoFunctor0 +{ + Func f_; const Arg0& arg0_; + cl_int operator ()( + cl_uint param, ::size_t size, void* value, ::size_t* size_ret) + { return f_(arg0_, param, size, value, size_ret); } +}; + +template +struct GetInfoFunctor1 +{ + Func f_; const Arg0& arg0_; const Arg1& arg1_; + cl_int operator ()( + cl_uint param, ::size_t size, void* value, ::size_t* size_ret) + { return f_(arg0_, arg1_, param, size, value, size_ret); } +}; + +template +inline cl_int +getInfo(Func f, const Arg0& arg0, cl_uint name, T* param) +{ + GetInfoFunctor0 f0 = { f, arg0 }; + return getInfoHelper(f0, name, param, 0); +} + +template +inline cl_int +getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param) +{ + GetInfoFunctor1 f0 = { f, arg0, arg1 }; + return getInfoHelper(f0, name, param, 0); +} + +template +struct ReferenceHandler +{ }; + +#if defined(CL_VERSION_1_2) +/** + * OpenCL 1.2 devices do have retain/release. + */ +template <> +struct ReferenceHandler +{ + /** + * Retain the device. + * \param device A valid device created using createSubDevices + * \return + * CL_SUCCESS if the function executed successfully. + * CL_INVALID_DEVICE if device was not a valid subdevice + * CL_OUT_OF_RESOURCES + * CL_OUT_OF_HOST_MEMORY + */ + static cl_int retain(cl_device_id device) + { return ::clRetainDevice(device); } + /** + * Retain the device. + * \param device A valid device created using createSubDevices + * \return + * CL_SUCCESS if the function executed successfully. + * CL_INVALID_DEVICE if device was not a valid subdevice + * CL_OUT_OF_RESOURCES + * CL_OUT_OF_HOST_MEMORY + */ + static cl_int release(cl_device_id device) + { return ::clReleaseDevice(device); } +}; +#else // #if defined(CL_VERSION_1_2) +/** + * OpenCL 1.1 devices do not have retain/release. + */ +template <> +struct ReferenceHandler +{ + // cl_device_id does not have retain(). + static cl_int retain(cl_device_id) + { return CL_SUCCESS; } + // cl_device_id does not have release(). + static cl_int release(cl_device_id) + { return CL_SUCCESS; } +}; +#endif // #if defined(CL_VERSION_1_2) + +template <> +struct ReferenceHandler +{ + // cl_platform_id does not have retain(). + static cl_int retain(cl_platform_id) + { return CL_SUCCESS; } + // cl_platform_id does not have release(). + static cl_int release(cl_platform_id) + { return CL_SUCCESS; } +}; + +template <> +struct ReferenceHandler +{ + static cl_int retain(cl_context context) + { return ::clRetainContext(context); } + static cl_int release(cl_context context) + { return ::clReleaseContext(context); } +}; + +template <> +struct ReferenceHandler +{ + static cl_int retain(cl_command_queue queue) + { return ::clRetainCommandQueue(queue); } + static cl_int release(cl_command_queue queue) + { return ::clReleaseCommandQueue(queue); } +}; + +template <> +struct ReferenceHandler +{ + static cl_int retain(cl_mem memory) + { return ::clRetainMemObject(memory); } + static cl_int release(cl_mem memory) + { return ::clReleaseMemObject(memory); } +}; + +template <> +struct ReferenceHandler +{ + static cl_int retain(cl_sampler sampler) + { return ::clRetainSampler(sampler); } + static cl_int release(cl_sampler sampler) + { return ::clReleaseSampler(sampler); } +}; + +template <> +struct ReferenceHandler +{ + static cl_int retain(cl_program program) + { return ::clRetainProgram(program); } + static cl_int release(cl_program program) + { return ::clReleaseProgram(program); } +}; + +template <> +struct ReferenceHandler +{ + static cl_int retain(cl_kernel kernel) + { return ::clRetainKernel(kernel); } + static cl_int release(cl_kernel kernel) + { return ::clReleaseKernel(kernel); } +}; + +template <> +struct ReferenceHandler +{ + static cl_int retain(cl_event event) + { return ::clRetainEvent(event); } + static cl_int release(cl_event event) + { return ::clReleaseEvent(event); } +}; + + +// Extracts version number with major in the upper 16 bits, minor in the lower 16 +static cl_uint getVersion(const char *versionInfo) +{ + int highVersion = 0; + int lowVersion = 0; + int index = 7; + while(versionInfo[index] != '.' ) { + highVersion *= 10; + highVersion += versionInfo[index]-'0'; + ++index; + } + ++index; + while(versionInfo[index] != ' ' && versionInfo[index] != '\0') { + lowVersion *= 10; + lowVersion += versionInfo[index]-'0'; + ++index; + } + return (highVersion << 16) | lowVersion; +} + +static cl_uint getPlatformVersion(cl_platform_id platform) +{ + ::size_t size = 0; + clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size); + char *versionInfo = (char *) alloca(size); + clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size); + return getVersion(versionInfo); +} + +static cl_uint getDevicePlatformVersion(cl_device_id device) +{ + cl_platform_id platform; + clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL); + return getPlatformVersion(platform); +} + +#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) +static cl_uint getContextPlatformVersion(cl_context context) +{ + // The platform cannot be queried directly, so we first have to grab a + // device and obtain its context + ::size_t size = 0; + clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size); + if (size == 0) + return 0; + cl_device_id *devices = (cl_device_id *) alloca(size); + clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL); + return getDevicePlatformVersion(devices[0]); +} +#endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + +template +class Wrapper +{ +public: + typedef T cl_type; + +protected: + cl_type object_; + +public: + Wrapper() : object_(NULL) { } + + Wrapper(const cl_type &obj) : object_(obj) { } + + ~Wrapper() + { + if (object_ != NULL) { release(); } + } + + Wrapper(const Wrapper& rhs) + { + object_ = rhs.object_; + if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + Wrapper(Wrapper&& rhs) CL_HPP_NOEXCEPT + { + object_ = rhs.object_; + rhs.object_ = NULL; + } +#endif + + Wrapper& operator = (const Wrapper& rhs) + { + if (this != &rhs) { + if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } + object_ = rhs.object_; + if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } + } + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + Wrapper& operator = (Wrapper&& rhs) + { + if (this != &rhs) { + if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } + object_ = rhs.object_; + rhs.object_ = NULL; + } + return *this; + } +#endif + + Wrapper& operator = (const cl_type &rhs) + { + if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } + object_ = rhs; + return *this; + } + + cl_type operator ()() const { return object_; } + + cl_type& operator ()() { return object_; } + +protected: + template + friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type); + + cl_int retain() const + { + return ReferenceHandler::retain(object_); + } + + cl_int release() const + { + return ReferenceHandler::release(object_); + } +}; + +template <> +class Wrapper +{ +public: + typedef cl_device_id cl_type; + +protected: + cl_type object_; + bool referenceCountable_; + + static bool isReferenceCountable(cl_device_id device) + { + bool retVal = false; + if (device != NULL) { + int version = getDevicePlatformVersion(device); + if(version > ((1 << 16) + 1)) { + retVal = true; + } + } + return retVal; + } + +public: + Wrapper() : object_(NULL), referenceCountable_(false) + { + } + + Wrapper(const cl_type &obj) : object_(obj), referenceCountable_(false) + { + referenceCountable_ = isReferenceCountable(obj); + } + + ~Wrapper() + { + if (object_ != NULL) { release(); } + } + + Wrapper(const Wrapper& rhs) + { + object_ = rhs.object_; + referenceCountable_ = isReferenceCountable(object_); + if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + Wrapper(Wrapper&& rhs) CL_HPP_NOEXCEPT + { + object_ = rhs.object_; + referenceCountable_ = rhs.referenceCountable_; + rhs.object_ = NULL; + rhs.referenceCountable_ = false; + } +#endif + + Wrapper& operator = (const Wrapper& rhs) + { + if (this != &rhs) { + if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } + object_ = rhs.object_; + referenceCountable_ = rhs.referenceCountable_; + if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } + } + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + Wrapper& operator = (Wrapper&& rhs) + { + if (this != &rhs) { + if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } + object_ = rhs.object_; + referenceCountable_ = rhs.referenceCountable_; + rhs.object_ = NULL; + rhs.referenceCountable_ = false; + } + return *this; + } +#endif + + Wrapper& operator = (const cl_type &rhs) + { + if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } + object_ = rhs; + referenceCountable_ = isReferenceCountable(object_); + return *this; + } + + cl_type operator ()() const { return object_; } + + cl_type& operator ()() { return object_; } + +protected: + template + friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type); + + template + friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS*, int, typename U::cl_type); + + cl_int retain() const + { + if( referenceCountable_ ) { + return ReferenceHandler::retain(object_); + } + else { + return CL_SUCCESS; + } + } + + cl_int release() const + { + if( referenceCountable_ ) { + return ReferenceHandler::release(object_); + } + else { + return CL_SUCCESS; + } + } +}; + +} // namespace detail +//! \endcond + +/*! \stuct ImageFormat + * \brief Adds constructors and member functions for cl_image_format. + * + * \see cl_image_format + */ +struct ImageFormat : public cl_image_format +{ + //! \brief Default constructor - performs no initialization. + ImageFormat(){} + + //! \brief Initializing constructor. + ImageFormat(cl_channel_order order, cl_channel_type type) + { + image_channel_order = order; + image_channel_data_type = type; + } + + //! \brief Assignment operator. + ImageFormat& operator = (const ImageFormat& rhs) + { + if (this != &rhs) { + this->image_channel_data_type = rhs.image_channel_data_type; + this->image_channel_order = rhs.image_channel_order; + } + return *this; + } +}; + +/*! \brief Class interface for cl_device_id. + * + * \note Copies of these objects are inexpensive, since they don't 'own' + * any underlying resources or data structures. + * + * \see cl_device_id + */ +class Device : public detail::Wrapper +{ +public: + //! \brief Default constructor - initializes to NULL. + Device() : detail::Wrapper() { } + + /*! \brief Constructor from cl_device_id. + * + * This simply copies the device ID value, which is an inexpensive operation. + */ + __CL_EXPLICIT_CONSTRUCTORS Device(const cl_device_id &device) : detail::Wrapper(device) { } + + /*! \brief Returns the first device on the default context. + * + * \see Context::getDefault() + */ + static Device getDefault(cl_int * err = NULL); + + /*! \brief Assignment operator from cl_device_id. + * + * This simply copies the device ID value, which is an inexpensive operation. + */ + Device& operator = (const cl_device_id& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Device(const Device& dev) : detail::Wrapper(dev) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Device& operator = (const Device &dev) + { + detail::Wrapper::operator=(dev); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Device(Device&& dev) CL_HPP_NOEXCEPT : detail::Wrapper(std::move(dev)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Device& operator = (Device &&dev) + { + detail::Wrapper::operator=(std::move(dev)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + //! \brief Wrapper for clGetDeviceInfo(). + template + cl_int getInfo(cl_device_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetDeviceInfo, object_, name, param), + __GET_DEVICE_INFO_ERR); + } + + //! \brief Wrapper for clGetDeviceInfo() that returns by value. + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_device_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + /** + * CL 1.2 version + */ +#if defined(CL_VERSION_1_2) + //! \brief Wrapper for clCreateSubDevicesEXT(). + cl_int createSubDevices( + const cl_device_partition_property * properties, + VECTOR_CLASS* devices) + { + cl_uint n = 0; + cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __CREATE_SUB_DEVICES); + } + + cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); + err = clCreateSubDevices(object_, properties, n, ids, NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __CREATE_SUB_DEVICES); + } + + devices->assign(&ids[0], &ids[n]); + return CL_SUCCESS; + } +#endif // #if defined(CL_VERSION_1_2) + +/** + * CL 1.1 version that uses device fission. + */ +#if defined(CL_VERSION_1_1) +#if defined(USE_CL_DEVICE_FISSION) + cl_int createSubDevices( + const cl_device_partition_property_ext * properties, + VECTOR_CLASS* devices) + { + typedef CL_API_ENTRY cl_int + ( CL_API_CALL * PFN_clCreateSubDevicesEXT)( + cl_device_id /*in_device*/, + const cl_device_partition_property_ext * /* properties */, + cl_uint /*num_entries*/, + cl_device_id * /*out_devices*/, + cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; + + static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL; + __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT); + + cl_uint n = 0; + cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __CREATE_SUB_DEVICES); + } + + cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); + err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __CREATE_SUB_DEVICES); + } + + devices->assign(&ids[0], &ids[n]); + return CL_SUCCESS; + } +#endif // #if defined(USE_CL_DEVICE_FISSION) +#endif // #if defined(CL_VERSION_1_1) +}; + +/*! \brief Class interface for cl_platform_id. + * + * \note Copies of these objects are inexpensive, since they don't 'own' + * any underlying resources or data structures. + * + * \see cl_platform_id + */ +class Platform : public detail::Wrapper +{ +public: + //! \brief Default constructor - initializes to NULL. + Platform() : detail::Wrapper() { } + + /*! \brief Constructor from cl_platform_id. + * + * This simply copies the platform ID value, which is an inexpensive operation. + */ + __CL_EXPLICIT_CONSTRUCTORS Platform(const cl_platform_id &platform) : detail::Wrapper(platform) { } + + /*! \brief Assignment operator from cl_platform_id. + * + * This simply copies the platform ID value, which is an inexpensive operation. + */ + Platform& operator = (const cl_platform_id& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + //! \brief Wrapper for clGetPlatformInfo(). + cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetPlatformInfo, object_, name, param), + __GET_PLATFORM_INFO_ERR); + } + + //! \brief Wrapper for clGetPlatformInfo() that returns by value. + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_platform_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + /*! \brief Gets a list of devices for this platform. + * + * Wraps clGetDeviceIDs(). + */ + cl_int getDevices( + cl_device_type type, + VECTOR_CLASS* devices) const + { + cl_uint n = 0; + if( devices == NULL ) { + return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR); + } + cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_DEVICE_IDS_ERR); + } + + cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); + err = ::clGetDeviceIDs(object_, type, n, ids, NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_DEVICE_IDS_ERR); + } + + devices->assign(&ids[0], &ids[n]); + return CL_SUCCESS; + } + +#if defined(USE_DX_INTEROP) + /*! \brief Get the list of available D3D10 devices. + * + * \param d3d_device_source. + * + * \param d3d_object. + * + * \param d3d_device_set. + * + * \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device + * values returned in devices can be used to identify a specific OpenCL + * device. If \a devices argument is NULL, this argument is ignored. + * + * \return One of the following values: + * - CL_SUCCESS if the function is executed successfully. + * + * The application can query specific capabilities of the OpenCL device(s) + * returned by cl::getDevices. This can be used by the application to + * determine which device(s) to use. + * + * \note In the case that exceptions are enabled and a return value + * other than CL_SUCCESS is generated, then cl::Error exception is + * generated. + */ + cl_int getDevices( + cl_d3d10_device_source_khr d3d_device_source, + void * d3d_object, + cl_d3d10_device_set_khr d3d_device_set, + VECTOR_CLASS* devices) const + { + typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)( + cl_platform_id platform, + cl_d3d10_device_source_khr d3d_device_source, + void * d3d_object, + cl_d3d10_device_set_khr d3d_device_set, + cl_uint num_entries, + cl_device_id * devices, + cl_uint* num_devices); + + if( devices == NULL ) { + return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR); + } + + static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL; + __INIT_CL_EXT_FCN_PTR_PLATFORM(object_, clGetDeviceIDsFromD3D10KHR); + + cl_uint n = 0; + cl_int err = pfn_clGetDeviceIDsFromD3D10KHR( + object_, + d3d_device_source, + d3d_object, + d3d_device_set, + 0, + NULL, + &n); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_DEVICE_IDS_ERR); + } + + cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); + err = pfn_clGetDeviceIDsFromD3D10KHR( + object_, + d3d_device_source, + d3d_object, + d3d_device_set, + n, + ids, + NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_DEVICE_IDS_ERR); + } + + devices->assign(&ids[0], &ids[n]); + return CL_SUCCESS; + } +#endif + + /*! \brief Gets a list of available platforms. + * + * Wraps clGetPlatformIDs(). + */ + static cl_int get( + VECTOR_CLASS* platforms) + { + cl_uint n = 0; + + if( platforms == NULL ) { + return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR); + } + + cl_int err = ::clGetPlatformIDs(0, NULL, &n); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); + } + + cl_platform_id* ids = (cl_platform_id*) alloca( + n * sizeof(cl_platform_id)); + err = ::clGetPlatformIDs(n, ids, NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); + } + + platforms->assign(&ids[0], &ids[n]); + return CL_SUCCESS; + } + + /*! \brief Gets the first available platform. + * + * Wraps clGetPlatformIDs(), returning the first result. + */ + static cl_int get( + Platform * platform) + { + cl_uint n = 0; + + if( platform == NULL ) { + return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR); + } + + cl_int err = ::clGetPlatformIDs(0, NULL, &n); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); + } + + cl_platform_id* ids = (cl_platform_id*) alloca( + n * sizeof(cl_platform_id)); + err = ::clGetPlatformIDs(n, ids, NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); + } + + *platform = ids[0]; + return CL_SUCCESS; + } + + /*! \brief Gets the first available platform, returning it by value. + * + * Wraps clGetPlatformIDs(), returning the first result. + */ + static Platform get( + cl_int * errResult = NULL) + { + Platform platform; + cl_uint n = 0; + cl_int err = ::clGetPlatformIDs(0, NULL, &n); + if (err != CL_SUCCESS) { + detail::errHandler(err, __GET_PLATFORM_IDS_ERR); + if (errResult != NULL) { + *errResult = err; + } + return Platform(); + } + + cl_platform_id* ids = (cl_platform_id*) alloca( + n * sizeof(cl_platform_id)); + err = ::clGetPlatformIDs(n, ids, NULL); + + if (err != CL_SUCCESS) { + detail::errHandler(err, __GET_PLATFORM_IDS_ERR); + if (errResult != NULL) { + *errResult = err; + } + return Platform(); + } + + + return Platform(ids[0]); + } + + static Platform getDefault( + cl_int *errResult = NULL ) + { + return get(errResult); + } + + +#if defined(CL_VERSION_1_2) + //! \brief Wrapper for clUnloadCompiler(). + cl_int + unloadCompiler() + { + return ::clUnloadPlatformCompiler(object_); + } +#endif // #if defined(CL_VERSION_1_2) +}; // class Platform + +/** + * Deprecated APIs for 1.2 + */ +#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) +/** + * Unload the OpenCL compiler. + * \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead. + */ +inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int +UnloadCompiler() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; +inline cl_int +UnloadCompiler() +{ + return ::clUnloadCompiler(); +} +#endif // #if defined(CL_VERSION_1_1) + +/*! \brief Class interface for cl_context. + * + * \note Copies of these objects are shallow, meaning that the copy will refer + * to the same underlying cl_context as the original. For details, see + * clRetainContext() and clReleaseContext(). + * + * \see cl_context + */ +class Context + : public detail::Wrapper +{ +private: + +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED + static std::atomic default_initialized_; +#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED + static volatile int default_initialized_; +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED + static Context default_; + static volatile cl_int default_error_; +public: + /*! \brief Constructs a context including a list of specified devices. + * + * Wraps clCreateContext(). + */ + Context( + const VECTOR_CLASS& devices, + cl_context_properties* properties = NULL, + void (CL_CALLBACK * notifyFptr)( + const char *, + const void *, + ::size_t, + void *) = NULL, + void* data = NULL, + cl_int* err = NULL) + { + cl_int error; + + ::size_t numDevices = devices.size(); + cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); + for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { + deviceIDs[deviceIndex] = (devices[deviceIndex])(); + } + + object_ = ::clCreateContext( + properties, (cl_uint) numDevices, + deviceIDs, + notifyFptr, data, &error); + + detail::errHandler(error, __CREATE_CONTEXT_ERR); + if (err != NULL) { + *err = error; + } + } + + Context( + const Device& device, + cl_context_properties* properties = NULL, + void (CL_CALLBACK * notifyFptr)( + const char *, + const void *, + ::size_t, + void *) = NULL, + void* data = NULL, + cl_int* err = NULL) + { + cl_int error; + + cl_device_id deviceID = device(); + + object_ = ::clCreateContext( + properties, 1, + &deviceID, + notifyFptr, data, &error); + + detail::errHandler(error, __CREATE_CONTEXT_ERR); + if (err != NULL) { + *err = error; + } + } + + /*! \brief Constructs a context including all or a subset of devices of a specified type. + * + * Wraps clCreateContextFromType(). + */ + Context( + cl_device_type type, + cl_context_properties* properties = NULL, + void (CL_CALLBACK * notifyFptr)( + const char *, + const void *, + ::size_t, + void *) = NULL, + void* data = NULL, + cl_int* err = NULL) + { + cl_int error; + +#if !defined(__APPLE__) && !defined(__MACOS) + cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 }; + + if (properties == NULL) { + // Get a valid platform ID as we cannot send in a blank one + VECTOR_CLASS platforms; + error = Platform::get(&platforms); + if (error != CL_SUCCESS) { + detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); + if (err != NULL) { + *err = error; + } + return; + } + + // Check the platforms we found for a device of our specified type + cl_context_properties platform_id = 0; + for (unsigned int i = 0; i < platforms.size(); i++) { + + VECTOR_CLASS devices; + +#if defined(__CL_ENABLE_EXCEPTIONS) + try { +#endif + + error = platforms[i].getDevices(type, &devices); + +#if defined(__CL_ENABLE_EXCEPTIONS) + } catch (Error) {} + // Catch if exceptions are enabled as we don't want to exit if first platform has no devices of type + // We do error checking next anyway, and can throw there if needed +#endif + + // Only squash CL_SUCCESS and CL_DEVICE_NOT_FOUND + if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND) { + detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); + if (err != NULL) { + *err = error; + } + } + + if (devices.size() > 0) { + platform_id = (cl_context_properties)platforms[i](); + break; + } + } + + if (platform_id == 0) { + detail::errHandler(CL_DEVICE_NOT_FOUND, __CREATE_CONTEXT_FROM_TYPE_ERR); + if (err != NULL) { + *err = CL_DEVICE_NOT_FOUND; + } + return; + } + + prop[1] = platform_id; + properties = &prop[0]; + } +#endif + object_ = ::clCreateContextFromType( + properties, type, notifyFptr, data, &error); + + detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); + if (err != NULL) { + *err = error; + } + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Context(const Context& ctx) : detail::Wrapper(ctx) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Context& operator = (const Context &ctx) + { + detail::Wrapper::operator=(ctx); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Context(Context&& ctx) CL_HPP_NOEXCEPT : detail::Wrapper(std::move(ctx)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Context& operator = (Context &&ctx) + { + detail::Wrapper::operator=(std::move(ctx)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + /*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT. + * + * \note All calls to this function return the same cl_context as the first. + */ + static Context getDefault(cl_int * err = NULL) + { + int state = detail::compare_exchange( + &default_initialized_, + __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED); + + if (state & __DEFAULT_INITIALIZED) { + if (err != NULL) { + *err = default_error_; + } + return default_; + } + + if (state & __DEFAULT_BEING_INITIALIZED) { + // Assume writes will propagate eventually... + while(default_initialized_ != __DEFAULT_INITIALIZED) { + detail::fence(); + } + + if (err != NULL) { + *err = default_error_; + } + return default_; + } + + cl_int error; + default_ = Context( + CL_DEVICE_TYPE_DEFAULT, + NULL, + NULL, + NULL, + &error); + + detail::fence(); + + default_error_ = error; + // Assume writes will propagate eventually... + default_initialized_ = __DEFAULT_INITIALIZED; + + detail::fence(); + + if (err != NULL) { + *err = default_error_; + } + return default_; + + } + + //! \brief Default constructor - initializes to NULL. + Context() : detail::Wrapper() { } + + /*! \brief Constructor from cl_context - takes ownership. + * + * This effectively transfers ownership of a refcount on the cl_context + * into the new Context object. + */ + __CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper(context) { } + + /*! \brief Assignment operator from cl_context - takes ownership. + * + * This effectively transfers ownership of a refcount on the rhs and calls + * clReleaseContext() on the value previously held by this instance. + */ + Context& operator = (const cl_context& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + //! \brief Wrapper for clGetContextInfo(). + template + cl_int getInfo(cl_context_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetContextInfo, object_, name, param), + __GET_CONTEXT_INFO_ERR); + } + + //! \brief Wrapper for clGetContextInfo() that returns by value. + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_context_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + /*! \brief Gets a list of supported image formats. + * + * Wraps clGetSupportedImageFormats(). + */ + cl_int getSupportedImageFormats( + cl_mem_flags flags, + cl_mem_object_type type, + VECTOR_CLASS* formats) const + { + cl_uint numEntries; + + if (!formats) { + return CL_SUCCESS; + } + + cl_int err = ::clGetSupportedImageFormats( + object_, + flags, + type, + 0, + NULL, + &numEntries); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); + } + + if (numEntries > 0) { + ImageFormat* value = (ImageFormat*) + alloca(numEntries * sizeof(ImageFormat)); + err = ::clGetSupportedImageFormats( + object_, + flags, + type, + numEntries, + (cl_image_format*)value, + NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); + } + + formats->assign(&value[0], &value[numEntries]); + } + else { + formats->clear(); + } + return CL_SUCCESS; + } +}; + +inline Device Device::getDefault(cl_int * err) +{ + cl_int error; + Device device; + + Context context = Context::getDefault(&error); + detail::errHandler(error, __CREATE_CONTEXT_ERR); + + if (error != CL_SUCCESS) { + if (err != NULL) { + *err = error; + } + } + else { + device = context.getInfo()[0]; + if (err != NULL) { + *err = CL_SUCCESS; + } + } + + return device; +} + + +#ifdef _WIN32 +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED +__declspec(selectany) std::atomic Context::default_initialized_; +#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__declspec(selectany) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED; +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__declspec(selectany) Context Context::default_; +__declspec(selectany) volatile cl_int Context::default_error_ = CL_SUCCESS; +#else // !_WIN32 +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED +__attribute__((weak)) std::atomic Context::default_initialized_; +#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__attribute__((weak)) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED; +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__attribute__((weak)) Context Context::default_; +__attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS; +#endif // !_WIN32 + +/*! \brief Class interface for cl_event. + * + * \note Copies of these objects are shallow, meaning that the copy will refer + * to the same underlying cl_event as the original. For details, see + * clRetainEvent() and clReleaseEvent(). + * + * \see cl_event + */ +class Event : public detail::Wrapper +{ +public: + //! \brief Default constructor - initializes to NULL. + Event() : detail::Wrapper() { } + + /*! \brief Constructor from cl_event - takes ownership. + * + * This effectively transfers ownership of a refcount on the cl_event + * into the new Event object. + */ + __CL_EXPLICIT_CONSTRUCTORS Event(const cl_event& event) : detail::Wrapper(event) { } + + /*! \brief Assignment operator from cl_event - takes ownership. + * + * This effectively transfers ownership of a refcount on the rhs and calls + * clReleaseEvent() on the value previously held by this instance. + */ + Event& operator = (const cl_event& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + //! \brief Wrapper for clGetEventInfo(). + template + cl_int getInfo(cl_event_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetEventInfo, object_, name, param), + __GET_EVENT_INFO_ERR); + } + + //! \brief Wrapper for clGetEventInfo() that returns by value. + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_event_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + //! \brief Wrapper for clGetEventProfilingInfo(). + template + cl_int getProfilingInfo(cl_profiling_info name, T* param) const + { + return detail::errHandler(detail::getInfo( + &::clGetEventProfilingInfo, object_, name, param), + __GET_EVENT_PROFILE_INFO_ERR); + } + + //! \brief Wrapper for clGetEventProfilingInfo() that returns by value. + template typename + detail::param_traits::param_type + getProfilingInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_profiling_info, name>::param_type param; + cl_int result = getProfilingInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + /*! \brief Blocks the calling thread until this event completes. + * + * Wraps clWaitForEvents(). + */ + cl_int wait() const + { + return detail::errHandler( + ::clWaitForEvents(1, &object_), + __WAIT_FOR_EVENTS_ERR); + } + +#if defined(CL_VERSION_1_1) + /*! \brief Registers a user callback function for a specific command execution status. + * + * Wraps clSetEventCallback(). + */ + cl_int setCallback( + cl_int type, + void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *), + void * user_data = NULL) + { + return detail::errHandler( + ::clSetEventCallback( + object_, + type, + pfn_notify, + user_data), + __SET_EVENT_CALLBACK_ERR); + } +#endif + + /*! \brief Blocks the calling thread until every event specified is complete. + * + * Wraps clWaitForEvents(). + */ + static cl_int + waitForEvents(const VECTOR_CLASS& events) + { + return detail::errHandler( + ::clWaitForEvents( + (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL), + __WAIT_FOR_EVENTS_ERR); + } +}; + +#if defined(CL_VERSION_1_1) +/*! \brief Class interface for user events (a subset of cl_event's). + * + * See Event for details about copy semantics, etc. + */ +class UserEvent : public Event +{ +public: + /*! \brief Constructs a user event on a given context. + * + * Wraps clCreateUserEvent(). + */ + UserEvent( + const Context& context, + cl_int * err = NULL) + { + cl_int error; + object_ = ::clCreateUserEvent( + context(), + &error); + + detail::errHandler(error, __CREATE_USER_EVENT_ERR); + if (err != NULL) { + *err = error; + } + } + + //! \brief Default constructor - initializes to NULL. + UserEvent() : Event() { } + + /*! \brief Sets the execution status of a user event object. + * + * Wraps clSetUserEventStatus(). + */ + cl_int setStatus(cl_int status) + { + return detail::errHandler( + ::clSetUserEventStatus(object_,status), + __SET_USER_EVENT_STATUS_ERR); + } +}; +#endif + +/*! \brief Blocks the calling thread until every event specified is complete. + * + * Wraps clWaitForEvents(). + */ +inline static cl_int +WaitForEvents(const VECTOR_CLASS& events) +{ + return detail::errHandler( + ::clWaitForEvents( + (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL), + __WAIT_FOR_EVENTS_ERR); +} + +/*! \brief Class interface for cl_mem. + * + * \note Copies of these objects are shallow, meaning that the copy will refer + * to the same underlying cl_mem as the original. For details, see + * clRetainMemObject() and clReleaseMemObject(). + * + * \see cl_mem + */ +class Memory : public detail::Wrapper +{ +public: + //! \brief Default constructor - initializes to NULL. + Memory() : detail::Wrapper() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * This effectively transfers ownership of a refcount on the cl_mem + * into the new Memory object. + */ + __CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper(memory) { } + + /*! \brief Assignment operator from cl_mem - takes ownership. + * + * This effectively transfers ownership of a refcount on the rhs and calls + * clReleaseMemObject() on the value previously held by this instance. + */ + Memory& operator = (const cl_mem& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Memory(const Memory& mem) : detail::Wrapper(mem) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Memory& operator = (const Memory &mem) + { + detail::Wrapper::operator=(mem); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Memory(Memory&& mem) CL_HPP_NOEXCEPT : detail::Wrapper(std::move(mem)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Memory& operator = (Memory &&mem) + { + detail::Wrapper::operator=(std::move(mem)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + //! \brief Wrapper for clGetMemObjectInfo(). + template + cl_int getInfo(cl_mem_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetMemObjectInfo, object_, name, param), + __GET_MEM_OBJECT_INFO_ERR); + } + + //! \brief Wrapper for clGetMemObjectInfo() that returns by value. + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_mem_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + +#if defined(CL_VERSION_1_1) + /*! \brief Registers a callback function to be called when the memory object + * is no longer needed. + * + * Wraps clSetMemObjectDestructorCallback(). + * + * Repeated calls to this function, for a given cl_mem value, will append + * to the list of functions called (in reverse order) when memory object's + * resources are freed and the memory object is deleted. + * + * \note + * The registered callbacks are associated with the underlying cl_mem + * value - not the Memory class instance. + */ + cl_int setDestructorCallback( + void (CL_CALLBACK * pfn_notify)(cl_mem, void *), + void * user_data = NULL) + { + return detail::errHandler( + ::clSetMemObjectDestructorCallback( + object_, + pfn_notify, + user_data), + __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR); + } +#endif + +}; + +// Pre-declare copy functions +class Buffer; +template< typename IteratorType > +cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ); +template< typename IteratorType > +cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ); +template< typename IteratorType > +cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ); +template< typename IteratorType > +cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ); + + +/*! \brief Class interface for Buffer Memory Objects. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class Buffer : public Memory +{ +public: + + /*! \brief Constructs a Buffer in a specified context. + * + * Wraps clCreateBuffer(). + * + * \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was + * specified. Note alignment & exclusivity requirements. + */ + Buffer( + const Context& context, + cl_mem_flags flags, + ::size_t size, + void* host_ptr = NULL, + cl_int* err = NULL) + { + cl_int error; + object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); + + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } + + /*! \brief Constructs a Buffer in the default context. + * + * Wraps clCreateBuffer(). + * + * \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was + * specified. Note alignment & exclusivity requirements. + * + * \see Context::getDefault() + */ + Buffer( + cl_mem_flags flags, + ::size_t size, + void* host_ptr = NULL, + cl_int* err = NULL) + { + cl_int error; + + Context context = Context::getDefault(err); + + object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); + + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } + + /*! + * \brief Construct a Buffer from a host container via iterators. + * IteratorType must be random access. + * If useHostPtr is specified iterators must represent contiguous data. + */ + template< typename IteratorType > + Buffer( + IteratorType startIterator, + IteratorType endIterator, + bool readOnly, + bool useHostPtr = false, + cl_int* err = NULL) + { + typedef typename std::iterator_traits::value_type DataType; + cl_int error; + + cl_mem_flags flags = 0; + if( readOnly ) { + flags |= CL_MEM_READ_ONLY; + } + else { + flags |= CL_MEM_READ_WRITE; + } + if( useHostPtr ) { + flags |= CL_MEM_USE_HOST_PTR; + } + + ::size_t size = sizeof(DataType)*(endIterator - startIterator); + + Context context = Context::getDefault(err); + + if( useHostPtr ) { + object_ = ::clCreateBuffer(context(), flags, size, static_cast(&*startIterator), &error); + } else { + object_ = ::clCreateBuffer(context(), flags, size, 0, &error); + } + + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + + if( !useHostPtr ) { + error = cl::copy(startIterator, endIterator, *this); + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } + } + + /*! + * \brief Construct a Buffer from a host container via iterators using a specified context. + * IteratorType must be random access. + * If useHostPtr is specified iterators must represent contiguous data. + */ + template< typename IteratorType > + Buffer(const Context &context, IteratorType startIterator, IteratorType endIterator, + bool readOnly, bool useHostPtr = false, cl_int* err = NULL); + + /*! + * \brief Construct a Buffer from a host container via iterators using a specified queue. + * If useHostPtr is specified iterators must represent contiguous data. + */ + template< typename IteratorType > + Buffer(const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, + bool readOnly, bool useHostPtr = false, cl_int* err = NULL); + + //! \brief Default constructor - initializes to NULL. + Buffer() : Memory() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + Buffer& operator = (const cl_mem& rhs) + { + Memory::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Buffer(const Buffer& buf) : Memory(buf) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Buffer& operator = (const Buffer &buf) + { + Memory::operator=(buf); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Buffer(Buffer&& buf) CL_HPP_NOEXCEPT : Memory(std::move(buf)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Buffer& operator = (Buffer &&buf) + { + Memory::operator=(std::move(buf)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + +#if defined(CL_VERSION_1_1) + /*! \brief Creates a new buffer object from this. + * + * Wraps clCreateSubBuffer(). + */ + Buffer createSubBuffer( + cl_mem_flags flags, + cl_buffer_create_type buffer_create_type, + const void * buffer_create_info, + cl_int * err = NULL) + { + Buffer result; + cl_int error; + result.object_ = ::clCreateSubBuffer( + object_, + flags, + buffer_create_type, + buffer_create_info, + &error); + + detail::errHandler(error, __CREATE_SUBBUFFER_ERR); + if (err != NULL) { + *err = error; + } + + return result; + } +#endif +}; + +#if defined (USE_DX_INTEROP) +/*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's. + * + * This is provided to facilitate interoperability with Direct3D. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class BufferD3D10 : public Buffer +{ +public: + typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)( + cl_context context, cl_mem_flags flags, ID3D10Buffer* buffer, + cl_int* errcode_ret); + + /*! \brief Constructs a BufferD3D10, in a specified context, from a + * given ID3D10Buffer. + * + * Wraps clCreateFromD3D10BufferKHR(). + */ + BufferD3D10( + const Context& context, + cl_mem_flags flags, + ID3D10Buffer* bufobj, + cl_int * err = NULL) + { + static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL; + +#if defined(CL_VERSION_1_2) + vector props = context.getInfo(); + cl_platform platform = -1; + for( int i = 0; i < props.size(); ++i ) { + if( props[i] == CL_CONTEXT_PLATFORM ) { + platform = props[i+1]; + } + } + __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clCreateFromD3D10BufferKHR); +#endif +#if defined(CL_VERSION_1_1) + __INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR); +#endif + + cl_int error; + object_ = pfn_clCreateFromD3D10BufferKHR( + context(), + flags, + bufobj, + &error); + + detail::errHandler(error, __CREATE_GL_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } + + //! \brief Default constructor - initializes to NULL. + BufferD3D10() : Buffer() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + BufferD3D10& operator = (const cl_mem& rhs) + { + Buffer::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + BufferD3D10(const BufferD3D10& buf) : Buffer(buf) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + BufferD3D10& operator = (const BufferD3D10 &buf) + { + Buffer::operator=(buf); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + BufferD3D10(BufferD3D10&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + BufferD3D10& operator = (BufferD3D10 &&buf) + { + Buffer::operator=(std::move(buf)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; +#endif + +/*! \brief Class interface for GL Buffer Memory Objects. + * + * This is provided to facilitate interoperability with OpenGL. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class BufferGL : public Buffer +{ +public: + /*! \brief Constructs a BufferGL in a specified context, from a given + * GL buffer. + * + * Wraps clCreateFromGLBuffer(). + */ + BufferGL( + const Context& context, + cl_mem_flags flags, + cl_GLuint bufobj, + cl_int * err = NULL) + { + cl_int error; + object_ = ::clCreateFromGLBuffer( + context(), + flags, + bufobj, + &error); + + detail::errHandler(error, __CREATE_GL_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } + + //! \brief Default constructor - initializes to NULL. + BufferGL() : Buffer() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + BufferGL& operator = (const cl_mem& rhs) + { + Buffer::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + BufferGL(const BufferGL& buf) : Buffer(buf) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + BufferGL& operator = (const BufferGL &buf) + { + Buffer::operator=(buf); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + BufferGL(BufferGL&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + BufferGL& operator = (BufferGL &&buf) + { + Buffer::operator=(std::move(buf)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + //! \brief Wrapper for clGetGLObjectInfo(). + cl_int getObjectInfo( + cl_gl_object_type *type, + cl_GLuint * gl_object_name) + { + return detail::errHandler( + ::clGetGLObjectInfo(object_,type,gl_object_name), + __GET_GL_OBJECT_INFO_ERR); + } +}; + +/*! \brief C++ base class for Image Memory objects. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class Image : public Memory +{ +protected: + //! \brief Default constructor - initializes to NULL. + Image() : Memory() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + Image& operator = (const cl_mem& rhs) + { + Memory::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image(const Image& img) : Memory(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image& operator = (const Image &img) + { + Memory::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image(Image&& img) CL_HPP_NOEXCEPT : Memory(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image& operator = (Image &&img) + { + Memory::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + +public: + //! \brief Wrapper for clGetImageInfo(). + template + cl_int getImageInfo(cl_image_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetImageInfo, object_, name, param), + __GET_IMAGE_INFO_ERR); + } + + //! \brief Wrapper for clGetImageInfo() that returns by value. + template typename + detail::param_traits::param_type + getImageInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_image_info, name>::param_type param; + cl_int result = getImageInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } +}; + +#if defined(CL_VERSION_1_2) +/*! \brief Class interface for 1D Image Memory objects. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class Image1D : public Image +{ +public: + /*! \brief Constructs a 1D Image in a specified context. + * + * Wraps clCreateImage(). + */ + Image1D( + const Context& context, + cl_mem_flags flags, + ImageFormat format, + ::size_t width, + void* host_ptr = NULL, + cl_int* err = NULL) + { + cl_int error; + cl_image_desc desc = + { + CL_MEM_OBJECT_IMAGE1D, + width, + 0, 0, 0, 0, 0, 0, 0, 0 + }; + object_ = ::clCreateImage( + context(), + flags, + &format, + &desc, + host_ptr, + &error); + + detail::errHandler(error, __CREATE_IMAGE_ERR); + if (err != NULL) { + *err = error; + } + } + + //! \brief Default constructor - initializes to NULL. + Image1D() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + Image1D& operator = (const cl_mem& rhs) + { + Image::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image1D(const Image1D& img) : Image(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image1D& operator = (const Image1D &img) + { + Image::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image1D(Image1D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image1D& operator = (Image1D &&img) + { + Image::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; + +/*! \class Image1DBuffer + * \brief Image interface for 1D buffer images. + */ +class Image1DBuffer : public Image +{ +public: + Image1DBuffer( + const Context& context, + cl_mem_flags flags, + ImageFormat format, + ::size_t width, + const Buffer &buffer, + cl_int* err = NULL) + { + cl_int error; + cl_image_desc desc = + { + CL_MEM_OBJECT_IMAGE1D_BUFFER, + width, + 0, 0, 0, 0, 0, 0, 0, + buffer() + }; + object_ = ::clCreateImage( + context(), + flags, + &format, + &desc, + NULL, + &error); + + detail::errHandler(error, __CREATE_IMAGE_ERR); + if (err != NULL) { + *err = error; + } + } + + Image1DBuffer() { } + + __CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { } + + Image1DBuffer& operator = (const cl_mem& rhs) + { + Image::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image1DBuffer(const Image1DBuffer& img) : Image(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image1DBuffer& operator = (const Image1DBuffer &img) + { + Image::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image1DBuffer(Image1DBuffer&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image1DBuffer& operator = (Image1DBuffer &&img) + { + Image::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; + +/*! \class Image1DArray + * \brief Image interface for arrays of 1D images. + */ +class Image1DArray : public Image +{ +public: + Image1DArray( + const Context& context, + cl_mem_flags flags, + ImageFormat format, + ::size_t arraySize, + ::size_t width, + ::size_t rowPitch, + void* host_ptr = NULL, + cl_int* err = NULL) + { + cl_int error; + cl_image_desc desc = + { + CL_MEM_OBJECT_IMAGE1D_ARRAY, + width, + 0, 0, // height, depth (unused) + arraySize, + rowPitch, + 0, 0, 0, 0 + }; + object_ = ::clCreateImage( + context(), + flags, + &format, + &desc, + host_ptr, + &error); + + detail::errHandler(error, __CREATE_IMAGE_ERR); + if (err != NULL) { + *err = error; + } + } + + Image1DArray() { } + + __CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { } + + Image1DArray& operator = (const cl_mem& rhs) + { + Image::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image1DArray(const Image1DArray& img) : Image(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image1DArray& operator = (const Image1DArray &img) + { + Image::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image1DArray(Image1DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image1DArray& operator = (Image1DArray &&img) + { + Image::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; +#endif // #if defined(CL_VERSION_1_2) + + +/*! \brief Class interface for 2D Image Memory objects. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class Image2D : public Image +{ +public: + /*! \brief Constructs a 1D Image in a specified context. + * + * Wraps clCreateImage(). + */ + Image2D( + const Context& context, + cl_mem_flags flags, + ImageFormat format, + ::size_t width, + ::size_t height, + ::size_t row_pitch = 0, + void* host_ptr = NULL, + cl_int* err = NULL) + { + cl_int error; + bool useCreateImage; + +#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + // Run-time decision based on the actual platform + { + cl_uint version = detail::getContextPlatformVersion(context()); + useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above + } +#elif defined(CL_VERSION_1_2) + useCreateImage = true; +#else + useCreateImage = false; +#endif + +#if defined(CL_VERSION_1_2) + if (useCreateImage) + { + cl_image_desc desc = + { + CL_MEM_OBJECT_IMAGE2D, + width, + height, + 0, 0, // depth, array size (unused) + row_pitch, + 0, 0, 0, 0 + }; + object_ = ::clCreateImage( + context(), + flags, + &format, + &desc, + host_ptr, + &error); + + detail::errHandler(error, __CREATE_IMAGE_ERR); + if (err != NULL) { + *err = error; + } + } +#endif // #if defined(CL_VERSION_1_2) +#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + if (!useCreateImage) + { + object_ = ::clCreateImage2D( + context(), flags,&format, width, height, row_pitch, host_ptr, &error); + + detail::errHandler(error, __CREATE_IMAGE2D_ERR); + if (err != NULL) { + *err = error; + } + } +#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + } + + //! \brief Default constructor - initializes to NULL. + Image2D() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + Image2D& operator = (const cl_mem& rhs) + { + Image::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image2D(const Image2D& img) : Image(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image2D& operator = (const Image2D &img) + { + Image::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image2D(Image2D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image2D& operator = (Image2D &&img) + { + Image::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; + + +#if !defined(CL_VERSION_1_2) +/*! \brief Class interface for GL 2D Image Memory objects. + * + * This is provided to facilitate interoperability with OpenGL. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + * \note Deprecated for OpenCL 1.2. Please use ImageGL instead. + */ +class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D +{ +public: + /*! \brief Constructs an Image2DGL in a specified context, from a given + * GL Texture. + * + * Wraps clCreateFromGLTexture2D(). + */ + Image2DGL( + const Context& context, + cl_mem_flags flags, + cl_GLenum target, + cl_GLint miplevel, + cl_GLuint texobj, + cl_int * err = NULL) + { + cl_int error; + object_ = ::clCreateFromGLTexture2D( + context(), + flags, + target, + miplevel, + texobj, + &error); + + detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR); + if (err != NULL) { + *err = error; + } + + } + + //! \brief Default constructor - initializes to NULL. + Image2DGL() : Image2D() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + Image2DGL& operator = (const cl_mem& rhs) + { + Image2D::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image2DGL(const Image2DGL& img) : Image2D(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image2DGL& operator = (const Image2DGL &img) + { + Image2D::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image2DGL(Image2DGL&& img) CL_HPP_NOEXCEPT : Image2D(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image2DGL& operator = (Image2DGL &&img) + { + Image2D::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; +#endif // #if !defined(CL_VERSION_1_2) + +#if defined(CL_VERSION_1_2) +/*! \class Image2DArray + * \brief Image interface for arrays of 2D images. + */ +class Image2DArray : public Image +{ +public: + Image2DArray( + const Context& context, + cl_mem_flags flags, + ImageFormat format, + ::size_t arraySize, + ::size_t width, + ::size_t height, + ::size_t rowPitch, + ::size_t slicePitch, + void* host_ptr = NULL, + cl_int* err = NULL) + { + cl_int error; + cl_image_desc desc = + { + CL_MEM_OBJECT_IMAGE2D_ARRAY, + width, + height, + 0, // depth (unused) + arraySize, + rowPitch, + slicePitch, + 0, 0, 0 + }; + object_ = ::clCreateImage( + context(), + flags, + &format, + &desc, + host_ptr, + &error); + + detail::errHandler(error, __CREATE_IMAGE_ERR); + if (err != NULL) { + *err = error; + } + } + + Image2DArray() { } + + __CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { } + + Image2DArray& operator = (const cl_mem& rhs) + { + Image::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image2DArray(const Image2DArray& img) : Image(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image2DArray& operator = (const Image2DArray &img) + { + Image::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image2DArray(Image2DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image2DArray& operator = (Image2DArray &&img) + { + Image::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; +#endif // #if defined(CL_VERSION_1_2) + +/*! \brief Class interface for 3D Image Memory objects. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class Image3D : public Image +{ +public: + /*! \brief Constructs a 3D Image in a specified context. + * + * Wraps clCreateImage(). + */ + Image3D( + const Context& context, + cl_mem_flags flags, + ImageFormat format, + ::size_t width, + ::size_t height, + ::size_t depth, + ::size_t row_pitch = 0, + ::size_t slice_pitch = 0, + void* host_ptr = NULL, + cl_int* err = NULL) + { + cl_int error; + bool useCreateImage; + +#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + // Run-time decision based on the actual platform + { + cl_uint version = detail::getContextPlatformVersion(context()); + useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above + } +#elif defined(CL_VERSION_1_2) + useCreateImage = true; +#else + useCreateImage = false; +#endif + +#if defined(CL_VERSION_1_2) + if (useCreateImage) + { + cl_image_desc desc = + { + CL_MEM_OBJECT_IMAGE3D, + width, + height, + depth, + 0, // array size (unused) + row_pitch, + slice_pitch, + 0, 0, 0 + }; + object_ = ::clCreateImage( + context(), + flags, + &format, + &desc, + host_ptr, + &error); + + detail::errHandler(error, __CREATE_IMAGE_ERR); + if (err != NULL) { + *err = error; + } + } +#endif // #if defined(CL_VERSION_1_2) +#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + if (!useCreateImage) + { + object_ = ::clCreateImage3D( + context(), flags, &format, width, height, depth, row_pitch, + slice_pitch, host_ptr, &error); + + detail::errHandler(error, __CREATE_IMAGE3D_ERR); + if (err != NULL) { + *err = error; + } + } +#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) + } + + //! \brief Default constructor - initializes to NULL. + Image3D() : Image() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + Image3D& operator = (const cl_mem& rhs) + { + Image::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image3D(const Image3D& img) : Image(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image3D& operator = (const Image3D &img) + { + Image::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image3D(Image3D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image3D& operator = (Image3D &&img) + { + Image::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; + +#if !defined(CL_VERSION_1_2) +/*! \brief Class interface for GL 3D Image Memory objects. + * + * This is provided to facilitate interoperability with OpenGL. + * + * See Memory for details about copy semantics, etc. + * + * \see Memory + */ +class Image3DGL : public Image3D +{ +public: + /*! \brief Constructs an Image3DGL in a specified context, from a given + * GL Texture. + * + * Wraps clCreateFromGLTexture3D(). + */ + Image3DGL( + const Context& context, + cl_mem_flags flags, + cl_GLenum target, + cl_GLint miplevel, + cl_GLuint texobj, + cl_int * err = NULL) + { + cl_int error; + object_ = ::clCreateFromGLTexture3D( + context(), + flags, + target, + miplevel, + texobj, + &error); + + detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR); + if (err != NULL) { + *err = error; + } + } + + //! \brief Default constructor - initializes to NULL. + Image3DGL() : Image3D() { } + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ + __CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { } + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + Image3DGL& operator = (const cl_mem& rhs) + { + Image3D::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image3DGL(const Image3DGL& img) : Image3D(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Image3DGL& operator = (const Image3DGL &img) + { + Image3D::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Image3DGL(Image3DGL&& img) CL_HPP_NOEXCEPT : Image3D(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Image3DGL& operator = (Image3DGL &&img) + { + Image3D::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; +#endif // #if !defined(CL_VERSION_1_2) + +#if defined(CL_VERSION_1_2) +/*! \class ImageGL + * \brief general image interface for GL interop. + * We abstract the 2D and 3D GL images into a single instance here + * that wraps all GL sourced images on the grounds that setup information + * was performed by OpenCL anyway. + */ +class ImageGL : public Image +{ +public: + ImageGL( + const Context& context, + cl_mem_flags flags, + cl_GLenum target, + cl_GLint miplevel, + cl_GLuint texobj, + cl_int * err = NULL) + { + cl_int error; + object_ = ::clCreateFromGLTexture( + context(), + flags, + target, + miplevel, + texobj, + &error); + + detail::errHandler(error, __CREATE_GL_TEXTURE_ERR); + if (err != NULL) { + *err = error; + } + } + + ImageGL() : Image() { } + + __CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { } + + ImageGL& operator = (const cl_mem& rhs) + { + Image::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + ImageGL(const ImageGL& img) : Image(img) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + ImageGL& operator = (const ImageGL &img) + { + Image::operator=(img); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + ImageGL(ImageGL&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + ImageGL& operator = (ImageGL &&img) + { + Image::operator=(std::move(img)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) +}; +#endif // #if defined(CL_VERSION_1_2) + +/*! \brief Class interface for GL Render Buffer Memory Objects. +* +* This is provided to facilitate interoperability with OpenGL. +* +* See Memory for details about copy semantics, etc. +* +* \see Memory +*/ +class BufferRenderGL : +#if defined(CL_VERSION_1_2) + public ImageGL +#else // #if defined(CL_VERSION_1_2) + public Image2DGL +#endif //#if defined(CL_VERSION_1_2) +{ +public: + /*! \brief Constructs a BufferRenderGL in a specified context, from a given + * GL Renderbuffer. + * + * Wraps clCreateFromGLRenderbuffer(). + */ + BufferRenderGL( + const Context& context, + cl_mem_flags flags, + cl_GLuint bufobj, + cl_int * err = NULL) + { + cl_int error; + object_ = ::clCreateFromGLRenderbuffer( + context(), + flags, + bufobj, + &error); + + detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } + + //! \brief Default constructor - initializes to NULL. +#if defined(CL_VERSION_1_2) + BufferRenderGL() : ImageGL() {}; +#else // #if defined(CL_VERSION_1_2) + BufferRenderGL() : Image2DGL() {}; +#endif //#if defined(CL_VERSION_1_2) + + /*! \brief Constructor from cl_mem - takes ownership. + * + * See Memory for further details. + */ +#if defined(CL_VERSION_1_2) + __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : ImageGL(buffer) { } +#else // #if defined(CL_VERSION_1_2) + __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Image2DGL(buffer) { } +#endif //#if defined(CL_VERSION_1_2) + + + /*! \brief Assignment from cl_mem - performs shallow copy. + * + * See Memory for further details. + */ + BufferRenderGL& operator = (const cl_mem& rhs) + { +#if defined(CL_VERSION_1_2) + ImageGL::operator=(rhs); +#else // #if defined(CL_VERSION_1_2) + Image2DGL::operator=(rhs); +#endif //#if defined(CL_VERSION_1_2) + + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ +#if defined(CL_VERSION_1_2) + BufferRenderGL(const BufferRenderGL& buf) : ImageGL(buf) {} +#else // #if defined(CL_VERSION_1_2) + BufferRenderGL(const BufferRenderGL& buf) : Image2DGL(buf) {} +#endif //#if defined(CL_VERSION_1_2) + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + BufferRenderGL& operator = (const BufferRenderGL &rhs) + { +#if defined(CL_VERSION_1_2) + ImageGL::operator=(rhs); +#else // #if defined(CL_VERSION_1_2) + Image2DGL::operator=(rhs); +#endif //#if defined(CL_VERSION_1_2) + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ +#if defined(CL_VERSION_1_2) + BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : ImageGL(std::move(buf)) {} +#else // #if defined(CL_VERSION_1_2) + BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : Image2DGL(std::move(buf)) {} +#endif //#if defined(CL_VERSION_1_2) + + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + BufferRenderGL& operator = (BufferRenderGL &&buf) + { +#if defined(CL_VERSION_1_2) + ImageGL::operator=(std::move(buf)); +#else // #if defined(CL_VERSION_1_2) + Image2DGL::operator=(std::move(buf)); +#endif //#if defined(CL_VERSION_1_2) + + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + //! \brief Wrapper for clGetGLObjectInfo(). + cl_int getObjectInfo( + cl_gl_object_type *type, + cl_GLuint * gl_object_name) + { + return detail::errHandler( + ::clGetGLObjectInfo(object_, type, gl_object_name), + __GET_GL_OBJECT_INFO_ERR); + } +}; + +/*! \brief Class interface for cl_sampler. + * + * \note Copies of these objects are shallow, meaning that the copy will refer + * to the same underlying cl_sampler as the original. For details, see + * clRetainSampler() and clReleaseSampler(). + * + * \see cl_sampler + */ +class Sampler : public detail::Wrapper +{ +public: + //! \brief Default constructor - initializes to NULL. + Sampler() { } + + /*! \brief Constructs a Sampler in a specified context. + * + * Wraps clCreateSampler(). + */ + Sampler( + const Context& context, + cl_bool normalized_coords, + cl_addressing_mode addressing_mode, + cl_filter_mode filter_mode, + cl_int* err = NULL) + { + cl_int error; + object_ = ::clCreateSampler( + context(), + normalized_coords, + addressing_mode, + filter_mode, + &error); + + detail::errHandler(error, __CREATE_SAMPLER_ERR); + if (err != NULL) { + *err = error; + } + } + + /*! \brief Constructor from cl_sampler - takes ownership. + * + * This effectively transfers ownership of a refcount on the cl_sampler + * into the new Sampler object. + */ + __CL_EXPLICIT_CONSTRUCTORS Sampler(const cl_sampler& sampler) : detail::Wrapper(sampler) { } + + /*! \brief Assignment operator from cl_sampler - takes ownership. + * + * This effectively transfers ownership of a refcount on the rhs and calls + * clReleaseSampler() on the value previously held by this instance. + */ + Sampler& operator = (const cl_sampler& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Sampler(const Sampler& sam) : detail::Wrapper(sam) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Sampler& operator = (const Sampler &sam) + { + detail::Wrapper::operator=(sam); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Sampler(Sampler&& sam) CL_HPP_NOEXCEPT : detail::Wrapper(std::move(sam)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Sampler& operator = (Sampler &&sam) + { + detail::Wrapper::operator=(std::move(sam)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + //! \brief Wrapper for clGetSamplerInfo(). + template + cl_int getInfo(cl_sampler_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetSamplerInfo, object_, name, param), + __GET_SAMPLER_INFO_ERR); + } + + //! \brief Wrapper for clGetSamplerInfo() that returns by value. + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_sampler_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } +}; + +class Program; +class CommandQueue; +class Kernel; + +//! \brief Class interface for specifying NDRange values. +class NDRange +{ +private: + size_t<3> sizes_; + cl_uint dimensions_; + +public: + //! \brief Default constructor - resulting range has zero dimensions. + NDRange() + : dimensions_(0) + { } + + //! \brief Constructs one-dimensional range. + NDRange(::size_t size0) + : dimensions_(1) + { + sizes_[0] = size0; + } + + //! \brief Constructs two-dimensional range. + NDRange(::size_t size0, ::size_t size1) + : dimensions_(2) + { + sizes_[0] = size0; + sizes_[1] = size1; + } + + //! \brief Constructs three-dimensional range. + NDRange(::size_t size0, ::size_t size1, ::size_t size2) + : dimensions_(3) + { + sizes_[0] = size0; + sizes_[1] = size1; + sizes_[2] = size2; + } + + /*! \brief Conversion operator to const ::size_t *. + * + * \returns a pointer to the size of the first dimension. + */ + operator const ::size_t*() const { + return (const ::size_t*) sizes_; + } + + //! \brief Queries the number of dimensions in the range. + ::size_t dimensions() const { return dimensions_; } +}; + +//! \brief A zero-dimensional range. +static const NDRange NullRange; + +//! \brief Local address wrapper for use with Kernel::setArg +struct LocalSpaceArg +{ + ::size_t size_; +}; + +namespace detail { + +template +struct KernelArgumentHandler +{ + static ::size_t size(const T&) { return sizeof(T); } + static const T* ptr(const T& value) { return &value; } +}; + +template <> +struct KernelArgumentHandler +{ + static ::size_t size(const LocalSpaceArg& value) { return value.size_; } + static const void* ptr(const LocalSpaceArg&) { return NULL; } +}; + +} +//! \endcond + +/*! __local + * \brief Helper function for generating LocalSpaceArg objects. + * Deprecated. Replaced with Local. + */ +inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg +__local(::size_t size) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; +inline LocalSpaceArg +__local(::size_t size) +{ + LocalSpaceArg ret = { size }; + return ret; +} + +/*! Local + * \brief Helper function for generating LocalSpaceArg objects. + */ +inline LocalSpaceArg +Local(::size_t size) +{ + LocalSpaceArg ret = { size }; + return ret; +} + +//class KernelFunctor; + +/*! \brief Class interface for cl_kernel. + * + * \note Copies of these objects are shallow, meaning that the copy will refer + * to the same underlying cl_kernel as the original. For details, see + * clRetainKernel() and clReleaseKernel(). + * + * \see cl_kernel + */ +class Kernel : public detail::Wrapper +{ +public: + inline Kernel(const Program& program, const char* name, cl_int* err = NULL); + + //! \brief Default constructor - initializes to NULL. + Kernel() { } + + /*! \brief Constructor from cl_kernel - takes ownership. + * + * This effectively transfers ownership of a refcount on the cl_kernel + * into the new Kernel object. + */ + __CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper(kernel) { } + + /*! \brief Assignment operator from cl_kernel - takes ownership. + * + * This effectively transfers ownership of a refcount on the rhs and calls + * clReleaseKernel() on the value previously held by this instance. + */ + Kernel& operator = (const cl_kernel& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Kernel(const Kernel& kernel) : detail::Wrapper(kernel) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Kernel& operator = (const Kernel &kernel) + { + detail::Wrapper::operator=(kernel); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Kernel(Kernel&& kernel) CL_HPP_NOEXCEPT : detail::Wrapper(std::move(kernel)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Kernel& operator = (Kernel &&kernel) + { + detail::Wrapper::operator=(std::move(kernel)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + template + cl_int getInfo(cl_kernel_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetKernelInfo, object_, name, param), + __GET_KERNEL_INFO_ERR); + } + + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_kernel_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + +#if defined(CL_VERSION_1_2) + template + cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param), + __GET_KERNEL_ARG_INFO_ERR); + } + + template typename + detail::param_traits::param_type + getArgInfo(cl_uint argIndex, cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_kernel_arg_info, name>::param_type param; + cl_int result = getArgInfo(argIndex, name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } +#endif // #if defined(CL_VERSION_1_2) + + template + cl_int getWorkGroupInfo( + const Device& device, cl_kernel_work_group_info name, T* param) const + { + return detail::errHandler( + detail::getInfo( + &::clGetKernelWorkGroupInfo, object_, device(), name, param), + __GET_KERNEL_WORK_GROUP_INFO_ERR); + } + + template typename + detail::param_traits::param_type + getWorkGroupInfo(const Device& device, cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_kernel_work_group_info, name>::param_type param; + cl_int result = getWorkGroupInfo(device, name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + template + cl_int setArg(cl_uint index, const T &value) + { + return detail::errHandler( + ::clSetKernelArg( + object_, + index, + detail::KernelArgumentHandler::size(value), + detail::KernelArgumentHandler::ptr(value)), + __SET_KERNEL_ARGS_ERR); + } + + cl_int setArg(cl_uint index, ::size_t size, const void* argPtr) + { + return detail::errHandler( + ::clSetKernelArg(object_, index, size, argPtr), + __SET_KERNEL_ARGS_ERR); + } +}; + +/*! \class Program + * \brief Program interface that implements cl_program. + */ +class Program : public detail::Wrapper +{ +public: + typedef VECTOR_CLASS > Binaries; + typedef VECTOR_CLASS > Sources; + + Program( + const STRING_CLASS& source, + bool build = false, + cl_int* err = NULL) + { + cl_int error; + + const char * strings = source.c_str(); + const ::size_t length = source.size(); + + Context context = Context::getDefault(err); + + object_ = ::clCreateProgramWithSource( + context(), (cl_uint)1, &strings, &length, &error); + + detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); + + if (error == CL_SUCCESS && build) { + + error = ::clBuildProgram( + object_, + 0, + NULL, + "", + NULL, + NULL); + + detail::errHandler(error, __BUILD_PROGRAM_ERR); + } + + if (err != NULL) { + *err = error; + } + } + + Program( + const Context& context, + const STRING_CLASS& source, + bool build = false, + cl_int* err = NULL) + { + cl_int error; + + const char * strings = source.c_str(); + const ::size_t length = source.size(); + + object_ = ::clCreateProgramWithSource( + context(), (cl_uint)1, &strings, &length, &error); + + detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); + + if (error == CL_SUCCESS && build) { + + error = ::clBuildProgram( + object_, + 0, + NULL, + "", + NULL, + NULL); + + detail::errHandler(error, __BUILD_PROGRAM_ERR); + } + + if (err != NULL) { + *err = error; + } + } + + Program( + const Context& context, + const Sources& sources, + cl_int* err = NULL) + { + cl_int error; + + const ::size_t n = (::size_t)sources.size(); + ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t)); + const char** strings = (const char**) alloca(n * sizeof(const char*)); + + for (::size_t i = 0; i < n; ++i) { + strings[i] = sources[(int)i].first; + lengths[i] = sources[(int)i].second; + } + + object_ = ::clCreateProgramWithSource( + context(), (cl_uint)n, strings, lengths, &error); + + detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); + if (err != NULL) { + *err = error; + } + } + + /** + * Construct a program object from a list of devices and a per-device list of binaries. + * \param context A valid OpenCL context in which to construct the program. + * \param devices A vector of OpenCL device objects for which the program will be created. + * \param binaries A vector of pairs of a pointer to a binary object and its length. + * \param binaryStatus An optional vector that on completion will be resized to + * match the size of binaries and filled with values to specify if each binary + * was successfully loaded. + * Set to CL_SUCCESS if the binary was successfully loaded. + * Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL. + * Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device. + * \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors: + * CL_INVALID_CONTEXT if context is not a valid context. + * CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices; + * or if any entry in binaries is NULL or has length 0. + * CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context. + * CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device. + * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host. + */ + Program( + const Context& context, + const VECTOR_CLASS& devices, + const Binaries& binaries, + VECTOR_CLASS* binaryStatus = NULL, + cl_int* err = NULL) + { + cl_int error; + + const ::size_t numDevices = devices.size(); + + // Catch size mismatch early and return + if(binaries.size() != numDevices) { + error = CL_INVALID_VALUE; + detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR); + if (err != NULL) { + *err = error; + } + return; + } + + ::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t)); + const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**)); + + for (::size_t i = 0; i < numDevices; ++i) { + images[i] = (const unsigned char*)binaries[i].first; + lengths[i] = binaries[(int)i].second; + } + + cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); + for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { + deviceIDs[deviceIndex] = (devices[deviceIndex])(); + } + + if(binaryStatus) { + binaryStatus->resize(numDevices); + } + + object_ = ::clCreateProgramWithBinary( + context(), (cl_uint) devices.size(), + deviceIDs, + lengths, images, (binaryStatus != NULL && numDevices > 0) + ? &binaryStatus->front() + : NULL, &error); + + detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR); + if (err != NULL) { + *err = error; + } + } + + +#if defined(CL_VERSION_1_2) + /** + * Create program using builtin kernels. + * \param kernelNames Semi-colon separated list of builtin kernel names + */ + Program( + const Context& context, + const VECTOR_CLASS& devices, + const STRING_CLASS& kernelNames, + cl_int* err = NULL) + { + cl_int error; + + + ::size_t numDevices = devices.size(); + cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); + for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { + deviceIDs[deviceIndex] = (devices[deviceIndex])(); + } + + object_ = ::clCreateProgramWithBuiltInKernels( + context(), + (cl_uint) devices.size(), + deviceIDs, + kernelNames.c_str(), + &error); + + detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR); + if (err != NULL) { + *err = error; + } + } +#endif // #if defined(CL_VERSION_1_2) + + Program() { } + + __CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper(program) { } + + Program& operator = (const cl_program& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + Program(const Program& program) : detail::Wrapper(program) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + Program& operator = (const Program &program) + { + detail::Wrapper::operator=(program); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + Program(Program&& program) CL_HPP_NOEXCEPT : detail::Wrapper(std::move(program)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + Program& operator = (Program &&program) + { + detail::Wrapper::operator=(std::move(program)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + cl_int build( + const VECTOR_CLASS& devices, + const char* options = NULL, + void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, + void* data = NULL) const + { + ::size_t numDevices = devices.size(); + cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); + for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { + deviceIDs[deviceIndex] = (devices[deviceIndex])(); + } + + return detail::errHandler( + ::clBuildProgram( + object_, + (cl_uint) + devices.size(), + deviceIDs, + options, + notifyFptr, + data), + __BUILD_PROGRAM_ERR); + } + + cl_int build( + const char* options = NULL, + void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, + void* data = NULL) const + { + return detail::errHandler( + ::clBuildProgram( + object_, + 0, + NULL, + options, + notifyFptr, + data), + __BUILD_PROGRAM_ERR); + } + +#if defined(CL_VERSION_1_2) + cl_int compile( + const char* options = NULL, + void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, + void* data = NULL) const + { + return detail::errHandler( + ::clCompileProgram( + object_, + 0, + NULL, + options, + 0, + NULL, + NULL, + notifyFptr, + data), + __COMPILE_PROGRAM_ERR); + } +#endif + + template + cl_int getInfo(cl_program_info name, T* param) const + { + return detail::errHandler( + detail::getInfo(&::clGetProgramInfo, object_, name, param), + __GET_PROGRAM_INFO_ERR); + } + + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_program_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + template + cl_int getBuildInfo( + const Device& device, cl_program_build_info name, T* param) const + { + return detail::errHandler( + detail::getInfo( + &::clGetProgramBuildInfo, object_, device(), name, param), + __GET_PROGRAM_BUILD_INFO_ERR); + } + + template typename + detail::param_traits::param_type + getBuildInfo(const Device& device, cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_program_build_info, name>::param_type param; + cl_int result = getBuildInfo(device, name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + cl_int createKernels(VECTOR_CLASS* kernels) + { + cl_uint numKernels; + cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); + } + + Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel)); + err = ::clCreateKernelsInProgram( + object_, numKernels, (cl_kernel*) value, NULL); + if (err != CL_SUCCESS) { + return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); + } + + kernels->assign(&value[0], &value[numKernels]); + return CL_SUCCESS; + } +}; + +#if defined(CL_VERSION_1_2) +inline Program linkProgram( + Program input1, + Program input2, + const char* options = NULL, + void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, + void* data = NULL, + cl_int* err = NULL) +{ + cl_int error_local = CL_SUCCESS; + + cl_program programs[2] = { input1(), input2() }; + + Context ctx = input1.getInfo(&error_local); + if(error_local!=CL_SUCCESS) { + detail::errHandler(error_local, __LINK_PROGRAM_ERR); + } + + cl_program prog = ::clLinkProgram( + ctx(), + 0, + NULL, + options, + 2, + programs, + notifyFptr, + data, + &error_local); + + detail::errHandler(error_local,__COMPILE_PROGRAM_ERR); + if (err != NULL) { + *err = error_local; + } + + return Program(prog); +} + +inline Program linkProgram( + VECTOR_CLASS inputPrograms, + const char* options = NULL, + void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, + void* data = NULL, + cl_int* err = NULL) +{ + cl_int error_local = CL_SUCCESS; + + cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program)); + + if (programs != NULL) { + for (unsigned int i = 0; i < inputPrograms.size(); i++) { + programs[i] = inputPrograms[i](); + } + } + + Context ctx; + if(inputPrograms.size() > 0) { + ctx = inputPrograms[0].getInfo(&error_local); + if(error_local!=CL_SUCCESS) { + detail::errHandler(error_local, __LINK_PROGRAM_ERR); + } + } + cl_program prog = ::clLinkProgram( + ctx(), + 0, + NULL, + options, + (cl_uint)inputPrograms.size(), + programs, + notifyFptr, + data, + &error_local); + + detail::errHandler(error_local,__COMPILE_PROGRAM_ERR); + if (err != NULL) { + *err = error_local; + } + + return Program(prog); +} +#endif + +template<> +inline VECTOR_CLASS cl::Program::getInfo(cl_int* err) const +{ + VECTOR_CLASS< ::size_t> sizes = getInfo(); + VECTOR_CLASS binaries; + for (VECTOR_CLASS< ::size_t>::iterator s = sizes.begin(); s != sizes.end(); ++s) + { + char *ptr = NULL; + if (*s != 0) + ptr = new char[*s]; + binaries.push_back(ptr); + } + + cl_int result = getInfo(CL_PROGRAM_BINARIES, &binaries); + if (err != NULL) { + *err = result; + } + return binaries; +} + +inline Kernel::Kernel(const Program& program, const char* name, cl_int* err) +{ + cl_int error; + + object_ = ::clCreateKernel(program(), name, &error); + detail::errHandler(error, __CREATE_KERNEL_ERR); + + if (err != NULL) { + *err = error; + } + +} + +/*! \class CommandQueue + * \brief CommandQueue interface for cl_command_queue. + */ +class CommandQueue : public detail::Wrapper +{ +private: +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED + static std::atomic default_initialized_; +#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED + static volatile int default_initialized_; +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED + static CommandQueue default_; + static volatile cl_int default_error_; +public: + CommandQueue( + cl_command_queue_properties properties, + cl_int* err = NULL) + { + cl_int error; + + Context context = Context::getDefault(&error); + detail::errHandler(error, __CREATE_CONTEXT_ERR); + + if (error != CL_SUCCESS) { + if (err != NULL) { + *err = error; + } + } + else { + Device device = context.getInfo()[0]; + + object_ = ::clCreateCommandQueue( + context(), device(), properties, &error); + + detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); + if (err != NULL) { + *err = error; + } + } + } + /*! + * \brief Constructs a CommandQueue for an implementation defined device in the given context + */ + explicit CommandQueue( + const Context& context, + cl_command_queue_properties properties = 0, + cl_int* err = NULL) + { + cl_int error; + VECTOR_CLASS devices; + error = context.getInfo(CL_CONTEXT_DEVICES, &devices); + + detail::errHandler(error, __CREATE_CONTEXT_ERR); + + if (error != CL_SUCCESS) + { + if (err != NULL) { + *err = error; + } + return; + } + + object_ = ::clCreateCommandQueue(context(), devices[0](), properties, &error); + + detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); + + if (err != NULL) { + *err = error; + } + + } + + CommandQueue( + const Context& context, + const Device& device, + cl_command_queue_properties properties = 0, + cl_int* err = NULL) + { + cl_int error; + object_ = ::clCreateCommandQueue( + context(), device(), properties, &error); + + detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); + if (err != NULL) { + *err = error; + } + } + + /*! \brief Copy constructor to forward copy to the superclass correctly. + * Required for MSVC. + */ + CommandQueue(const CommandQueue& queue) : detail::Wrapper(queue) {} + + /*! \brief Copy assignment to forward copy to the superclass correctly. + * Required for MSVC. + */ + CommandQueue& operator = (const CommandQueue &queue) + { + detail::Wrapper::operator=(queue); + return *this; + } + +#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + /*! \brief Move constructor to forward move to the superclass correctly. + * Required for MSVC. + */ + CommandQueue(CommandQueue&& queue) CL_HPP_NOEXCEPT : detail::Wrapper(std::move(queue)) {} + + /*! \brief Move assignment to forward move to the superclass correctly. + * Required for MSVC. + */ + CommandQueue& operator = (CommandQueue &&queue) + { + detail::Wrapper::operator=(std::move(queue)); + return *this; + } +#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED) + + static CommandQueue getDefault(cl_int * err = NULL) + { + int state = detail::compare_exchange( + &default_initialized_, + __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED); + + if (state & __DEFAULT_INITIALIZED) { + if (err != NULL) { + *err = default_error_; + } + return default_; + } + + if (state & __DEFAULT_BEING_INITIALIZED) { + // Assume writes will propagate eventually... + while(default_initialized_ != __DEFAULT_INITIALIZED) { + detail::fence(); + } + + if (err != NULL) { + *err = default_error_; + } + return default_; + } + + cl_int error; + + Context context = Context::getDefault(&error); + detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); + + if (error != CL_SUCCESS) { + if (err != NULL) { + *err = error; + } + } + else { + Device device = context.getInfo()[0]; + + default_ = CommandQueue(context, device, 0, &error); + + detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); + if (err != NULL) { + *err = error; + } + } + + detail::fence(); + + default_error_ = error; + // Assume writes will propagate eventually... + default_initialized_ = __DEFAULT_INITIALIZED; + + detail::fence(); + + if (err != NULL) { + *err = default_error_; + } + return default_; + + } + + CommandQueue() { } + + __CL_EXPLICIT_CONSTRUCTORS CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper(commandQueue) { } + + CommandQueue& operator = (const cl_command_queue& rhs) + { + detail::Wrapper::operator=(rhs); + return *this; + } + + template + cl_int getInfo(cl_command_queue_info name, T* param) const + { + return detail::errHandler( + detail::getInfo( + &::clGetCommandQueueInfo, object_, name, param), + __GET_COMMAND_QUEUE_INFO_ERR); + } + + template typename + detail::param_traits::param_type + getInfo(cl_int* err = NULL) const + { + typename detail::param_traits< + detail::cl_command_queue_info, name>::param_type param; + cl_int result = getInfo(name, ¶m); + if (err != NULL) { + *err = result; + } + return param; + } + + cl_int enqueueReadBuffer( + const Buffer& buffer, + cl_bool blocking, + ::size_t offset, + ::size_t size, + void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueReadBuffer( + object_, buffer(), blocking, offset, size, + ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_READ_BUFFER_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueWriteBuffer( + const Buffer& buffer, + cl_bool blocking, + ::size_t offset, + ::size_t size, + const void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueWriteBuffer( + object_, buffer(), blocking, offset, size, + ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_WRITE_BUFFER_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueCopyBuffer( + const Buffer& src, + const Buffer& dst, + ::size_t src_offset, + ::size_t dst_offset, + ::size_t size, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueCopyBuffer( + object_, src(), dst(), src_offset, dst_offset, size, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQEUE_COPY_BUFFER_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueReadBufferRect( + const Buffer& buffer, + cl_bool blocking, + const size_t<3>& buffer_offset, + const size_t<3>& host_offset, + const size_t<3>& region, + ::size_t buffer_row_pitch, + ::size_t buffer_slice_pitch, + ::size_t host_row_pitch, + ::size_t host_slice_pitch, + void *ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueReadBufferRect( + object_, + buffer(), + blocking, + (const ::size_t *)buffer_offset, + (const ::size_t *)host_offset, + (const ::size_t *)region, + buffer_row_pitch, + buffer_slice_pitch, + host_row_pitch, + host_slice_pitch, + ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_READ_BUFFER_RECT_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueWriteBufferRect( + const Buffer& buffer, + cl_bool blocking, + const size_t<3>& buffer_offset, + const size_t<3>& host_offset, + const size_t<3>& region, + ::size_t buffer_row_pitch, + ::size_t buffer_slice_pitch, + ::size_t host_row_pitch, + ::size_t host_slice_pitch, + void *ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueWriteBufferRect( + object_, + buffer(), + blocking, + (const ::size_t *)buffer_offset, + (const ::size_t *)host_offset, + (const ::size_t *)region, + buffer_row_pitch, + buffer_slice_pitch, + host_row_pitch, + host_slice_pitch, + ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_WRITE_BUFFER_RECT_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueCopyBufferRect( + const Buffer& src, + const Buffer& dst, + const size_t<3>& src_origin, + const size_t<3>& dst_origin, + const size_t<3>& region, + ::size_t src_row_pitch, + ::size_t src_slice_pitch, + ::size_t dst_row_pitch, + ::size_t dst_slice_pitch, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueCopyBufferRect( + object_, + src(), + dst(), + (const ::size_t *)src_origin, + (const ::size_t *)dst_origin, + (const ::size_t *)region, + src_row_pitch, + src_slice_pitch, + dst_row_pitch, + dst_slice_pitch, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQEUE_COPY_BUFFER_RECT_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + +#if defined(CL_VERSION_1_2) + /** + * Enqueue a command to fill a buffer object with a pattern + * of a given size. The pattern is specified a as vector. + * \tparam PatternType The datatype of the pattern field. + * The pattern type must be an accepted OpenCL data type. + */ + template + cl_int enqueueFillBuffer( + const Buffer& buffer, + PatternType pattern, + ::size_t offset, + ::size_t size, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueFillBuffer( + object_, + buffer(), + static_cast(&pattern), + sizeof(PatternType), + offset, + size, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_FILL_BUFFER_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } +#endif // #if defined(CL_VERSION_1_2) + + cl_int enqueueReadImage( + const Image& image, + cl_bool blocking, + const size_t<3>& origin, + const size_t<3>& region, + ::size_t row_pitch, + ::size_t slice_pitch, + void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueReadImage( + object_, image(), blocking, (const ::size_t *) origin, + (const ::size_t *) region, row_pitch, slice_pitch, ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_READ_IMAGE_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueWriteImage( + const Image& image, + cl_bool blocking, + const size_t<3>& origin, + const size_t<3>& region, + ::size_t row_pitch, + ::size_t slice_pitch, + void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueWriteImage( + object_, image(), blocking, (const ::size_t *) origin, + (const ::size_t *) region, row_pitch, slice_pitch, ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_WRITE_IMAGE_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueCopyImage( + const Image& src, + const Image& dst, + const size_t<3>& src_origin, + const size_t<3>& dst_origin, + const size_t<3>& region, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueCopyImage( + object_, src(), dst(), (const ::size_t *) src_origin, + (const ::size_t *)dst_origin, (const ::size_t *) region, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_COPY_IMAGE_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + +#if defined(CL_VERSION_1_2) + /** + * Enqueue a command to fill an image object with a specified color. + * \param fillColor is the color to use to fill the image. + * This is a four component RGBA floating-point color value if + * the image channel data type is not an unnormalized signed or + * unsigned data type. + */ + cl_int enqueueFillImage( + const Image& image, + cl_float4 fillColor, + const size_t<3>& origin, + const size_t<3>& region, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueFillImage( + object_, + image(), + static_cast(&fillColor), + (const ::size_t *) origin, + (const ::size_t *) region, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_FILL_IMAGE_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + /** + * Enqueue a command to fill an image object with a specified color. + * \param fillColor is the color to use to fill the image. + * This is a four component RGBA signed integer color value if + * the image channel data type is an unnormalized signed integer + * type. + */ + cl_int enqueueFillImage( + const Image& image, + cl_int4 fillColor, + const size_t<3>& origin, + const size_t<3>& region, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueFillImage( + object_, + image(), + static_cast(&fillColor), + (const ::size_t *) origin, + (const ::size_t *) region, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_FILL_IMAGE_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + /** + * Enqueue a command to fill an image object with a specified color. + * \param fillColor is the color to use to fill the image. + * This is a four component RGBA unsigned integer color value if + * the image channel data type is an unnormalized unsigned integer + * type. + */ + cl_int enqueueFillImage( + const Image& image, + cl_uint4 fillColor, + const size_t<3>& origin, + const size_t<3>& region, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueFillImage( + object_, + image(), + static_cast(&fillColor), + (const ::size_t *) origin, + (const ::size_t *) region, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_FILL_IMAGE_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } +#endif // #if defined(CL_VERSION_1_2) + + cl_int enqueueCopyImageToBuffer( + const Image& src, + const Buffer& dst, + const size_t<3>& src_origin, + const size_t<3>& region, + ::size_t dst_offset, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueCopyImageToBuffer( + object_, src(), dst(), (const ::size_t *) src_origin, + (const ::size_t *) region, dst_offset, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueCopyBufferToImage( + const Buffer& src, + const Image& dst, + ::size_t src_offset, + const size_t<3>& dst_origin, + const size_t<3>& region, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueCopyBufferToImage( + object_, src(), dst(), src_offset, + (const ::size_t *) dst_origin, (const ::size_t *) region, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + void* enqueueMapBuffer( + const Buffer& buffer, + cl_bool blocking, + cl_map_flags flags, + ::size_t offset, + ::size_t size, + const VECTOR_CLASS* events = NULL, + Event* event = NULL, + cl_int* err = NULL) const + { + cl_event tmp; + cl_int error; + void * result = ::clEnqueueMapBuffer( + object_, buffer(), blocking, flags, offset, size, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL, + &error); + + detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + if (event != NULL && error == CL_SUCCESS) + *event = tmp; + + return result; + } + + void* enqueueMapImage( + const Image& buffer, + cl_bool blocking, + cl_map_flags flags, + const size_t<3>& origin, + const size_t<3>& region, + ::size_t * row_pitch, + ::size_t * slice_pitch, + const VECTOR_CLASS* events = NULL, + Event* event = NULL, + cl_int* err = NULL) const + { + cl_event tmp; + cl_int error; + void * result = ::clEnqueueMapImage( + object_, buffer(), blocking, flags, + (const ::size_t *) origin, (const ::size_t *) region, + row_pitch, slice_pitch, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL, + &error); + + detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR); + if (err != NULL) { + *err = error; + } + if (event != NULL && error == CL_SUCCESS) + *event = tmp; + return result; + } + + cl_int enqueueUnmapMemObject( + const Memory& memory, + void* mapped_ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueUnmapMemObject( + object_, memory(), mapped_ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_UNMAP_MEM_OBJECT_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + +#if defined(CL_VERSION_1_2) + /** + * Enqueues a marker command which waits for either a list of events to complete, + * or all previously enqueued commands to complete. + * + * Enqueues a marker command which waits for either a list of events to complete, + * or if the list is empty it waits for all commands previously enqueued in command_queue + * to complete before it completes. This command returns an event which can be waited on, + * i.e. this event can be waited on to insure that all events either in the event_wait_list + * or all previously enqueued commands, queued before this command to command_queue, + * have completed. + */ + cl_int enqueueMarkerWithWaitList( + const VECTOR_CLASS *events = 0, + Event *event = 0) + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueMarkerWithWaitList( + object_, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_MARKER_WAIT_LIST_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + /** + * A synchronization point that enqueues a barrier operation. + * + * Enqueues a barrier command which waits for either a list of events to complete, + * or if the list is empty it waits for all commands previously enqueued in command_queue + * to complete before it completes. This command blocks command execution, that is, any + * following commands enqueued after it do not execute until it completes. This command + * returns an event which can be waited on, i.e. this event can be waited on to insure that + * all events either in the event_wait_list or all previously enqueued commands, queued + * before this command to command_queue, have completed. + */ + cl_int enqueueBarrierWithWaitList( + const VECTOR_CLASS *events = 0, + Event *event = 0) + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueBarrierWithWaitList( + object_, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_BARRIER_WAIT_LIST_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + /** + * Enqueues a command to indicate with which device a set of memory objects + * should be associated. + */ + cl_int enqueueMigrateMemObjects( + const VECTOR_CLASS &memObjects, + cl_mem_migration_flags flags, + const VECTOR_CLASS* events = NULL, + Event* event = NULL + ) + { + cl_event tmp; + + cl_mem* localMemObjects = static_cast(alloca(memObjects.size() * sizeof(cl_mem))); + for( int i = 0; i < (int)memObjects.size(); ++i ) { + localMemObjects[i] = memObjects[i](); + } + + + cl_int err = detail::errHandler( + ::clEnqueueMigrateMemObjects( + object_, + (cl_uint)memObjects.size(), + static_cast(localMemObjects), + flags, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_UNMAP_MEM_OBJECT_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } +#endif // #if defined(CL_VERSION_1_2) + + cl_int enqueueNDRangeKernel( + const Kernel& kernel, + const NDRange& offset, + const NDRange& global, + const NDRange& local = NullRange, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueNDRangeKernel( + object_, kernel(), (cl_uint) global.dimensions(), + offset.dimensions() != 0 ? (const ::size_t*) offset : NULL, + (const ::size_t*) global, + local.dimensions() != 0 ? (const ::size_t*) local : NULL, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_NDRANGE_KERNEL_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueTask( + const Kernel& kernel, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueTask( + object_, kernel(), + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_TASK_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueNativeKernel( + void (CL_CALLBACK *userFptr)(void *), + std::pair args, + const VECTOR_CLASS* mem_objects = NULL, + const VECTOR_CLASS* mem_locs = NULL, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0) + ? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem)) + : NULL; + + if (mems != NULL) { + for (unsigned int i = 0; i < mem_objects->size(); i++) { + mems[i] = ((*mem_objects)[i])(); + } + } + + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueNativeKernel( + object_, userFptr, args.first, args.second, + (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, + mems, + (mem_locs != NULL && mem_locs->size() > 0) ? (const void **) &mem_locs->front() : NULL, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_NATIVE_KERNEL); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + +/** + * Deprecated APIs for 1.2 + */ +#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) + CL_EXT_PREFIX__VERSION_1_1_DEPRECATED + cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueMarker( + object_, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_MARKER_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + CL_EXT_PREFIX__VERSION_1_1_DEPRECATED + cl_int enqueueWaitForEvents(const VECTOR_CLASS& events) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED + { + return detail::errHandler( + ::clEnqueueWaitForEvents( + object_, + (cl_uint) events.size(), + events.size() > 0 ? (const cl_event*) &events.front() : NULL), + __ENQUEUE_WAIT_FOR_EVENTS_ERR); + } +#endif // #if defined(CL_VERSION_1_1) + + cl_int enqueueAcquireGLObjects( + const VECTOR_CLASS* mem_objects = NULL, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueAcquireGLObjects( + object_, + (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, + (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_ACQUIRE_GL_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueReleaseGLObjects( + const VECTOR_CLASS* mem_objects = NULL, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueReleaseGLObjects( + object_, + (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, + (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_RELEASE_GL_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + +#if defined (USE_DX_INTEROP) +typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem* mem_objects, cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, cl_event* event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem* mem_objects, cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, cl_event* event); + + cl_int enqueueAcquireD3D10Objects( + const VECTOR_CLASS* mem_objects = NULL, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL; +#if defined(CL_VERSION_1_2) + cl_context context = getInfo(); + cl::Device device(getInfo()); + cl_platform_id platform = device.getInfo(); + __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueAcquireD3D10ObjectsKHR); +#endif +#if defined(CL_VERSION_1_1) + __INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR); +#endif + + cl_event tmp; + cl_int err = detail::errHandler( + pfn_clEnqueueAcquireD3D10ObjectsKHR( + object_, + (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, + (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_ACQUIRE_GL_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } + + cl_int enqueueReleaseD3D10Objects( + const VECTOR_CLASS* mem_objects = NULL, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) const + { + static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL; +#if defined(CL_VERSION_1_2) + cl_context context = getInfo(); + cl::Device device(getInfo()); + cl_platform_id platform = device.getInfo(); + __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueReleaseD3D10ObjectsKHR); +#endif // #if defined(CL_VERSION_1_2) +#if defined(CL_VERSION_1_1) + __INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR); +#endif // #if defined(CL_VERSION_1_1) + + cl_event tmp; + cl_int err = detail::errHandler( + pfn_clEnqueueReleaseD3D10ObjectsKHR( + object_, + (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, + (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_RELEASE_GL_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; + } +#endif + +/** + * Deprecated APIs for 1.2 + */ +#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) + CL_EXT_PREFIX__VERSION_1_1_DEPRECATED + cl_int enqueueBarrier() const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED + { + return detail::errHandler( + ::clEnqueueBarrier(object_), + __ENQUEUE_BARRIER_ERR); + } +#endif // #if defined(CL_VERSION_1_1) + + cl_int flush() const + { + return detail::errHandler(::clFlush(object_), __FLUSH_ERR); + } + + cl_int finish() const + { + return detail::errHandler(::clFinish(object_), __FINISH_ERR); + } +}; + +#ifdef _WIN32 +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED +__declspec(selectany) std::atomic CommandQueue::default_initialized_; +#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__declspec(selectany) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED; +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__declspec(selectany) CommandQueue CommandQueue::default_; +__declspec(selectany) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS; +#else // !_WIN32 +#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED +__attribute__((weak)) std::atomic CommandQueue::default_initialized_; +#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__attribute__((weak)) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED; +#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED +__attribute__((weak)) CommandQueue CommandQueue::default_; +__attribute__((weak)) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS; +#endif // !_WIN32 + +template< typename IteratorType > +Buffer::Buffer( + const Context &context, + IteratorType startIterator, + IteratorType endIterator, + bool readOnly, + bool useHostPtr, + cl_int* err) +{ + typedef typename std::iterator_traits::value_type DataType; + cl_int error; + + cl_mem_flags flags = 0; + if( readOnly ) { + flags |= CL_MEM_READ_ONLY; + } + else { + flags |= CL_MEM_READ_WRITE; + } + if( useHostPtr ) { + flags |= CL_MEM_USE_HOST_PTR; + } + + ::size_t size = sizeof(DataType)*(endIterator - startIterator); + + if( useHostPtr ) { + object_ = ::clCreateBuffer(context(), flags, size, static_cast(&*startIterator), &error); + } else { + object_ = ::clCreateBuffer(context(), flags, size, 0, &error); + } + + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + + if( !useHostPtr ) { + CommandQueue queue(context, 0, &error); + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + + error = cl::copy(queue, startIterator, endIterator, *this); + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } +} + +template< typename IteratorType > +Buffer::Buffer( + const CommandQueue &queue, + IteratorType startIterator, + IteratorType endIterator, + bool readOnly, + bool useHostPtr, + cl_int* err) +{ + typedef typename std::iterator_traits::value_type DataType; + cl_int error; + + cl_mem_flags flags = 0; + if (readOnly) { + flags |= CL_MEM_READ_ONLY; + } + else { + flags |= CL_MEM_READ_WRITE; + } + if (useHostPtr) { + flags |= CL_MEM_USE_HOST_PTR; + } + + ::size_t size = sizeof(DataType)*(endIterator - startIterator); + + Context context = queue.getInfo(); + + if (useHostPtr) { + object_ = ::clCreateBuffer(context(), flags, size, static_cast(&*startIterator), &error); + } + else { + object_ = ::clCreateBuffer(context(), flags, size, 0, &error); + } + + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + + if (!useHostPtr) { + error = cl::copy(queue, startIterator, endIterator, *this); + detail::errHandler(error, __CREATE_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + } +} + +inline cl_int enqueueReadBuffer( + const Buffer& buffer, + cl_bool blocking, + ::size_t offset, + ::size_t size, + void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event); +} + +inline cl_int enqueueWriteBuffer( + const Buffer& buffer, + cl_bool blocking, + ::size_t offset, + ::size_t size, + const void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event); +} + +inline void* enqueueMapBuffer( + const Buffer& buffer, + cl_bool blocking, + cl_map_flags flags, + ::size_t offset, + ::size_t size, + const VECTOR_CLASS* events = NULL, + Event* event = NULL, + cl_int* err = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + + void * result = ::clEnqueueMapBuffer( + queue(), buffer(), blocking, flags, offset, size, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (cl_event*) event, + &error); + + detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); + if (err != NULL) { + *err = error; + } + return result; +} + +inline cl_int enqueueUnmapMemObject( + const Memory& memory, + void* mapped_ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); + if (error != CL_SUCCESS) { + return error; + } + + cl_event tmp; + cl_int err = detail::errHandler( + ::clEnqueueUnmapMemObject( + queue(), memory(), mapped_ptr, + (events != NULL) ? (cl_uint) events->size() : 0, + (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, + (event != NULL) ? &tmp : NULL), + __ENQUEUE_UNMAP_MEM_OBJECT_ERR); + + if (event != NULL && err == CL_SUCCESS) + *event = tmp; + + return err; +} + +inline cl_int enqueueCopyBuffer( + const Buffer& src, + const Buffer& dst, + ::size_t src_offset, + ::size_t dst_offset, + ::size_t size, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event); +} + +/** + * Blocking copy operation between iterators and a buffer. + * Host to Device. + * Uses default command queue. + */ +template< typename IteratorType > +inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + if (error != CL_SUCCESS) + return error; + + return cl::copy(queue, startIterator, endIterator, buffer); +} + +/** + * Blocking copy operation between iterators and a buffer. + * Device to Host. + * Uses default command queue. + */ +template< typename IteratorType > +inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + if (error != CL_SUCCESS) + return error; + + return cl::copy(queue, buffer, startIterator, endIterator); +} + +/** + * Blocking copy operation between iterators and a buffer. + * Host to Device. + * Uses specified queue. + */ +template< typename IteratorType > +inline cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ) +{ + typedef typename std::iterator_traits::value_type DataType; + cl_int error; + + ::size_t length = endIterator-startIterator; + ::size_t byteLength = length*sizeof(DataType); + + DataType *pointer = + static_cast(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error)); + // if exceptions enabled, enqueueMapBuffer will throw + if( error != CL_SUCCESS ) { + return error; + } +#if defined(_MSC_VER) + std::copy( + startIterator, + endIterator, + stdext::checked_array_iterator( + pointer, length)); +#else + std::copy(startIterator, endIterator, pointer); +#endif + Event endEvent; + error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent); + // if exceptions enabled, enqueueUnmapMemObject will throw + if( error != CL_SUCCESS ) { + return error; + } + endEvent.wait(); + return CL_SUCCESS; +} + +/** + * Blocking copy operation between iterators and a buffer. + * Device to Host. + * Uses specified queue. + */ +template< typename IteratorType > +inline cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ) +{ + typedef typename std::iterator_traits::value_type DataType; + cl_int error; + + ::size_t length = endIterator-startIterator; + ::size_t byteLength = length*sizeof(DataType); + + DataType *pointer = + static_cast(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error)); + // if exceptions enabled, enqueueMapBuffer will throw + if( error != CL_SUCCESS ) { + return error; + } + std::copy(pointer, pointer + length, startIterator); + Event endEvent; + error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent); + // if exceptions enabled, enqueueUnmapMemObject will throw + if( error != CL_SUCCESS ) { + return error; + } + endEvent.wait(); + return CL_SUCCESS; +} + +#if defined(CL_VERSION_1_1) +inline cl_int enqueueReadBufferRect( + const Buffer& buffer, + cl_bool blocking, + const size_t<3>& buffer_offset, + const size_t<3>& host_offset, + const size_t<3>& region, + ::size_t buffer_row_pitch, + ::size_t buffer_slice_pitch, + ::size_t host_row_pitch, + ::size_t host_slice_pitch, + void *ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueReadBufferRect( + buffer, + blocking, + buffer_offset, + host_offset, + region, + buffer_row_pitch, + buffer_slice_pitch, + host_row_pitch, + host_slice_pitch, + ptr, + events, + event); +} + +inline cl_int enqueueWriteBufferRect( + const Buffer& buffer, + cl_bool blocking, + const size_t<3>& buffer_offset, + const size_t<3>& host_offset, + const size_t<3>& region, + ::size_t buffer_row_pitch, + ::size_t buffer_slice_pitch, + ::size_t host_row_pitch, + ::size_t host_slice_pitch, + void *ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueWriteBufferRect( + buffer, + blocking, + buffer_offset, + host_offset, + region, + buffer_row_pitch, + buffer_slice_pitch, + host_row_pitch, + host_slice_pitch, + ptr, + events, + event); +} + +inline cl_int enqueueCopyBufferRect( + const Buffer& src, + const Buffer& dst, + const size_t<3>& src_origin, + const size_t<3>& dst_origin, + const size_t<3>& region, + ::size_t src_row_pitch, + ::size_t src_slice_pitch, + ::size_t dst_row_pitch, + ::size_t dst_slice_pitch, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueCopyBufferRect( + src, + dst, + src_origin, + dst_origin, + region, + src_row_pitch, + src_slice_pitch, + dst_row_pitch, + dst_slice_pitch, + events, + event); +} +#endif + +inline cl_int enqueueReadImage( + const Image& image, + cl_bool blocking, + const size_t<3>& origin, + const size_t<3>& region, + ::size_t row_pitch, + ::size_t slice_pitch, + void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueReadImage( + image, + blocking, + origin, + region, + row_pitch, + slice_pitch, + ptr, + events, + event); +} + +inline cl_int enqueueWriteImage( + const Image& image, + cl_bool blocking, + const size_t<3>& origin, + const size_t<3>& region, + ::size_t row_pitch, + ::size_t slice_pitch, + void* ptr, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueWriteImage( + image, + blocking, + origin, + region, + row_pitch, + slice_pitch, + ptr, + events, + event); +} + +inline cl_int enqueueCopyImage( + const Image& src, + const Image& dst, + const size_t<3>& src_origin, + const size_t<3>& dst_origin, + const size_t<3>& region, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueCopyImage( + src, + dst, + src_origin, + dst_origin, + region, + events, + event); +} + +inline cl_int enqueueCopyImageToBuffer( + const Image& src, + const Buffer& dst, + const size_t<3>& src_origin, + const size_t<3>& region, + ::size_t dst_offset, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueCopyImageToBuffer( + src, + dst, + src_origin, + region, + dst_offset, + events, + event); +} + +inline cl_int enqueueCopyBufferToImage( + const Buffer& src, + const Image& dst, + ::size_t src_offset, + const size_t<3>& dst_origin, + const size_t<3>& region, + const VECTOR_CLASS* events = NULL, + Event* event = NULL) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.enqueueCopyBufferToImage( + src, + dst, + src_offset, + dst_origin, + region, + events, + event); +} + + +inline cl_int flush(void) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + return queue.flush(); +} + +inline cl_int finish(void) +{ + cl_int error; + CommandQueue queue = CommandQueue::getDefault(&error); + + if (error != CL_SUCCESS) { + return error; + } + + + return queue.finish(); +} + +// Kernel Functor support +// New interface as of September 2011 +// Requires the C++11 std::tr1::function (note do not support TR1) +// Visual Studio 2010 and GCC 4.2 + +struct EnqueueArgs +{ + CommandQueue queue_; + const NDRange offset_; + const NDRange global_; + const NDRange local_; + VECTOR_CLASS events_; + + EnqueueArgs(NDRange global) : + queue_(CommandQueue::getDefault()), + offset_(NullRange), + global_(global), + local_(NullRange) + { + + } + + EnqueueArgs(NDRange global, NDRange local) : + queue_(CommandQueue::getDefault()), + offset_(NullRange), + global_(global), + local_(local) + { + + } + + EnqueueArgs(NDRange offset, NDRange global, NDRange local) : + queue_(CommandQueue::getDefault()), + offset_(offset), + global_(global), + local_(local) + { + + } + + EnqueueArgs(Event e, NDRange global) : + queue_(CommandQueue::getDefault()), + offset_(NullRange), + global_(global), + local_(NullRange) + { + events_.push_back(e); + } + + EnqueueArgs(Event e, NDRange global, NDRange local) : + queue_(CommandQueue::getDefault()), + offset_(NullRange), + global_(global), + local_(local) + { + events_.push_back(e); + } + + EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) : + queue_(CommandQueue::getDefault()), + offset_(offset), + global_(global), + local_(local) + { + events_.push_back(e); + } + + EnqueueArgs(const VECTOR_CLASS &events, NDRange global) : + queue_(CommandQueue::getDefault()), + offset_(NullRange), + global_(global), + local_(NullRange), + events_(events) + { + + } + + EnqueueArgs(const VECTOR_CLASS &events, NDRange global, NDRange local) : + queue_(CommandQueue::getDefault()), + offset_(NullRange), + global_(global), + local_(local), + events_(events) + { + + } + + EnqueueArgs(const VECTOR_CLASS &events, NDRange offset, NDRange global, NDRange local) : + queue_(CommandQueue::getDefault()), + offset_(offset), + global_(global), + local_(local), + events_(events) + { + + } + + EnqueueArgs(CommandQueue &queue, NDRange global) : + queue_(queue), + offset_(NullRange), + global_(global), + local_(NullRange) + { + + } + + EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) : + queue_(queue), + offset_(NullRange), + global_(global), + local_(local) + { + + } + + EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) : + queue_(queue), + offset_(offset), + global_(global), + local_(local) + { + + } + + EnqueueArgs(CommandQueue &queue, Event e, NDRange global) : + queue_(queue), + offset_(NullRange), + global_(global), + local_(NullRange) + { + events_.push_back(e); + } + + EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) : + queue_(queue), + offset_(NullRange), + global_(global), + local_(local) + { + events_.push_back(e); + } + + EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) : + queue_(queue), + offset_(offset), + global_(global), + local_(local) + { + events_.push_back(e); + } + + EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS &events, NDRange global) : + queue_(queue), + offset_(NullRange), + global_(global), + local_(NullRange), + events_(events) + { + + } + + EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS &events, NDRange global, NDRange local) : + queue_(queue), + offset_(NullRange), + global_(global), + local_(local), + events_(events) + { + + } + + EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS &events, NDRange offset, NDRange global, NDRange local) : + queue_(queue), + offset_(offset), + global_(global), + local_(local), + events_(events) + { + + } +}; + +namespace detail { + +class NullType {}; + +template +struct SetArg +{ + static void set (Kernel kernel, T0 arg) + { + kernel.setArg(index, arg); + } +}; + +template +struct SetArg +{ + static void set (Kernel, NullType) + { + } +}; + +template < + typename T0, typename T1, typename T2, typename T3, + typename T4, typename T5, typename T6, typename T7, + typename T8, typename T9, typename T10, typename T11, + typename T12, typename T13, typename T14, typename T15, + typename T16, typename T17, typename T18, typename T19, + typename T20, typename T21, typename T22, typename T23, + typename T24, typename T25, typename T26, typename T27, + typename T28, typename T29, typename T30, typename T31 +> +class KernelFunctorGlobal +{ +private: + Kernel kernel_; + +public: + KernelFunctorGlobal( + Kernel kernel) : + kernel_(kernel) + {} + + KernelFunctorGlobal( + const Program& program, + const STRING_CLASS name, + cl_int * err = NULL) : + kernel_(program, name.c_str(), err) + {} + + Event operator() ( + const EnqueueArgs& args, + T0 t0, + T1 t1 = NullType(), + T2 t2 = NullType(), + T3 t3 = NullType(), + T4 t4 = NullType(), + T5 t5 = NullType(), + T6 t6 = NullType(), + T7 t7 = NullType(), + T8 t8 = NullType(), + T9 t9 = NullType(), + T10 t10 = NullType(), + T11 t11 = NullType(), + T12 t12 = NullType(), + T13 t13 = NullType(), + T14 t14 = NullType(), + T15 t15 = NullType(), + T16 t16 = NullType(), + T17 t17 = NullType(), + T18 t18 = NullType(), + T19 t19 = NullType(), + T20 t20 = NullType(), + T21 t21 = NullType(), + T22 t22 = NullType(), + T23 t23 = NullType(), + T24 t24 = NullType(), + T25 t25 = NullType(), + T26 t26 = NullType(), + T27 t27 = NullType(), + T28 t28 = NullType(), + T29 t29 = NullType(), + T30 t30 = NullType(), + T31 t31 = NullType() + ) + { + Event event; + SetArg<0, T0>::set(kernel_, t0); + SetArg<1, T1>::set(kernel_, t1); + SetArg<2, T2>::set(kernel_, t2); + SetArg<3, T3>::set(kernel_, t3); + SetArg<4, T4>::set(kernel_, t4); + SetArg<5, T5>::set(kernel_, t5); + SetArg<6, T6>::set(kernel_, t6); + SetArg<7, T7>::set(kernel_, t7); + SetArg<8, T8>::set(kernel_, t8); + SetArg<9, T9>::set(kernel_, t9); + SetArg<10, T10>::set(kernel_, t10); + SetArg<11, T11>::set(kernel_, t11); + SetArg<12, T12>::set(kernel_, t12); + SetArg<13, T13>::set(kernel_, t13); + SetArg<14, T14>::set(kernel_, t14); + SetArg<15, T15>::set(kernel_, t15); + SetArg<16, T16>::set(kernel_, t16); + SetArg<17, T17>::set(kernel_, t17); + SetArg<18, T18>::set(kernel_, t18); + SetArg<19, T19>::set(kernel_, t19); + SetArg<20, T20>::set(kernel_, t20); + SetArg<21, T21>::set(kernel_, t21); + SetArg<22, T22>::set(kernel_, t22); + SetArg<23, T23>::set(kernel_, t23); + SetArg<24, T24>::set(kernel_, t24); + SetArg<25, T25>::set(kernel_, t25); + SetArg<26, T26>::set(kernel_, t26); + SetArg<27, T27>::set(kernel_, t27); + SetArg<28, T28>::set(kernel_, t28); + SetArg<29, T29>::set(kernel_, t29); + SetArg<30, T30>::set(kernel_, t30); + SetArg<31, T31>::set(kernel_, t31); + + args.queue_.enqueueNDRangeKernel( + kernel_, + args.offset_, + args.global_, + args.local_, + &args.events_, + &event); + + return event; + } + +}; + +//------------------------------------------------------------------------------------------------------ + + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24, + typename T25, + typename T26, + typename T27, + typename T28, + typename T29, + typename T30, + typename T31> +struct functionImplementation_ +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + T30, + T31> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + T30, + T31); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24, + T25 arg25, + T26 arg26, + T27 arg27, + T28 arg28, + T29 arg29, + T30 arg30, + T31 arg31) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24, + arg25, + arg26, + arg27, + arg28, + arg29, + arg30, + arg31); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24, + typename T25, + typename T26, + typename T27, + typename T28, + typename T29, + typename T30> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + T30, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + T30, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + T30); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24, + T25 arg25, + T26 arg26, + T27 arg27, + T28 arg28, + T29 arg29, + T30 arg30) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24, + arg25, + arg26, + arg27, + arg28, + arg29, + arg30); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24, + typename T25, + typename T26, + typename T27, + typename T28, + typename T29> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24, + T25 arg25, + T26 arg26, + T27 arg27, + T28 arg28, + T29 arg29) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24, + arg25, + arg26, + arg27, + arg28, + arg29); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24, + typename T25, + typename T26, + typename T27, + typename T28> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24, + T25 arg25, + T26 arg26, + T27 arg27, + T28 arg28) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24, + arg25, + arg26, + arg27, + arg28); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24, + typename T25, + typename T26, + typename T27> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24, + T25 arg25, + T26 arg26, + T27 arg27) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24, + arg25, + arg26, + arg27); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24, + typename T25, + typename T26> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24, + T25 arg25, + T26 arg26) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24, + arg25, + arg26); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24, + typename T25> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24, + T25 arg25) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24, + arg25); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23, + typename T24> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23, + T24 arg24) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23, + arg24); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22, + typename T23> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22, + T23 arg23) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22, + arg23); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21, + typename T22> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21, + T22 arg22) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21, + arg22); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20, + typename T21> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20, + T21 arg21) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20, + arg21); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19, + typename T20> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19, + T20 arg20) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19, + arg20); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18, + typename T19> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18, + T19 arg19) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18, + arg19); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17, + typename T18> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17, + T18 arg18) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17, + arg18); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16, + typename T17> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16, + T17 arg17) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16, + arg17); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15, + typename T16> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15, + T16 arg16) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15, + arg16); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14, + typename T15> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14, + T15 arg15) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14, + arg15); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13, + typename T14> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13, + T14 arg14) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13, + arg14); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12, + typename T13> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12, + T13 arg13) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12, + arg13); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11, + typename T12> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11, + T12 arg12) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11, + arg12); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10, + typename T11> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10, + T11 arg11) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10, + arg11); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, + T10 arg10) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9, + arg10); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8, + arg9); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7, + arg8); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + arg7); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5, + typename T6> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + T6, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5, + T6); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4, + typename T5> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + T5, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + T5, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4, + T5); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4, + arg5); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3, + typename T4> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + T4, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + T4, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3, + T4); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3, + arg4); + } + + +}; + +template< + typename T0, + typename T1, + typename T2, + typename T3> +struct functionImplementation_ +< T0, + T1, + T2, + T3, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + T3, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2, + T3); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2, + T3 arg3) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2, + arg3); + } + + +}; + +template< + typename T0, + typename T1, + typename T2> +struct functionImplementation_ +< T0, + T1, + T2, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + T2, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1, + T2); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1, + T2 arg2) + { + return functor_( + enqueueArgs, + arg0, + arg1, + arg2); + } + + +}; + +template< + typename T0, + typename T1> +struct functionImplementation_ +< T0, + T1, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + T1, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0, + T1); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0, + T1 arg1) + { + return functor_( + enqueueArgs, + arg0, + arg1); + } + + +}; + +template< + typename T0> +struct functionImplementation_ +< T0, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> +{ + typedef detail::KernelFunctorGlobal< + T0, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType, + NullType> FunctorType; + + FunctorType functor_; + + functionImplementation_(const FunctorType &functor) : + functor_(functor) + { + + #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1)) + // Fail variadic expansion for dev11 + static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); + #endif + + } + + //! \brief Return type of the functor + typedef Event result_type; + + //! \brief Function signature of kernel functor with no event dependency. + typedef Event type_( + const EnqueueArgs&, + T0); + + Event operator()( + const EnqueueArgs& enqueueArgs, + T0 arg0) + { + return functor_( + enqueueArgs, + arg0); + } + + +}; + + + + + +} // namespace detail + +//---------------------------------------------------------------------------------------------- + +template < + typename T0, typename T1 = detail::NullType, typename T2 = detail::NullType, + typename T3 = detail::NullType, typename T4 = detail::NullType, + typename T5 = detail::NullType, typename T6 = detail::NullType, + typename T7 = detail::NullType, typename T8 = detail::NullType, + typename T9 = detail::NullType, typename T10 = detail::NullType, + typename T11 = detail::NullType, typename T12 = detail::NullType, + typename T13 = detail::NullType, typename T14 = detail::NullType, + typename T15 = detail::NullType, typename T16 = detail::NullType, + typename T17 = detail::NullType, typename T18 = detail::NullType, + typename T19 = detail::NullType, typename T20 = detail::NullType, + typename T21 = detail::NullType, typename T22 = detail::NullType, + typename T23 = detail::NullType, typename T24 = detail::NullType, + typename T25 = detail::NullType, typename T26 = detail::NullType, + typename T27 = detail::NullType, typename T28 = detail::NullType, + typename T29 = detail::NullType, typename T30 = detail::NullType, + typename T31 = detail::NullType +> +struct make_kernel : + public detail::functionImplementation_< + T0, T1, T2, T3, + T4, T5, T6, T7, + T8, T9, T10, T11, + T12, T13, T14, T15, + T16, T17, T18, T19, + T20, T21, T22, T23, + T24, T25, T26, T27, + T28, T29, T30, T31 + > +{ +public: + typedef detail::KernelFunctorGlobal< + T0, T1, T2, T3, + T4, T5, T6, T7, + T8, T9, T10, T11, + T12, T13, T14, T15, + T16, T17, T18, T19, + T20, T21, T22, T23, + T24, T25, T26, T27, + T28, T29, T30, T31 + > FunctorType; + + make_kernel( + const Program& program, + const STRING_CLASS name, + cl_int * err = NULL) : + detail::functionImplementation_< + T0, T1, T2, T3, + T4, T5, T6, T7, + T8, T9, T10, T11, + T12, T13, T14, T15, + T16, T17, T18, T19, + T20, T21, T22, T23, + T24, T25, T26, T27, + T28, T29, T30, T31 + >( + FunctorType(program, name, err)) + {} + + make_kernel( + const Kernel kernel) : + detail::functionImplementation_< + T0, T1, T2, T3, + T4, T5, T6, T7, + T8, T9, T10, T11, + T12, T13, T14, T15, + T16, T17, T18, T19, + T20, T21, T22, T23, + T24, T25, T26, T27, + T28, T29, T30, T31 + >( + FunctorType(kernel)) + {} +}; + + +//---------------------------------------------------------------------------------------------------------------------- + +#undef __ERR_STR +#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) +#undef __GET_DEVICE_INFO_ERR +#undef __GET_PLATFORM_INFO_ERR +#undef __GET_DEVICE_IDS_ERR +#undef __GET_CONTEXT_INFO_ERR +#undef __GET_EVENT_INFO_ERR +#undef __GET_EVENT_PROFILE_INFO_ERR +#undef __GET_MEM_OBJECT_INFO_ERR +#undef __GET_IMAGE_INFO_ERR +#undef __GET_SAMPLER_INFO_ERR +#undef __GET_KERNEL_INFO_ERR +#undef __GET_KERNEL_ARG_INFO_ERR +#undef __GET_KERNEL_WORK_GROUP_INFO_ERR +#undef __GET_PROGRAM_INFO_ERR +#undef __GET_PROGRAM_BUILD_INFO_ERR +#undef __GET_COMMAND_QUEUE_INFO_ERR + +#undef __CREATE_CONTEXT_ERR +#undef __CREATE_CONTEXT_FROM_TYPE_ERR +#undef __GET_SUPPORTED_IMAGE_FORMATS_ERR + +#undef __CREATE_BUFFER_ERR +#undef __CREATE_SUBBUFFER_ERR +#undef __CREATE_IMAGE2D_ERR +#undef __CREATE_IMAGE3D_ERR +#undef __CREATE_SAMPLER_ERR +#undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR + +#undef __CREATE_USER_EVENT_ERR +#undef __SET_USER_EVENT_STATUS_ERR +#undef __SET_EVENT_CALLBACK_ERR +#undef __SET_PRINTF_CALLBACK_ERR + +#undef __WAIT_FOR_EVENTS_ERR + +#undef __CREATE_KERNEL_ERR +#undef __SET_KERNEL_ARGS_ERR +#undef __CREATE_PROGRAM_WITH_SOURCE_ERR +#undef __CREATE_PROGRAM_WITH_BINARY_ERR +#undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR +#undef __BUILD_PROGRAM_ERR +#undef __CREATE_KERNELS_IN_PROGRAM_ERR + +#undef __CREATE_COMMAND_QUEUE_ERR +#undef __SET_COMMAND_QUEUE_PROPERTY_ERR +#undef __ENQUEUE_READ_BUFFER_ERR +#undef __ENQUEUE_WRITE_BUFFER_ERR +#undef __ENQUEUE_READ_BUFFER_RECT_ERR +#undef __ENQUEUE_WRITE_BUFFER_RECT_ERR +#undef __ENQEUE_COPY_BUFFER_ERR +#undef __ENQEUE_COPY_BUFFER_RECT_ERR +#undef __ENQUEUE_READ_IMAGE_ERR +#undef __ENQUEUE_WRITE_IMAGE_ERR +#undef __ENQUEUE_COPY_IMAGE_ERR +#undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR +#undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR +#undef __ENQUEUE_MAP_BUFFER_ERR +#undef __ENQUEUE_MAP_IMAGE_ERR +#undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR +#undef __ENQUEUE_NDRANGE_KERNEL_ERR +#undef __ENQUEUE_TASK_ERR +#undef __ENQUEUE_NATIVE_KERNEL + +#undef __CL_EXPLICIT_CONSTRUCTORS + +#undef __UNLOAD_COMPILER_ERR +#endif //__CL_USER_OVERRIDE_ERROR_STRINGS + +#undef __CL_FUNCTION_TYPE + +// Extensions +/** + * Deprecated APIs for 1.2 + */ +#if defined(CL_VERSION_1_1) +#undef __INIT_CL_EXT_FCN_PTR +#endif // #if defined(CL_VERSION_1_1) +#undef __CREATE_SUB_DEVICES + +#if defined(USE_CL_DEVICE_FISSION) +#undef __PARAM_NAME_DEVICE_FISSION +#endif // USE_CL_DEVICE_FISSION + +#undef __DEFAULT_NOT_INITIALIZED +#undef __DEFAULT_BEING_INITIALIZED +#undef __DEFAULT_INITIALIZED + +#undef CL_HPP_RVALUE_REFERENCES_SUPPORTED +#undef CL_HPP_NOEXCEPT + +} // namespace cl + +#endif // CL_HPP_