From 5af731ce03605c80db4672ef9d80cf7e7c128dcc Mon Sep 17 00:00:00 2001 From: Beman Dawes Date: Sun, 25 Nov 2007 19:35:43 +0000 Subject: [PATCH] Full merge from trunk at revision 41356 of entire boost-root tree. [SVN r41372] --- BoostSponsorshipAgreement.pdf | Bin 0 -> 248822 bytes Jamfile.v2 | 2 +- background.html | 221 ---- bibliography.html | 538 -------- blanket-permission.txt | 5 +- boost_soc_06_overview.html | 820 ++++++++++++ borland_cpp.html | 394 ------ bugs.htm | 118 -- count_bdy.htm | 774 ------------ cpp_committee_meetings.html | 125 -- discussion_policy.htm | 370 ------ error_handling.html | 240 ---- formal_review_process.htm | 47 +- formal_review_schedule.html | 349 +++++- generic_exception_safety.html | 683 ---------- generic_programming.html | 474 ------- getting_started/detail/release-variables.rst | 8 +- getting_started/unix-variants.html | 22 +- getting_started/unix-variants.rst | 4 +- getting_started/windows.html | 156 +-- getting_started/windows.rst | 35 +- header.htm | 103 -- imp_vars.htm | 211 ---- index.htm | 3 + int_const_guidelines.htm | 328 ----- lib_guide.htm | 931 -------------- library_reuse.htm | 75 -- license_info.html | 280 ----- mailing_lists.htm | 403 ------ moderators.html | 81 -- regression.html | 11 +- report-nov-2007.html | 423 +++++++ report-sep-2007.html | 329 +++++ requesting_new_features.htm | 56 - separate_compilation.html | 385 ------ submission_process.htm | 133 -- test_policy.htm | 100 -- updating_the_website.html | 111 -- whos_using/Jamfile.v2 | 6 +- whos_using/using.qbk | 1176 +++++++++++------- 40 files changed, 2800 insertions(+), 7730 deletions(-) create mode 100644 BoostSponsorshipAgreement.pdf delete mode 100644 background.html delete mode 100644 bibliography.html create mode 100644 boost_soc_06_overview.html delete mode 100644 borland_cpp.html delete mode 100644 bugs.htm delete mode 100644 count_bdy.htm delete mode 100644 cpp_committee_meetings.html delete mode 100644 discussion_policy.htm delete mode 100644 error_handling.html delete mode 100644 generic_exception_safety.html delete mode 100644 generic_programming.html delete mode 100644 header.htm delete mode 100644 imp_vars.htm delete mode 100644 int_const_guidelines.htm delete mode 100644 lib_guide.htm delete mode 100644 library_reuse.htm delete mode 100644 license_info.html delete mode 100644 mailing_lists.htm delete mode 100644 moderators.html create mode 100644 report-nov-2007.html create mode 100644 report-sep-2007.html delete mode 100644 requesting_new_features.htm delete mode 100644 separate_compilation.html delete mode 100644 submission_process.htm delete mode 100644 test_policy.htm delete mode 100755 updating_the_website.html diff --git a/BoostSponsorshipAgreement.pdf b/BoostSponsorshipAgreement.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea8b838b2fda4f1ca8645edebbb8182f02603156 GIT binary patch literal 248822 zcmb5#L$D}8vmoGO+qP}nwr$(CZQHhO+dlUm+veQ=#k`oen8nPhGAeu7QPuf%CaHpm z7%d|m3oI1raLI7baNBS`EEE#~1A)Df6)Y4F4*|W5shzot1p)KFJtbHu0s;bhF-sd4 zQ>TBcjiHOFh^eu?i76};A0I4~vx}3dp)D+wN6x6Ob~H{mq96Mk|BN$1_F8GF9S2Cy zH=mcc(tdu(v8Da6kauNE zx{u89A+%3!Mm|}F{tT^fpt4%yV7tXNTWI(U2$J$vD;HS+$;b!$H2Gq4+bZ;=9hJq^ zbDxeB>`tPztW zJd`_Mnp1N9nWUWDcyzt24)HeGmsByyWAaio?qi^81xZTUZYz^@&k)?~0*ub$D$lW3 z%(d9=Nb%y+v2=eMB-_)PnDMY#RPc0|*-u{o6Mpm`W-Rcx$7@L<<|@BDSWSLZ_?en5 zo9PX?&85ASwg5``t0D>Ov)uI`+)$FC5CUW5urL<3XB1*z$LcaeN(N{9JP*9Ix; zGLMO|?}`VXj5O@Ofq^)eB#r4bAWorc(MD20{eu)xy$6JH>_`Vdz}LA#KqZiWzFQhb zFJ?mM$^w1iB2m|W*4ljhEvA#J(`R?o%%O2e{EeRZVO1+`Qm#~;%ZV;-Lr23dAUs(I zXHI5tr0Twn1SxF{?H1b|1npnH)Jsk_)o25+v(p}m^%^dhm=#bJ!zLzFx1hzhAtY&C zd4nReTjK;BMJXO$TyQ`*CElO&GN-Ujo^TU08ycc&a~c}LA$Pr?p||w*FsLBD0I+q8 zlec}RZXdsna+x7|1YYRB%c$vC1}iWrg1Ut$8piF7%n*iv&gpPi>)Q(3set}$YE@St zi9*hQbKj3PG5b>t8d%6BXahdu15}cdqkNOqZjX7FcbFjysyILejb&nBQ;t+@2QD;d z5~<-&zi>i@60Hy4-I^FIauJ`K*9Jgl^IleLbV6QskOGav-4K(aE*jFn-Wli7{ht6tTsSiJD6;-oOTz?B^S!NE2lElUyaxIRk z&O9u!LcR-NvaW;_AGq^Mn4Vz@H1?x?NF($N5=(SDx0UENDO?mBkr7fte=fOI@@h2PnI5Lxg2uC*vXgLI#n* zN^x7})~iHX%Vmr5=qv? z1`L^*e74%xl)!Psog1T5u*Z`J-FsDio7oVzq9i6JTGgpcRy9sMs@17`w7QA$|mRXTI6|1evOMx13IeYRDE-+sd5e6QAE=;Z?LV( zI!a4qe5y*JYq2Ao(hKZ`=0_#AgB)*PG^W0s5f zof{#xct|C^2Nfp|xPC8w4a!=iR za<4xVR=+vw+bua}d%ps6iJ^Ji3eYs9fz`aBBk$R7~aGs`oF z(5QLAYyk8OJNu!s<+|eph^JU6YR&b^h0uUpEB|9aZ}GD6vj&|ZRFXVPcL&1z7lYp0 zcfgOjh?o{%+Kk5tyb)d*TKR(wPMr@2Jno5rg#a6{TnH}z1&D2blc{!AkY$*iIj3io z<65QHWHZKxrkAYcz|>?=Rhq}J-x*()`nsq*OQfgmk$G;)QcwO0yEsDGVOu`Xk^T}+ zq=@VK@VFXxiTV1@%Y0CzK23>YC|M3mXz+p2lfd3z(apgrCPv@OrGPZki&}%5bFgHz zfG&=Qi@d{#>JwlH-@7av^hLUQonjCnNIFJtg6!1-FStgzRT5?mWQsr=-ebC~!^r+x z1P?rMfB@NXc*cO2oW`yupc&i~BC$ymOWM!ukP8~*bvX7BKu>-^CQ51(I1!}95XjsJ z-sIRI0q^qw8+Ao?G7FXI$yne|9;}kw*of%bKCxSWL#@GH1jSwg77rlwB;Xvtnnc71 zxPou7UP;}lE}ccz)SOBec#B_HWy!%A19;|3pF&>pguq;i^(XTl`E)D)S5tqbdq5ZcP6E_Kc_9ItUGEnNBw_Sa2%RqUQ_hvz|HzDmZt=5!%T+5FaWwO5ok`50IU`bbdjR2RLCB-Y! z-o1Pa^`U~B*k*+|ct+}?-fM|C`=xkb&d(8m)GVHs=oFr=(O8l;oUfnnjDw{Bs0%h? z7&*BW%7*!z(1cTD8@>F_n-OKf+p=K%W=!Ma$bo24`A((EWqeB!`*^%FWUu)-%M<${ zi#p6Wz+;jrcI=At9M7WmnLhEv-~jihu#QB+NEGO;x?Q%=n@z`<3bfL$LR?oAunP7X zI#pyupwj}8u?Ifr<24|YFjpZ%zlCcC_Zh&2s$)@X?PzrUnGrZS*vMkiR(RBKvI=4N z7TOW(WU(krxV)n^A}&BU9uc&3w`J9Y_1{I-q8J8G7R%$2QcqiZ9OnmK=>_b$7^whdPu7I8kyP9-Rya z3hqrpH$?}<%fV!{R5roei*L%;rep%@bgSPvj(HsEL1&@*Z#Cq@tm#v4FG=`pR5Rvr zutwe^Va0FJG90&k+^8n*BuDzyWtFUSXUJxG>&Cxm_Je8%$MzZi^WJ9t0^x&y01gTb zuzSN?-eIEew)U81cKD>pGYfsC@^K>)oH^Hz9(rfGo0G4*^amT${n$NHoIP3gq3s0(`5X(tIi22 zY~pPZpQE|q67g@(@tV<$Z5Y|zB>OCRcTx+3X+zN{t7Di_5X1czIoGuVDbR zj~^`VenngNI)-a6aD-Og&wcR0`u z+dY{abFd+MDaL#hLsxaWqFiPK zg4KTMl9eOFnXa(VNs(R$145@W{}5d%0j^W0c*Xp$|^I%0S8)kh14oNCr{;OLW^LO#>yJ4?M+P~(yX zbaUnxB^;{yBMaIhir>{G`l1^Z&0BQv<#$2Kj*DX3p-}Mn_-bx&;8Jz4`tv>L)mtIo zbeP4-Yyz%0gP|SWWt(%(>}mw}EQgYX6S~w{!_gcQ-kpCkAg4zDa(y{j#EdV*O6xWF zWM5j`rw5+umnuQdm>|mSUO$n^cHQYfY~WZ5L!9b9JSJ=&Sp514W4kyKr(n77m_ zFPE%A)-n!yqOywM_vOiNVYi%gkyB0)72eE@e${*h-Q5dqlC!^_VFlZepcud00IQo2~lrF)@yn`OY@u~VBSr7Hehd-JqEpa0{0A?JUS z_p!WFetm1&`|~}{FZa(0&iCv8;{@Zk`TXA>-;d>e{QR-yrQH0v^83GjAJfiU&*x9y z`Q`d2KlSCezaL+gURZ6X?Z2O}AsSpf2dz8*klH8l zW!$h2X1up&#S2}M`W!jGFj23!^@RJ>B(=UZ`yq#g_=a}2+?}4yUPt$zpk-mJ5LAd* zu%r1GiHL5gA#%$hv4X3U1v^%t@IPR$x~)dz@u!AMEd}$stSp^YSOV7H`Qg2yrw$MslZ*ginMhu9LB7TF z5K$*vNOU*PJV_a>&c}f6BEOa(83m7TYlk`e$l8ApA#!2z1$J|or_y(Tcnf$5xV_3( z<%`gBH3fz>X6UNfZok$4;^Y&~f8k{1+ugYV;8 zzXkC4U~Y>e!IpE3`I??ScPX~Mh`1tdsK_j#(x3f0v4bhHfq-47Z~x{SMxoi2Hp^$) z^>Rx43l`ZGCzUw!#c40NpU8_b&SOuAa$#UkiaakprE(5E*0GYTlu%=+oS*psSTfw5 zAe8ny#OJAWPSO2#afsVJ5q*iblIej8+~v8m=Kp)pbR?^1kW3sdC)+PXOeI(=7VXs; z?Fdz5MT(K-J?xJpc4`a&B6c6d94_1+Xne>AWYuo$`n5_ZnB&>it{HZ5ARSw^hjD~=i>&dbi0auY&$u- zw@^=1A^hS|VHqSV{)`g~CsR~V@m6iGPmfeeVLa4rxI60s#K#uo)fsRF?5JZ!{tpG1 z9SKG{MbMd~g1`iq?tWrIpgqdRtqG>iz*mM;?PD~~V%oZxd5 zYz9-LwC|hrtds2vvRuH(^MKoUyUUivbx&dZ@cv=UQjvDK%b5E!*GUDPi{8ilE%YjL^qN?YqY4R*K>>WLFiG@dN-zs$zIdY2#}UDmW>V)^L-mB@%jTU&} zp!$qE+4UjSdNs>~G^k4p@`4*}pfO>*n5r}JB8Ns+oh96~W3P*CA2KTkiy1K6Qk-aBCpU>ZutH?_9#ID3I2f{!gMG#XVAKvk z{23@$^W#eW=CJNppN%zxi7OIBGIfNhh;=>*id9c2zzGs+_?+$$TFRGUIHj}=u!T;!GQSt=A2@>YlTskpVC0rcLgNqg=ihQerR}noQ`+f2OkEodJ zuWc1bP{+)wCSr+XAjEDNc&ci68&^#d#ApV614@hv(D$~o?#qF8_GN(-qlA|_E4C`z znd3J8&=$PPOf7SzSUyZwVZOQ#s5`p@kXiysTL1oa8ILf$@b||fZJc2OS}eKG zA2Zfq2J&JmAO1MzPBB@*F`M}4l7B{bH>VRe(QFeVEb=&9guEL5 zHiN}(L|_qIc!*VLI^dv1f^)HE{7IASEdXt&D4sPrm`2Yy$<9_B0ZJV3$&DVe(iU3H zs3LGvUAtKppM`1$-!;DI=QJa>l5snY>i& zs5rI9rsF^KL+=8a>LZpap*xjbCS>>qYIrx>1=A}r*^~6!JnA`C(|34h?l@Dz7Pfek z$W(Y0QeN^Q$>|8vyMs7g%N=IqSux^;DYW_BS7~HfU0Cv1GUq!3EH4QVi60|r%k%5O z3R+86O7E8Ni7qEBEVl<0ALIU|DE=CXBP!CqBsu}?xZi}(6-|N>IzL;lsk*-1zEGam zVNI+}E3CLL%N*oFRt}=wPe!Bs?#S?LB>f!PI9%ko>hjeKZTux@hu^Bnbke+7wM)lH z|2vSV-;nd&Y1SqwrpDUTAS~f=70@mWO}*Hjh)$nU*Ag_T04w>X*+(Zj+DhG9zJby*1rRu)!s=N8gJV`q#bC}Bdkq=b1X z1a&9Yb{Fd_t|NTA+iK!k$8q@nr>)}g-@VZ9dmsZxp++8SgQofY35HY3eVWr>Zx|UB zIUS*I@|!K8V!jKiMPvhRjOLvskB|7bvur`P*GgN_BVrrYzw+1!5}-A(gRvqH{m%7$ zTOdg94F(dq^{ylz&a*~tKdbro`89Durg`U;9<$K7WiUkOYzOv<00I?poQt7>h{%8I z1T%0moe+-@{kwBprTyTDzjiPl43TrXEi*@Q;_B9qYa zi>-bGbaDSLe%ryK79-hk0SDu`Ik8T2c(RPQ$!Rpj_jHAZUpE$x)z@ZH7DyOHRn~H2HTFyoovQ3Ap-VKIX(C*Yt6PlwkL-s`643 z33`9*)9T8{!n?)#Hr2yf-PV8zid22^;)$e5Mjws6=;M!Xv2#a#N`xtC(6mSGzi#Ag zQ0lX=7PDUTDQ1KFig=ClB$BDt+NSnBM~+-7_lMpqunSKL(x5A3LZB&4EpY|2KhNH{ zvOro{c6V(SClzQT(SE=V+%&&c7i@%iwdd*uw6}K9*Qh|o2EeBb799M9x6qQSU{3+du>iYG;cy9`-{r!rCtoz2v~;hThn`DKB^*q>D6f zKL;6|`QMmB7ATu|(R~#_+u%KZu@wjBe-!c}eAz~TGhjf|;5GnszT|rFXV+~Bt>fgu zG_Awy`5|!1L-Ckuf{P?&WuYZFGCW1L&tX?Klvu{k3v$ci5KZi0Tr>)>hK)Uj-~mi7 z5@k_w4Hnu+exs6vgOu*}Vh%hIuA7Cs_G6r|CaVDt=!)hsw;j=>ov;lP9a(fqWYEmm z+{xd&nSf&M}M{e}&EU_>&t^pXl2z=oaUr7 z&qRrccPJI*sbb8}5Uu;TfJ?l<+~^k3(&k%UC?a$S4y`sh5ol7TP|7DCSY^7l4-zmx zLF+g6b7ZRnixWh~#Wx0GwWleQHv%9T5~2_u;_@x~0*x8z&VuR73PeZ&{A1LyIa@&4 zo@!;_yXHHenyqno4L6?j3m459MC5iUND=$=W(o1y1&CYSfzsb{8~iB#9+B<1QHAyG zaK?@iF!5{Ns~Q!K`sxaB{}X*G*w`f&1glf zaD&}OvV#kt0Zc9ouwBo)=ensPrUBiX3YxtyRA|-m1DS|r<4-NCQ5K;qF6kRJ2AjJ%EWYIxWP+moVlpdZbM&K=&Y*COLu-fCQ z((GaO&OUa>Nm5i*amTL>e>p#0`E$5KUyE%;3RN6 zI$|?LeZi#-!Dq@kw$_lv^L&EN3h8nEGIc!;N_UM_rcl3gu=;wHYQ3AMZERYjUPs{t z^x+X47L!BV4BGc1Dx_V@iY_Ej2P?=&x^t~p8Zx(91oYI&2LhWaEW@C*N4!lT1<^k$ zl3wN_1)8g4i>@pbUEFSS@rPc^J}9X&@R54s0z-DpmJ_4riE+6Lr-!U(w2m1;uM7mu z84=!exBtsTT6}KYau=_afM^n@ffURNlv$xt4#wna(hlg^^N&Hjc$-FCn6QvMf1~58 zbRtHB_PD%X8EI*GZ8UjTFPy8?lzal8? zorJ%QuHsvqm_I%?O$Y|;(lVx)J+rE3S_xL-k_&eka}j1vBsLvElc&ozr&_u)X=56o zFBp&UHVN&Ge=ue`o~enojDlgbU_)XAt>ZIhgz(RB_;<>6^?Zs|NT%XwjMIg$ zo=%0#9sL;9&{bv61~1P-8HsV9;oDf6sgktbiV|ZQLHeF#!KkHC{%SyWTs2sTvZ{nc zv%T!D<8XeWS+d&VTpD8b?)^2NNgSDGiuj=GE6w zz+b>^Xg-V{^j}|dS9OUhk0ohS)#s}qMw*UtCMKamkEA@5sl&hh|H$&xf#>V}t(03v zSM!&fKK=LS<)2#oxV*i7_Urw;ZrA^Ne*UGeKVC>3e)Y%m z!wT=m>-)WYEPt2o|MB~7&o5hM>HDp{?2}pNPdog~|DYd!raye9U*71*GHYc&iA9|m0<-6~mUuU1>y2OC4`GXQy z)PJ7sNcJB4xT0~oj%(`ef+%7j{mGR(ut29Pau&nfDwI2Z&I9|rxzrr4sI<T;s8-g-9C@Vjg|zah$Q zlhdcyK9kc*NZ6L{5$&}Sj&#e4_w(Vkp{_Y8ja$k>&tFgR0S$Di;iFM|35Dl9erVbG z_4*>Xy3n{8xVY#8g1!jJu^ks8cbsj|%R^Bw?2uU4*IL1ce+iAwR@s;LOvyNlK@JP% z2DcG$q(`k*s}N}+Ct@mV(34ZBzwdyygMFk?JyL~5IW>t@h6dwsOkH!qbv#&#+mo}M z$?43y&Rn%r8P4c8#YqSv=&ca1;r8${R^?%4U=zC0hbauuMsUN{0MGRwp0UY5TN>$1m2vLdbn`kZo+15x1BkpaBosky%k zK=qhz#w$Fots7`E7WIMF6&RXz6sQxrC3 zXsKeXU>aC#EN68Zp%NDKM%dV^Z>UKzfQd`eVlWpu-;qmEwBFTJ2k$z3e*htb?Hrc3 zSH`B?yfL068X`%sYITn0aic@rRo4nBwhqM2G}QH!X;|rB**C0F#d5(RtY3~iX?{fw zfMhK!q>ZE-LB){Z(m)5Ev@D9$4*z0Y52%)_v7f3;4WgrvcphCK*GpjcSR9B6El*ju zbP@IVr-a{|l%M!8JOr@F3LBomeB+rb>_z?9np@c1(ugiSWqI+U>bd0yus0t!2#XXJ&vPt<31+rM8B(M()&na;n1WBmh9Gzuk8^gO)S%{a3uQEni zK#$}qr5x#pG~{olW3(eE6a-8rgcBOBXbn`VqOfX(t=*rYc`k?S;q!Y4y*pjRa)@w| z95AQD2xq4uL^c$Pg}V)oiLB8>hKqLKKm&!+E=OeggUJ;1gGnD<<9MhpO!rlcRcCIV zz6Il(V&Z54O>xilifTSwRhF~UF&FEoWd~N90NhyfE_wp-3hTcP4jIIloU(V#iWX;> z^iP)Je<=JCn@;A+690hkF0GCdg|j=1Wny0z=)mE9LeD;a+dZHd4-0O>#rzR?$8i;b zfkURTuwo))KZy6dfS{JW6RdOq0fbhT9RFbRt`a6sfa+H)(!@!GIUL}*@kJQ335pEf zKAa~*Rw2a^*O5?M3Tt-)KoaFe z<{DiBKQR~Sk6^ahK;#8F^Pbih8JxHrqNxP$ZDDt&HjFi3<_xW?DNFYLP-4`4veTU)`lu zwU$n2g64pq1Xb(&Z{MJdp zv!_A}Iweso;p+5dQAC93eOCLIz*5`hBo-;>&48I)M7+h zF2$Nbdp7B}lZKot2gp~K$9Bkq--AJ$K+HG<=Cy*GlGuMYOb=X8d4Zb_m!q9co8(i! z#HW(GsFIO!j|Rm|r(UI+Tug~qkwlNLv_agQ;M_f&UchRrsY6uXs>c#!V>hld6Q^T( z#=5c6Uhpomv`z9`gYLadLPhq6s!*443bMWABsnw_wt15LQDqjN9zTP>Zxbi^NVQ~{ zq@Kk3cJ4myaja4&E_^lA63&Dl6|YQh-pRKidFfdx6l+~1(ll%&Ablxzvu^{Jofw!@ zCqCQil4J(ffHtN&BG%k53&zB-)=sCZ^Fmh@sCAkuSx)s#R9d)_@1l}DkyJ|j6gpFy z==j;evaP`M@EPXfvJ6+dVtNc}Xl=^-Hp{q@rU7B{tR=*-;Q8An(2j?W^%|MaO>+0p zIDyPfN5 z?F{8iGt2yW=sA9?OQM)roionc}pWbqSsBq3y6aPcl29$12xDRbF2mefRah*szdCv#o}XQ#B2$Dhx%n5g zy?)8#EH$_n4<>IoXvg7B%6jO?F%bB!$}u;U{Qg?Q+l^^RA_x=xH@gNTJ_Kw>OT${S zPlSs;EM9zGG^aEl_ewsM7@g>0|1}Lxdx?)33A)#)O@&PQ3zM6gt}?7&Dg|)!&TAeQ zY^)KHz7-{wEuwrND$={mOfFTCuD*NHxb`iGAyv4YJ*s(-eMDyxD_`I&geJob)xzgE zlYy{7{a$u!L~|y^Y)4l&OoW9OzBU?)E_|4@I7dX4D+9jM=*Glhwd7!r~Dsb|B`+y8bi z4c-|nDUS1jJM4R{YT(V>GarH%-uab5MiE2#*#JA2YiZi`9yBF1uqrr~QUO=aRy*dc z$Q$~Dn|@P1on+EQ&8+o|(&#lGCb&lBKCggdxQVj5;w)=274|UHu{+g(UZmyBl+4>K z?4sa#`J}OVv{Q)O1EIuRQCSz42uHfihSvN>r_+FwMvrLw%r(^Ao5inYnV-O7qD#UKPHQQl8 zftay3emi!Q(n-CGbh<|�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

(lWUej@J=Yy( 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

    IHtwbKaW*T@*(?qLx^t3<|_S{|Ex3L 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%0A8%SMnBpVyhneh_iS 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

    UpfALAInVh*QoCDx~`tVz^Sf`Q?M|dW4?hZ z%j=9~Y9a;~5XS`v@eh3!XEVJ_8ScL)%||k6kw6XehgQHLNy;))VzL90(WmPT(=eP` zVfJXC@Co`|eYzjy&b_?sdm6(0p#uX&&R5Dy&r&NrvIK|eEd|}(p*+&Oz7O3@m4)0* zS3IyB_gk@_LK&y-pIbCUhaFY}@ca6ptIy zuc;!`@d(Xh+cD27>R?C;IBijv!|EnX31TxHF|gu}7(vaeGy~tQ59tfFQ9lNe zCbb2HM(nCjhrlW&;}_oH*!UbnIY>06@sk*Xwj|tj04x=MH#AVd^ibHfJ_L9 za4j4Hieom*uSY62*zFTzU|E)(DEE2u7Mc6TdO9xh3(s@7xO|MB*j4{Ol}otgsQX8bJV!m86E|u*)Vc9n#)s zxdn}v{rR!46`E0fVa9$fCAn&VA1hE6QlL%Jyvy|E-?$xj)!z=<&*1EtJm|o*Ar5bTsG8H5GKNI%`m$?PFYrp^cZz*QEY62U4 z-sZqYhb0|y&P21cpVcyyd9dw0hV6{3IdOYRLB>ck?B=qMTJ8vl1+W`>pKOBrfyV z;c`92X!=|ISyLEZPxX+><$Ph-atd&K+ zw|W>HA1pc=Lvv;H99uFDeY~-po?p2s3I!hq`igQxhhAJej1Mo7wL43(KBMV8SaBm7 zR_s5%=OOh_lo?vV!G`7V4grsbl;dz4q-m2PO+SBSpDA4+FT#&X8!98MtN>09L931* z1qdH@nZRWiq34X5r=Va&J?6f?GVpPQblvBla0zo(`+y)A@}p}x#)UOLrf74@YG zjk*-bHuG4m!ETRtMEn9XOB2B#q;TZH?2K8Oz`}PSyMeoUKs@OmOVYFa1Ql&1(gXuodWEEiW1B3fvMp7zN z--#k~g{(x4%p7h7TmUD*{keo)_uE&!b$jVg`F-4Mwg>~Vk`A+I>BSf)$$7wxt*RAk zcZ!a+(uRDGJo86_#?4xD8Ke~ypNXY94mIDHuf&xIPQXk&v&}NNY`>rYe9`_ao`?hJ z=n^qS!N8n2Nj0$Q5f5E|(4!4mKm_bXX3`PD=5?Y>-Q+6JY1GT;*DGE|wdwe#)Z6Og za~+eJGXSXEdL)~ak$UOF4yEPsTo|kf-PrHF04&A#gC!%(^oi08OrSdxUB8i{B&F1p zTq#$V4H;;}T44%N zFs?dzI*rQ!ntQL?gpU5;8o87XDTJbDc3jt4I);!JkucsUrSniEJ~;)wilvj|0XC5^ zf_CAap_G%~hLb1cYHn$Gz|UW|62qE#tb6t=n`ar~skR zM0wmkz6aVTV_-`IdZFn@K%xn)u~Wl~VX9}5=Q&J^s*H6g3b=1_){+℞Z1os3ZFB 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 - - - - - - - - Boost Background Information - - - - - - - - - - - - - - -
    - boost.png (6897 bytes) - - Home - - - Libraries - - People - - - FAQ - - More -
    -

    - - Boost Background Information -

    -

    - Why should an organization use Boost? -

    -

    - In a word, Productivity. Use of high-quality libraries like - Boost speeds initial development, results in fewer bugs, reduces - reinvention-of-the-wheel, and cuts long-term maintenance costs. And since - Boost libraries tend to become de facto or de jure standards, many - programmers are already familiar with them. -

    -

    - - Ten of the Boost libraries are included in the C++ - Standard Library's TR1, and so are slated for later full - standardization. More Boost libraries are in the pipeline for TR2. - Using Boost libraries gives an organization a head-start in adopting new - technologies. -

    -

    - Many organization already use programs implemented with Boost, like Adobe - Acrobat - Reader 7.0. -

    -

    - Who else is using Boost? -

    - -

    - See the Who's Using Boost - page for a sampling. We don't know the exact numbers, but a release - gets around 100,000 downloads from SourceForge, and that is only one of - several distribution routes. -

    -

    - What do others say about Boost? -

    -

    - "...one of the most highly regarded and expertly designed C++ library - projects in the world." -

    - -
    -

    - -- Herb Sutter and Andrei - Alexandrescu, C++ Coding - Standards -

    -
    - -

    - "Item 55: Familiarize yourself with Boost." -

    -
    -

    - -- Scott Meyers, Effective C++, 3rd - Ed. -

    - -
    -

    - "The obvious solution for most programmers is to use a library that - provides an elegant and efficient platform independent to needed services. - Examples are BOOST..." -

    -
    -

    - -- Bjarne Stroustrup, - Abstraction, - libraries, and efficiency in C++ - -

    -
    -

    - How do users get support? -

    -

    - For relatively straightforward support needs, users rely on the mailing lists. One of the advantages of Boost is - the responsiveness of other users and Boost developers. -

    -

    - - For more involved needs, Commercial - Support is available. -

    -

    - What about license issues? -

    -

    - Boost has its own license, developed with - help from the Harvard Law School.  The Boost license polices encourage both commercial and - non-commercial use, and the Boost license is not related to the GPL or - other licenses - that are sometimes seen as business unfriendly. -

    - -

    - What about other intellectual property issues? -

    -

    - The Boost libraries tend to be new, fresh, and creative designs. They are - not copies, clones, or derivations of proprietary libraries. Boost has a - firm policy to respect the IP rights of others. The development of Boost - libraries is publicly documented via the mailing lists and version control - repository. The source code has been inspected by many, many knowledgeable - programmers. Each Boost file has a copyright notice and license - information. IP issues have been reviewed by the legal teams from some of - the corporations which use Boost, and in some cases these lawyers have been - kind enough to give Boost feedback on IP issues. There are no guarantees, - but those factors all tend to reduce IP risk. -

    -

    - Why would anyone give away valuable software for free? -

    -

    - - Businesses and other organizations often prefer to have code developed, - maintained, and improved in the open source community when it does not - contain technology specific to their application domain, because it allows - them to focus more development resources on their core business. -

    -

    - Individuals contribute for the technical challenge, to hone their technical - skills, for the sense of community, as part of their graduate school - programs, as a way around geographic isolation, to enhance their employment - opportunities, and as advertisements for their consulting services. There - are probably as many reasons as there are individuals. Some of the - apparently individual contributions come from employees of support - companies with contracts from businesses or other organizations who have an - interest in seeing that a library is well-maintained. -

    -

    - Who pays Boost's expenses? -

    -

    - Boost doesn't really have any expenses! All the infrastructure is - contributed by supporters, such as the Open Systems Lab at Indiana University,  - - SourceForge, Boost Consulting, MetaCommunications, and the individuals, - companies, and other organizations who run the regression tests. Borland, - HP, Intel, and Microsoft have contributed compilers. And hundreds, or even - thousands, of programmers contribute their time. That's what makes Boost - possible. -

    -
    -

    - Revised 07 July, 2005 - -

    - -

    - © Copyright Beman Dawes 2005. -

    -

    - Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt) -

    - - - diff --git a/bibliography.html b/bibliography.html deleted file mode 100644 index 3c54804..0000000 --- a/bibliography.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - Boost Bibliography - - - - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    -

    Boost Bibliography

    -

    Print publications about Boost or Boost Libraries
    - Online publications about Boost or Boost Libraries
    - Print mentions of Boost or Boost Libraries
    - Online mentions of Boost or Boost Libraries
    - How to update this page
    - Acknowledgements

    -

    Print publications about Boost or Boost - Libraries

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    [MaddockCleary00]John Maddock and Steve Cleary, C++ Type - Traits. Dr. Dobb's Journal, Vol. 25, Issue 10, October, 2000, page 38. - www.boost.org/libs/type_traits/c++_type_traits.htm
      
    [Maddock01]John Maddock, Regular Expressions in C++. - Dr. Dobb's Journal, Vol. 26, Issue 10, October, 2001, page 21.
    [SiekLumsdaine01]Jeremy Siek and Andrew Lumsdaine, C++ - Concept Checking. Dr. Dobb's Journal, Vol. 26, Issue 6, June, 2001, - page 64.
      
    [Karlsson02]Björn Karlsson, Smart Pointers in Boost. - C/C++ Users Journal, April, 2002. - www.cuj.com/documents/s=8014/cuj0204karlsson/ -
    [Karlsson02a]Björn Karlsson, C/C++ Tip #9: Lexical - Conversions. C/C++ Users Journal, November, 2002. - www.cuj.com/documents/s=8470/cuj0211karlsson/
    [Kempf02]Bill Kempf, The Boost.Threads Library. - C/C++ Users Journal, May, 2002. - www.cuj.com/documents/s=8013/cuj0205kempf/
    [SiekLeeLumsdaine02] - Jeremy Siek, Lie-Quan Lee and Andrew Lumsdaine, The Boost Graph Library. - Addison-Wesley, 2002. ISBN: 0-201-72914-8. - www.awprofessional.com/titles/0-201-72914-8/ -
    A sample chapter is available at: tinyurl.com/24666 -
      
    [AbrahamsGrosse-Kunstleve03]David Abrahams and Ralf W. - Grosse-Kunstleve, Building Hybrid Systems with Boost.Python. C/C++ Users - Journal, July, 2003. - www.cuj.com/documents/s=8470/cuj0307abrahams/
    [GuzmanNuffer03]Joel de Guzman and Dan Nuffer, The Spirit - Library: Inline Parsing in C++. C/C++ Users Journal, September, 2003, - Vol. 21, Issue 9, page 22.
    [Karlsson03]Björn Karlsson, Lambda Expressions & - C++. C/C++ Users Journal, December, 2003, Vol. 21, Issue 12, page 20.
    [Sutter03]Herb Sutter, Generalized Function Pointers. - C/C++ Users Journal, August, 2003. - www.cuj.com/documents/s=8464/cujcexp0308sutter/ -
      
    [AbrahamsGurtovoy04] - David Abrahams and Aleksey Gurtovoy, C++ Template Metaprogramming: Concepts, - Tools, and Techniques from Boost and Beyond. Addison-Wesley, November, - 2004. ISBN: 0-321-22725-5. - www.awprofessional.com/titles/0321227255/ -
    - Additional information and two sample chapters are available at: - boost-consulting.com/tmpbook/ -
    [Inaba04] - Kazuhiro Inaba, Boost C++ Library Programming. Shuwa System, May, 2004. ISBN: 4-7980-0786-2. - www.shuwasystem.co.jp/books/7980/0786-2/0786-2.html -
    - Additional information and a sample chapter are available at: - www.kmonos.net/pub/BoostBook/ -
    [López04]Joaquín M López Muñoz, - The Boost Multi-Index Containers Library. C/C++ Users Journal, - September, 2004, Vol. 22, Issue 9, page 6.
      
    [Karlsson05] - Björn Karlsson, Beyond the C++ Standard Library: An Introduction to Boost. Addison-Wesley, August 31, 2005. ISBN: 0-3211-3354-4. - www.awprofessional.com/titles/0321133544/ -
    - A sample chapter is available at: - www.awprofessional.com/content/images/0321133544/samplechapter/karlsson_ch09.pdf -
    -

    Online publications about Boost or Boost - Libraries

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    [Brownell02]David Brownell, C++ Techniques for - Tomorrow That Can be Implemented Today (a.k.a. Boosting your Code). - NWCPP, November 13, 2002. www.nwcpp.org/Meetings/2002/11.html
    [Long02]Matt Long, Adding Regular Expressions to Your App with Regex++. - The Code Project, June 18, 2002. www.codeproject.com/string/regex__.asp
    [Siek02]Jeremy G. Siek, The Boost Graph Library. - InformIT, March 1, 2002. tinyurl.com/2hc27
    [Siek02a]Jeremy G. Siek, A Boost Graph Library - Tutorial. InformIT, March 1, 2002. tinyurl.com/2sa4s
      
    [Abrahams03]David Abrahams, The Boost - Metaprogramming Library. ACCU, 2003. - www.boost-consulting.com/writing/ACCU_MPL_slides.ppt
    [Dawes03]Beman Dawes, Multiplatform Software - Development. 2003. www.esva.net/~beman/multiplat_dev.ppt
    [Halleux03]Jonathan de Halleux, Opening a door - towards Spirit: a parser framework. The Code Project, March 24, 2003. www.codeproject.com/cpp/spiritintro.asp
    [Kaiser03]Hartmut Kaiser, Wave: a Standard conformant C++ preprocessor library. The Code Project, March 25, 2003. www.codeproject.com/cpp/wave_preprocessor.asp
    [Trentini03]Matthew S. Trentini, Introduction to Boost.
    [Walker03] Andrew Walker, An Introduction to Boost. - The Code Project, July 7, 2003. - www.codeproject.com/vcpp/stl/BoostIntro.asp -
    A short and straightforward introduction to Boost.
      
    [Dawes04]Beman Dawes, Boost for Visual C++ - Developers. MSDN, May 17, 2004. tinyurl.com/2lzyh
    [D'Agostino04]Jim D'Agostino, Designing Robust Objects with Boost. - The Code Project, August 17, 2004. - www.codeproject.com/cpp/Designing_Robust_Objects.asp
    [Handley04]Dave Handley, An Introduction to the Boost Spirit Parser framework. - The Code Project, October 9, 2004. - www.codeproject.com/vcpp/stl/introduction_spirit.asp
    [Handley04a]Dave Handley, Implementing Semantic Actions in the Boost Spirit Parser Framework. - The Code Project, October 10, 2004. - www.codeproject.com/vcpp/stl/spirit_semantic_actions.asp
    [Hauptmann04]Peter Hauptmann, Smart Pointers to boost your - code. The Code Project, September 27, 2004. - www.codeproject.com/vcpp/stl/boostsmartptr.asp
    [Hauptmann04a]Peter Hauptmann, boost 2: shared_ptr wraps - resource handles. The Code Project, October 4, 2004. - www.codeproject.com/vcpp/stl/boostsp_handleref.asp
    [Wikipedia04]Wikipedia, Boost. - Wikipedia, The Free Encyclopedia, 2004. - en.wikipedia.org/wiki/Boost_(programming)
    [Witt04]Thomas Witt, The Boost Iterator Library. - ACCU Spring Conference, 2004. - www.accu.org/conference/presentations/Witt_-_Boost_Iterator_Library.pdf
      
    [Karlsson05a]Bjorn Karlsson, How the Boost Bind Library Can Improve Your C++ Programs. InformIT, August 26, 2005. - http://www.informit.com/articles/article.asp?p=412354
    [Cogswell05]Jeff Cogswell, Adding an Easy File Save and File Load Mechanism - to Your C++ Program. InformIT, July 1, 2005. - http://www.informit.com/articles/article.asp?p=398702 -
    Explains Boost.Serialization.
    [Gurtovoy05]Aleksey Gurtovoy and David Abrahams An In-Depth Look at Metafunctions in C++. InformIT, April 1, 2005. - http://www.informit.com/articles/article.asp?p=375705
    -

    Print mentions of Boost or Boost Libraries

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    [HyslopSutter01]Jim Hyslop and Herb Sutter, Conversations: - I'd Hold Anything for You. C/C++ Users Journal, December, 2001. - www.cuj.com/documents/s=7988/cujcexp1912hyslop/ -
    boost::any -
    [Meyers01]Scott Meyers, Item 50: Familiarize yourself with - STL-related web sites. Effective STL, Addison-Wesley, 2001, page 221. ISBN: 0-201-74962-9 -
    [Sutter01]Herb Sutter, The String Formatters of - Manor Farm. C/C++ Users Journal, Vol. 19, November, 2001. - www.gotw.ca/publications/mill19.htm -
    boost::lexical_cast -
      
    [Ablavsky02]Vitaly Ablavsky, Applying BGL to - Computational Geometry. C/C++ Users Journal, August, 2002. - www.cuj.com/documents/s=8470/cuj0208ablavsky/
    [Alexandrescu02]Andrei Alexandrescu, Generic<Programming>: - Efficient Generic Sorting and Searching in C++ (I): In Search of a Better - Search. C/C++ Users Journal, October, 2002. - www.cuj.com/documents/s=7978/cujcexp2010alexandr/ -
    boost::type_traits -
    [HyslopSutter02]Jim Hyslop and Herb Sutter, Conversations: - Getting to the Point. C/C++ Users Journal, July, 2002. - www.cuj.com/documents/s=7981/cujcexp2007hyslop/ -
    smart pointer discussion. boost::scoped_ptr, shared_ptr, scoped_array, - shared_array. -
    [Sutter02]Herb Sutter, The New C++: The Group of - Seven - Extensions under Consideration for the C++ Standard Library. - C/C++ Users Journal, April, 2002. - www.cuj.com/documents/s=7984/cujcexp2004sutter/ -
    [Sutter02a]Herb Sutter, The New C++: Smart(er) - Pointers. C/C++ Users Journal, August, 2002. - www.cuj.com/documents/s=7980/cujcexp2008sutter/
      
    [Besser03]Mitch Besser, Generic Printable ENUM++. - C/C++ Users Journal, June, 2003. - www.cuj.com/documents/s=8470/cujboost0306besser/ -
    Mentions BOOST_PP -
    [Nasonov03]Alexander Nasonov, I/O System: dynamic_any - Campaign. C/C++ Users Journal, September, 2003. - www.cuj.com/documents/s=8470/cujweb0309nasonov/ -
    Improved boost::any -
    [Sutter03a]Herb Sutter, Generalizing Observer. - C/C++ Users Journal, September, 2003. - www.cuj.com/documents/s=8840/cujexp0309sutter/ -
    [Tan03]Kwee H. Tan, Exploring EDA Algorithms with - the Boost Graph Library. C/C++ Users Journal, July, 2003. - www.cuj.com/documents/s=8470/cuj0307tan/ -
    [VandervoordeJosuttis03] - David Vandevoorde and Nicolai M. - Josuttis, Using Templates in Practice. C/C++ Users Journal, February, - 2003. - www.cuj.com/documents/s=8208/cujweb0302vandevoorde/web0302b.htm -
    Concept Check Library -
      
    [Meyers05]Scott Meyers, Item 55: Familiarize yourself - with Boost. Effective C++, 3rd Edition, Addison-Wesley, May 12, 2005. ISBN: 0-321-33487-6 -
    -

    Online mentions of Boost or Boost Libraries

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    [Siek01]Jeremy G. Siek, An Implementation of Graph Isomorphism Testing, - December 9, 2001. - www.boost.org/libs/graph/doc/isomorphism-impl.pdf
      
    [Burnap02]Steven R. Burnap, Boost::any, - Kuro5hin, May 1, 2002. - www.kuro5hin.org/story/2002/5/1/142321/9513
    [Carbon02]David S?, Boost : The handy library of - handy libraries. Kuro5hin, July 18, 2002. - www.kuro5hin.org/story/2002/7/18/3313/01429 -
    [Curran02]James Curran, Access Raw Data with - Performance Counters in Visual C++. DevX.com, October, 2002. - www.devx.com/cplus/article/7951 -
    Devotes several paragraphs to boost::shared_ptr<>. -
    [Siek02b]Jeremy G. Siek, Internet Packet Routing - with the Boost Graph Library. InformIT, March 1, 2002. - tinyurl.com/26dwj
      
    [Casad03]Joe Casad, Introducing the Boost Corner. - C/C++ Users Journal, August, 2003. - www.cuj.com/documents/s=8470/cuj0308boostcorner/ -
    [Lischner03] - Ray Lischner, C++: Beyond the Standard Library. O'Reilly Network, May 6, - 2003. www.oreillynet.com/lpt/a/3683 -
    Mentions tuples, shared_ptr, lambda, spirit. -
      
    [Inaba04a]Kazuhiro Inaba, Let's Boost. 2004. - www.kmonos.net/alang/boost/
    [Stein04] -

    Sebastian Stein, How to use Boost Test for automated testing. 2004. - www.hpfsc.de/boosttest/

    -
      
    [Lindrud05]Jarl Lindrud, RMI for C++. - The Code Project, April 11, 2005. www.codeproject.com/threads/RMI_For_Cpp.asp -
    Uses Boost.Serialization.
    -

    How to update this page

    -

    Please help us keep this page updated - users can post new citations to the - mailing list, while Boost developers should update the page directly in CVS.

    -
      -
    • - If a publication is available both in print and online, cite it in the - appropriate print - section, with a hyperlink to the online version. -
    • - Bookmark the contents of [...] in the first column to make it easy to link to - the entry. -
    • - Identify the first entry an author has in a given year with just the two-digit - year. Subsequent entries for the same author and year should have a-z - appended. -
    • - Inside each section, entries are grouped by year and, within a year, alphabetically - sorted by author name. -
    • - In the text, spell out absolute URL's so that printed versions of this page - include the full URL. -
    • -
    -

    Acknowledgements

    -

    Fredrik Blomqvist provided many of the initial citations.

    -
    -

    Revised - - 17 September, 2005

    -

    © Copyright Beman Dawes 2003

    -

    Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at www.boost.org/LICENSE_1_0.txt) -

    - - diff --git a/blanket-permission.txt b/blanket-permission.txt index 018d5ea..6096aea 100644 --- a/blanket-permission.txt +++ b/blanket-permission.txt @@ -5,7 +5,7 @@ License, Version 1.0. (boostinspect:nolicense boostinspect:nocopyright) Aleksey Gurtovoy (agurtovoy@meta-comm.com) Andrei Alexandrescu (andrewalex - at - hotmail.com) (See Boost list message of August 12, 2004 11:06:58 AM EST) Andrew Lumsdaine () -Anthony Williams (anthony -at- justsoftwaresolutions.co.uk( +Anthony Williams (anthony -at- justsoftwaresolutions.co.uk) Beman Dawes (bdawes@acm.org) Brad King (brad.king -at- kitware.com) (See Boost list message of Wed, 21 Jul 2004 11:15:46 -0400) Brian Osman (osman -at- vvisions.com) (See CVS log) @@ -96,6 +96,9 @@ Trustees of Indiana University () University of Notre Dame () Vladimir Prus (ghost@cs.msu.su) William E. Kempf () (email to Beman Dawes, 9/14/2006 4:18 PM) +Joerg Walter (jhr.walter - at - t-online.de : email to ublas mailing list Mon, 17 Sep 2007 10:17:08 +0200) +Mathias Koch (mkoch - at - idesis.de 7 : email to boost-owner@lists.boost.org Sep 2007 13:20:09 +0200) --- end --- + diff --git a/boost_soc_06_overview.html b/boost_soc_06_overview.html new file mode 100644 index 0000000..f8d6770 --- /dev/null +++ b/boost_soc_06_overview.html @@ -0,0 +1,820 @@ + + + + + +An overview of Boost participation in +Google Summer of Code™ 2006 + + + + + +boost.png (6308 bytes) +

    An overview of Boost participation in +Google Summer of Code™ 2006

    + +
    + +

    +For the second consecutive year, Google has conducted its +Summer of Code™ initiative, +a program by which student developers are sponsored for their contributions +within open source organizations willing to mentor the participants. The 2006 +campaign has run between April and September, with active development work +taking place between May 23 and August 21. +

    + +

    +Around mid April, when the program had just started, some Boost members began +considering the possibility to enter Summer of Code as a mentoring +organization. Despite the lack of time and the fact that most of us were +completely new to this initiative, Boost managed to successfully apply for +the program. As a result ten projects were selected and mentored, most of +which are expected to become full contributions to Boost in the near future. +

    + +

    +We give here a summary report of this experience, along with a short analysis +of the main problems we found, so that we can work at solving them and do +better next year. +

    + +

    Contents

    + + + + +

    How the program works

    + +

    +There are three types of participants in Google Summer of Code: +

      +
    • Google itself acts as the funding partner and conducts the overall + program.
    • +
    • The open source organizations accepted into the program must designate + people inside the organization who will act as project mentors.
    • +
    • Students submit their project ideas and, if selected, work in + collaboration with one of the mentoring organizations; upon successful + completion of the project, students receive the full stipend for the + program.
    • +
    +The program goes through the following stages: +
      +
    • Organization selection: those open source organizations willing to + enter Summer of Code submit an expression of interest to Google, along + with information Google uses for qualifying purposes. Selected organizations + are publicly announced and each organization is expected to provide a pool + of project ideas.
    • +
    • Student selection: students willing to participate submit one or more + project proposals, typically expanding on some of the ideas previously + provided by the mentoring organizations. A student can apply several times + and for different organizations, but ultimately can only be chosen for just + one project. These proposals are routed by Google to the appropriate + organizations, which must analyze them, rank them, and assign mentors to the + most promising applications. Based on the information provided by mentoring + organizations, Google issues the final list of accepted projects.
    • +
    • Development: Students, guided by their assigned mentors, are expected to + complete the projects in a period of three months. Google asks mentors for a + mid-program review upon which continuation of the project depends.
    • +
    • Final review: Once the development period is over, mentors are requested + to inform Google on the results of the project, and determine whether students + qualify to receive the full stipend.
    • +
    +

    + +

    2006 figures

    + +

    +The 2006 campaign of Google Summer of Code took place between April 14 and +September 25. A total of 102 mentoring organizations participated. Of the 6,338 +applications submitted by 3,044 students around the globe, 630 were finally +selected and funded. Google has spent more than US$3 million in student stipends +and compensations to the mentoring organizations. +

    + +

    Boost participation

    + +

    Application and +process selection

    + +

    +On April 14, the same day Google Summer of Code started, Julio M. Merino Vidal +(later to become one of the selected students) sent a message encouraging Boost +members to participate in this program as a mentoring organization. This call +sparked the interest of the community; although time was already short for doing +all the preparation labors, Boost moderators put rapidly themselves to work and +conducted the preliminary registration steps. In the meantime, a Wiki page was +grown with project ideas provided by Boost members, totalling more than twenty +proposals. +

    + +

    +By the beginning of May Boost was officially accepted into the program and Boost +moderators set out to form a group of mentors, selected on an invitation basis. +As student selection is a delicate process, involving the assessment of individuals +on their technical skills, all subsequent discussions were conducted by the +selected mentors on a private mail list established for their collaboration. +

    + +

    +We were not prepared for the avalanche of student applications that followed. On +day two after the application period was open, we had received three proposals; +next day it was 14, and within a week the count exceeded 50. By the end of the +application period the total number of proposals received was 174, which forced +us to go through a very intensive ranking process and recruit additional mentors. +Two rules were followed so as rationalize the process of selection among dozens +of different proposals: +

      +
    • Where there were competing applications for the same project idea, only + one were to be ultimately selected; so, no two projects with the same or very + similar goals were accepted.
    • +
    • Some of the applications built on a given Boost library (for instance, the + Boost Graph Library is a frequent target for the addition of algorithms.) We + limited the applications to a maximum of two per Boost library.
    • +
    +These rules have the combined effect of greatly reducing the number of eligible +applications while at the same time distributing the accepted projects evenly +across the space of ideas. Moreover, students with unique proposals, i.e. project +ideas not coming from the pool originally presented by Boost, are at a +competitive advantage. +

    + +

    +The different proposals were classified according to its related technological +area so that each cluster could be handled by an appointed mentor with the +required expertise on the subject. Mentors submitted then "focus reports" +summarizing the applications under their responsibility; these reports served as +a first filter to help reduce the number of final applications to be evaluated +jointly. Along the process, students with the most promising proposals were asked +to refine their ideas and provide further information. +

    + +

    +Although not enforced by the official rules, we agreed upon a one-to-one ratio +of mentors to students, which ultimately marked a hard limit on the maximum number +of eligible projects. +

    + +

    Accepted projects

    + +

    +Google accepted and funded the ten top-ranked projects endorsed by Boost. Of +these, eight projects are libraries or library components targeted for future +inclusion into Boost, while the remaining two consist of utility programs +heavily relying on Boost. +

    + +
    +C++ Coroutine Library +
    +Giovanni Piero Deretta, mentored by Eric Niebler. +
    +Library for the management through a modern C++ interface of OS-provided +coroutine facilities. +
    + +
    +Concurrency Library +
    +Matthew Calabrese, mentored by David Abrahams. +
    +STL-inspired generic framework for high-level specification and execution of +parallelizable algorithms. +
    + +
    +TR1 Math Special Functions +
    +Xiaogang Zhang, mentored by John Maddock. +
    +Implementation of the 23 special mathematical functions specified in C++ +standard library extension proposal TR1. +
    + +
    +The Boost.Process library +
    +Julio M. Merino Vidal, mentored by Jeff Garland. +
    +Portable library for process launching and basic management. +
    + +
    +Out-of-Core Graphs and Graph Algorithms +
    +Stéphane Zampelli, mentored by Jeremy Siek. +
    +Extension of the Boost Graph Library to deal with out-of-core structures, +i.e. data sets too large to be kept in main memory at once. +
    + +
    +MISC (M)ulti (I)ndex (S)pecialized (C)ontainers +
    +Matías Capeletto, mentored by Joaquín M López Muñoz. +
    +Families of specialized containers internally based on Boost.MultiIndex. +
    + +
    +Generic Tree Container +
    +Bernhard Reiter, mentored by René Rivera. +
    +Design and implementation of a family of STL-compatible tree containers. +
    + +
    +Viewer utility for FSMs +
    +Ioana Tibuleac, mentored by Andreas Huber Dönni. +
    +Utility program for the visualization of finite state machines (FSMs) specified +with Boost.Statechart. +
    + +
    +Modular C++ preprocessor, using Boost.Spirit +
    +Hermanpreet 'Lally' Singh, mentored by Joel de Guzman. +
    +Implementation with Boost.Spirit and Boost.Wave of a front-end translator +from Modular C++ (as specified in a proposal to add modules to C++ by Daveed +Vandevoorde) to standard C++. +
    + +
    +Implementing a state of the art Mincut/Maxflow algorithm. +
    +Stephan Diederich, mentored by Douglas Gregor. +
    +Implementation of a fast mincut/maxflow routine for the Boost Graph Library +based on a new algorithm devised by Vladimir Kolmogorov. +
    + +

    Development

    + +

    +Two main facilities were set up to assist students and mentors during the +development phase: a mailing list and a Trac/SVN project management system +with separate directories for each project. One of the students, Matías +Capeletto, out of personal initiative registered a Google Group aimed at giving +students with Boost a place for informal interaction and discussion of common +problems. +

    + +

    +After the initial warm-up period, each student-mentor pair performed development +work mostly privately. The usage of the Boost mailing lists was scarce, and +only by the end of the program did some students publicly announced their results. +

    + +

    Results

    + +

    +By the date the development period was officially closed, the status of the +different projects was as follows: +

      +
    • Seven projects were completed or nearly completed and the students are + expected to ask for a formal review within 2006 or early 2007. Four of these + projects necessitated a goal reorientation during development, basically + because the original plan was too ambitious for three months. Most of the + projects are still in active development during the months following the + Summer of Code program.
    • +
    • Two projects did not reach the planned goals, but nevertheless produced + useful material that could be expanded outside of the Summer of Code + program.
    • +
    • One project was abandoned shortly after the midterm review. The reasons + for the abandonment are unknown.
    • +
    +The results of all the projects can be consulted online at the dedicated +Trac +site. +

    + +

    Analysis

    + +

    +We examine the various stages of Boost participation in Summer of Code, with an +emphasis on discovering opportunities for improvement. +

    + +

    Boost appeal

    + +

    +In a mid project +presentation at OSCON +2006, Chris DiBona from Google provided some data about the organizations +which received the most applications: +

    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OrganizationNo of applications
    KDE244
    Ubuntu & Bazaar236
    Python Software Foundation212
    GNOME199
    Apache Software Foundation190
    Boost174
    Gaim152
    The GNU Project148
    Drupal146
    +

    +
    +The numbers shown here have been estimated from a chart included in the +presentation slides. This chart contains an additional column labeled "Google" +which actually accounts for the applications dismissed because of their low +quality. +
    + +

    +The fact that Boost is ranked the sixth most attractive organization out of a +total of 102 was entirely unexpected, especially considering the wide popularity +of the rest of top-rated organizations. There is a more or less implicit +consensus among Boost members that ours is a relatively niche project, known for +its quality standards by seasoned C++ practitioners, but with a limited penetration +among entry level programmers: maybe the figures above should make us reconsider +this assumption. A cursory examination of the applications submitted to Boost reveals +that most applicants were regular users of Boost: many cite the Boost status among +the C++ community as an appealing factor in order to apply. +

    + +

    Opportunities lost?

    + +

    +If we look at the number of funded projects with respect to the applications received, +figures are not so favorable to Boost.

    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OrganizationNo of projectsProject/app ratio
    KDE249.8 %
    Ubuntu & Bazaar229.3 %
    Python Software Foundation2310.8 %
    GNOME199.5 %
    Apache Software Foundation2714.2 %
    Boost105.7 %
    Gaim85.3 %
    The GNU Project106.8 %
    Drupal149.6 %
    +

    + +

    +It turns out that the project/application ratio for almost any other organization +among the top nine is considerably higher than that of Boost. As it happens, Google +initially requested that organizations submitted the maximum number of projects they +felt they could cope with, and we got funding for exactly what we aimed for, so the +limiting factor lies entirely on Boost's side. +

    + +

    Projects startup

    + +

    +Contributing to Boost relies on a fair number of guidelines and protocols for +coding, documentation, testing and maintenance. Many of the required tools are +exclusively used within Boost, and some of them are not trivial, like for instance +Boost.Build. Although the Boost web site contains information about all these tools +and procedures, this intelligence is scattered through unrelated pages and sometimes +is very hard to come by. +

    + +

    +So, there is a good deal of expertise required to begin working at Boost. Some +students have reported on startup difficulties getting to know these details and +familiarizing themselves with the tools, most notably bjam and Quickbook. Each +student overcome the startup difficulties on their own or resorting to their +mentors (see the section on public +communication issues). +

    + +

    Ongoing development

    + +

    +Once students got past the startup stage, most projects advanced without serious +complications. In the majority of cases, it was realized at some point during +the development that there was no time to complete it. Some participants had to +redefine the goals in an effort to keep the project within schedule, while others +simply decided that they would continue working after the official deadline of +Summer of Code. +

    + +

    +The information flow between each student and their mentor was usually reported +by both parties to be satisfactory. The projects suffering from lack of +communication have been precisely those yielding the poorest results. In general, +mentors have not felt overwhelmed by requests from their students, and even in a +couple of cases the projects were run practically unattendedly. This fact is +witness to the high competence of the students recruited into the program. +

    + +

    +The degree of usage of the Trac/SVN system has varied. Some students did frequent +updates, while others have just used the repository to dump the final results for +the official submission to Google. +

    + +

    Public communication +issues

    + +

    +Students and mentors had at their disposal three different forums for the public +interchange of information and support: +

      +
    • Boost public lists, especially the developers and users lists.
    • +
    • A dedicated mailing list reaching all students and mentors working at + Summer of Code in Boost.
    • +
    • A more casual Google Group, set up by one of the students, aimed at + providing the participants with a place for socializing and resolution of + common problems.
    • +
    +Despite this abundance of resources, there was an almost complete lack of group +communication among all the parties involved and between these and the larger +Boost community. Seemingly, students were satisfied to pursue their activities by +relying on support from their mentors alone. This circumstance has prevented +Boost members from enriching the initiative by offering their experience and +insight, and has possibly led students to the false impression that contributing +to Boost proceeds in a predictable linear path from requisites to completion of +the work. When asked about their not engaging in public communication, the students +gave vague justifications that can be classified into the following: +
      +
    • Doubts were deemed too technical or specific to be worth raising in + public.
    • +
    • A crave for perfectionism detracted students from asking or submitting work + in progress until they felt their material looked good enough.
    • +
    • Shyness: some students probably lacked previous experience communicating in + public, and most are not English native speakers, which could also be a + limiting factor.
    • +
    +Although students did not identify the following as a reason not to go public, it +is likely that many of them did not feel the need given the readily access to their +mentors they enjoyed. It is easy to grow used to such a dedicated source of support +and neglect resorting to other resources. Mentors should have encouraged their +students to pursue the public discussion of projects, which constitutes one of the +pillars of Boost renowned quality. +

    + +

    Scope of projects

    + +

    +In hindsight, it has become apparent that most projects were too ambitious to be +completed within the three months of duration of the program, and even those that +were considered a success will need weeks or months of polishing up before the +material is ready for a formal review. In contrast with other organizations +participating in the Summer of Code program, Boost has as of this writing included +no results into its code base. No formal review for any project has been requested +yet, either. +

    + +

    +These scope issues are very dependent on the particular type of project. We can +classify the Boost projects for Summer of Code as follows: +

      +
    • Full-fledged libraries,
    • +
    • additions to existing Boost libraries,
    • +
    • utilities and tool projects using Boost.
    • +
    +Of these, additions (like for instance the mincut/maxflow algorithm for BGL by +Stephan Diederich) are the most suitable for completion in a short period of time: +most of the preparation work is already done, and the student has clear guides as +to what coding and documentation standards to follow. Also, these projects need +not undergo a formal review, since it is the responsibility of the hosting library +author to review the code and include it within her discretion. Utility projects +seem also suitable for small timeframes, though most project proposals and requests +are naturally oriented to contributions of actual code to the Boost project. +

    + +

    +As for those projects involving the design and realization of full-fledged +libraries, there is little hope that the goals and scope can be kept modest enough +for a three-month schedule. Boost candidate libraries developed by professional +authors usually take much longer than three months to be accepted; some libraries +have been evolving through several years before being included into Boost. +So, the best we can hope for if we are to support the realization of library projects +for Boost inside Summer of Code is that the results by the end of the program can +be evaluated to constitute a viable potential contribution to Boost. When this is +the case, it is crucial that the student commits to further working on the project +up to completion and formal review. Perhaps more important than getting libraries +coded is to engage new authors into a long-term relationship with the Boost project. +

    + +

    Suggestions for improvement

    + +

    +The following proposals aim to alleviate some of the problems we have identified +during the development of Summer of Code within Boost. These action points are +related only to the issues found in connection with Boost: we are not addressing +other areas of improvement associated to the Summer of Code program itself. +

    + +

    Preparation

    + +

    +Much work can be done before the actual program begins. The following preparation +activities can already be launched: +

    + +

    +Create a pool of ideas for projects. This action will provide valuable extra +time for evaluation and refining of ideas before the Summer of Code begins. +The experience has shown that those projects with more preparation work, especially +in the area of design, were ultimately more successful. The pool can also be used +to retain interesting ideas that arise at the mailing lists and very often are +not given proper attention and become abandoned. +

    + +

    +Create a student pool. Prior involvement with Boost is clearly an advantage +both in the selection phase and later during project development. Those students +with a serious interest in participating in Summer of Code with Boost can enter +the pool and begin exploring ideas and interacting with the community well in +advance of the summer, so as to put themselves in a favorable position for the +selection. Advertisement for the student pool can be initiated in the beginning of +2007 through the usual channels (web site and mailing lists): additionally, Boost +members involved with the University can spread this information locally and help +raise the interest of students in their environment. +

    + +

    +Create a mentor pool. Given the rush with which Boost entered the 2006 +Summer of Code campaign, the invitation of mentors has to be done on an on-demand +basis as it became all too evident that the task was growing bigger and bigger. +It is important that the organization is better prepared next year so that a +number of people with the ability and will to participate as Boost mentors are +identified in advance. +

    + +

    +Prepare a startup package. In order to facilitate the initial period of +getting familiarized with the various Boost guidelines, protocols and tools, it +would be extremely useful to prepare a compilation of startup material for +students. This package can consist of a single document gathering the currently +dispersed information, or go beyond this and provide some bundle of documentation +and pre-built tools, an approach that one of the students is currently working on. +

    + +

    Public communication

    + +

    +It is crucial that students get involved with the community as soon as possible +and grow to appreciate the advantages of public development with respect to +solitary coding. +

    + +

    +Mandate (bi)weekly reports. These reports should be directed to the public +mailing lists so as to give all Boost members an opportunity to follow the work +in progress and contribute. Reporting has the extra benefit for students of +forcing them to reflect on their own work periodically and struggle with the +often difficult task of presenting their ideas to others. +

    + +

    +Conduct student-mentor exclusively through public channels. This might be +too drastic a policy, as some matters need privacy, and depending on the amount +of information exchanged flooding problems may arise. Less severe variations +involve allowing for some private interchange at the mentors' discretion and +moving this kind of communication to a dedicated public mailing list different +from the general ones. +

    + +

    Project management

    + +

    +The two most important issues to improve upon with respect to the management are: +

      +
    • Project scope must be kept under control,
    • +
    • The progress has to be publicly visible, so that problems of scope, + design and/or schedule can be more easily detected.
    • +
    +Some of the proposals in this section are not to be regarded as strict rules, +but rather as general guidelines to be kept in mind by students and encouraged +by mentors. +

    + +

    +Create a best practices document. This document can serve as a guideline +for project management, an area in which Boost traditionally imposes no +requirements. Students might lack the expertise in this area that is usually +taken for granted in the traditional model where contributions to Boost are +made by professional programmers. +

    + +

    +Mandate a design phase. Having a concrete design set up and clearly +described early in the project will help estimate the necessary effort for +completion of the work. This is also an opportunity for public discussion. +

    + +

    +Maintain code, docs and tests in parallel. All too often, novice +programmers do the coding in one fell swoop and only then move to testing and +documenting their work. This is unacceptable by all current methodology +standards, and can result in serious underestimations of the time to +completion. +

    + +

    +Encourage the KISS principle. It is much better to finish a simpler library +and then iteratively evolve it, once it has been exposed to public scrutiny and +usage. +

    + +

    +More Trac updates. The repository should be viewed as an everyday work +tool, not only as the place into which to dump the final results. Updating often +leads to more visibility of the work by the mentor and the public in general. +

    + +

    +Informal reviews. The typical Summer of Code Boost project will not be +completed by the official deadline, as have been discussed earlier. To somehow +officialize the work done within the Summer of Code proper, and also to allow +the students to reach some sort of psychological milestone, informal reviews can +be instituted where Boost members evaluate the work done at then end of Summer +of Code. +

    + +

    +Engage students. This experience has shown that it is possible to guide +willing and bright students to the competence levels required for contributing +to Boost. The best possible outcome of Summer of Code campaigns are the +incorporation of new people into the circle of Boost active contributors. Strive +to make the students commit to Boost. +

    + +

    Conclusions

    + +

    +Despite the lack of previous experience in Boost, our participation in Google +Summer of Code has been extremely fruitful: much useful material has been produced, +and, perhaps more importantly, some of the students are likely to commit on a +long-term basis and grow to be regular Boost contributors. Traditionally, becoming +a productive Boost author has a very high entry barrier due to the extreme quality +standards, lack of public support and the very specific culture of the project. +The appeal of Summer of Code itself and the possibility of being gently mentored +into the world of Boost have most likely been key factors in lowering this entry +barrier. +

    + +

    +The process has not been without some difficulties, either, as it was expected of +a newcomer organization as Boost. We have tried to identify in this paper the +areas of improvement and suggest specific actions so that the upcoming Google +Summer of Code 2007 can be an even more rewarding experience. +

    + +

    Acknowledgements

    + +

    +This paper couldn't have been written without the numerous reports and contributions +kindly provided by Boost students and mentors: Many thanks to all the participants +for sharing their experiences with me. Thank you also to the people at Google who +have promoted and conducted the Summer of Code initiative. +

    + +
    + +

    Revised October 17th 2006

    + +

    © Copyright 2006 Joaquín M López Muñoz. +Distributed under the Boost Software +License, Version 1.0. (See accompanying file +LICENSE_1_0.txt or copy at +http://www.boost.org/LICENSE_1_0.txt) +

    + + + diff --git a/borland_cpp.html b/borland_cpp.html deleted file mode 100644 index 49781ed..0000000 --- a/borland_cpp.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - - - Portability Hints: Borland C++ 5.5.1 - - - - - - - - - - - - - - - - - -
    -HomeLibrariesPeopleFAQMore
    - -

    Portability Hints: Borland C++ 5.5.1

    - -

    It is a general aim for boost libraries to be portable. The primary means for achieving - this goal is to adhere to ISO Standard C++. However, ISO C++ is a broad and - complex standard and most compilers are not fully conformant to ISO C++ - yet. In order to achieve portability in the light of this restriction, it - seems advisable to get acquainted with those language features that some - compilers do not fully implement yet.

    - -

    This page gives portability hints on some language features of the - Borland C++ version 5.5.1 compiler. Furthermore, the appendix presents - additional problems with Borland C++ version 5.5. Borland C++ 5.5.1 is a - freely available command-line compiler for Win32 available at http://www.borland.com/.

    - -

    Each entry in the following list describes a particular issue, complete - with sample source code to demonstrate the effect. Most sample code herein - has been verified to compile with gcc 2.95.2 and Comeau C++ 4.2.44.

    - -

    Preprocessor symbol

    - -

    The preprocessor symbol __BORLANDC__ is defined for all - Borland C++ compilers. Its value is the version number of the compiler - interpreted as a hexadecimal number. The following table lists some known - values.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Compiler__BORLANDC__ value
    Borland C++ Builder 40x0540
    Borland C++ Builder 50x0550
    Borland C++ 5.50x0550
    Borland C++ 5.5.10x0551
    Borland C++ Builder 60x0560
    - -

    Core Language

    - -

    [using-directive] Mixing using-declarations and - using-directives

    - -

    Mixing using-directives (which refer to whole namespaces) - and namespace-level using-declarations (which refer to - individual identifiers within foreign namespaces) causes ambiguities where - there are none. The following code fragment illustrates this:

    -
    -namespace N {
    -  int x();
    -}
    -
    -using N::x;
    -using namespace N;
    -
    -int main()
    -{
    -  &x;     // Ambiguous overload
    -}
    -
    - -

    [using template] using-declarations for class - templates

    - -

    Identifiers for class templates can be used as arguments to - using-declarations as any other identifier. However, the - following code fails to compile with Borland C++:

    -
    -template<class T>
    -class X { };
    -
    -namespace N
    -{
    -  // "cannot use template 'X<T>' without specifying specialization parameters"
    -  using ::X;
    -};
    -
    - -

    [template const arg] Deduction of constant arguments to function - templates

    - -

    Template function type deduction should omit top-level constness. - However, this code fragment instantiates "f<const int>(int)":

    -
    -template<class T>
    -void f(T x)
    -{
    -        x = 1;  // works
    -        (void) &x;
    -        T y = 17;
    -        y = 20;  // "Cannot modify a const object in function f<const int>(int)"
    -        (void) &y;
    -}
    -
    -int main()
    -{
    -        const int i = 17;
    -        f(i);
    -}
    -
    - -

    [function address] Resolving addresses of overloaded functions

    - -

    Addresses of overloaded functions are not in all contexts properly - resolved (std:13.4 [over.over]); here is a small example:

    -
    -template<class Arg>
    -void f( void(*g)(Arg) );
    -
    -void h(int);
    -void h(double);
    -
    -template<class T>
    -void h2(T);
    -
    -int main()
    -{
    -  void (*p)(int) = h;            // this works (std:13.4-1.1)
    -  void (*p2)(unsigned char) = h2;    // this works as well (std:13.4-1.1)
    -  f<int>(h2);  // this also works (std:13.4-1.3)
    -
    -  // "Cannot generate template specialization from h(int)",
    -  // "Could not find a match for f<Arg>(void (*)(int))"
    -  f<double>(h);   // should work (std:13.4-1.3)
    -
    -  f( (void(*)(double))h);  // C-style cast works (std:13.4-1.6 with 5.4)
    -
    -  // "Overloaded 'h' ambiguous in this context"
    -  f(static_cast<void(*)(double)>(h)); // should work (std:13.4-1.6 with 5.2.9)
    -}
    -
    - -

    Workaround: Always use C-style casts when determining - addresses of (potentially) overloaded functions.

    - -

    [string conversion] Converting const char * to - std::string

    - -

    Implicitly converting const char * parameters to - std::string arguments fails if template functions are - explicitly instantiated (it works in the usual cases, though):

    -
    -#include <string>
    -
    -template<class T>
    -void f(const std::string & s)
    -{}
    -
    -int main()
    -{
    -  f<double>("hello");  // "Could not find a match for f<T>(char *)"
    -}
    -
    -
    - -

    Workaround: Avoid explicit template function - instantiations (they have significant problems with Microsoft Visual C++) - and pass default-constructed unused dummy arguments with the appropriate - type. Alternatively, if you wish to keep to the explicit instantiation, you - could use an explicit conversion to std::string or declare the - template function as taking a const char * parameter.

    - -

    [template value defaults] Dependent default arguments for template - value parameters

    - -

    Template value parameters which default to an expression dependent on - previous template parameters don't work:

    -
    -template<class T>
    -struct A
    -{
    -  static const bool value = true;
    -};
    -
    -// "Templates must be classes or functions", "Declaration syntax error"
    -template<class T, bool v = A<T>::value>
    -struct B {};
    -
    -int main()
    -{
    -  B<int> x;
    -}
    -
    -
    - -

    Workaround: If the relevant non-type template parameter - is an implementation detail, use inheritance and a fully qualified - identifier (for example, ::N::A<T>::value).

    - -

    [function partial ordering] Partial ordering of function templates

    - -

    Partial ordering of function templates, as described in std:14.5.5.2 - [temp.func.order], does not work:

    -
    -#include <iostream>
    -
    -template<class T> struct A {};
    -
    -template<class T1>
    -void f(const A<T1> &)
    -{
    -  std::cout << "f(const A<T1>&)\n";
    -}
    -
    -template<class T>
    -void f(T)
    -{
    -  std::cout << "f(T)\n";
    -}
    -
    -int main()
    -{
    -  A<double> a;
    -  f(a);   // output: f(T)  (wrong)
    -  f(1);   // output: f(T)  (correct)
    -}
    -
    - -

    Workaround: Declare all such functions uniformly as - either taking a value or a reference parameter.

    - -

    [instantiate memfun ptr] Instantiation with member function - pointer

    - -

    When directly instantiating a template with some member function - pointer, which is itself dependent on some template parameter, the compiler - cannot cope:

    -
    -template<class U> class C { };
    -template<class T>
    -class A
    -{
    -  static const int v = C<void (T::*)()>::value;
    -};
    -
    - -

    Workaround: Use an intermediate - typedef:

    -
    -template<class U> class C { };
    -template<class T>
    -class A
    -{
    -  typedef void (T::*my_type)();
    -  static const int v = C<my_type>::value;
    -};
    -
    - -

    (Extracted from e-mail exchange of David Abrahams, Fernando Cacciola, - and Peter Dimov; not actually tested.)

    - -

    Library

    - -

    [cmath.abs] Function double std::abs(double) missing

    - -

    The function double std::abs(double) should be defined - (std:26.5-5 [lib.c.math]), but it is not:

    -
    -#include <cmath>
    -
    -int main()
    -{
    -  double (*p)(double) = std::abs;  // error
    -}
    -
    - -

    Note that int std::abs(int) will be used without warning if - you write std::abs(5.1).

    - -

    Similar remarks apply to seemingly all of the other standard math - functions, where Borland C++ fails to provide float and - long double overloads.

    - -

    Workaround: Use std::fabs instead if type - genericity is not required.

    - -

    Appendix: Additional issues with Borland C++ version 5.5

    - -

    These issues are documented mainly for historic reasons. If you are - still using Borland C++ version 5.5, you are strongly encouraged to obtain - an upgrade to version 5.5.1, which fixes the issues described in this - section.

    - -

    [inline friend] Inline friend functions in template classes

    - -

    If a friend function of some class has not been declared before the - friend function declaration, the function is declared at the namespace - scope surrounding the class definition. Together with class templates and - inline definitions of friend functions, the code in the following fragment - should declare (and define) a non-template function "bool N::f(int,int)", - which is a friend of class N::A<int>. However, Borland C++ v5.5 - expects the function f to be declared beforehand:

    -
    -namespace N {
    -template<class T>
    -class A
    -{
    -  // "f is not a member of 'N' in function main()"
    -  friend bool f(T x, T y) { return x < y; }
    -};
    -}
    -
    -int main()
    -{
    -  N::A<int> a;
    -}
    -
    - -

    This technique is extensively used in boost/operators.hpp. Giving in to - the wish of the compiler doesn't work in this case, because then the - "instantiate one template, get lots of helper functions at namespace scope" - approach doesn't work anymore. Defining BOOST_NO_OPERATORS_IN_NAMESPACE (a - define BOOST_NO_INLINE_FRIENDS_IN_CLASS_TEMPLATES would match this case - better) works around this problem and leads to another one, see - [using-template].

    -
    - -

    Valid HTML 4.01 Transitional

    - -

    Revised - 03 - December, 2006

    - -

    Copyright © 2000-2002 Jens - Maurer

    - -

    Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt)

    - - diff --git a/bugs.htm b/bugs.htm deleted file mode 100644 index 6d07c54..0000000 --- a/bugs.htm +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - Bugs - - - - - - - - - - - - - - - - -
    - boost.png (6897 bytes)Home - Libraries - PeopleFAQMore
    - -

    What to do about Boost bugs

    - -
      - -
    1. Make sure the bug isn't already fixed in the latest sources. The most - recent version of everything on the Boost web site is available from - the boost public - CVS repository.
      -
      -
    2. -
    3. If you are a Boost user, or a Boost developer that doesn't have a CVS - write access:
      -
      -
        -
      1. Submit a bug report to either - boost-users list, - boost mailing - list, or our bug - tracking facility; submitting it to either of the mailing - lists is a preferred way - because many of the Boost developers read the - lists on a daily basis, this way you are likely to get a quicker response, - and the discussions that often arise there from (possible) bug reports are - quite interesting and educational as well;
        -
        -
      2. -
      3. If you have a proposed patch to the code, post it along with your bug - report, preferably in the unified diffs format (cvs diff -du); - if you can, send a patch relative to the current CVS state. A canonical -example of creating a patch file follows (let's assume that you've found -a bug in the file intentional_bug.hpp:
        -
        -
          -
        1. Download the latest version of intentional_bug.hpp from CVS.
        2. -
        3. Make sure that the bug is still present in the code.
        4. -
        5. Copy the file intentional_bug.hpp to a file called intentional_bug.hpp.orig.
        6. -
        7. Apply your changes to intentional_bug.hpp.
        8. -
        9. Run "diff -du intentional_bug.hpp.orig intentional_bug.hpp > intentional_bug.hpp.patch" from the command prompt.
        10. -
        11. Submit the patch file together with an explanation of the bug -and the proposed fix; and don't forget to include the word patch or bug -in the subject if you're submitting to the boost mailing list.
          -
          -
        12. -
        - -
      4. - -
      -
    4. -
    5. If you are a Boost developer, and you have a CVS write access:
      -
      -
        -
      1. If the bug is trivial (e.g. misspelled name, missed typename, - etc.), and you are willing to make a fix, either make your changes locally - and contact the library author(s)/maintainer(s) about it, or go ahead and - check the fix into CVS, but post a notification about it to the - boost mailing - list (if the author is not very active on the list, you also might want - to consider cc'ing him as well);
        -
        -
      2. -
      3. If the bug is non-trivial, and/or you don't have the time and resources to fix it, - submit a bug report (see p. 2 above); chances are that the maintainer(s) - will respond promptly and take care of the problem;
        -
        -
      4. -
      5. Otherwise, create a temporary branch in CVS, make your changes there, and - ask the library author(s)/maintainer(s) to review them; if they are ok with - the new code, either you or they can integrate the fixes into the main - trunk.
      6. -
      -
    6. -
    - -
    -

    Revised 18 January, 2002 -

    - -

    © Copyright Aleksey Gurtovoy -2002

    -

    Distributed under the Boost Software License, Version 1.0. -(See accompanying file LICENSE_1_0.txt or -copy at www.boost.org/LICENSE_1_0.txt) -

    - -
    - - - diff --git a/count_bdy.htm b/count_bdy.htm deleted file mode 100644 index 67e9087..0000000 --- a/count_bdy.htm +++ /dev/null @@ -1,774 +0,0 @@ - - - - - - - - - - - Counted Body Techniques - - - -

    Counted Body Techniques

    - -
    -

    Kevlin Henney
    - (kevlin@acm.org, khenney@qatraining.com)

    -
    - -
    -

    Reference counting techniques? Nothing new, you might think. Every good - C++ text that takes you to an intermediate or advanced level will - introduce the concept. It has been explored with such thoroughness in the - past that you might be forgiven for thinking that everything that can be - said has been said. Well, let's start from first principles and see if we - can unearth something new....

    -
    -
    - -

    And then there were none...

    - -
    -

    The principle behind reference counting is to keep a running usage - count of an object so that when it falls to zero we know the object is - unused. This is normally used to simplify the memory management for - dynamically allocated objects: keep a count of the number of references - held to that object and, on zero, delete the object.

    - -

    How to keep a track of the number of users of an object? Well, normal - pointers are quite dumb, and so an extra level of indirection is required - to manage the count. This is essentially the PROXY - pattern described in Design Patterns [Gamma, Helm, Johnson & - Vlissides, Addison-Wesley, ISBN 0-201-63361-2]. The - intent is given as

    - -
    -

    Provide a surrogate or placeholder for another object to control - access to it.

    -
    - -

    Coplien [Advanced C++ Programming Styles and Idioms, - Addison-Wesley, ISBN 0-201-56365-7] defines a set - of idioms related to this essential separation of a handle and a body - part. The Taligent Guide to Designing Programs [Addison-Wesley, - ISBN 0-201-40888-0] identifies a number of specific - categories for proxies (aka surrogates). Broadly speaking they fall into - two general categories:

    - -
      -
    • Hidden: The handle is the object of interest, hiding the body - itself. The functionality of the handle is obtained by delegation to the - body, and the user of the handle is unaware of the body. Reference - counted strings offer a transparent optimisation. The body is shared - between copies of a string until such a time as a change is needed, at - which point a copy is made. Such a COPY ON WRITE - pattern (a specialisation of LAZY EVALUATION) requires the use of a hidden reference counted - body.
    • - -
    • Explicit: Here the body is of interest and the handle merely - provides intelligence for its access and housekeeping. In C++ this is - often implemented as the SMART POINTER idiom. One such application is that of reference - counted smart pointers that collaborate to keep a count of an object, - deleting it when the count falls to zero.
    • -
    -
    -
    - -

    Attached vs detached

    - -
    -

    For reference counted smart pointers there are two places the count can - exist, resulting in two different patterns, both outlined in - Software Patterns [Coplien, SIGS, ISBN - 0-884842-50-X]:

    - -
      -
    • COUNTED BODY or ATTACHED - COUNTED - HANDLE/BODY places the - count within the object being counted. The benefits are that - countability is a part of the object being counted, and that reference - counting does not require an additional object. The drawbacks are - clearly that this is intrusive, and that the space for the reference - count is wasted when the object is not heap based. Therefore the - reference counting ties you to a particular implementation and style of - use.
    • - -
    • DETACHED COUNTED - HANDLE/BODY places the - count outside the object being counted, such that they are handled - together. The clear benefit of this is that this technique is completely - unintrusive, with all of the intelligence and support apparatus in the - smart pointer, and therefore can be used on classes created - independently of the reference counted pointer. The main disadvantage is - that frequent use of this can lead to a proliferation of small objects, - i.e. the counter, being created on the heap.
    • -
    - -

    Even with this simple analysis, it seems that the DETACHED COUNTED HANDLE/BODY approach is ahead. Indeed, - with the increasing use of templates this is often the favourite, and is - the principle behind the common - but not standard - counted_ptr. [The Boost name is shared_ptr rather than counted_ptr.]

    - -

    A common implementation of COUNTED BODY is to provide the counting mechanism in a base class that - the counted type is derived from. Either that, or the reference counting - mechanism is provided anew for each class that needs it. Both of these - approaches are unsatisfactory because they are quite closed, coupling a - class into a particular framework. Added to this the non-cohesiveness of - having the count lying dormant in a non-counted object, and you get the - feeling that excepting its use in widespread object models such as COM and - CORBA the COUNTED BODY - approach is perhaps only of use in specialised situations.

    -
    -
    - -

    A requirements based approach

    - -
    -

    It is the question of openness that convinced me to revisit the - problems with the COUNTED BODY idiom. Yes, there is a certain degree of intrusion - expected when using this idiom, but is there anyway to minimise this and - decouple the choice of counting mechanism from the smart pointer type - used?

    - -

    In recent years the most instructive body of code and specification for - constructing open general purpose components has been the Stepanov and - Lee's STL (Standard Template Library), now part of the C++ standard - library. The STL approach makes extensive use of compile time polymorphism - based on well defined operational requirements for types. For instance, - each container, contained and iterator type is defined by the operations - that should be performable on an object of that type, often with - annotations describing additional constraints. Compile time polymorphism, - as its name suggests, resolves functions at compile time based on function - name and argument usage, i.e. overloading. This is less intrusive, - although less easily diagnosed if incorrect, than runtime poymorphism that - is based on types, names and function signatures.

    - -

    This requirements based approach can be applied to reference counting. - The operations we need for a type to be Countable are loosely:

    - -
      -
    • An acquire operation that registers - interest in a Countable object.
    • - -
    • A release operation unregisters - interest in a Countable object.
    • - -
    • An acquired query that returns - whether or not a Countable object is currently acquired.
    • - -
    • A dispose operation that is - responsible for disposing of an object that is no longer acquired.
    • -
    - -

    Note that the count is deduced as a part of the abstract state of this - type, and is not mentioned or defined in any other way. The openness of - this approach derives in part from the use of global functions, meaning - that no particular member functions are implied; a perfect way to wrap up - an existing counted body class without modifying the class itself. The - other aspect to the openness comes from a more precise specification of - the operations.

    - -

    For a type to be Countable it must satisfy the following - requirements, where ptr is a non-null - pointer to a single object (i.e. not an array) of the type, and - #function indicates number of calls - to function(ptr):

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ExpressionReturn typeSemantics and notes
    acquire(ptr)no requirementpost: acquired(ptr)
    release(ptr)no requirementpre: acquired(ptr)
    - post: acquired(ptr) == #acquire - - #release
    acquired(ptr)convertible to boolreturn: #acquire > #release
    dispose(ptr, ptr)no requirementpre: !acquired(ptr)
    - post: *ptr no longer usable
    -
    - -

    Note that the two arguments to dispose - are to support selection of the appropriate type safe version of the - function to be called. In the general case the intent is that the first - argument determines the type to be deleted, and would typically be - templated, while the second selects which template to use, e.g. by - conforming to a specific base class.

    - -

    In addition the following requirements must also be satisfied, where - null is a null pointer to the - Countable type:

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ExpressionReturn typeSemantics and notes
    acquire(null)no requirementaction: none
    release(null)no requirementaction: none
    acquired(null)convertible to boolreturn: false
    dispose(null, null)no requirementaction: none
    -
    - -

    Note that there are no requirements on these functions in terms of - exceptions thrown or not thrown, except that if exceptions are thrown the - functions themselves should be exception safe.

    -
    -
    - -

    Getting smart

    - -
    -

    Given the Countable requirements for a type, it is possible to - define a generic smart pointer type that uses them for reference counting:

    - -
    -
    -template<typename countable_type>
    -class countable_ptr
    -{
    -public: // construction and destruction
    -
    -    explicit countable_ptr(countable_type *);
    -    countable_ptr(const countable_ptr &);
    -    ~countable_ptr();
    -
    -public: // access
    -
    -    countable_type *operator->() const;
    -    countable_type &operator*() const;
    -    countable_type *get() const;
    -
    -public: // modification
    -
    -    countable_ptr &clear();
    -    countable_ptr &assign(countable_type *);
    -    countable_ptr &assign(const countable_ptr &);
    -    countable_ptr &operator=(const countable_ptr &);
    -
    -private: // representation
    -
    -    countable_type *body;
    -
    -};
    -
    -
    -
    - -

    The interface to this class has been kept intentionally simple, e.g. - member templates and throw specs have been - omitted, for exposition. The majority of the functions are quite simple in - implementation, relying very much on the assign member as a keystone function:

    - -
    -
    -template<typename countable_type>
    -countable_ptr<countable_type>::countable_ptr(countable_type *initial)
    -  : body(initial)
    -{
    -    acquire(body);
    -}
    -
    -template<typename countable_type>
    -countable_ptr<countable_type>::countable_ptr(const countable_ptr &other)
    -  : body(other.body)
    -{
    -    acquire(body);
    -}
    -
    -template<typename countable_type>
    -countable_ptr<countable_type>::~countable_ptr()
    -{
    -    clear();
    -}
    -
    -template<typename countable_type>
    -countable_type *countable_ptr<countable_type>::operator->() const
    -{
    -    return body;
    -}
    -
    -template<typename countable_type>
    -countable_type &countable_ptr<countable_type>::operator*() const
    -{
    -    return *body;
    -}
    -
    -template<typename countable_type>
    -countable_type *countable_ptr<countable_type>::get() const
    -{
    -    return body;
    -}
    -
    -template<typename countable_type>
    -countable_ptr<countable_type> &countable_ptr<countable_type>::clear()
    -{
    -    return assign(0);
    -}
    -
    -template<typename countable_type>
    -countable_ptr<countable_type> &countable_ptr<countable_type>::assign(countable_type *rhs)
    -{
    -    // set to rhs (uses Copy Before Release idiom which is self assignment safe)
    -    acquire(rhs);
    -    countable_type *old_body = body;
    -    body = rhs;
    -
    -    // tidy up
    -    release(old_body);
    -    if(!acquired(old_body))
    -    {
    -        dispose(old_body, old_body);
    -    }
    -
    -    return *this;
    -}
    -
    -template<typename countable_type>
    -countable_ptr<countable_type> &countable_ptr<countable_type>::assign(const countable_ptr &rhs)
    -{
    -    return assign(rhs.body);
    -}
    -
    -template<typename countable_type>
    -countable_ptr<countable_type> &countable_ptr<countable_type>::operator=(const countable_ptr &rhs)
    -{
    -    return assign(rhs);
    -}
    -
    -
    -
    -
    -
    - -

    Public accountability

    - -
    -

    Conformance to the requirements means that a type can be used with - countable_ptr. Here is an implementation - mix-in class (mix-imp) that confers countability on its derived - classes through member functions. This class can be used as a class - adaptor:

    - -
    -
    -class countability
    -{
    -public: // manipulation
    -
    -    void acquire() const;
    -    void release() const;
    -    size_t acquired() const;
    -
    -protected: // construction and destruction
    -
    -    countability();
    -    ~countability();
    -
    -private: // representation
    -
    -    mutable size_t count;
    -
    -private: // prevention
    -
    -    countability(const countability &);
    -    countability &operator=(const countability &);
    -
    -};
    -
    -
    -
    - -

    Notice that the manipulation functions are const and that the count - member itself is mutable. This is because - countability is not a part of an object's abstract state: memory - management does not depend on the const-ness or otherwise of an object. I won't include the - definitions of the member functions here as you can probably guess them: - increment, decrement and return the current count, respectively for the - manipulation functions. In a multithreaded environment you should ensure - that such read and write operations are atomic.

    - -

    So how do we make this class Countable? A simple set of - forwarding functions does the job:

    - -
    -
    -void acquire(const countability *ptr)
    -{
    -    if(ptr)
    -    {
    -        ptr->acquire();
    -    }
    -}
    -
    -void release(const countability *ptr)
    -{
    -    if(ptr)
    -    {
    -        ptr->release();
    -    }
    -}
    -
    -size_t acquired(const countability *ptr)
    -{
    -    return ptr ? ptr->acquired() : 0;
    -}
    -
    -template<class countability_derived>
    -void dispose(const countability_derived *ptr, const countability *)
    -{
    -    delete ptr;
    -}
    -
    -
    -
    - -

    Any type that now derives from countability may now be used with countable_ptr:

    - -
    -
    -class example : public countability
    -{
    -    ...
    -};
    -
    -void simple()
    -{
    -    countable_ptr<example> ptr(new example);
    -    countable_ptr<example> qtr(ptr);
    -    ptr.clear(); // set ptr to point to null
    -}   // allocated object deleted when qtr destructs
    -
    -
    -
    -
    -
    - -

    Runtime mixin

    - -
    -

    The challenge is to apply COUNTED BODY in a non-intrusive fashion, such that there is no overhead - when an object is not counted. What we would like to do is confer this - capability on a per object rather than on a per class basis. Effectively - we are after Countability on any object, i.e. anything pointed to - by a void *! It goes without saying that - void is perhaps the least committed of any type.

    - -

    The forces to resolve on this are quite interesting, to say the least. - Interesting, but not insurmountable. Given that the class of a runtime - object cannot change dynamically in any well defined manner, and the - layout of the object must be fixed, we have to find a new place and time - to add the counting state. The fact that this must be added only on heap - creation suggests the following solution:

    - -
    -
    -struct countable_new;
    -extern const countable_new countable;
    -
    -void *operator new(size_t, const countable_new &);
    -void operator delete(void *, const countable_new &);
    -
    -
    - -

    We have overloaded operator new with a - dummy argument to distinguish it from the regular global operator new. This is comparable to the use of the - std::nothrow_t type and std::nothrow object in the standard library. The - placement operator delete is there to - perform any tidy up in the event of failed construction. Note that this is - not yet supported on all that many compilers.

    - -

    The result of a new expression using - countable is an object allocated on the - heap that has a header block that holds the count, i.e. we have extended - the object by prefixing it. We can provide a couple of features in an - anonymous namespace (not shown) in the implementation file for for - supporting the count and its access from a raw pointer:

    - -
    -
    -struct count
    -{
    -    size_t value;
    -};
    -
    -count *header(const void *ptr)
    -{
    -    return const_cast<count *>(static_cast<const count *>(ptr) - 1);
    -}
    -
    -
    -
    - -

    An important constraint to observe here is the alignment of - count should be such that it is suitably - aligned for any type. For the definition shown this will be the case on - almost all platforms. However, you may need to add a padding member for - those that don't, e.g. using an anonymous union to coalign count - and the most aligned type. Unfortunately, there is no portable way of - specifying this such that the minimum alignment is also observed - this is - a common problem when specifying your own allocators that do not directly - use the results of either new or - malloc.

    - -

    Again, note that the count is not considered to be a part of the - logical state of the object, and hence the conversion from - const to non-const - count is in - effect a mutable type.

    - -

    The allocator functions themselves are fairly straightforward:

    - -
    -
    -void *operator new(size_t size, const countable_new &)
    -{
    -    count *allocated = static_cast<count *>(::operator new(sizeof(count) + size));
    -    *allocated = count(); // initialise the header
    -    return allocated + 1; // adjust result to point to the body
    -}
    -
    -void operator delete(void *ptr, const countable_new &)
    -{
    -    ::operator delete(header(ptr));
    -}
    -
    -
    -
    - -

    Given a correctly allocated header, we now need the Countable - functions to operate on const void * to - complete the picture:

    - -
    -
    -void acquire(const void *ptr)
    -{
    -    if(ptr)
    -    {
    -        ++header(ptr)->value;
    -    }
    -}
    -
    -void release(const void *ptr)
    -{
    -    if(ptr)
    -    {
    -        --header(ptr)->value;
    -    }
    -}
    -
    -size_t acquired(const void *ptr)
    -{
    -    return ptr ? header(ptr)->value : 0;
    -}
    -
    -template<typename countable_type>
    -void dispose(const countable_type *ptr, const void *)
    -{
    -    ptr->~countable_type();
    -    operator delete(const_cast<countable_type *>(ptr), countable);
    -}
    -
    -
    -
    - -

    The most complex of these is the dispose function that must ensure that the correct type - is destructed and also that the memory is collected from the correct - offset. It uses the value and type of first argument to perform this - correctly, and the second argument merely acts as a strategy selector, - i.e. the use of const void * - distinguishes it from the earlier dispose shown for const countability *.

    -
    -
    - -

    Getting smarter

    - -
    -

    Now that we have a way of adding countability at creation for objects - of any type, what extra is needed to make this work with the - countable_ptr we defined earlier? Good - news: nothing!

    - -
    -
    -class example
    -{
    -    ...
    -};
    -
    -void simple()
    -{
    -    countable_ptr<example> ptr(new(countable) example);
    -    countable_ptr<example> qtr(ptr);
    -    ptr.clear(); // set ptr to point to null
    -}   // allocated object deleted when qtr destructs
    -
    -
    -
    - -

    The new(countable) expression defines a - different policy for allocation and deallocation and, in common with other - allocators, any attempt to mix your allocation policies, e.g. call - delete on an object allocated with - new(countable), results in undefined - behaviour. This is similar to what happens when you mix new[] with delete or - malloc with delete. The whole point of Countable conformance - is that Countable objects are used with countable_ptr, and this ensures the correct use.

    - -

    However, accidents will happen, and inevitably you may forget to - allocate using new(countable) and instead - use new. This error and others can be - detected in most cases by extending the code shown here to add a check - member to the count, validating the check - on every access. A benefit of ensuring clear separation between header and - implementation source files means that you can introduce a checking - version of this allocator without having to recompile your code.

    -
    -
    - -

    Conclusion

    - -
    -

    There are two key concepts that this article has introduced:

    - -
      -
    • The use of a generic requirements based approach to simplify and - adapt the use of the COUNTED BODY pattern.
    • - -
    • The ability, through control of allocation, to dynamically and - non-intrusively add capabilities to fixed types using the RUNTIME MIXIN pattern.
    • -
    - -

    The application of the two together gives rise to a new variant of the - essential COUNTED BODY - pattern, UNINTRUSIVE COUNTED BODY. You can take this theme - even further and contrive a simple garbage collection system for C++.

    - -

    The complete code for countable_ptr, - countability, and the countable new is also available.

    -
    - -
    -
    - First published in Overload 25, - April 1998, ISSN 1354-3172 -
    - -

    Valid HTML 4.01 Transitional

    - -

    Revised - 04 December, 2006

    - -

    Copyright © 1998-1999 Kevlin Henney

    - -

    Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt)

    - - diff --git a/cpp_committee_meetings.html b/cpp_committee_meetings.html deleted file mode 100644 index 26bc51a..0000000 --- a/cpp_committee_meetings.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - -C++ Committee Meetings - - - - -

    C++ Committee Meeting FAQ for Boost Members

    -

    Who can attend C++ Committee meetings? Members of -J16 (the INCITS/ANSI committee) or of a WG21 (ISO) member country committee -("national body" in -ISO-speak). -INCITS has broadened  J16 membership requirements so anyone can -join, regardless of nationality or employer.

    -

    In addition, a small number of "technical experts" who are not committee -members can also attend meetings. The "technical expert" umbrella is broad enough to cover -the -Boost members who attend meetings.

    -

    When and where is the next meeting? There are two meetings a year. The -Fall meeting is usually in North America, and the Spring meeting is usually -outside North America. See a general -list of meeting locations and -dates. Detailed information about a particular meeting, including hotel -information, is usually provided in a paper appearing in one of -mailings for the prior meeting. If there isn't a link to -it on the -Meetings web page, you will have to go to -the committee's -Papers page and search a bit.

    -

    Is there a fee for attending meetings? No, but there can be a lot of -incidental expenses like travel, lodging, and meals, and there is a $US 800 a -year INCITS fee to become a voting member.

    -

    What is the schedule?  The meetings start at 9:00AM on -Monday, and 8:30AM other days, unless otherwise announced. It is best to arrive -a half-hour early to grab a good seat, some coffee, tea, or donuts, and to say -hello to people. (There is also a Sunday evening a WG21 administrative meeting, -which is closed except to delegates from national bodies.)

    -

    The meetings generally end on Friday, although there is discussion of -extending them one extra day until the next standard ships. The last day the meeting  is generally over by 11:00AM. Because -the last day's meeting is for formal votes only, it is primarily of interest only to -actual committee -members.

    -

    Sometimes there are evening technical sessions; the details aren't -usually available until the Monday morning meeting.  There may be a -reception one evening, and, yes, significant others are -invited. Again, details usually become available Monday morning.

    -

    What actually happens at the meetings? Monday morning an hour or two -is spent in full committee on administrivia, and then the committee breaks up -into working groups (Core, Library, and Enhancements). The full committee also -gets together later in the week to hear working group progress reports.

    -

    The working groups are where most technical activities take place.  Each -active issue that appears on an issues list is discussed, as are papers from the -mailing. Most issues are non-controversial and disposed of in a few minutes. -Technical discussions are often led by long-term committee members, often -referring to past decisions or longstanding working group practice. Sometimes a -controversy erupts. It takes first-time attendees awhile to understand the -discussions and how decisions are actually made. The working group chairperson -moderates.

    -

    Sometimes straw polls are taken. In a straw poll anyone attending can vote, -in contrast to the formal votes taken by the full committee, where only voting -members can vote.

    -

    Lunch break is an hour and a half.  Informal subgroups often lunch -together; a lot of technical problems are discussed or actually solved at lunch, -or later at dinner. In many ways these discussions involving only a few people -are the most interesting. Sometimes during the regular meetings, a working group -chair will break off a sub-group to tackle a difficult problem.

    -

    Do I have to stay at the main hotel? No, and committee members on -tight budgets often stay at other, cheaper, hotels. (The main hotels are usually -chosen because they have large meeting rooms available, and thus tend to be pricey.) -The advantage of staying at the main hotel is that it is then easier to -participate in the off-line discussions which can be at least as interesting -as what actually happens in the scheduled meetings.

    -

    What do people wear at meetings?  Programmer casual. No neckties -to be seen.

    -

    What should I bring to a meeting? It is almost essential to have a -laptop computer along. There is a committee LAN with a wiki and Internet connectivity. -Wireless connectivity has become the norm, although there is usually a wired hub -or two for those needed wired access.

    -

    What should I do to prepare for a meeting? It is helpful to have -downloaded the mailing or individual papers for the -meeting, and read any papers you are interested in. Familiarize yourself with -the issues lists if you haven't done so already. Decide which of the working -groups you want to attend.

    -

    What is a "Paper"? An electronic document containing issues, -proposals, or anything else the committee is interested in. Very little gets -discussed at a meeting, much less acted upon, unless it is presented in a paper.  -Papers are available -to anyone. Papers don't just appear randomly; they become available four (lately -six) times a -year, before and after each meeting. Committee members often refer to a paper by -saying what mailing it was in: "See the pre-Redmond mailing."

    -

    What is a "Mailing"? A mailing is the -set of papers prepared four to six times a year before and after each meeting, -or between meetings.  It -is physically just a -.zip or .gz -archive of -all the papers for a meeting. Although the mailing's archive file itself is only available to committee members and technical -experts, the contents (except copies of the standard) are available to the -general public as individual papers. The ways of ISO are -inscrutable.

    -

    What is a "Reflector"? The committee's mailing lists are -called "reflectors". There are a number of them; "all", "core", "lib", and "ext" -are the main ones. As a courtesy, Boost technical experts can be added to -committee reflectors at the request of a committee member.

    -
    -

    Revised -April 17, 2005

    -

    © Copyright Beman Dawes, 2002

    -

    - Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt) -

    - - - - diff --git a/discussion_policy.htm b/discussion_policy.htm deleted file mode 100644 index 3a584af..0000000 --- a/discussion_policy.htm +++ /dev/null @@ -1,370 +0,0 @@ - - - - - - - - - - - Boost Discussion Policy - - - - - - - - - - - - - - - - - -
    -HomeLibrariesPeopleFAQMore
    - -

    Boost Discussion Policy

    - -

    Email discussion is the tie that binds boost members together into a - community. If the discussion is stimulating and effective, the community - thrives. If the discussion degenerates into name calling and ill will, the - community withers and dies.

    - -

    Contents

    - -
    -
    Acceptable Topics
    - -
    Unacceptable Topics
    - -
    Effective Posting
    - -
    Prohibited Behavior
    - -
    Culture
    - -
    Library Names
    -
    - -

    Acceptable topics

    - -
      -
    • Queries to determine interest in a possible library submission.
    • - -
    • Technical discussions about a proposed or existing library, including - bug reports and requests for help.
    • - -
    • Formal Reviews of proposed libraries.
    • - -
    • Reports of user experiences with Boost libraries.
    • - -
    • Boost administration or policies.
    • - -
    • Compiler specific workarounds as applied to Boost libraries.
    • -
    - -

    Other topics related to boost development may be acceptable, at the - discretion of moderators. If unsure, go ahead and post. The moderators will - let you know.

    - -

    Unacceptable Topics

    - -
      -
    • Advertisements for commercial products.
    • - -
    • Requests for help getting non-boost code to compile with your - compiler. Try the comp.lang.c++.moderated newsgroup instead.
    • - -
    • Requests for help interpreting the C++ standard. Try the comp.std.c++ - newsgroup instead.
    • - -
    • Job offers.
    • - -
    • Requests for solutions to homework assignments.
    • -
    - -

    Effective Posting

    - -

    Most Boost mailing lists host a great deal of traffic, so your post is - usually competing for attention with many other communications. This - section describes how to make sure it has the desired impact.

    - -

    Well-Crafted Posting is Worth the Effort

    - -

    Don't forget, you're a single writer but there are many readers, and you - want them to stay interested in what you're saying. Saving your readers a - little time and effort is usually worth the extra time you spend when - writing a message. Also, boost discussions are saved for posterity, as - rationales and history of the work we do. A post's usefulness in the future - is determined by its readability.

    - -

    Put the Library Name in the Subject Line

    - -

    When your post is related to a particular Boost library, it's helpful to - put the library name in square brackets at the beginning of the subject - line, e.g.

    - -
    - Subject: [Regex] Why doesn't this pattern match? -
    The Boost developers' list is a high-volume mailing list, and - most maintainers don't have time to read every message. A tag on the - subject line will help ensure the right people see your post. - -

    - -

    Don't Use Tabs

    If you use tabs to indent your source code, convert - them to spaces before inserting the code in a posting. Something in the - processing chain usually strips all the indentation and leaves a mess - behind. - -

    - -

    Limit Line Length

    If you put source code in your postings and your - mailer wraps long lines automatically, either keep the code narrow or - insert the code as an (inline, if possible) attachment. That will help - ensure others can read what you've posted. - -

    - -

    Don't Overquote

    Please prune extraneous quoted text from - replies so that only the relevant parts are included. Some people have to - pay for, or wait for, each byte that they download from the list. More - importantly, it will save time and make your post more valuable when - readers do not have to find out which exact part of a previous message you - are responding to. - -

    Use a Readable Quotation Style

    - -

    A common and very useful approach is to cite the small fractions of the - message you are actually responding to and to put your response directly - beneath each citation, with a blank line separating them for - readability:

    - -
    -
    -Person-you're-replying-to wrote:
    -
    -> Some part of a paragraph that you wish to reply to goes 
    -> here; there may be several lines.
    -
    -Your response to that part of the message goes here.  There may,
    -of course, be several lines.
    -
    -> The second part of the  paragraph that is relevant to your 
    -> reply goes here; agiain there may be several lines.
    -
    -Your response to the second part of the message goes here.
    -...
    -
    -
    -
    For more information about effective use of quotation in - posts, see this - helpful guide. - -

    Keep the Formatting of Quotations Consistent

    - -

    Some email and news clients use poor word wrapping algorithms that leave - successive lines from the same quotation with differing numbers of leading - ">" characters. Microsoft Outlook and Outlook - Express, and some web clients, are especially bad about this. If your - client offends in this way, please take the effort to clean up the mess it - makes in quoted text. Remember, even if you didn't write the original text, - it's your posting; whether you get your point across depends on its - readability.

    - -

    The Microsoft clients also create an unusually verbose header at the - beginning of the original message text and leave the cursor at the - beginning of the message, which encourages users to write their replies - before all of the quoted text rather than putting the reply in context. - Fortunately, Dominic Jain has written a utility that fixes all of these - problems automatically: Outlook - Quotefix for Outlook Users and OE QuoteFix for - users of Outlook Express.

    - -

    Summarizing and Referring to Earlier Messages

    - -

    A summary of the foregoing thread is only needed after a long - discussion, especially when the topic is drifting or a result has been - achieved in a discussion. The mail system will do the tracking that is - needed to enable mail readers to display message threads (and every decent - mail reader supports that).

    - -

    If you ever have to refer to single message earlier in a thread or in a - different thread then you can use a URL to the message archives. To help to keep those - URLs short, you can use tinyurl.com. - Citing the relevant portion of a message you link to is often helpful (if - the citation is small).

    - -

    Maintain the Integrity of Discussion Threads

    - -

    When starting a new topic, always send a fresh message, rather - than beginning a reply to some other message and replacing the subject and - body. Many mailers are able to detect the thread you started with and will - show the new message as part of the original thread, which probably isn't - what you intended. Follow this guideline for your own sake as well as for - others'. Often, people scanning for relevant messages will decide they're - done with a topic and hide or kill the entire thread: your message will be - missed, and you won't get the response you're looking for.

    - -

    By the same token, When replying to an existing message, use your - mailer's "Reply" function, so that the reply shows up as part of the - same discussion thread.

    - -

    Do not reply to digests if you are a digest delivery subscriber. - Your reply will not be properly threaded and will probably have the wrong - subject line. Instead, you can reply through the GMane web - interface.

    - -

    Keep The Size of Your Posting Manageable

    - -

    The mailing list software automatically limits message and attachment - size to a reasonable amount, typically 75K, which is adjusted from - time-to-time by the moderators. This limit is a courtesy to those who rely - on dial-up Internet access.

    - -

    Prohibited Behavior

    - -

    Prohibited behavior will not be tolerated. The moderators will ban - postings by abusers.

    - -

    Flame wars

    - -

    Personal insults, argument for the sake of argument, and all the other - behaviors which fall into the "flame war" category are prohibited. - Discussions should focus on technical arguments, not the personality traits - or motives of participants.

    - -

    Third-party attacks

    - -

    Attacks on third parties such as software vendors, hardware vendors, or - any other organizations, are prohibited. Boost exists to unite and serve - the entire C++ community, not to disparage the work of others.

    - -

    Does this mean that we ban the occasional complaint or wry remark about - a troublesome compiler? No, but be wary of overdoing it.

    - -

    Off-topic posts

    - -

    Discussions which stray from the acceptable topics are strongly - discouraged. While off-topic posts are often well meaning and not as - individually corrosive as other abuses, cumulatively the distraction - damages the effectiveness of discussion.

    - -

    Culture

    - -

    In addition to technical skills, Boost members value collaboration, - acknowledgement of the help of others, and a certain level of politeness. - Boost membership is very international, and ranges widely in age and other - characteristics. Think of discussion as occurring among colleagues in a - widely read forum, rather than among a few close friends.

    - -

    Always remember that the cumulative effort spent by people reading your - contribution scales with the (already large) number of boost members. Thus, - do invest time and effort to make your message as readable as possible. - Adhere to English syntax and grammar rules such as proper capitalization. - Avoid copious informalism, colloquial language, or abbreviations, they may - not be understood by all readers. Re-read your message before submitting - it.

    - -

    Guidelines for Effective Discussions

    - -

    Apply social engineering to prevent heated technical discussion from - degenerating into a shouting match, and to actively encourage the - cooperation upon which Boost depends.

    - -
      -
    • Questions help. If someone suggests something that you don't think - will work, then replying with a question like "will that compile?" or - "won't that fail to compile, or am I missing something?" is a lot - smoother than "That's really stupid - it won't compile."  Saying - "that fails to compile for me, and seems to violate section n.n.n of the - standard" would be yet another way to be firm without being - abrasive.
    • - -
    • If most of the discussion has been code-free generalities, posting a - bit of sample code can focus people on the practical issues.
    • - -
    • If most of the discussion has been in terms of specific code, try to - talk a bit about hidden assumptions and generalities that may be - preventing discussion closure.
    • - -
    • Taking a time-out is often effective. Just say: "Let me think about - that for a day or two. Let's take a time-out to digest the discussion so - far."
    • -
    - -

    Avoid Parkinson's Bicycle Shed. Parkinson described a - committee formed to oversee design of an early nuclear power plant. There - were three agenda items - when to have tea, where to put the bicycle shed, - and how to ensure nuclear safety. Tea was disposed of quickly as - trivial. Nuclear safety was discussed for only an hour - it was so - complex, scary, and technical that even among experts few felt comfortable - with the issues. Endless days were then spent discussing construction of - the bicycle shed (the parking lot would be the modern equivalent) because - everyone though they understood the issues and felt comfortable discussing - them. 

    - -

    Library Names

    - -

    In order to ensure a uniform presentation in books and articles, we have - adopted a convention for referring to Boost libraries. Library names can - either be written in a compact form with a dot, as "Boost.Name", or - in a long form as "the Boost Name library." For example:

    - -
    - Boost.Python serves a very different purpose from the Boost - Graph library. -
    Note that the word "library" is not part of the name, and as - such isn't capitalized. - -

    Please take care to avoid confusion in discussions between libraries - that have been accepted into Boost and those that have not. Acceptance as a - Boost library indicates that the code and design have passed through our - peer-review process; failing to make the distinction devalues the hard work - of library authors who've gone through that process. Here are some - suggested ways to describe potential Boost libraries:

    - -
      -
    • the proposed Boost Name library
    • - -
    • the Boost.Name candidate
    • - -
    • the Name library (probably the best choice where - applicable)
    • -
    - -

    Note that this policy only applies to discussions, not to the - documentation, directory structure, or even identifiers in the code of - potential Boost libraries.

    -
    - -

    Valid HTML 4.01 Transitional

    - -

    Revised - 04 December, 2006

    - -

    Copyright © 2000-2005 Beman Dawes, Rob Stewart, and David Abrahams

    - -

    Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at www.boost.org/LICENSE_1_0.txt)

    - - diff --git a/error_handling.html b/error_handling.html deleted file mode 100644 index 1436404..0000000 --- a/error_handling.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - Error and Exception Handling - - - -

    Error and Exception Handling

    - -

    References

    - -

    The following paper is a good introduction to some of the issues of - writing robust generic components:

    - -
    - D. Abrahams: ``Exception Safety - in Generic Components'', originally published in M. - Jazayeri, R. Loos, D. Musser (eds.): Generic Programming, Proc. of a - Dagstuhl Seminar, Lecture Notes on Computer Science. Volume. 1766 -
    - -

    Guidelines

    - -

    When should I use exceptions?

    - -

    The simple answer is: ``whenever the semantic and performance - characteristics of exceptions are appropriate.''

    - -

    An oft-cited guideline is to ask yourself the question ``is this an - exceptional (or unexpected) situation?'' This guideline has an attractive - ring to it, but is usually a mistake. The problem is that one person's - ``exceptional'' is another's ``expected'': when you really look at the - terms carefully, the distinction evaporates and you're left with no - guideline. After all, if you check for an error condition, then in some - sense you expect it to happen, or the check is wasted code.

    - -

    A more appropriate question to ask is: ``do we want stack - unwinding here?'' Because actually handling an exception is likely - to be significantly slower than executing mainline code, you - should also ask: ``Can I afford stack unwinding here?'' For - example, a desktop application performing a long computation might - periodically check to see whether the user had pressed a cancel - button. Throwing an exception could allow the operation to be - cancelled gracefully. On the other hand, it would probably be - inappropriate to throw and handle exceptions in the inner - loop of this computation because that could have a significant - performance impact. The guideline mentioned above has a grain of - truth in it: in time critical code, throwing an exception - should be the exception, not the rule.

    - -

    How should I design my exception classes?

    - -
      -
    1. Derive your exception class - from std::exception. Except in *very* rare - circumstances where you can't afford the cost of a virtual - table, - std::exception makes a reasonable exception base class, - and when used universally, allows programmers to catch "everything" - without resorting to catch(...). For more about - catch(...), see below. - -
    2. Use virtual inheritance. This insight is due - to Andrew Koenig. Using virtual inheritance from your - exception's base class(es) prevents ambiguity problems at the - catch-site in case someone throws an exception derived from - multiple bases which have a base class in common: - -
      -#include <iostream>
      -struct my_exc1 : std::exception { char const* what() const throw(); };
      -struct my_exc2 : std::exception { char const* what() const throw(); };
      -struct your_exc3 : my_exc1, my_exc2 {};
      -
      -int main()
      -{
      -   try { throw your_exc3(); }
      -   catch(std::exception const& e) {}
      -   catch(...) { std::cout << "whoops!" << std::endl; }
      -}
      -
      - -The program above prints "whoops" because the -C++ runtime can't resolve which exception instance to -match in the first catch clause. - -
    3. - -
    4. - Don't embed a std::string object or any other data - member or base class whose copy constructor could throw an exception. - That could lead directly to std::terminate() at the throw point. - Similarly, it's a bad idea to use a base or member whose ordinary - constructor(s) might throw, because, though not necessarily fatal to - your program, you may report a different exception than intended from - a throw-expression that includes construction such as: - -
      -
      -throw some_exception();    
      -
      -
      - -

      There are various ways to avoid copying string objects when - exceptions are copied, including embedding a fixed-length buffer in - the exception object, or managing strings via reference-counting. - However, consider the next point before pursuing either of these - approaches.

      -
    5. - -
    6. Format the what() message on demand, if you - feel you really must format the message. Formatting an exception error - message is typically a memory-intensive operation that could - potentially throw an exception. This is an operation best delayed until - after stack unwinding has occurred, and presumably, released some - resources. It's a good idea in this case to protect your - what() function with a catch(...) block so - that you have a fallback in case the formatting code throws
    7. - -
    8. Don't worry too much about the what() - message. It's nice to have a message that a programmer stands a - chance of figuring out, but you're very unlikely to be able to compose - a relevant and user-comprehensible error message at the point an - exception is thrown. Certainly, internationalization is beyond the - scope of the exception class author. Peter Dimov makes an excellent argument - that the proper use of a what() string is to serve as a - key into a table of error message formatters. Now if only we could get - standardized what() strings for exceptions thrown by the - standard library...
    9. - -
    10. Expose relevant information about the cause of the error in - your exception class' public interface. A fixation on the - what() message is likely to mean that you neglect to - expose information someone might need in order to make a coherent - message for users. For example, if your exception reports a numeric - range error, it's important to have the actual numbers involved - available as numbers in the exception class' public interface - where error reporting code can do something intelligent with them. If - you only expose a textual representation of those numbers in the - what() string, you will make life very difficult for - programmers who need to do something more (e.g. subtraction) with them - than dumb output.
    11. - -
    12. Make your exception class immune to double-destruction if - possible. Unfortunately, several popular compilers occasionally cause - exception objects to be destroyed twice. If you can arrange for that to - be harmless (e.g. by zeroing deleted pointers) your code will be more - robust.
    13. -
    - -

    What About Programmer Errors?

    - -

    As a developer, if I have violated a precondition of a library I'm - using, I don't want stack unwinding. What I want is a core dump or the - equivalent - a way to inspect the state of the program at the exact point - where the problem was detected. That usually means assert() or - something like it.

    - -

    Sometimes it is necessary to have resilient APIs which can stand up to - nearly any kind of client abuse, but there is usually a significant cost - to this approach. For example, it usually requires that each object used - by a client be tracked so that it can be checked for validity. If you - need that sort of protection, it can usually be provided as a layer on - top of a simpler API. Beware half-measures, though. An API which promises - resilience against some, but not all abuse is an invitation to disaster. - Clients will begin to rely on the protection and their expectations will - grow to cover unprotected parts of the interface.

    - -

    Note for Windows developers: unfortunately, the native - exception-handling used by most Windows compilers actually throws an - exception when you use assert(). Actually, this is true of other - programmer errors such as segmentation faults and divide-by-zero errors. - One problem with this is that if you use JIT (Just In Time) debugging, - there will be collateral exception-unwinding before the debugger comes up - because catch(...) will catch these not-really-C++ - exceptions. Fortunately, there is a simple but little-known workaround, - which is to use the following incantation:

    - -
    -
    -extern "C" void straight_to_debugger(unsigned int, EXCEPTION_POINTERS*)
    -{
    -    throw;
    -}
    -extern "C" void (*old_translator)(unsigned, EXCEPTION_POINTERS*)
    -         = _set_se_translator(straight_to_debugger);
    -
    -
    - This technique doesn't work if the SEH is raised from within a catch - block (or a function called from within a catch block), but it still - eliminates the vast majority of JIT-masking problems. - -

    How should I handle exceptions?

    - -

    Often the best way to deal with exceptions is to not handle them at - all. If you can let them pass through your code and allow destructors to - handle cleanup, your code will be cleaner.

    - -

    Avoid catch(...) when possible

    - Unfortunately, operating systems other than Windows also wind non-C++ - "exceptions" (such as thread cancellation) into the C++ EH machinery, and - there is sometimes no workaround corresponding to the - _set_se_translator hack described above. The result is that - catch(...) can have the effect of making some unexpected - system notification at a point where recovery is impossible look just - like a C++ exception thrown from a reasonable place, invalidating the - usual safe assumptions that destructors and catch blocks have taken valid - steps to ensure program invariants during unwinding. - -

    I reluctantly concede this point to Hillel Y. Sims, after many - long debates in the newsgroups: until all OSes are "fixed", if - every exception were derived from std::exception and - everyone substituted - catch(std::exception&) for catch(...), the - world would be a better place.

    - -

    Sometimes, catch(...), is still the most appropriate - pattern, in spite of bad interactions with OS/platform design choices. If - you have no idea what kind of exception might be thrown and you really - must stop unwinding it's probably still your best bet. One obvious - place where this occurs is at language boundaries.

    -
    - -

    © Copyright David Abrahams 2001-2003. All rights reserved.

    - -

    Revised - - 21 August, 2003 -

    - - - diff --git a/formal_review_process.htm b/formal_review_process.htm index 2f4c161..ca9ae11 100644 --- a/formal_review_process.htm +++ b/formal_review_process.htm @@ -107,7 +107,15 @@ div.admonition p.admonition-title { needs your evaluation of the library.  If you identify problems along the way, please note if they are minor, serious, or showstoppers.

    -

    Here are some questions you might want to answer in your review:

    +

    The goal of a Boost library review is to improve the library through + constructive criticism, and at the end a decision must be made: is the + library good enough at this point to accept into Boost? If not, we hope to + have provided enough constructive criticism for it to be improved and + accepted at a later time. The Serialization library is a good example of how + constructive criticism resulted in revisions resulting in an excellent + library that was accepted in its second review.

    + +

    Here are some questions you might want to answer in your review:

    • What is your evaluation of the design?
    • @@ -136,7 +144,21 @@ div.admonition p.admonition-title { your overall opinion.
    -

    Results

    +

    Many reviews include questions for library authors. Authors are + interested in defending their library against your criticisms; otherwise + they would not have brought their library up for review. If you don't get a + response to your question quickly, be patient; if it takes too long or you + don't get an answer you feel is sufficient, ask again or try to rephrase the + question. Do remember that English is not the native language for many + Boosters, and that can cause misunderstandings.
    +
    + E-mail is a poor communication medium, and even if messages rarely get lost + in transmission, they often get drowned in the deluge of other messages. + Don't assume that an unanswered message means you're being ignored. Given + constructively, criticism will be taken better and have more positive + effects, and you'll get the answers you want.

    + +

    Results

    At the conclusion of the comment period, the Review Manager will post a message to the mailing list saying if the library has been accepted or @@ -192,9 +214,12 @@ div.admonition p.admonition-title {

  • Follows review discussions regarding the library, moderating or answering questions as needed.
  • -
  • Asks the review wizard for permission to extend - the review schedule if it appears that too few reviews will be submitted - during the review period.
  • +
  • Asks the review wizard for permission + to extend the review schedule if it appears that too few reviews will + be submitted during the review period.
  • + +
  • Decides if there is consensus to accept the library, and if there + are any conditions attached.
  • Decides if there is consensus to accept the library, and if there are any conditions attached.
  • @@ -256,9 +281,12 @@ div.admonition p.admonition-title {
-
  • Maintains a schedule of both past and pending reviews, in the form of - the Review Schedule web - page.
  • +
  • Monitors the general review process, and makes minor adjustments as + needed, or queries the list about possible major adjustments.
  • + + The role of Boost Review Wizard is currently played by John + Phillips (phillips at mps dot ohio-state dot edu) and Ronald + Garcia (garcia at cs dot indiana dot edu).
  • Resolves questions from review managers and library submitters, who sometimes want a third opinion on questions such as "Should we extend the @@ -270,7 +298,8 @@ div.admonition p.admonition-title { "mailto:reportbase@yahoo.com">Tom Brinkman and Ronald Garcia (garcia at cs dot indiana dot edu). -

    Fast Track Reviews

    +

    Revised + 10 October, 2006

    To qualify for fast track review:

    diff --git a/formal_review_schedule.html b/formal_review_schedule.html index 219c4b5..d0409ab 100644 --- a/formal_review_schedule.html +++ b/formal_review_schedule.html @@ -1,17 +1,16 @@ - + - - - + Formal Review Schedule - +
    @@ -34,7 +33,8 @@ track review manager assignments and libraries reviewed but not yet posted on the web site. There is often a lag between acceptance and site posting as authors address issues raised in the formal review.

    Schedule

    -
    boost.png (6897 bytes)
    + +
    @@ -46,26 +46,144 @@ authors address issues raised in the formal review.

    - - - - + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Submission Submitter
    Function Types (Re-review)Tobias SchwingerBoost Sandbox VaultTom BrinkmanFinite State MachinesAndrey Semashev + Boost Sandbox VaultMartin Vuille -
    Message PassingDoug Gregor - - http://www.osl.iu.edu/~dgregor/boost.mpi/boost-mpi-20060628.tgzFloating Point UtilitiesJohan Råde + Boost Sandbox Vault Needed -
    SwitchSteven Watanabe + Boost Sandbox Vault Stejpan RajkoJanuary 5, 2008 - January 9, 2008
    Property Map (fast-track)Andrew Sutton + Boost SandboxJeremy Siek-
    Graph (fast-track)Andrew Sutton + Boost SandboxJeremy Siek-
    Forward (fast-track)Tobias Schwinger + Boost Sandbox VaultJohn TorjoJanuary 14, 2008 - January 18, 2008
    Singleton (fast-track)Tobias Schwinger + Boost Sandbox VaultJohn TorjoDecember 3, 2007 - December 7, 2007
    Factory (fast-track)Tobias Schwinger + Boost Sandbox VaultJohn TorjoDecember 17, 2007 - December 21, 2007
    LexerBen Hanson + Boost Sandbox VaultHartmut Kaiser-
    Thread-Safe SignalsFrank Hess + Boost Sandbox VaultNeeded-
    LoggingJohn Torjohttp://torjo.com/log2/Gennadiy RozentalFebruary 4, 2008 - February 13, 2008
    FlyweightJoaquín Mª López Muñoz + Boost Sandbox VaultIon GaztañagaJanuary 21, 2008 - January 30, 2008
    Unordered ContainersDaniel JamesBoost Sandbox VaultIon GaztañagaDecember 7, 2007 - December 16, 2007
    Boost.Range (Update)Neil Groves + Boost Sandbox VaultNeeded-
    +

    Past Review Results and Milestones

    - +
    @@ -76,6 +194,151 @@ authors address issues raised in the formal review.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -90,8 +353,8 @@ authors address issues raised in the formal review.

    - + @@ -100,7 +363,7 @@ authors address issues raised in the formal review.

    + Accepted -- Added to CVS @@ -109,7 +372,7 @@ authors address issues raised in the formal review.

    + Accepted -- Added to CVS @@ -118,8 +381,9 @@ authors address issues raised in the formal review.

    + Accepted -- Added to CVS + @@ -129,13 +393,13 @@ authors address issues raised in the formal review.

    - - + + + Accepted -- Added to CVS @@ -161,7 +425,7 @@ authors address issues raised in the formal review.

    + Accepted -- Added to CVS @@ -214,7 +478,7 @@ authors address issues raised in the formal review.

    - + @@ -222,7 +486,7 @@ authors address issues raised in the formal review.

    - + @@ -248,7 +512,7 @@ authors address issues raised in the formal review.

    - + @@ -265,7 +529,7 @@ authors address issues raised in the formal review.

    - + @@ -281,7 +545,7 @@ authors address issues raised in the formal review.

    - + @@ -348,29 +612,30 @@ authors address issues raised in the formal review.

    - + - - + + - + - + - + @@ -461,7 +726,7 @@ authors address issues raised in the formal review.

    - + @@ -475,7 +740,7 @@ authors address issues raised in the formal review.

    - + @@ -510,7 +775,7 @@ authors address issues raised in the formal review.

    - + @@ -601,7 +866,7 @@ authors address issues raised in the formal review.

    - + @@ -632,7 +897,9 @@ authors address issues raised in the formal review.

    We try to rotate the task of Review Manager between many experienced Boost members, both to ensure fairness, and to spread the workload.  If you would like to volunteer to become a review manager, please contact -Tom Brinkman (Review Wizard).

    +John Phillips (phillips at mps dot ohio-state dot edu) or Ronald + Garcia (garcia at cs dot indiana dot edu). +


    Revised 15 Apr 2005 diff --git a/generic_exception_safety.html b/generic_exception_safety.html deleted file mode 100644 index 1d03d93..0000000 --- a/generic_exception_safety.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - Exception-Safety in Generic Components - - - -

    Exception-Safety in Generic Components

    - -

    Lessons Learned from Specifying Exception-Safety - for the C++ Standard Library - -

    David Abrahams

    - -

    - david.abrahams@rcn.com

    - -

    Abstract. This paper represents the knowledge accumulated in - response to a real-world need: that the C++ Standard Template Library - exhibit useful and well-defined interactions with exceptions, the - error-handling mechanism built-in to the core C++ language. It explores the - meaning of exception-safety, reveals surprising myths about exceptions and - genericity, describes valuable tools for reasoning about program - correctness, and outlines an automated testing procedure for verifying - exception-safety. - -

    Keywords: exception-safety, exceptions, STL, C++ - -

    1 What is exception-safety?

    - -

    Informally, exception-safety in a component means that it exhibits - reasonable behavior when an exception is thrown during its execution. For - most people, the term ``reasonable'' includes all the usual - expectations for error-handling: that resources should not be leaked, and - that the program should remain in a well-defined state so that execution - can continue. For most components, it also includes the expectation that - when an error is encountered, it is reported to the caller. - -

    More formally, we can describe a component as minimally exception-safe - if, when exceptions are thrown from within that component, its invariants - are intact. Later on we'll see that at least three different levels of - exception-safety can be usefully distinguished. These distinctions can help - us to describe and reason about the behavior of large systems. - -

    In a generic component, we usually have an additional expectation of - exception-neutrality, which means that exceptions thrown by a - component's type parameters should be propagated, unchanged, to the - component's caller. - -

    2 Myths and Superstitions

    - -

    Exception-safety seems straightforward so far: it doesn't constitute - anything more than we'd expect from code using more traditional - error-handling techniques. It might be worthwhile, however, to examine the - term from a psychological viewpoint. Nobody ever spoke of - ``error-safety'' before C++ had exceptions. - -

    It's almost as though exceptions are viewed as a mysterious - attack on otherwise correct code, from which we must protect ourselves. - Needless to say, this doesn't lead to a healthy relationship with error - handling! During standardization, a democratic process which requires broad - support for changes, I encountered many widely-held superstitions. In order - to even begin the discussion of exception-safety in generic components, it - may be worthwhile confronting a few of them. - -

    ``Interactions between templates and exceptions are not - well-understood.'' This myth, often heard from those who consider - these both new language features, is easily disposed of: there simply are - no interactions. A template, once instantiated, works in all respects like - an ordinary class or function. A simple way to reason about the behavior of - a template with exceptions is to think of how a specific instantiation of - that template works. Finally, the genericity of templates should not cause - special concern. Although the component's client supplies part of the - operation (which may, unless otherwise specified, throw arbitrary - exceptions), the same is true of operations using familiar virtual - functions or simple function pointers. - -

    ``It is well known to be impossible to write an exception-safe - generic container.'' This claim is often heard with reference to - an article by Tom Cargill [4] - in which he explores the problem of exception-safety for a generic stack - template. In his article, Cargill raises many useful questions, but - unfortunately fails to present a solution to his problem.1 - He concludes by suggesting that a solution may not be possible. - Unfortunately, his article was read by many as ``proof'' of that - speculation. Since it was published there have been many examples of - exception-safe generic components, among them the C++ standard library - containers. - -

    ``Dealing with exceptions will slow code down, and templates are - used specifically to get the best possible performance.'' A good - implementation of C++ will not devote a single instruction cycle to dealing - with exceptions until one is thrown, and then it can be handled at a speed - comparable with that of calling a function [7]. - That alone gives programs using exceptions performance equivalent to that - of a program which ignores the possibility of errors. Using exceptions can - actually result in faster programs than ``traditional'' error - handling methods for other reasons. First, a catch block clearly indicates - to the compiler which code is devoted to error-handling; it can then be - separated from the usual execution path, improving locality of reference. - Second, code using ``traditional'' error handling must typically - test a return value for errors after every single function call; using - exceptions completely eliminates that overhead. - -

    ``Exceptions make it more difficult to reason about a program's - behavior.'' Usually cited in support of this myth is the way - ``hidden'' execution paths are followed during stack-unwinding. - Hidden execution paths are nothing new to any C++ programmer who expects - local variables to be destroyed upon returning from a function: - -

    -
    ErrorCode f( int& result )         // 1 
    -{                                  // 2 
    -    X x;                           // 3 
    -    ErrorCode err = x.g( result ); // 4 
    -    if ( err != kNoError )         // 5 
    -        return err;                // 6 
    -    // ...More code here... 
    -    return kNoError;               // 7 
    -}
    -
    -
    - -

    In the example above, there is a ``hidden'' call to - X::~X() in lines 6 and 7. Granted, using exceptions, there is - no code devoted to error handling visible: - -

    -
    int f()                 // 1 
    -{                       // 2 
    -    X x;                // 3 
    -    int result = x.g(); // 4 
    -    // ...More code here... 
    -    return result;      // 5 
    -} 
    -
    -
    - -

    For many programmers more familiar with exceptions, the second example - is actually more readable and understandable than the first. The - ``hidden'' code paths include the same calls to destructors of - local variables. In addition, they follow a simple pattern which acts - exactly as though there were a potential return statement after each - function call in case of an exception. Readability is enhanced because the - normal path of execution is unobscured by error-handling, and return values - are freed up to be used in a natural way. - -

    There is an even more important way in which exceptions can enhance - correctness: by allowing simple class invariants. In the first example, if - x's constructor should need to allocate resources, it has no - way to report a failure: in C++, constructors have no return values. The - usual result when exceptions are avoided is that classes requiring - resources must include a separate initializer function which finishes the - job of construction. The programmer can therefore never be sure, when an - object of class X is used, whether he is handling a - full-fledged X or some abortive attempt to construct one (or - worse: someone simply forgot to call the initializer!) - -

    3 A contractual basis for exception-safety

    - -

    A non-generic component can be described as exception-safe in isolation, - but because of its configurability by client code, exception-safety in a - generic component usually depends on a contract between the component and - its clients. For example, the designer of a generic component might require - that an operation which is used in the component's destructor not throw any - exceptions.2 - The generic component might, in return, provide one of the following - guarantees: - -

      -
    • The basic guarantee: that the invariants of the component are - preserved, and no resources are leaked. - -
    • The strong guarantee: that the operation has either completed - successfully or thrown an exception, leaving the program state exactly as - it was before the operation started. - -
    • The no-throw guarantee: that the operation will not throw an - exception. -
    - -

    The basic guarantee is a simple minimum standard for exception-safety to - which we can hold all components. It says simply that after an exception, - the component can still be used as before. Importantly, the preservation of - invariants allows the component to be destroyed, potentially as part of - stack-unwinding. This guarantee is actually less useful than it might at - first appear. If a component has many valid states, after an exception we - have no idea what state the component is in|only that the state is valid. - The options for recovery in this case are limited: either destruction or - resetting the component to some known state before further use. Consider - the following example: - -

    -
    template <class X> 
    -void print_random_sequence() 
    -{ 
    -    std::vector<X> v(10); // A vector of 10 items 
    -    try { 
    -        // Provides only the basic guarantee 
    -        v.insert( v.begin(), X() ); 
    -    } 
    -    catch(...) {} // ignore any exceptions above 
    -    // print the vector's contents 
    -    std::cout "(" << v.size() << ") "; 
    -    std::copy( v.begin(), v.end(), 
    -    std::ostream_iterator<X>( std::cout, " " ) ); 
    -} 
    -
    -
    - -

    Since all we know about v after an exception is that it is valid, the - function is allowed to print any random sequence of Xs.3 - It is ``safe'' in the sense that it is not allowed to crash, but - its output may be unpredictable. - -

    The strong guarantee provides full - ``commit-or-rollback'' semantics. In the case of C++ standard - containers, this means, for example, that if an exception is thrown all - iterators remain valid. We also know that the container has exactly the - same elements as before the exception was thrown. A transaction that has no - effects if it fails has obvious benefits: the program state is simple and - predictable in case of an exception. In the C++ standard library, nearly - all of the operations on the node-based containers list, set, multiset, - map, and multimap provide the strong guarantee.4). - -

    The no-throw guarantee is the strongest of all, and it says that - an operation is guaranteed not to throw an exception: it always completes - successfully. This guarantee is necessary for most destructors, and indeed - the destructors of C++ standard library components are all guaranteed not - to throw exceptions. The no-throw guarantee turns out to be - important for other reasons, as we shall see.5 - -

    4 Legal Wrangling

    - -

    Inevitably, the contract can get more complicated: a quid pro quo - arrangement is possible. Some components in the C++ Standard Library give - one guarantee for arbitrary type parameters, but give a stronger guarantee - in exchange for additional promises from the client type that no exceptions - will be thrown. For example, the standard container operation - vector<T>::erase gives the basic guarantee for - any T, but for types whose copy constructor and copy - assignment operator do not throw, it gives the no-throw guarantee.6 - -

    5 What level of exception-safety should a component specify?

    - -

    From a client's point-of-view, the strongest possible level of safety - would be ideal. Of course, the no-throw guarantee is simply - impossible for many operations, but what about the strong guarantee? - For example, suppose we wanted atomic behavior for - vector<T>::insert. Insertion into the middle of a vector - requires copying elements after the insertion point into later positions, - to make room for the new element. If copying an element can fail, rolling - back the operation would require ``undoing'' the previous - copies...which depends on copying again. If copying back should fail (as it - likely would), we have failed to meet our guarantee. - -

    One possible alternative would be to redefine insert to - build the new array contents in a fresh piece of memory each time, and only - destroy the old contents when that has succeeded. Unfortunately, there is a - non-trivial cost if this approach is followed: insertions near the end of a - vector which might have previously caused only a few copies would now cause - every element to be copied. The basic guarantee is a - ``natural'' level of safety for this operation, which it can - provide without violating its performance guarantees. In fact all of the - operations in the library appear to have such a ``natural'' level - of safety. - -

    Because performance requirements were already a well-established part of - the draft standard and because performance is a primary goal of the STL, - there was no attempt to specify more safety than could be provided within - those requirements. Although not all of the library gives the strong - guarantee, almost any operation on a standard container which gives the - basic guarantee can be made strong using the ``make a - new copy'' strategy described above: - -

    -
    template <class Container, class BasicOp> 
    -void MakeOperationStrong( Container& c, const BasicOp& op ) 
    -{ 
    -    Container tmp(c); // Copy c 
    -    op(tmp); // Work on the copy 
    -    c.swap(tmp); // Cannot fail7
    -}
    -
    -
    - -

    This technique can be folded into a wrapper class to make a similar - container which provides stronger guarantees (and different performance - characteristics).8 - -

    6 Should we take everything we can get?

    - -

    By considering a particular implementation, we can hope to discern a - natural level of safety. The danger in using this to establish requirements - for a component is that the implementation might be restricted. If someone - should come up with a more-efficient implementation which we'd like to use, - we may find that it's incompatible with our exception-safety requirements. - One might expect this to be of no concern in the well-explored domains of - data structures and algorithms covered by the STL, but even there, advances - are being made. A good example is the recent introsort algorithm [6], - which represents a substantial improvement in worst-case complexity over - the well-established quicksort. - -

    To determine exactly how much to demand of the standard components, I - looked at a typical real-world scenario. The chosen test case was a - ``composite container.'' Such a container, built of two or more - standard container components, is not only commonly needed, but serves as a - simple representative case for maintaining invariants in larger systems: - -

    -
    // SearchableStack - A stack which can be efficiently searched 
    -// for any value. 
    -template <class T> 
    -class SearchableStack 
    -{ 
    - public: 
    -    void push(const T& t); // O(log n) 
    -    void pop(); // O(log n) 
    -    bool contains(const T& t) const; // O(log n) 
    -    const T& top() const; // O(1) 
    - private: 
    -    std::set<T> set_impl; 
    -    std::list<std::set<T>::iterator> list_impl; 
    -}; 
    -
    -
    - -

    The idea is that the list acts as a stack of set iterators: every - element goes into the set first, and the resulting position is pushed onto - the list. The invariant is straightforward: the set and the list should - always have the same number of elements, and every element of the set - should be referenced by an element of the list. The following - implementation of the push function is designed to give the strong - guarantee within the natural levels of safety provided by set and list: - -

    -
    template <class T>                                // 1 
    -void SearchableStack<T>::push(const T& t)         // 2 
    -{                                                       // 3 
    -    set<T>::iterator i = set_impl.insert(t);      // 4 
    -    try                                                 // 5 
    -    {                                                   // 6 
    -        list_impl.push_back(i);                         // 7 
    -    }                                                   // 8 
    -    catch(...)                                          // 9 
    -    {                                                   // 10 
    -        set_impl.erase(i);                              // 11 
    -        throw;                                          // 12 
    -    }                                                   // 13 
    -}                                                       // 14 
    -
    -
    - -

    What does our code actually require of the library? We need to examine - the lines where non-const operations occur: - -

      -
    • Line 4: if the insertion fails but set_impl is modified - in the process, our invariant is violated. We need to be able to rely on - the strong guarantee from set<T>::insert. - -
    • Line 7: likewise, if push_back fails, but - list_impl is modified in the process, our invariant is - violated, so we need to be able to rely on the strong guarantee - from list<T>::insert. - -
    • Line 11: here we are ``rolling back'' the insertion on line - 4. If this operation should fail, we will be unable to restore our - invariant. We absolutely depend on the no-throw guarantee from - set<T>::erase.9 - -
    • Line 11: for the same reasons, we also depend on being able to pass - the i to the erase function: we need the - no-throw guarantee from the copy constructor of - set<T>::iterator. -
    - -

    I learned a great deal by approaching the question this way during - standardization. First, the guarantee specified for the composite container - actually depends on stronger guarantees from its components (the - no-throw guarantees in line 11). Also, I took advantage of all of - the natural level of safety to implement this simple example. Finally, the - analysis revealed a requirement on iterators which I had previously - overlooked when operations were considered on their own. The conclusion was - that we should provide as much of the natural level of safety as possible. - Faster but less-safe implementations could always be provided as extensions - to the standard components. 10 - -

    7 Automated testing for exception-safety

    - -

    As part of the standardization process, I produced an exception-safe - reference implementation of the STL. Error-handling code is seldom - rigorously tested in real life, in part because it is difficult to cause - error conditions to occur. It is very common to see error-handling code - which crashes the first time it is executed ...in a shipping product! To - bolster confidence that the implementation actually worked as advertised, I - designed an automated test suite, based on an exhaustive technique due to - my colleague Matt Arnold. - -

    The test program started with the basics: reinforcement and - instrumentation, especially of the global operators new and - delete.11Instances of the components (containers and - algorithms) were created, with type parameters chosen to reveal as many - potential problems as possible. For example, all type parameters were given - a pointer to heap-allocated memory, so that leaking a contained object - would be detected as a memory leak. - -

    Finally, a scheme was designed that could cause an operation to throw an - exception at each possible point of failure. At the beginning of every - client-supplied operation which is allowed to throw an exception, a call to - ThisCanThrow was added. A call to ThisCanThrow - also had to be added everywhere that the generic operation being tested - might throw an exception, for example in the global operator - new, for which an instrumented replacement was supplied. - -

    -
    // Use this as a type parameter, e.g. vector<TestClass> 
    -struct TestClass 
    -{ 
    -    TestClass( int v = 0 ) 
    -        : p( ThisCanThrow(), new int( v ) ) {} 
    -    TestClass( const TestClass& rhs ) 
    -        : p( ThisCanThrow(), new int( *rhs.p ) ) {} 
    -    const TestClass& operator=( const TestClass& rhs ) 
    -        { ThisCanThrow(); *p = *rhs.p; } 
    -    bool operator==( const TestClass& rhs ) const
    -        { ThisCanThrow(); return *p == *rhs.p; } 
    -    ...etc... 
    -    ~TestClass() { delete p; } 
    -};
    -
    -
    - -

    ThisCanThrow simply decrements a ``throw - counter'' and, if it has reached zero, throws an exception. Each test - takes a form which begins the counter at successively higher values in an - outer loop and repeatedly attempts to complete the operation being tested. - The result is that the operation throws an exception at each successive - step along its execution path that can possibly fail. For example, here is - a simplified version of the function used to test the strong - guarantee: 12 - -

    -
    extern int gThrowCounter; // The throw counter
    -void ThisCanThrow() 
    -{ 
    -    if (gThrowCounter-- == 0) 
    -        throw 0; 
    -} 
    - 
    -template <class Value, class Operation> 
    -void StrongCheck(const Value& v, const Operation& op) 
    -{ 
    -    bool succeeded = false; 
    -    for (long nextThrowCount = 0; !succeeded; ++nextThrowCount) 
    -    { 
    -        Value duplicate = v; 
    -        try 
    -        { 
    -            gThrowCounter = nextThrowCount; 
    -            op( duplicate ); // Try the operation 
    -            succeeded = true; 
    -        } 
    -        catch(...) // Catch all exceptions 
    -        { 
    -            bool unchanged = duplicate == v; // Test strong guarantee 
    -            assert( unchanged ); 
    -        } 
    -        // Specialize as desired for each container type, to check 
    -        // integrity. For example, size() == distance(begin(),end()) 
    -        CheckInvariant(v); // Check any invariant 
    -    } 
    -}
    -
    -
    - -

    Notably, this kind of testing is much easier and less intrusive with a - generic component than with non-generics, because testing-specific type - parameters can be used without modifying the source code of the component - being tested. Also, generic functions like StrongCheck above - were instrumental in performing the tests on a wide range of values and - operations. - -

    8 Further Reading

    - To my knowledge, there are currently only two descriptions of STL - exception-safety available. The original specification [2] - for the reference exception-safe implementation of the STL is an informal - specification, simple and self-explanatory (also verbose), and uses the - basic- and strong-guarantee distinctions outlined in this - article. It explicitly forbids leaks, and differs substantively from the - final C++ standard in the guarantees it makes, though they are largely - identical. I hope to produce an updated version of this document soon. - -

    The description of exception-safety in the C++ Standard [1] - is only slightly more formal, but relies on hard-to-read - ``standardese'' and an occasionally subtle web of implication.13 - In particular, leaks are not treated directly at all. It does have the - advantage that it is the standard. - -

    The original reference implementation [5] - of the exception-safe STL is an adaptation of an old version of the SGI - STL, designed for C++ compilers with limited features. Although it is not a - complete STL implementation, the code may be easier to read, and it - illustrates a useful base-class technique for eliminating - exception-handling code in constructors. The full test suite [3] - used to validate the reference implementation has been used successfully to - validate all recent versions of the SGI STL, and has been adapted to test - one other vendor's implementation (which failed). As noted on the - documentation page, it also seems to have the power to reveal hidden - compiler bugs, particularly where optimizers interact with - exception-handling code. - -

    References

    - -
      -
    1. International Standard ISO/IEC 14882, - Information Technology-Programming Languages-C++, Document Number - ISO/IEC 14882-1998, available from http://webstore.ansi.org/ansidocstore/default.asp. - -
    2. D. Abrahams, Exception Safety in - STLport, available at http://www.stlport.org/doc/exception_safety.html. - -
    3. D. Abrahams and B. Fomitchev, Exception - Handling Test Suite, available at http://www.stlport.org/doc/eh_testsuite.html. - -
    4. Tom Cargill, ``Exception Handling: - A False Sense of Security,'' C++ Report, Nov-Dec 1994, also - available at http://www.awprofessional.com/content/images/020163371x/supplements/Exception_Handling_Article.html. - -
    5. B. Fomitchev, Adapted SGI STL Version - 1.0, with exception handling code by D. Abrahams, available at http://www.stlport.org. - -
    6. D. R. Musser, ``Introspective Sorting - and Selection Algorithms,'' Software-Practice and Experience - 27(8):983-993, 1997. - -
    7. Bjarne Stroustrup, The Design And - Evolution of C++. Addison Wesley, Reading, MA, 1995, ISBN - 0-201-54330-3, Section 16.9.1. -
    - -

    Footnotes

    - -

    1 Probably the greatest impediment to a solution - in Cargill's case was an unfortunate combination of choices on his part: - the interface he chose for his container was incompatible with his - particular demands for safety. By changing either one he might have solved - the problem. - -

    2 It is usually inadvisable to throw an - exception from a destructor in C++, since the destructor may itself be - called during the stack-unwinding caused by another exception. If the - second exception is allowed to propagate beyond the destructor, the program - is immediately terminated. - -

    3 In practice of course, this function would - make an extremely poor random sequence generator! - -

    4 It is worth noting that mutating algorithms - usually cannot provide the strong guarantee: to roll back a modified - element of a range, it must be set back to its previous value using - operator=, which itself might throw. In the C++ standard - library, there are a few exceptions to this rule, whose rollback behavior - consists only of destruction: uninitialized_copy, - uninitialized_fill, and uninitialized_fill_n. - -

    5 All type parameters supplied by clients of the - C++ standard library are required not to throw from their destructors. In - return, all components of the C++ standard library provide at least the - basic guarantee. - -

    6 Similar arrangements might have been made in - the C++ standard for many of the mutating algorithms, but were never - considered due to time constraints on the standardization process. - -

    7 Associative containers whose - Compare object might throw an exception when copied cannot use - this technique, since the swap function might fail. - -

    8 This suggests another potential use for the - oft-wished-for but as yet unseen container_traits<> - template: automated container selection to meet exception-safety - constraints. - -

    9 One might be tempted to surround the erase - operation with a try/catch block to reduce the - requirements on set<T> and the problems that arise in - case of an exception, but in the end that just begs the question. First, - erase just failed and in this case there are no viable alternative ways to - produce the necessary result. Second and more generally, because of the - variability of its type parameters a generic component can seldom be - assured that any alternatives will succeed. - -

    10 The prevalent philosophy in the design of - STL was that functionality that wasn't essential to all uses should be left - out in favor of efficiency, as long as that functionality could be obtained - when needed by adapting the base components. This departs from that - philosophy, but it would be difficult or impossible to obtain even the - basic guarantee by adapting a base component that doesn't already - have it. - -

    11 An excellent discussion on how to fortify - memory subsystems can be found in: Steve Maguire, Writing Solid Code, - Microsoft Press, Redmond, WA, 1993, ISBN 1-55615- 551-4. - -

    12 Note that this technique requires that the - operation being tested be exception-neutral. If the operation ever tries to - recover from an exception and proceed, the throw counter will be negative, - and subsequent operations that might fail will not be tested for - exception-safety. - -

    13 The changes to the draft standard which - introduced exception-safety were made late in the process, when amendments - were likely to be rejected solely on the basis of the number of altered - words. Unfortunately, the result compromises clarity somewhat in favor of - brevity. Greg Colvin was responsible for the clever language-lawyering - needed to minimize the extent of these changes. diff --git a/generic_programming.html b/generic_programming.html deleted file mode 100644 index 23a1241..0000000 --- a/generic_programming.html +++ /dev/null @@ -1,474 +0,0 @@ - - - - - - - - - - Generic Programming Techniques - - - - boost.png (6897 bytes) - -

    Generic Programming Techniques

    - -

    This is an incomplete survey of some of the generic programming - techniques used in the boost libraries.

    - -

    Table of Contents

    - - - -

    Introduction

    - -

    Generic programming is about generalizing software components so that - they can be easily reused in a wide variety of situations. In C++, class - and function templates are particularly effective mechanisms for generic - programming because they make the generalization possible without - sacrificing efficiency.

    - -

    As a simple example of generic programming, we will look at how one - might generalize the memcpy() function of the C standard - library. An implementation of memcpy() might look like the - following:
    -
    -

    - -
    -
    -void* memcpy(void* region1, const void* region2, size_t n)
    -{
    -  const char* first = (const char*)region2;
    -  const char* last = ((const char*)region2) + n;
    -  char* result = (char*)region1;
    -  while (first != last)
    -    *result++ = *first++;
    -  return result;
    -}
    -
    -
    - The memcpy() function is already generalized to some extent by - the use of void* so that the function can be used to copy arrays - of different kinds of data. But what if the data we would like to copy is - not in an array? Perhaps it is in a linked list. Can we generalize the - notion of copy to any sequence of elements? Looking at the body of - memcpy(), the function's minimal requirements are - that it needs to traverse through the sequence using some sort - of pointer, access elements pointed to, write the elements - to the destination, and compare pointers to know when to stop. The - C++ standard library groups requirements such as these into - concepts, in this case the Input Iterator - concept (for region2) and the Output Iterator - concept (for region1). - -

    If we rewrite the memcpy() as a function template, and use - the Input - Iterator and Output Iterator - concepts to describe the requirements on the template parameters, we can - implement a highly reusable copy() function in the following - way:
    -
    -

    - -
    -
    -template <typename InputIterator, typename OutputIterator>
    -OutputIterator
    -copy(InputIterator first, InputIterator last, OutputIterator result)
    -{
    -  while (first != last)
    -    *result++ = *first++;
    -  return result;
    -}
    -
    -
    - -

    Using the generic copy() function, we can now copy elements - from any kind of sequence, including a linked list that exports iterators - such as std::list.
    -
    -

    - -
    -
    -#include <list>
    -#include <vector>
    -#include <iostream>
    -
    -int main()
    -{
    -  const int N = 3;
    -  std::vector<int> region1(N);
    -  std::list<int> region2;
    -
    -  region2.push_back(1);
    -  region2.push_back(0);
    -  region2.push_back(3);
    -  
    -  std::copy(region2.begin(), region2.end(), region1.begin());
    -
    -  for (int i = 0; i < N; ++i)
    -    std::cout << region1[i] << " ";
    -  std::cout << std::endl;
    -}
    -
    -
    - -

    Anatomy of a Concept

    - A concept is a set of requirements - consisting of valid expressions, associated types, invariants, and - complexity guarantees. A type that satisfies the requirements is - said to model the concept. A concept can extend the - requirements of another concept, which is called - refinement. - -
      -
    • Valid Expressions are C++ - expressions which must compile successfully for the objects involved in - the expression to be considered models of the concept.
    • - -
    • Associated Types are types - that are related to the modeling type in that they participate in one - or more of the valid expressions. Typically associated types can be - accessed either through typedefs nested within a class definition for - the modeling type, or they are accessed through a traits class.
    • - -
    • Invariants are run-time characteristics of the objects that - must always be true, that is, the functions involving the objects must - preserve these characteristics. The invariants often take the form of - pre-conditions and post-conditions.
    • - -
    • Complexity Guarantees are maximum limits on how long the - execution of one of the valid expressions will take, or how much of - various resources its computation will use.
    • -
    - -

    The concepts used in the C++ Standard Library are documented at the SGI STL - site.

    - -

    Traits

    - -

    A traits class provides a way of associating information with a - compile-time entity (a type, integral constant, or address). For example, - the class template std::iterator_traits<T> - looks something like this:

    - -
    -
    -template <class Iterator>
    -struct iterator_traits {
    -  typedef ... iterator_category;
    -  typedef ... value_type;
    -  typedef ... difference_type;
    -  typedef ... pointer;
    -  typedef ... reference;
    -};
    -
    -
    - The traits' value_type gives generic code the type which the - iterator is "pointing at", while the iterator_category can be - used to select more efficient algorithms depending on the iterator's - capabilities. - -

    A key feature of traits templates is that they're - non-intrusive: they allow us to associate information with - arbitrary types, including built-in types and types defined in - third-party libraries, Normally, traits are specified for a particular - type by (partially) specializing the traits template.

    - -

    For an in-depth description of std::iterator_traits, see this page - provided by SGI. Another very different expression of the traits idiom in - the standard is std::numeric_limits<T> which provides - constants describing the range and capabilities of numeric types.

    - -

    Tag Dispatching

    - -

    Tag dispatching is a way of using function overloading to - dispatch based on properties of a type, and is often used hand in - hand with traits classes. A good example of this synergy is the - implementation of the std::advance() - function in the C++ Standard Library, which increments an iterator - n times. Depending on the kind of iterator, there are different - optimizations that can be applied in the implementation. If the iterator - is random - access (can jump forward and backward arbitrary distances), then the - advance() function can simply be implemented with i += - n, and is very efficient: constant time. Other iterators must be - advanced in steps, making the operation linear in n. If the - iterator is bidirectional, - then it makes sense for n to be negative, so we must decide - whether to increment or decrement the iterator.

    - -

    The relation between tag dispatching and traits classes is that the - property used for dispatching (in this case the - iterator_category) is often accessed through a traits class. The - main advance() function uses the iterator_traits - class to get the iterator_category. It then makes a call the the - overloaded advance_dispatch() function. The appropriate - advance_dispatch() is selected by the compiler based on whatever - type the iterator_category resolves to, either input_iterator_tag, - bidirectional_iterator_tag, - or random_access_iterator_tag. - A tag is simply a class whose only purpose is to convey - some property for use in tag dispatching and similar techniques. Refer to - this page - for a more detailed description of iterator tags.

    - -
    -
    -namespace std {
    -  struct input_iterator_tag { };
    -  struct bidirectional_iterator_tag { };
    -  struct random_access_iterator_tag { };
    -
    -  namespace detail {
    -    template <class InputIterator, class Distance>
    -    void advance_dispatch(InputIterator& i, Distance n, input_iterator_tag) {
    -      while (n--) ++i;
    -    }
    -
    -    template <class BidirectionalIterator, class Distance>
    -    void advance_dispatch(BidirectionalIterator& i, Distance n, 
    -       bidirectional_iterator_tag) {
    -      if (n >= 0)
    -        while (n--) ++i;
    -      else
    -        while (n++) --i;
    -    }
    -
    -    template <class RandomAccessIterator, class Distance>
    -    void advance_dispatch(RandomAccessIterator& i, Distance n, 
    -       random_access_iterator_tag) {
    -      i += n;
    -    }
    -  }
    -
    -  template <class InputIterator, class Distance>
    -  void advance(InputIterator& i, Distance n) {
    -    typename iterator_traits<InputIterator>::iterator_category category;
    -    detail::advance_dispatch(i, n, category);
    -  }
    -}
    -
    -
    - -

    Adaptors

    - -

    An adaptor is a class template which builds on another type or - types to provide a new interface or behavioral variant. Examples of - standard adaptors are std::reverse_iterator, - which adapts an iterator type by reversing its motion upon - increment/decrement, and std::stack, which adapts a - container to provide a simple stack interface.

    - -

    A more comprehensive review of the adaptors in the standard can be - found - here.

    - -

    Type Generators

    - -

    Note: The type generator concept has largely been - superseded by the more refined notion of a metafunction. See - C++ Template - Metaprogramming for an in-depth discussion of metafunctions.

    - -

    A type generator is a template whose only purpose is to - synthesize a new type or types based on its template argument(s)[1]. The generated type is usually expressed as a nested typedef - named, appropriately type. A type generator is usually used to - consolidate a complicated type expression into a simple one. This example - uses an old version of iterator_adaptor - whose design didn't allow derived iterator types. As a result, every - adapted iterator had to be a specialization of iterator_adaptor - itself and generators were a convenient way to produce those types.

    - -
    -
    -template <class Predicate, class Iterator, 
    -    class Value = complicated default,
    -    class Reference = complicated default,
    -    class Pointer = complicated default,
    -    class Category = complicated default,
    -    class Distance = complicated default
    -         >
    -struct filter_iterator_generator {
    -    typedef iterator_adaptor<
    -        
    -        Iterator,filter_iterator_policies<Predicate,Iterator>,
    -        Value,Reference,Pointer,Category,Distance> type;
    -};
    -
    -
    - -

    Now, that's complicated, but producing an adapted filter iterator - using the generator is much easier. You can usually just write:

    - -
    -
    -boost::filter_iterator_generator<my_predicate,my_base_iterator>::type
    -
    -
    - -

    Object Generators

    - -

    An object generator is a function template whose only purpose - is to construct a new object out of its arguments. Think of it as a kind - of generic constructor. An object generator may be more useful than a - plain constructor when the exact type to be generated is difficult or - impossible to express and the result of the generator can be passed - directly to a function rather than stored in a variable. Most Boost - object generators are named with the prefix "make_", after - std::make_pair(const T&, const U&).

    - -

    For example, given:

    - -
    -
    -struct widget {
    -  void tweak(int);
    -};
    -std::vector<widget *> widget_ptrs;
    -
    -
    - By chaining two standard object generators, std::bind2nd() - and std::mem_fun(), - we can easily tweak all widgets: - -
    -
    -void tweak_all_widgets1(int arg)
    -{
    -   for_each(widget_ptrs.begin(), widget_ptrs.end(),
    -      bind2nd(std::mem_fun(&widget::tweak), arg));
    -}
    -
    -
    - -

    Without using object generators the example above would look like - this:

    - -
    -
    -void tweak_all_widgets2(int arg)
    -{
    -   for_each(struct_ptrs.begin(), struct_ptrs.end(),
    -      std::binder2nd<std::mem_fun1_t<void, widget, int> >(
    -          std::mem_fun1_t<void, widget, int>(&widget::tweak), arg));
    -}
    -
    -
    - -

    As expressions get more complicated the need to reduce the verbosity - of type specification gets more compelling.

    - -

    Policy Classes

    - -

    A policy class is a template parameter used to transmit behavior. An - example from the standard library is std::allocator, - which supplies memory management behaviors to standard containers.

    - -

    Policy classes have been explored in detail by Andrei Alexandrescu in this chapter - of his book, Modern C++ Design. He writes:

    - -
    -

    In brief, policy-based class design fosters assembling a class with - complex behavior out of many little classes (called policies), each of - which takes care of only one behavioral or structural aspect. As the - name suggests, a policy establishes an interface pertaining to a - specific issue. You can implement policies in various ways as long as - you respect the policy interface.

    - -

    Because you can mix and match policies, you can achieve a - combinatorial set of behaviors by using a small core of elementary - components.

    -
    - -

    Andrei's description of policy classes suggests that their power is - derived from granularity and orthogonality. Less-granular policy - interfaces have been shown to work well in practice, though. - This paper describes an old version of iterator_adaptor - that used non-orthogonal policies. There is also precedent in the - standard library: std::char_traits, - despite its name, acts as a policies class that determines the behaviors - of std::basic_string.

    - -

    Notes

    - [1] Type generators are sometimes viewed as a workaround - for the lack of ``templated typedefs'' in C++. -
    - -

    Revised - 18 - August 2004 -

    - -

    © Copyright David Abrahams 2001. Permission to copy, use, modify, - sell and distribute this document is granted provided this copyright - notice appears in all copies. This document is provided "as is" without - express or implied warranty, and with no claim as to its suitability for - any purpose. - - - - - - -

    - - - diff --git a/getting_started/detail/release-variables.rst b/getting_started/detail/release-variables.rst index f066052..3fb717e 100644 --- a/getting_started/detail/release-variables.rst +++ b/getting_started/detail/release-variables.rst @@ -5,8 +5,8 @@ .. This file contains all the definitions that need to be updated .. for each new release of Boost. -.. |boost-version-number| replace:: 1.34.1 -.. |boost_ver| replace:: ``boost_1_34_1`` -.. |boost_ver-bold| replace:: **boost_1_34_1** +.. |boost-version-number| replace:: 1.35.0 +.. |boost_ver| replace:: ``boost_1_35_0`` +.. |boost_ver-bold| replace:: **boost_1_35_0** -.. _sf-download: http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041 \ No newline at end of file +.. _sf-download: http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041 diff --git a/getting_started/unix-variants.html b/getting_started/unix-variants.html index 67db82e..cb95ca6 100644 --- a/getting_started/unix-variants.html +++ b/getting_started/unix-variants.html @@ -63,12 +63,12 @@

    The most reliable way to get a copy of Boost is to download a distribution from SourceForge:

      -
    1. Download boost_1_34_1.tar.bz2.

      +
    2. Download boost_1_35_0.tar.bz2.

    3. In the directory where you want to put the Boost installation, execute

      -tar --bzip2 -xf /path/to/boost_1_34_1.tar.bz2
      +tar --bzip2 -xf /path/to/boost_1_35_0.tar.bz2
       
    @@ -91,7 +91,7 @@ from 2   The Boost Distribution

    This is a sketch of the resulting directory structure:

    -boost_1_34_1/ .................The “boost root directoryâ€
    +boost_1_35_0/ .................The “boost root directoryâ€
        index.htm .........A copy of www.boost.org starts here
        boost/ .........................All Boost Header files
         
    @@ -136,7 +136,7 @@ anything you can use in these directories.

    It's important to note the following:

      -
    1. The path to the boost root directory (often /usr/local/boost_1_34_1) is +

    2. The path to the boost root directory (often /usr/local/boost_1_35_0) is sometimes referred to as $BOOST_ROOT in documentation and mailing lists .

    3. @@ -230,7 +230,7 @@ int main()

      Now, in the directory where you saved example.cpp, issue the following command:

      -c++ -I path/to/boost_1_34_1 example.cpp -o example
      +c++ -I path/to/boost_1_35_0 example.cpp -o example
       

      To test the result, type:

      @@ -261,7 +261,7 @@ you'll need to acquire library binaries.

      Issue the following commands in the shell (don't type $; that represents the shell's prompt):

      -$ cd path/to/boost_1_34_1
      +$ cd path/to/boost_1_35_0
       $ ./configure --help
       

      Select your configuration options and invoke ./configure again @@ -425,7 +425,7 @@ bjam --build-dir=

      For example, your session might look like this:

      -$ cd ~/boost_1_34_1
      +$ cd ~/boost_1_35_0
       $ bjam --build-dir=/tmp/build-boost --toolset=gcc stage
       
      @@ -533,15 +533,15 @@ project.
      1. You can specify the full path to each library:

        -$ c++ -I path/to/boost_1_34_1 example.cpp -o example \
        -   ~/boost/lib/libboost_regex-gcc34-mt-d-1_34.a
        +$ c++ -I path/to/boost_1_35_0 example.cpp -o example \
        +   ~/boost/lib/libboost_regex-gcc34-mt-d-1_35.a
         
      2. You can separately specify a directory to search (with -Ldirectory) and a library name to search for (with -llibrary,2 dropping the filename's leading lib and trailing suffix (.a in this case):

        -$ c++ -I path/to/boost_1_34_1 example.cpp -o example \
        -   -L~/boost/lib/ -lboost_regex-gcc34-mt-d-1_34
        +$ c++ -I path/to/boost_1_35_0 example.cpp -o example \
        +   -L~/boost/lib/ -lboost_regex-gcc34-mt-d-1_35
         

        As you can see, this method is just as terse as method A for one library; it really pays off when you're using multiple diff --git a/getting_started/unix-variants.rst b/getting_started/unix-variants.rst index 4cf74c4..ca9a3d0 100644 --- a/getting_started/unix-variants.rst +++ b/getting_started/unix-variants.rst @@ -153,7 +153,7 @@ A. You can specify the full path to each library: .. parsed-literal:: $ c++ -I |root| example.cpp -o example **\\** - **~/boost/lib/libboost_regex-gcc34-mt-d-1_34.a** + **~/boost/lib/libboost_regex-gcc34-mt-d-1_35.a** B. You can separately specify a directory to search (with ``-L``\ *directory*) and a library name to search for (with ``-l``\ @@ -163,7 +163,7 @@ B. You can separately specify a directory to search (with ``-L``\ .. parsed-literal:: $ c++ -I |root| example.cpp -o example **\\** - **-L~/boost/lib/ -lboost_regex-gcc34-mt-d-1_34** + **-L~/boost/lib/ -lboost_regex-gcc34-mt-d-1_35** As you can see, this method is just as terse as method A for one library; it *really* pays off when you're using multiple diff --git a/getting_started/windows.html b/getting_started/windows.html index 1bf3145..38a57eb 100644 --- a/getting_started/windows.html +++ b/getting_started/windows.html @@ -26,40 +26,40 @@ not supported—they may or may not work.

        Index

        -

        1   Get Boost

        +

        1   Get Boost

        The easiest way to get a copy of Boost is to use the installer provided by Boost Consulting. We especially recommend this method if you use Microsoft Visual Studio .NET 2003 or Microsoft @@ -69,17 +69,17 @@ them yourself. To complete this tutorial, you'll need to at least install the Boost.Regex binaries when given the option.

        If you're using an earlier version of Visual Studio or some other compiler, or if you prefer to build everything yourself, you can -download boost_1_34_1.exe and run it to install a complete Boost +download boost_1_35_0.exe and run it to install a complete Boost distribution.1

        -

        2   The Boost Distribution

        +

        2   The Boost Distribution

        This is a sketch of the resulting directory structure:

        -boost_1_34_1\ .................The “boost root directoryâ€
        +boost_1_35_0\ .................The “boost root directoryâ€
            index.htm .........A copy of www.boost.org starts here
            boost\ .........................All Boost Header files
            lib\ .....................precompiled library binaries
        @@ -124,7 +124,7 @@ anything you can use in these directories.

        It's important to note the following:

          -
        1. The path to the boost root directory (often C:\Program Files\boost\boost_1_34_1) is +

        2. The path to the boost root directory (often C:\Program Files\boost\boost_1_35_0) is sometimes referred to as $BOOST_ROOT in documentation and mailing lists .

        3. @@ -159,7 +159,7 @@ contains a subset of the Boost documentation. Start with
          -

          3   Header-Only Libraries

          +

          3   Header-Only Libraries

          The first thing many people want to know is, “how do I build Boost?†The good news is that often, there's nothing to build.

          @@ -199,7 +199,7 @@ use.
          -

          4   Build a Simple Program Using Boost

          +

          4   Build a Simple Program Using Boost

          To keep things simple, let's start by using a header-only library. The following program reads a sequence of integers from standard input, uses Boost.Lambda to multiply each number by three, and @@ -248,14 +248,14 @@ cd path\to\some\directory

      followed by Return. For example,

      -cd C:\Program Files\boost\boost_1_34_1
      +cd C:\Program Files\boost\boost_1_35_0
       

      Long commands can be continued across several lines by typing a caret (^) at the end of all but the last line. Some examples on this page use that technique to save horizontal space.

      -

      4.1   Build From the Visual Studio IDE

      +

      4.1   Build From the Visual Studio IDE

      • From Visual Studio's File menu, select New > Project…

      • @@ -273,7 +273,7 @@ select Properties from the resulting pop-up menu

      • In Configuration Properties > C/C++ > General > Additional Include Directories, enter the path to the Boost root directory, for example

        -

        C:\Program Files\boost\boost_1_34_1

        +

        C:\Program Files\boost\boost_1_35_0

      • In Configuration Properties > C/C++ > Precompiled Headers, change @@ -296,7 +296,7 @@ Return key.

        skip to the next step

      -

      4.3   Errors and Warnings

      +

      4.3   Errors and Warnings

      Don't be alarmed if you see compiler warnings originating in Boost headers. We try to eliminate them, but doing so isn't always practical.5 Errors are another matter. If you're @@ -335,21 +335,21 @@ correctly identified the -

      5   Prepare to Use a Boost Library Binary

      +

      5   Prepare to Use a Boost Library Binary

      If you want to use any of the separately-compiled Boost libraries, you'll need to acquire library binaries.

      -

      5.1   Install Visual Studio (2005 or .NET 2003) Binaries

      +

      5.1   Install Visual Studio (2005 or .NET 2003) Binaries

      The installer supplied by Boost Consulting will download and install pre-compiled binaries into the lib\ subdirectory of the -boost root, typically C:\Program Files\boost\boost_1_34_1\lib\. If you installed +boost root, typically C:\Program Files\boost\boost_1_35_0\lib\. If you installed all variants of the Boost.Regex binary, you're done with this step. Otherwise, please run the installer again and install them now.

      skip to the next step

      -

      5.2   Or, Build Binaries From Source

      +

      5.2   Or, Build Binaries From Source

      If you're using an earlier version of Visual C++, or a compiler from another vendor, you'll need to use Boost.Build to create your own binaries.

      @@ -361,7 +361,7 @@ installing software. To use it, you'll need an executable called bjam.

      -

      5.2.1   Get bjam

      +

      5.2.1   Get bjam

      bjam is the command-line tool that drives the Boost Build system. To build Boost binaries, you'll invoke bjam from the Boost root.

      @@ -370,7 +370,7 @@ Alternatively, you can build bjam instructions.

      -

      5.2.2   Identify Your Toolset

      +

      5.2.2   Identify Your Toolset

      First, find the toolset corresponding to your compiler in the following table.

      @@ -475,7 +475,7 @@ are using the msvc or gcc toolsets, which have special version detection code) or auto-linking will fail.

      -

      5.2.3   Select a Build Directory

      +

      5.2.3   Select a Build Directory

      Boost.Build will place all intermediate files it generates while building into the build directory. If your Boost root directory is writable, this step isn't strictly necessary: by @@ -483,7 +483,7 @@ default Boost.Build will create a

      -

      5.2.4   Invoke bjam

      +

      5.2.4   Invoke bjam

      Change your current directory to the Boost root directory and invoke bjam as follows:

      @@ -491,11 +491,13 @@ bjam --build-dir=
       

      For example, your session might look like this:4

      -C:\WINDOWS> cd C:\Program Files\boost\boost_1_34_1
      -C:\Program Files\boost\boost_1_34_1> bjam ^
      -More? --build-dir=C:\temp\build-boost ^
      +C:\WINDOWS> cd C:\Program Files\boost\boost_1_35_0
      +C:\Program Files\boost\boost_1_35_0> bjam ^
      +More? --build-dir="C:\Documents and Settings\dave\build-boost" ^
       More? --toolset=msvc stage
       
      +

      Be sure to read this note about the appearance of ^, +More? and quotation marks (") in that line.

      @@ -523,7 +525,7 @@ be interested in:

      -

      5.3   Expected Build Output

      +

      5.3   Expected Build Output

      During the process of building Boost libraries, you can expect to see some messages printed on the console. These may include

        @@ -547,7 +549,7 @@ look something like:

      -

      5.4   In Case of Build Errors

      +

      5.4   In Case of Build Errors

      The only error messages you see when building Boost—if any—should be related to the IOStreams library's support of zip and bzip2 formats as described here. Install the relevant development @@ -565,7 +567,7 @@ questions about configuring Boost for your compiler to the

      -

      6.3   Library Naming

      +

      6.3   Library Naming

      Note

      If, like Visual C++, your compiler supports auto-linking, @@ -657,7 +659,7 @@ following elements:

      Prefix: except on Microsoft Windows, every Boost library name begins with this string. On Windows, only ordinary static libraries use the lib prefix; import libraries and DLLs do -not.6
      +not.6
      boost_regex
      Library name: all boost library filenames begin with boost_.
      -vc71
      @@ -695,14 +697,14 @@ libraries.
    - + - +
    Submission Submitter Result
    Review Wizard Status ReportRonald Garcia2007 November 16Report
    ExceptionEmil DotchevskiTobias SchwingerSeptember 27, 2007 - October 7, 2007 + Accepted
    Review Wizard Status ReportRonald Garcia2007 September 14Report
    Scope ExitAlexander NasonovJody HaginsAugust 13, 2007 - August 22, 2007- + Pending
    Time SeriesEric NieblerJohn R. PhillipsJuly 30, 2007 - August 13, 2007 + Accepted
    Boost 1.34.1 ReleasedThomas WittJuly 24, 2007 + Notes
    Boost 1.34.0 ReleasedThomas WittMay 12, 2007 + Notes
    Globally Unique IdentifierAndy TompkinsHartmut KaiserApril 30, 2007 - May 10, 2007 + Accepted Provisionally
    Math ToolkitJohn MaddockMatthias SchabelApril 11, 2007 - April 27, 2007 + Accepted -- Added to SVN
    Quantitative UnitsMatthias SchabelJohn R. PhillipsMarch 26, 2007 - April 4, 2007 + Accepted
    Intrusive ContainersIon GaztañagaJoaquín Mª López MuñozMarch 12, 2007 - March 21, 2007 + Accepted -- Added to CVS
    BimapMatias CapelettoIon GaztañagaFebruary 15 2007- March 2, 2007 + Accepted -- Added to CVS
    AccumulatorsEric NieblerJohn R. PhillipsJanuary 29, 2007 - February 7, 2007 + Accepted
    Function Types (Re-review)Tobias SchwingerTom Brinkman2006 November 6 - 2006 November 17 + Accepted -- Added to CVS
    Generic Image LibraryLubomir BourdevTom Brinkman2006 October 5 - 2006 October 25 + Accepted -- Added to CVS
    Message PassingDoug GregorJeremy Siek2006 September 6 - 2006 September 15 + Accepted -- Added to CVS
    Physical Quantities System Andy Little Asger Mangaard Rene Rivera 2006 May 15 - 2006 May 24 - Pending + Rejected
    Ronald Garcia 2006 May 1 - 2006 May 10 - Accepted
    Thorsten Ottosen 2006 April 18 - 2006 April 30 - Accepted
    Tobias Schwinger 2006 April 1 - 2006 April 9 - Accepted
    Review Wizard Status Report
    ShmemIon GaztanagaShmem (now Interprocess)Ion Gaztañaga Fred Bertsch 2006 February 6 - 2006 February 15 - Accepted
    Jeff Garland 2005 December 10 -
    2005 December 30
    - Accepted
    John Maddock Beman Dawes 2005 September 24 - 2005 October 5Accepted -- added to cvsAccepted -- Added in 1.34
    Eric Niebler Thomas Witt 2005 September 8 - 2005 September 18Accepted -- Added to CVSAccepted -- Added in 1.34
    Arkadiy Vertleyb and Peder Holt Andy Little 2005 May 20 - 2005 May 30Accepted -- Added to CVSAccepted -- Added in 1.34
    Eric Niebler Gennadiy Rozental 2005 April 25 - 2005 May 1Accepted -- Added to CVSAccepted -- Added in 1.34
    Andreas Huber Pavel Vozenilek 2005 Feb 23 - 2005 March 9Accepted -- Added to CVSAccepted -- Added in 1.34
    Wave Accepted -- Added in 1.32
    Container Traits (renamed boost.range)Container Traits (now Range) Thorsten Ottosen Hartmut Kaiser 2004 Apr 28 - May 7 Accepted -- Added in 1.32
    Indexed SetJoaqu� M L�ez Mu�zIndexed Set (now MultiIndex)Joaquín Mª López Muñoz Pavel Vozenilek 2004 Mar 20 - 30Accepted -- Added in 1.32 + Accepted -- Added in 1.32
    Circular Buffer Jan Gaspar Pavel Vozenilek 2004 Mar 5 - 15Accepted -- not added yetAccepted -- Added to CVS
    enable_ifJaakko Järvi & Jeremiah Willcock & Andrew LumsdaineJaakko Järvi & Jeremiah Willcock & Andrew Lumsdaine (fasttrack) Dec 2003 Accepted -- added in 1.31
    MinmaxHervé BronnimannHervé Bronnimann Thomas Witt 28 Sep - 07 Oct 2002 Accepted -- added in 1.32
    Interval Arithmetic LibraryHervé Bronnimann & Guillaume Melquiond & Sylvain PionHervé Bronnimann & Guillaume Melquiond & Sylvain Pion Beman Dawes 31 Aug - 09 Sep 2002 Accepted -- added in 1.30
    LambdaJaakko J�vi & Gary PowellJaakko Järvi & Gary Powell Aleksey Gurtovoy 08 - 20 Mar 2002 Accepted and added
    Tuples LibraryJaakko J�viJaakko Järvi Beman Dawes Jun 17 - 26 Accepted and added using a special debug build of Python.
    dbuilding a debug version of your code.7building a debug version of your code.7
    p using the STLPort standard library rather than the default one supplied with your compiler.
    nusing STLPort's deprecated “native iostreams†feature.8using STLPort's deprecated “native iostreams†feature.8
    @@ -735,7 +737,7 @@ version number, will also be created.
    -

    6.4   Test Your Program

    +

    6.4   Test Your Program

    To test our subject extraction, we'll filter the following text file. Copy it out of your browser and save it as jayne.txt:

    @@ -757,7 +759,7 @@ Spoil Rock Hunter?â€

    -

    7   Conclusion and Further Resources

    +

    7   Conclusion and Further Resources

    This concludes your introduction to Boost and to integrating it with your programs. As you start using Boost in earnest, there are surely a few additional points you'll wish we had covered. One day @@ -786,7 +788,7 @@ mailing list.

    [1]If you prefer not to download executable programs, -download boost_1_34_1.zip and use an external tool to decompress +download boost_1_35_0.zip and use an external tool to decompress it. We don't recommend using Windows' built-in decompression as it can be painfully slow for large archives. @@ -813,11 +815,25 @@ used in the examples. - +
    [4]In this example, the caret character ^ is a -way of continuing the command on multiple lines. The command -prompt responds with More? to prompt for more input. Feel -free to omit the carets and subsequent newlines; we used them so -the example would fit on a page of reasonable width.
    [4]

    In this example, the caret character ^ is a +way of continuing the command on multiple lines, and must be the +final character used on the line to be continued (i.e. do +not follow it with spaces). The command prompt responds with +More? to prompt for more input. Feel free to omit the +carets and subsequent newlines; we used them so the example +would fit on a page of reasonable width.

    +

    The command prompt treats each bit of whitespace in the command +as an argument separator. That means quotation marks (") +are required to keep text together whenever a single +command-line argument contains spaces, as in

    +
    +--build-dir="C:\Documents_and_Settings\dave\build-boost"
    +
    +

    Also, for example, you can't add spaces around the = sign as in

    +
    +--build-dir_=_"C:\Documents and Settings\dave\build-boost"
    +
    +
    @@ -837,7 +853,7 @@ have any source code mechanism for suppressing warnings. - @@ -846,7 +862,7 @@ same name.
    [6]This convention distinguishes the static version of +
    [6]This convention distinguishes the static version of a Boost library from the import library for an identically-configured Boost DLL, which would otherwise have the same name.
    -
    [7]These libraries were compiled without optimization +
    [7]These libraries were compiled without optimization or inlining, with full debug symbols enabled, and without NDEBUG #defined. Although it's true that sometimes these choices don't affect binary compatibility with other @@ -856,7 +872,7 @@ compiled code, you can't count on that with Boost libraries.
    - diff --git a/getting_started/windows.rst b/getting_started/windows.rst index 1750a00..3fa22fb 100644 --- a/getting_started/windows.rst +++ b/getting_started/windows.rst @@ -10,6 +10,9 @@ :alt: Boost :class: boost-logo +.. role:: raw-html(raw) + :format: html + __ ../../index.htm .. section-numbering:: @@ -201,9 +204,14 @@ For example, your session might look like this: [#continuation]_ C:\\WINDOWS> cd |default-root| |default-root|> bjam **^** - More? **--build-dir=**\ C:\\temp\\build-boost **^** + More? **--build-dir=**\ "C:\\Documents and Settings\\dave\\build-boost" **^** More? **--toolset=**\ msvc stage +Be sure to read `this note`__ about the appearance of ``^``, +``More?`` and quotation marks (``"``) in that line. + +__ continuation_ + .. include:: detail/build-from-source-tail.rst .. _auto-linking: @@ -300,10 +308,27 @@ Spoil Rock Hunter?†used in the examples. .. [#continuation] In this example, the caret character ``^`` is a - way of continuing the command on multiple lines. The command - prompt responds with ``More?`` to prompt for more input. Feel - free to omit the carets and subsequent newlines; we used them so - the example would fit on a page of reasonable width. + way of continuing the command on multiple lines, and must be the + **final character** used on the line to be continued (i.e. do + not follow it with spaces). The command prompt responds with + ``More?`` to prompt for more input. Feel free to omit the + carets and subsequent newlines; we used them so the example + would fit on a page of reasonable width. + + The command prompt treats each bit of whitespace in the command + as an argument separator. That means quotation marks (``"``) + are required to keep text together whenever a single + command-line argument contains spaces, as in + + .. parsed-literal:: + + --build-dir=\ :raw-html:`"`\ C:\\Documents\ :raw-html:`_`\ and\ :raw-html:`_`\ Settings\\dave\\build-boost\ \ :raw-html:`"` + + Also, for example, you can't add spaces around the ``=`` sign as in + + .. parsed-literal:: + + --build-dir\ :raw-html:`_`\ =\ :raw-html:`_`\ "C:\\Documents and Settings\\dave\\build-boost" .. |boost.zip| replace:: |boost_ver|\ ``.zip`` diff --git a/header.htm b/header.htm deleted file mode 100644 index 3df5cee..0000000 --- a/header.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -Boost Header policy - - - - - - - -
    [8]This feature of STLPort is deprecated because it's +
    [8]This feature of STLPort is deprecated because it's impossible to make it work transparently to the user; we don't recommend it.
    - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    -

    Boost Header Policy

    -

    Header files are the place where a library comes into contact with user code -and other libraries.  To co-exist peacefully and productively, headers must -be "good neighbors".

    -

    Here are the standards for boost headers.    Many of -these are also reasonable guidelines for general use. -

      -
    • Header filenames should have a .hpp (lowercase) extension. 
    • -
    • Unless multiple inclusion is intended, wrap the header in #ifndef guards. - Use a naming convention that minimizes the chance of clashes - with macro names from other's code.  The sample - header uses the Boost convention of all uppercase letters, with the - header name prefixed by the namespace name, and suffixed with HPP, separated - by underscores.
    • -
    • Wrap the header contents in a namespace to prevent global namespace - pollution. The namespace approach to pollution control is strongly preferred - to older approaches such as adding funny prefixes to global names.  - Libraries which are designed to work well with other Boost libraries should - be placed in namespace boost.
    • - -
    • Make sure that a translation unit consisting of just the - contents of the header file will compile successfully.
    • - -
    • Place the header file in a sub-directory to prevent conflict with - identically named header files in other libraries.  The parent - directory is added to the compiler's include search path.  Then both - your code and user code specifies the sub-directory in #include - directives.  Thus the header sample header  - would be included by #include <boost/furball.hpp>
    • -
    • The preferred ordering for class definitions is public members, protected - members, and finally private members.
    • -
    • Include the boost/config.hpp configuration - header if there is a need to deal with compiler or platform - configuration issues.
    • -
    -

    Sample Header

    -
    //  Boost general library furball.hpp header file ---------------------------//
    -
    -  < Copyright and license notice, as indicated in the license page >
    -
    -//  See http://www.boost.org/ for latest version.
    -
    -#ifndef BOOST_FURBALL_HPP
    -#define BOOST_FURBALL_HPP
    -
    -namespace boost {
    -
    -//  Furball class declaration  -----------------------------------------------//
    -
    -  class furball
    -  {
    -    public: 
    -      void throw_up();
    -    private:
    -      int whatever;
    -  };  // furball
    -
    -} // namespace
    -
    -#endif  // include guard
    -

    Coding Style

    -

    The alert reader will have noticed that the sample -header employs a certain coding style for indentation, positioning braces, -commenting ending braces, and similar formatting issues.  These stylistic -issues are viewed as personal preferences and are not part of the Boost Header -Policy.

    -
    -

    Revised 02 October, 2003

    - -

    © Copyright Beman Dawes 1998

    -

    - Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt) -

    - - - - \ No newline at end of file diff --git a/imp_vars.htm b/imp_vars.htm deleted file mode 100644 index 0b61012..0000000 --- a/imp_vars.htm +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - -Boost Implementation Variations - - - - - - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    -

    Boost Implementation Variations

    -

    Separation of interface and implementation

    -

    The interface specifications for boost.org library components (as well as for -quality software in general) are conceptually separate from implementations of -those interfaces. This may not be obvious, particularly when a component is -implemented entirely within a header, but this separation of interface and -implementation is always assumed. From the perspective of those concerned with -software design, portability, and standardization, the interface is what is -important, while the implementation is just a detail.

    -

    Dietmar Kühl, one of the original boost.org contributors, comments "The -main contribution is the interface, which is augmented with an implementation, -proving that it is possible to implement the corresponding class and providing a -free implementation."

    - -

    Implementation variations

    - -

    There may be a need for multiple implementations of an interface, to -accommodate either platform dependencies or performance tradeoffs. Examples of -platform dependencies include compiler shortcomings, file systems, thread -mechanisms, and graphical user interfaces. The classic example of a performance -tradeoff is a fast implementation which uses a lot of memory versus a slower -implementation which uses less memory.

    -

    Boost libraries generally use a configuration -header, boost/config.hpp, to capture compiler and platform -dependencies.  Although the use of boost/config.hpp is not required, it is -the preferred approach for simple configuration problems.  

    -

    Boost policy

    -

    The Boost policy is to avoid platform dependent variations in interface -specifications, but supply implementations which are usable over a wide range of -platforms and applications.  That means boost libraries will use the -techniques below described as appropriate for dealing with platform -dependencies.

    -

    The Boost policy toward implementation variations designed to enhance -performance is to avoid them unless the benefits greatly exceed the full -costs.  The term "full costs" is intended to include both -tangible costs like extra maintenance, and intangible cost like increased -difficulty in user understanding.

    - -

    Techniques for providing implementation variations

    - -

    Several techniques may be used to provide implementation variations. Each is -appropriate in some situations, and not appropriate in other situations.

    -

    Single general purpose implementation

    -

    The first technique is to simply not provide implementation variation at -all.  Instead, provide a single general purpose implementation, and forgo -the increased complexity implied by all other techniques.

    -

    Appropriate:  When it is possible to write a single portable -implementation which has reasonable performance across a wide range of -platforms. Particularly appropriate when alternative implementations differ only -in esoteric ways.

    -

    Not appropriate: When implementation requires platform specific -features, or when there are multiple implementation possible with widely -differing performance characteristics.

    -

    Beman Dawes comments "In design discussions some implementation is often -alleged to be much faster than another, yet  a timing test discovers no -significant difference. The lesson is that while algorithmic differences may -affect speed dramatically, coding differences such as changing a class from -virtual to non-virtual members or removing a level of indirection are unlikely -to make any measurable difference unless deep in an inner loop. And even in an -inner loop, modern CPUs often execute such competing code sequences in the -same number of clock cycles!  A single general purpose implementation is -often just fine."

    -

    Or as Donald Knuth said, "Premature optimization is the root of all -evil." (Computing Surveys, vol 6, #4, p 268).

    -

    Macros

    -

    While the evils of macros are well known, there remain a few cases where -macros are the preferred solution:

    -
    -
      -
    •  Preventing multiple inclusion of headers via #include guards.
    • -
    •  Passing minor configuration information from a configuration - header to other files.
    • -
    -
    -

    Appropriate:  For small compile-time variations which would -otherwise be costly or confusing to install, use, or maintain. More appropriate -to communicate within and between library components than to communicate with -library users.

    -

    Not appropriate:  If other techniques will do.

    -

    To minimize the negative aspects of macros:

    -
    -
      -
    • Only use macros when they are clearly superior to other - techniques.  They should be viewed as a last resort.
    • -
    • Names should be all uppercase, and begin with the namespace name. This - will minimize the chance of name collisions. For example, the #include - guard for a boost header called foobar.h might be named BOOST_FOOBAR_H.
    • -
    -
    -

    Separate files

    -

    A library component can have multiple variations, each contained in its own -separate file or files.  The files for the most appropriate variation are -copied to the appropriate include or implementation directories at installation -time.

    -

    The way to provide this approach in boost libraries is to include specialized -implementations as separate files in separate sub-directories in the .ZIP -distribution file. For example, the structure within the .ZIP distribution file -for a library named foobar which has both default and specialized variations -might look something like:

    -
    -
    foobar.h		// The default header file
    -foobar.cpp		// The default implementation file
    -readme.txt		// Readme explains when to use which files
    -self_contained/foobar.h	// A variation with everything in the header
    -linux/foobar.cpp      	// Implementation file to replace the default
    -win32/foobar.h          // Header file to replace the default
    -win32/foobar.cpp	// Implementation file to replace the default
    -
    -

    Appropriate:  When different platforms require different -implementations, or when there are major performance differences between -possible implementations. 

    -

    Not appropriate:  When it makes sense to use more that one of the -variations in the same installation.

    -

    Separate components

    -

    Rather than have several implementation variations of a single component, -supply several separate components. For example, the Boost library currently -supplies scoped_ptr and shared_ptr classes rather than -a single smart_ptr class parameterized to distinguish between the -two cases.  There are several ways to make the component choice:

    -
    -
      -
    • Hardwired by the programmer during coding.
    • -
    • Chosen by programmer written runtime logic (trading off some extra - space, time, and program complexity for the ability to select the - implementation at run-time.)
    • -
    -
    -

    Appropriate: When the interfaces for the variations diverge, and when -it is reasonably to use more than one of the variations. When run-time selection -of implementation is called for.

    -

    Not appropriate: When the variations are data type, traits, or -specialization variations which can be better handled by making the component a -template. Also not appropriate when choice of variation is best done by some -setup or installation mechanism outside of the program itself.  Thus -usually not appropriate to cope with platform differences.

    -

    Note: There is a related technique where the interface is specified as -an abstract (pure virtual) base class (or an interface definition language), and -the implementation choice is passed off to some third-party, such as a -dynamic-link library or object-request broker. While that is a powerful -technique, it is way beyond the scope of this discussion.

    -

    Template-based approaches

    -

    Turning a class or function into a template is often an elegant way to cope -with variations.  Template-based approaches provide optimal space and time -efficiency in return for constraining the implementation selection to compile -time. 

    -

    Important template techniques include:

    -
    -
      -
    • Data type parameterization.  This allows a single component to - operate on a variety of data types, and is why templates were originally - invented.
    • -
    • Traits parameterization.  If parameterization is complex, bundling - up aspects into a single traits helper class can allow great variation - while hiding messy details.  The C++ Standard Library provides - several examples of this idiom, such as iterator_traits<> - (24.3.1 lib.iterator.traits) and char_traits<> (21.2 - lib.char.traits).
    • -
    • Specialization.  A template parameter can be used purely for the - purpose of selecting a specialization. For example:
    • -
    -
    -
    -
    SomeClass<fast>  my_fast_object;  // fast and small are empty classes
    -SomeClass<small> my_small_object; // used just to select specialization
    -
    -
    -
    -

    Appropriate: When the need for variation is due to data type or -traits, or is performance related like selecting among several algorithms, and -when a program might reasonably use more than one of the variations.

    -

    Not appropriate:  When the interfaces for variations are -different, or when choice of variation is best done by some mechanism outside of -the program itself.  Thus usually not appropriate to cope with platform -differences.

    -
    -

    Revised 02 October, 2003

    - -

    © Copyright Beman Dawes 2001

    - -

    Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt) -

    - - - - \ No newline at end of file diff --git a/index.htm b/index.htm index 4d53dcb..5a5ff17 100644 --- a/index.htm +++ b/index.htm @@ -79,6 +79,9 @@ to request new library features.

    C++ Committee Meetings FAQ for Boost Members wishing to attend a standards committee meeting.

    +

    An overview of Boost participation in + Google Summer of Code™ 2006 A report of our first experience + in this open source initiative.

    Version History Changes and additions in past Boost releases.

    diff --git a/int_const_guidelines.htm b/int_const_guidelines.htm deleted file mode 100644 index 6159086..0000000 --- a/int_const_guidelines.htm +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - - - - - - - -

    Coding Guidelines for Integral Constant -Expressions

    - -

    Integral Constant Expressions are used in many places in C++; -as array bounds, as bit-field lengths, as enumerator -initialisers, and as arguments to non-type template parameters. -However many compilers have problems handling integral constant -expressions; as a result of this, programming using non-type -template parameters in particular can be fraught with difficulty, -often leading to the incorrect assumption that non-type template -parameters are unsupported by a particular compiler. This short -article is designed to provide a set of guidelines and -workarounds that, if followed, will allow integral constant -expressions to be used in a manner portable to all the compilers -currently supported by boost. Although this article is mainly -targeted at boost library authors, it may also be useful for -users who want to understand why boost code is written in a -particular way, or who want to write portable code themselves.

    - -

    What is an Integral Constant Expression?

    - -

    Integral constant expressions are described in section 5.19 of -the standard, and are sometimes referred to as "compile time -constants". An integral constant expression can be one of -the following:

    - -
      -
    1. A literal integral value, for example 0u or 3L.
    2. -
    3. An enumerator value.
    4. -
    5. Global integral constants, for example:
      -
      const int my_INTEGRAL_CONSTANT = 3;
    6. -
    7. Static member constants, for example:
      - struct myclass
      - { static const int value = 0; };
    8. -
    9. Member enumerator values, for example:
      - struct myclass
      - { enum{ value = 0 }; };
    10. -
    11. Non-type template parameters of integral or enumerator - type.
    12. -
    13. The result of a sizeof expression, for - example:
      - sizeof(foo(a, b, c))
    14. -
    15. The result of a static_cast, where the - target type is an integral or enumerator type, and the - argument is either another integral constant expression, - or a floating-point literal.
    16. -
    17. The result of applying a binary operator to two integral - constant expressions:
      - INTEGRAL_CONSTANT1 op INTEGRAL_CONSTANT2
      - p
      rovided that the operator is not an assignment - operator, or comma operator.
    18. -
    19. The result of applying a unary operator to an integral - constant expression:
      - op INTEGRAL_CONSTANT1
      -
      provided that the operator is not the increment or - decrement operator.
    20. -
    - -

     

    - -

    Coding Guidelines

    - -

    The following guidelines are declared in no particular order (in -other words you need to obey all of them - sorry!), and may also -be incomplete, more guidelines may be added as compilers change -and/or more problems are encountered.

    - -

    When declaring constants that are class members always -use the macro BOOST_STATIC_CONSTANT.

    - -
    template <class T>
    -struct myclass
    -{
    -   BOOST_STATIC_CONSTANT(int, value = sizeof(T));
    -};
    - -

    Rationale: not all compilers support inline initialisation of -member constants, others treat member enumerators in strange ways -(they're not always treated as integral constant expressions). -The BOOST_STATIC_CONSTANT macro uses the most appropriate method -for the compiler in question.

    - -

    Don't declare integral constant expressions whose type -is wider than int.

    - -

    Rationale: while in theory all integral types are usable in -integral constant expressions, in practice many compilers limit -integral constant expressions to types no wider than int.

    - -

    Don't use logical operators in integral constant -expressions; use template meta-programming instead.

    - -

    The header <boost/type_traits/ice.hpp> contains a number -of workaround templates, that fulfil the role of logical -operators, for example instead of:

    - -

    INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2

    - -

    Use:

    - -

    ::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value

    - -

    Rationale: A number of compilers (particularly the Borland and -Microsoft compilers), tend to not to recognise integral constant -expressions involving logical operators as genuine integral -constant expressions. The problem generally only shows up when -the integral constant expression is nested deep inside template -code, and is hard to reproduce and diagnose.

    - -

    Don't use any operators in an integral constant -expression used as a non-type template parameter

    - -

    Rather than:

    - -

    typedef myclass<INTEGRAL_CONSTANT1 == -INTEGRAL_CONSTANT2> mytypedef;

    - -

    Use:

    - -

    typedef myclass< some_symbol> mytypedef;

    - -

    Where some_symbol is the symbolic name of a an -integral constant expression whose value is (INTEGRAL_CONSTANT1 -== INTEGRAL_CONSTANT2).

    - -

    Rationale: the older EDG based compilers (some of which are -used in the most recent version of that platform's compiler), -don't recognise expressions containing operators as non-type -template parameters, even though such expressions can be used as -integral constant expressions elsewhere.

    - -

    Always use a fully qualified name to refer to an -integral constant expression.

    - -

    For example:

    - -
    typedef myclass< ::boost::is_integral<some_type>::value> mytypedef;
    - -

    Rationale: at least one compiler (Borland's), doesn't -recognise the name of a constant as an integral constant -expression unless the name is fully qualified (which is to say it -starts with ::).

    - -

    Always leave a space after a '<' and before '::'

    - -

    For example:

    - -
    typedef myclass< ::boost::is_integral<some_type>::value> mytypedef;
    -                ^
    -                ensure there is space here!
    - -

    Rationale: <: is a legal digraph in it's own right, so <:: -is interpreted as the same as [:.

    - -

    Don't use local names as integral constant expressions

    - -

    Example:

    - -
    template <class T>
    -struct foobar
    -{
    -   BOOST_STATIC_CONSTANT(int, temp = computed_value);
    -   typedef myclass<temp> mytypedef;  // error
    -};
    - -

    Rationale: At least one compiler (Borland's) doesn't accept -this.

    - -

    Although it is possible to fix this by using:

    - -
    template <class T>
    -struct foobar
    -{
    -   BOOST_STATIC_CONSTANT(int, temp = computed_value);
    -   typedef foobar self_type;
    -   typedef myclass<(self_type::temp)> mytypedef;  // OK
    -};
    - -

    This breaks at least one other compiler (VC6), it is better to -move the integral constant expression computation out into a -separate traits class:

    - -
    template <class T>
    -struct foobar_helper
    -{
    -   BOOST_STATIC_CONSTANT(int, temp = computed_value);
    -};
    -
    -template <class T>
    -struct foobar
    -{
    -   typedef myclass< ::foobar_helper<T>::value> mytypedef;  // OK
    -};
    - -

    Don't use dependent default parameters for non-type -template parameters.

    - -

    For example:

    - -
    template <class T, int I = ::boost::is_integral<T>::value>  // Error can't deduce value of I in some cases.
    -struct foobar;
    - -

    Rationale: this kind of usage fails for Borland C++. Note that -this is only an issue where the default value is dependent upon a -previous template parameter, for example the following is fine:

    - -
    template <class T, int I = 3>  // OK, default value is not dependent
    -struct foobar;
    - -

     

    - -

    Unresolved Issues

    - -

    The following issues are either unresolved or have fixes that -are compiler specific, and/or break one or more of the coding -guidelines.

    - -

    Be careful of numeric_limits

    - -

    There are three issues here:

    - -
      -
    1. The header <limits> may be absent - it is - recommended that you never include <limits> - directly but use <boost/pending/limits.hpp> instead. - This header includes the "real" <limits> - header if it is available, otherwise it supplies it's own - std::numeric_limits definition. Boost also defines the - macro BOOST_NO_LIMITS if <limits> is absent.
    2. -
    3. The implementation of std::numeric_limits may be defined - in such a way that its static-const members may not be - usable as integral constant expressions. This contradicts - the standard but seems to be a bug that affects at least - two standard library vendors; boost defines - BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS in <boost/config.hpp> - when this is the case.
    4. -
    5. There is a strange bug in VC6, where the members of std::numeric_limits - can be "prematurely evaluated" in template - code, for example:
    6. -
    - -
    template <class T>
    -struct limits_test
    -{
    -   BOOST_STATIC_ASSERT(::std::numeric_limits<T>::is_specialized);
    -};
    - -

    This code fails to compile with VC6 even though no instances -of the template are ever created; for some bizarre reason ::std::numeric_limits<T>::is_specialized -always evaluates to false, irrespective of what the -template parameter T is. The problem seems to be confined to -expressions which depend on std::numeric_limts: for example if -you replace ::std::numeric_limits<T>::is_specialized -with ::boost::is_arithmetic<T>::value, then -everything is fine. The following workaround also works but -conflicts with the coding guidelines:

    - -
    template <class T>
    -struct limits_test
    -{
    -   BOOST_STATIC_CONSTANT(bool, check = ::std::numeric_limits<T>::is_specialized);
    -   BOOST_STATIC_ASSERT(check);
    -};
    - -

    So it is probably best to resort to something like this:

    - -
    template <class T>
    -struct limits_test
    -{
    -#ifdef BOOST_MSVC
    -   BOOST_STATIC_CONSTANT(bool, check = ::std::numeric_limits<T>::is_specialized);
    -   BOOST_STATIC_ASSERT(check);
    -#else
    -   BOOST_STATIC_ASSERT(::std::numeric_limits<T>::is_specialized);
    -#endif
    -};
    - -

    Be careful how you use the sizeof operator

    - -

    As far as I can tell, all compilers treat sizeof expressions -correctly when the argument is the name of a type (or a template-id), -however problems can occur if:

    - -
      -
    1. The argument is the name of a member-variable, or a local - variable (code may not compile with VC6).
    2. -
    3. The argument is an expression which involves the creation - of a temporary (code will not compile with Borland C++).
    4. -
    5. The argument is an expression involving an overloaded - function call (code compiles but the result is a garbage - value with Metroworks C++).
    6. -
    - -

    Don't use boost::is_convertible unless you have to

    - -

    Since is_convertible is implemented in terms of the sizeof -operator, it consistently gives the wrong value when used with -the Metroworks compiler, and may not compile with the Borland's -compiler (depending upon the template arguments used).

    - -
    - -

    © Copyright Dr John Maddock 2001

    -

    Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt)

    - -

     

    - -

     

    - - diff --git a/lib_guide.htm b/lib_guide.htm deleted file mode 100644 index f258260..0000000 --- a/lib_guide.htm +++ /dev/null @@ -1,931 +0,0 @@ - - - - - Boost Library Requirements and Guidelines - - - - - - - - - - - - - - - - - -
    - boost.png (6897 bytes) - - Home - - - Libraries - - People - - - FAQ - - More -
    -

    - - Boost Library Requirements and Guidelines -

    -

    - Introduction
    - Requirements
    -     License requirements
    -     Portability requirements
    - -     Ownership
    - Guidelines
    -     Design and - programming
    -     Directory structure and - filenames
    -     Naming - consistency
    - -     Documentation
    - Rationale
    -     Exception-specification rationale
    -     Naming conventions rationale
    -     Source code fonts - rationale
    - -     Tabs rationale
    -     ECMAScript/JavaScript - rationale
    -     Rationale - rationale
    -     Acknowledgements - rationale -

    - -

    - Introduction -

    -

    - This page describes requirements and guidelines for the content of a - library submitted to Boost. -

    -

    - See the Boost Library Submission - Process page for a description of the process involved. -

    - -

    - Requirements -

    -

    - To avoid the frustration and wasted time of a proposed library being - rejected, it must meets these requirements: -

    -
      -
    • The license must meet the license requirements - - below. Restricted licenses like the GPL and LGPL are not acceptable. -
    • -
    • The copyright ownership must be clear. -
    • -
    • The library must be generally useful and not restricted to a narrow - problem domain. -
    • -
    • The library must meet the portability - requirements below.  - -
    • -
    • The library must come reasonably close to meeting the Guidelines below. - -
    • -
    • The author must be willing to participate in discussions on the mailing - list, and to refine the library accordingly. -
    • - -
    -

    - There's no requirement that an author read the mailing list for a time - before making a submission. It has been noted, however, that submissions - which begin "I just started to read this mailing list ..." seem to fail, - often embarrassingly. -

    -

    - License requirements -

    -

    - The preferred way to meet the license requirements is to use the Boost Software License. See license information. If for any reason you do not - intend to use the Boost Software License, please discuss the issues on the - Boost developers mailing list first. -

    - -

    - The license requirements: -

    -
      -
    • Must be simple to read and understand. -
    • -
    • Must grant permission without fee to copy, use and modify the software - for any use (commercial and non-commercial). -
    • -
    • Must require that the license appear on all copies of the software - source code. -
    • -
    • Must not require that the license appear with executables or other - binary uses of the library. -
    • - -
    • Must not require that the source code be available for execution or - other binary uses of the library. -
    • -
    • May restrict the use of the name and description of the library to the - standard version found on the Boost web site. -
    • -
    -

    - Portability requirements -

    -
      - -
    • -

      - A library's interface must portable and not restricted to a particular - compiler or operating system. -

      -
    • -
    • -

      - A library's implementation must if possible be portable and not - restricted to a particular compiler or operating system.  If a - portable implementation is not possible, non-portable constructions are - acceptable if reasonably easy to port to other environments, and - implementations are provided for at least two popular operating systems - (such as UNIX and Windows). -

      - -
    • -
    • -

      - There is no requirement that a library run on C++ compilers which do - not conform to the ISO standard.  -

      -
    • -
    • -

      - - There is no requirement that a library run on any particular C++ - compiler.  Boost contributors often try to ensure their libraries - work with popular compilers.  The boost/config.hpp configuration header is the preferred - mechanism for working around compiler deficiencies. -

      -
    • -
    -

    - Since there is no absolute way to prove portability, many boost submissions - demonstrate practical portability by compiling and executing correctly with - two different C++ compilers, often under different operating systems.  - - Otherwise reviewers may disbelieve that porting is in fact practical. -

    -

    - Ownership -

    -

    - Are you sure you own the library you are thinking of - submitting?   "How to Copyright Software" by MJ Salone, Nolo - Press, 1990 says: -

    - -
    -

    - Doing work on your own time that is very similar to programming you do - for your employer on company time can raise nasty legal problems.  - In this situation, it's best to get a written release from your employer - in advance. -

    -
    -

    - Place a copyright notice in all the important files you submit. Boost won't - accept libraries without clear copyright information. -

    - -

    - Guidelines -

    -

    - Please use these guidelines as a checklist for preparing the content a - library submission.  Not every guideline applies to every library, but - a reasonable effort to comply is expected. -

    -

    - Design and - Programming - -

    -
      -
    • Aim first for clarity and correctness; optimization should be only a - secondary concern in most Boost libraries. -
    • -
    -
      -
    • Aim for ISO Standard C++. Than means making effective use of the - standard features of the language, and avoiding non-standard compiler - extensions. It also means using the C++ Standard Library where applicable. -
    • -
    - -
      -
    • Follow quality programming practices. See, for example, "Effective C++" - 2nd Edition, and "More Effective C++", both by Scott Meyers, published by - Addison Wesley. -
    • -
    -
      - -
    • Use the C++ Standard Library or other Boost libraries, but only when - the benefits outweigh the costs.  Do not use libraries other than the - C++ Standard Library or Boost. See Library - reuse. -
    • -
    -
      -
    • Read Implementation Variation to see how to - supply performance, platform, or other implementation variations. -
    • - -
    - -
      -
    • Use the naming conventions of the C++ Standard Library (See Naming conventions rationale):
      - -   -
        -
      • Names (except as noted below) should be all lowercase, with words - separated by underscores. -
      • -
      • Acronyms should be treated as ordinary names (e.g. - xml_parser instead of XML_parser). -
      • -
      • Template parameter names begin with an uppercase letter. -
      • - -
      • Macro (gasp!) names all uppercase and begin with BOOST_. -
      • -
      -
    • -
    -
      -
    • Choose meaningful names - explicit is better than implicit, and - readability counts. There is a strong preference for clear and descriptive - names, even if lengthy. -
    • -
    -
      - -
    • Use exceptions to report errors where appropriate, and write code that - is safe in the face of exceptions. -
    • -
    - -
      - -
    • Provide sample programs or confidence tests so potential users can see - how to use your library. -
    • -
    - -
      -
    • Although some boost members use proportional fonts, tabs, and - unrestricted line lengths in their own code, boost's widely distributed - source code should follow more conservative guidelines: - - -
    • -
    -
      -
    • End all documentation files (HTML or otherwise) with a copyright - message and a licensing message. See license - information page for the preferred form. -
    • -
    -
      -
    • Begin all source files (including programs, headers, scripts, etc.) - with:
      - -   -
        -
      • A comment line describing the contents of the file.
        -   -
      • -
      • Comments describing copyright and licensing: again, the preferred - form is indicated in the license - information page
        - -
        - Note that developers should not provide a copy of - LICENSE_1_0.txt with their libraries: Boost - distributions already include a copy in the Boost root directory.
        -   -
      • -
      • A comment line referencing your library on the Boost web site. For - example:
        -
        - - //  See http://www.boost.org/libs/foo/ for library home - page.
        -
        - where foo is the directory name (see below) for the - library. As well as aiding users who come across a Boost file - detached from its documentation, some of Boost's automatic tools - depend on this comment to identify which library header files belong - to. -
      • -
      -
    • - -
    -
      -
    • Make sure your code compiles in the presence of the min() - and max() macros. Some platform headers define - min() and max() macros which cause some common - C++ constructs to fail to compile. Some simple tricks can protect your code - from inappropriate macro substitution:
      - -   -
        -
      • If you want to call std::min() or - std::max():
        -   -
          -
        • If you do not require argument-dependent look-up, use - (std::min)(a,b). -
        • - -
        • -
          -
        • -
        • If you do require argument-dependent look-up, you should: -
        • -
        • -
          -
            -
          • - - #include <boost/config.hpp> -
          • -
          • Use BOOST_USING_STD_MIN(); to bring - std::min() into the current scope. -
          • -
          • Use min BOOST_PREVENT_MACRO_SUBSTITUTION - (a,b); to make an argument-dependent call to - min(a,b). -
          • - -
          -
        • -
        -
      • -
      • -
        -
      • -
      • If you want to call - std::numeric_limits<int>::max(), use - (std::numeric_limits<int>::max)() instead. -
      • - -
      • -
        -
      • -
      • If you want to call a min() or max() - member function, instead to doing obj.min(), use - (obj.min)().
        - -
      • -
      • -
        -
      • -
      • If you want to declare or define a function or a member function - named min or max, then you must use the - BOOST_PREVENT_MACRO_SUBSTITUTION macro. Instead of writing - int min() { return 0; } you should write int min - BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; }
        - - This is true regardless if the function is a free (namespace scope) - function, a member function or a static member function, and it - applies for the function declaration as well as for the function - definition.
        -
      • -
      -
    • -
    -

    - Directory - Structure and Filenames -

    - -
      -
    • File and directory names must contain only lowercase ASCII - letters , numbers, underscores, and a period.  Leading character must - be alphabetic. Maximum length 31. Only a single period is permitted.  - These requirements ensure file and directory names are relatively portable. -
    • -
    • Files intended to be processed by a C++ compiler as part of a - translation unit should have a three-letter filename extension ending in - "pp". Other files should not use extensions ending in "pp". This - convention makes it easy to identify all of the C++ source in Boost. -
    • - -
    • All libraries have at their highest level a primary directory named for - the particular library. See Naming - consistency. The primary directory may have sub-directories. -
    • -
    • For very simple libraries implemented entirely within the library - header, all files go in the primary directory (except headers, which go in - the boost header directory). -
    • -
    -
    -

    - Boost standard sub-directory names - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Sub-directory - - Contents - - - Required -
    - build - - - Library build files such as a Jamfile. - - If any build files. -
    - - doc - - Documentation (HTML) files. - - If several doc files. -
    - example - - Sample program files. - - If several sample files. -
    - src - - Source files which must be compiled to build the library.  - - If any source files. -
    - test - - - Regression or other test programs or scripts. - - If several test files. -
    -
    -

    - Redirection - -

    -

    - The primary directory should always contain a file named index.html (or - index.htm). Authors have requested this so that they can publish URL's in - the form http://www.boost.org/libs/lib-name with the assurance a - documentation reorganization won't invalidate the URL. Boost's internal - tools are also simplified by knowing that a library's documentation is - always reachable via the simplified URL. -

    -

    - If the documentation is in a doc sub-directory, the primary directory - index.html file should just do an automatic redirection to the doc - subdirectory: -

    -
    - -
    -<html>
    -<head>
    -<meta http-equiv="refresh" content="0; URL=doc/index.html">
    -</head>
    -<body>
    -Automatic redirection failed, please go to
    -<a href="doc/index.html">doc/index.html</a>
    -
    -</body>
    -</html>
    -
    -
    -

    - Naming consistency -

    -

    - As library developers and users have gained experience with Boost, the - following consistent naming approach has come to be viewed as very helpful, - particularly for larger libraries that need their own header subdirectories - and namespaces. -

    - -

    - Here is how it works. The library is given a name that describes the - contents of the library. Cryptic abbreviations are strongly discouraged. - Following the practice of the C++ Standard Library, names are usually - singular rather than plural. For example, a library dealing with file - systems might chose the name "filesystem", but not "filesystems", "fs" or - "nicecode". -

    -
      -
    • The library's primary directory (in parent boost-root/libs) is - given that same name.  For example, - boost-root/libs/filesystem.
      -   - -
    • -
    • The library's primary header directory (in parent - boost-root/boost) is given that same name. For example, - boost-root/boost/filesystem.
      -   -
    • -
    • The library's primary namespace (in parent ::boost) is given - that same name, except when there's a component with that name (e.g., - boost::tuple), in which case the namespace name is pluralized. For - example, ::boost::filesystem. -
    • - -
    -

    - When documenting Boost libraries, follow these conventions (see also the - following section of this document): -

    -
      -
    • The library name is set in roman type. -
    • -
    • The library name is capitalized. -
    • -
    • A period between "Boost" and the library name (e.g., Boost.Bind) is - used if and only if the library name is not followed by the word "library". -
    • - -
    • The word "library" is not part of the library name and is therefore - lowercased. -
    • -
    -

    - Here are a few examples of how to apply these conventions: -

    -
      -
    • Boost.Bind was written by Peter Dimov. -
    • -
    • The Boost Bind library was written by Peter Dimov. -
    • - -
    • I regularly use Bind, a Boost library written by Peter Dimov. -
    • -
    -

    - Documentation -

    -

    - Even the simplest library needs some documentation; the amount should be - proportional to the need.  The documentation should assume the readers - have a basic knowledge of C++, but are not necessarily experts. -

    - -

    - The format for documentation should be HTML, and should not require an - advanced browser or server-side extensions. Style sheets are acceptable. - ECMAScript/JavaScript is not acceptable. The documentation entry point - should always be a file named index.html or index.htm; see Redirection. -

    -

    - There is no single right way to do documentation. HTML documentation is - often organized quite differently from traditional printed documents. - Task-oriented styles differ from reference oriented styles. In the end, it - comes down to the question: Is the documentation sufficient for the - mythical "average" C++ programmer to use the library successfully? -

    -

    - Appropriate topics for documentation often include: -

    - -
      -
    • General introduction to the library. -
    • -
    • Description of each class. -
    • -
    • Relationship between classes. -
    • -
    • For each function, as applicable, description, requirements - (preconditions), effects, post-conditions, returns, and throws. -
    • -
    • Discussion of error detection and recovery strategy. -
    • - -
    • How to use including description of typical uses. -
    • -
    • How to compile and link. -
    • -
    • How to test. -
    • -
    • Version or revision history. -
    • -
    • Rationale for design decisions.  See Rationale rationale. -
    • - -
    • Acknowledgements.  See Acknowledgments - rationale. -
    • -
    -

    - If you need more help with how to write documentation you can check out the - article on Writing Documentation for - Boost. -

    - -

    - Rationale -

    -

    - Rationale for some of the requirements and guidelines follows. -

    -
    -

    - Exception-specification rationale -

    - -

    - Exception specifications [ISO 15.4] are sometimes coded to indicate what - exceptions may be thrown, or because the programmer hopes they will - improved performance.  But consider the following member from a smart - pointer: -

    -
    -    T& operator*() const throw()  { return *ptr; }
    -
    -

    - This function calls no other functions; it only manipulates fundamental - data types like pointers Therefore, no runtime behavior of the - exception-specification can ever be invoked.  The function is - completely exposed to the compiler; indeed it is declared inline Therefore, - a smart compiler can easily deduce that the functions are incapable of - throwing exceptions, and make the same optimizations it would have made - based on the empty exception-specification. A "dumb" compiler, however, may - make all kinds of pessimizations. -

    - -

    - For example, some compilers turn off inlining if there is an - exception-specification.  Some compilers add try/catch blocks. Such - pessimizations can be a performance disaster which makes the code unusable - in practical applications. -

    -

    - Although initially appealing, an exception-specification tends to have - consequences that require very careful thought to understand. The - biggest problem with exception-specifications is that programmers use them - as though they have the effect the programmer would like, instead of the - effect they actually have. -

    -

    - - A non-inline function is the one place a "throws nothing" - exception-specification may have some benefit with some compilers. -

    -
    -

    - Naming conventions rationale -

    -

    - The C++ standard committee's Library Working Group discussed this issue in - detail, and over a long period of time. The discussion was repeated again - in early boost postings. A short summary: -

    - -
      -
    • Naming conventions are contentious, and although several are widely - used, no one style predominates. -
    • -
    • Given the intent to propose portions of boost for the next revision of - the C++ standard library, boost decided to follow the standard library's - conventions. -
    • -
    • Once a library settles on a particular convention, a vast majority of - stakeholders want that style to be consistently used. -
    • -
    -
    -

    - - Source code fonts rationale -

    -

    - Dave Abrahams comments: An important purpose (I daresay the primary - purpose) of source code is communication: the documentation of intent. This - is a doubly important goal for boost, I think. Using a fixed-width font - allows us to communicate with more people, in more ways (diagrams are - possible) right there in the source. Code written for fixed-width fonts - using spaces will read reasonably well when viewed with a variable-width - font, and as far as I can tell every editor supporting variable-width fonts - also supports fixed width. I don't think the converse is true. -

    -
    -

    - Tabs rationale -

    - -

    - Tabs are banned because of the practical problems caused by tabs in - multi-developer projects like Boost, rather than any dislike in principle. - See mailing list archives. Problems - include maintenance of a single source file by programmers using tabs and - programmers using spaces, and the difficulty of enforcing a consistent tab - policy other than just "no tabs". Discussions concluded that Boost files - should either all use tabs, or all use spaces, and thus the decision to - stick with spaces. -

    -
    -

    - ECMAScript/JavaScript rationale -

    - -

    - Before the 1.29.0 release, two Boost libraries added ECMAScript/JavaScript - documentation. Controversy followed (see mailing list archives), and the developers - were asked to remove the ECMAScript/JavaScript. Reasons given for banning - included: -

    -
      -
    • Incompatible with some older browsers and some text based browsers. -
    • -
    • Makes printing docs pages difficult. -
    • -
    • Often results in really bad user interface design. -
    • - -
    • "It's just annoying in general." -
    • -
    • Would require Boost to test web pages for ECMAScript/JavaScript - compliance. -
    • -
    • Makes docs maintenance by other than the original developer more - difficult. -
    • -
    -
    -

    - Rationale - rationale - -

    -

    - Rationale is defined as "The fundamental reasons for something; basis" by - the American Heritage Dictionary. -

    -

    - Beman Dawes comments:  Failure to supply contemporaneous rationale for - design decisions is a major defect in many software projects. Lack of - accurate rationale causes issues to be revisited endlessly, causes - maintenance bugs when a maintainer changes something without realizing it - was done a certain way for some purpose, and shortens the useful lifetime - of software. -

    -

    - Rationale is fairly easy to provide at the time decisions are made, but - very hard to accurately recover even a short time later. -

    - -
    -

    - Acknowledgements - rationale -

    -

    - As a library matures, it almost always accumulates improvements suggested - to the authors by other boost members.  It is a part of the culture of - boost.org to acknowledge such contributions, identifying the person making - the suggestion.  Major contributions are usually acknowledged in the - documentation, while minor fixes are often mentioned in comments within the - code itself. -

    - -
    -

    - Revised - - 04 November, 2003 -

    -

    - © Copyright Beman Dawes 2003. -

    - -

    - Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at www.boost.org/LICENSE_1_0.txt) -

    - - diff --git a/library_reuse.htm b/library_reuse.htm deleted file mode 100644 index 2618afb..0000000 --- a/library_reuse.htm +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - -Boost Library Reuse - - - - - - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    -  -

    Boost Library reuse: cost versus benefit trade-offs

    -

    A Boost library should not use libraries other than Boost or the C++ -Standard Library.

    -

    A Boost library should use other Boost Libraries or the C++ Standard -Library, but only when the benefits outweigh the costs. 

    -

    The benefits of using components from other libraries may include clearer, -more understandable code, reduced development and maintenance costs, and the -assurance which comes from reusing well-known and trusted building blocks.

    -

    The costs may include undesirable coupling between components, and added -compilation and runtime costs.  If the interface to the additional -component is complex, using it may make code less readable, and thus actually -increase development and maintenance costs.

    -

    Negative effects of coupling become obvious when one library uses a second -library which uses a third, and so on. The worst form of coupling requires the -user understand each of the coupled libraries. Coupling may also reduce the -portability of a library - even in case when all used libraries are -self-sufficient (see example of questionable usage of <iostream> library -below).

    -

    Example where another boost component should certainly be used:  -boost::noncopyable (in boost/utility.hpp) has -considerable benefits; it simplifies code, improves readability, and signals -intent.  Costs are low as coupling is limited;  noncopyable itself -uses no other classes and its header includes only the lightweight headers -<boost/config.hpp> and <cstddef>.  There are no runtime costs -at all. With costs so low and benefits so high, other boost libraries should use -boost::noncopyable when the need arises except in exceptional circumstances.

    -

    Example where a standard library component might possibly be used: -Providing diagnostic output as a debugging aid can be a nice feature for a -library. Yet using Standard Library <iostream> can involves a lot of -additional cost, particularly if <iostream> is unlikely to be use -elsewhere in the application.  In certain GUI or embedded applications, -coupling to <iostream> would be a disqualification.    -Consider redesign of the boost library in question so that the user supplies the -diagnostic output mechanism.

    -

    Example where another boost component should not be used:  The -boost dir_it library has considerable coupling and runtime costs, not to mention -portability issues for unsupported operating systems.  While completely -appropriate when directory iteration is required, it would not be reasonable for -another boost library to use dir_it just to check that a file is available -before opening.  C++ Standard Library file open functionality does this at -lower cost.  Don't use dir_it just for the sake of using a boost library.

    -
    -

    Revised 02 October 2003

    -

    © Copyright Beman Dawes 2000

    -

    Distributed under the Boost Software License, Version 1.0. (See -accompanying file LICENSE_1_0.txt or copy -at http://www.boost.org/LICENSE_1_0.txt)

    - - - - \ No newline at end of file diff --git a/license_info.html b/license_info.html deleted file mode 100644 index 7715d9d..0000000 --- a/license_info.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - - -Boost Software License Background - - - - - - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    - -

    Information about the Boost Software License

    - -

    License text
    -Introduction
    -History
    -Rationale
    -FAQ
    -Transition
    -Acknowledgements

    - -

    Introduction

    - -

    The Boost Software License -specifies the terms and conditions of use for those Boost libraries -that it covers.

    - -

    Currently, some Boost libraries have their own licenses. The hope is that -eventually all Boost libraries will be covered by the Boost Software -License. In the meantime, all libraries comply with the Boost License requirements.

    - -

    History

    - -

    As Boost grew, it became unmanageable for each Boost file to have -its own license. Users complained that each license needed to be reviewed, and that -reviews were difficult or impossible if Boost libraries contained many different licenses. -Boost moderators and maintainers spent excessive time dealing with license -issues. Boost developers often copied existing licenses without actually knowing -if the license wording met legal needs.

    -

    To clarify these licensing issues, the Boost moderators asked for help from -the Berkman Center for Internet & Society -at Harvard Law School, Cambridge, Massachusetts, USA. It was requested that a -single Boost license be developed that met the traditional requirements that Boost licenses, particularly:

    - - -
      -
    • Must be simple to read and understand.
    • -
    • Must grant permission without fee to copy, use and modify the software for - any use (commercial and non-commercial).
    • -
    • Must require that the license appear with all copies [including - redistributions] of the software source code.
    • -
    • Must not require that the license appear with executables or other binary - uses of the library.
    • -
    • Must not require that the source code be available for execution or other - binary uses of the library.
    • -
    - -

    Additionally, other common open source licenses were studied to see what -additional issues were being treated, and additions representing good legal -practice were also requested. The result is the Boost -Software License.

    - -

    Rationale

    - -

    The following rationale was provided by Devin Smith, the -lawyer who wrote the Boost Software License. It has been edited slightly for -brevity. Editorial additions are shown in square brackets.

    - -

    Benefit of Common Software License

    -

    If one of Boost's goals is to ease use and adoption of the various -libraries made available by Boost, it does make sense to try to -standardize the licenses under which the libraries are made available to -users. (I make some recommendations about a possible short-form license -below.)

    -

    [Standardizing the license will not] necessarily address the issue of satisfying -corporate licensees. Each corporation will have its own concerns, based -on their own experiences with software licensing and distribution and, -if they're careful, will want to carefully review each license, even if -they've been told that they're all standard. I would expect that, -unless we're remarkably brilliant (or lucky) in drafting the standard -Boost license, the standard license won't satisfy the legal departments -of all corporations. I imagine that some will, for instance, absolutely -insist that licensors provide a warranty of title and provide -indemnification for third-party intellectual property infringement -claims. Others may want functional warranties. (If I were advising the -corporations, I would point out that they're not paying anything for the -code and getting such warranties from individual programmers, who -probably do not have deep pockets, is not that valuable anyway, but -other lawyers may disagree.)

    -

    But this can be addressed, not by trying to craft the perfect standard -license, but by informing the corporations that they can, if they don't like the -standard license, approach the authors to negotiate a different, perhaps even -paid, license.

    -

    One other benefit of adopting a standard license is to help ensure that -the license accomplishes, from a legal perspective, what the authors -intend. For instance, many of the [original] licenses for the libraries available -on boost.org do not disclaim the warranty of title, meaning that the -authors could, arguably, be sued by a user if the code infringes the -rights of a third party and the user is sued by that third party. I -think the authors probably want to disclaim this kind of liability.

    -

    Short-Form License

    -

    Without in anyway detracting from the draft license that's been -circulated [to Boost moderators], I'd like to propose an alternative "short-form" license that -Boost could have the library authors adopt. David [Abrahams] has expressed a -desire to keep things as simple as possible, and to try to move away -from past practice as little as possible, and this is my attempt at a -draft.

    -

    This license, which is very similar to the BSD license and the MIT -license, should satisfy the Open Source Initiative's Open Source -Definition: (i) the license permits free redistribution, (ii) the -distributed code includes source code, (iii) the license permits the -creation of derivative works, (iv) the license does not discriminate -against persons or groups, (v) the license does not discriminate against -fields of endeavor, (vi) the rights apply to all to whom the program is -redistributed, (vii) the license is not specific to a product, and (viii) the -license is technologically neutral (i.e., it does not [require] an explicit gesture of -assent in order to establish a contract between licensor and licensee).

    -

    This license grants all rights under the owner's copyrights (as well as an -implied patent license), disclaims all liability for use of the code (including -intellectual property infringement liability), and requires that all subsequent -copies of the code [except machine-executable object code], including partial copies and derivative works, include the -license.

    - -

    FAQ

    - -

    How should Boost programmers apply the license to source and -header files?

    - -

    Add a comment based on the following template, substituting -appropriate text for the italicized portion: -
    -
    -

    -//          Copyright Joe Coder 2004 - 2006.
    -// Distributed under the Boost Software License, Version 1.0.
    -//    (See accompanying file LICENSE_1_0.txt or copy at
    -//          http://www.boost.org/LICENSE_1_0.txt)
    -
    -
    -Please leave an empty line before and after the above comment block. -It is fine if the copyright and license messages are not on different lines; in -no case there should be other intervening text. Do not include -"All rights reserved" anywhere.
    - -

    Other ways of licensing source files have been considered, but some -of them turned out to unintentionally nullify legal elements of the -license. Having fixed language for referring to the license helps -corporate legal departments evaluate the boost distribution. -Creativity in license reference language is strongly discouraged, but -judicious changes in the use of whitespace are fine. - -

    How should the license be applied to documentation files, instead?

    - -

    Very similarly to the way it is applied to source files: the user should -see the very same text indicated in the template above, with the only difference -that both the local and the web copy of LICENSE_1_0.txt should be linked to. -Refer to the HTML source code of this page in case of doubt. - -

    Note that the location of the local LICENSE_1_0.txt needs to be indicated -relatively to the position of your documentation file -(../LICENSE_1_0.txt, ../../LICENSE_1_0.txt etc.)

    - -

    How is the Boost license different from the -GNU General Public -License (GPL)?

    - - -

    The Boost license permits the creation of derivative works for -commercial or non-commercial use with no legal requirement to release -your source code. Other differences include Boost not requiring -reproduction of copyright messages for object code redistribution, and -the fact that the Boost license is not "viral": if you -distribute your own code along with some Boost code, the Boost license -applies only to the Boost code (and modified versions thereof); you -are free to license your own code under any terms you like. The GPL is -also much longer, and thus may be harder to understand.

    - -

    Why the phrase "machine-executable object code generated by a source -language processor"?

    - -

    To distinguish cases where we do not require reproduction of the copyrights -and license, such as object libraries, shared libraries, and final program -executables, from cases where reproduction is still required, such as -distribution of self-extracting archives of source code or precompiled header -files. More detailed wording was rejected as not being legally necessary, and -reducing readability.

    - -

    Why is the "disclaimer" paragraph of the license entirely in uppercase?

    - -

    Capitalization of these particular provisions is a US legal mandate for -consumer protection. (Diane Cabell)

    - -

    Does the copyright and license cover interfaces too?

    - -

    The conceptual interface to a library isn't covered. The particular -representation expressed in the header is covered, as is the documentation, -examples, test programs, and all the other material that goes with the library. -A different implementation is free to use the same logical interface, however. -Interface issues have been fought out in court several times; ask a lawyer for -details.

    - -

    Why doesn't the license prohibit the copyright holder from patenting the -covered software?

    - -

    No one who distributes their code under the terms of this license could turn -around and sue a user for patent infringement. (Devin Smith)

    - -

    Boost's lawyers were well aware of patent provisions in licenses like the GPL -and CPL, and would have included such provisions in the Boost license if they -were believed to be legally useful.

    - -

    Why doesn't the copyright message say "All rights reserved"?

    - -

    Devin Smith says "I don't think it belongs in the copyright notice for -anything (software, electronic documentation, etc.) that is being licensed. It -belongs in books that are sold where, in fact, all rights (e.g., to reproduce -the book, etc.) are being reserved in the publisher or author. I think it -shouldn't be in the BSD license."

    - -

    Do I have to copyright/license trivial files? - -

    Even a test file that just contains an empty main() -should have a copyright. Files without copyrights make corporate -lawyers nervous, and that's a barrier to adoption. The more of Boost -is uniformly copyrighted and licensed, the less problem people will -have with mounting a Boost release CD on a corporate server. - - -

    Can I use the Boost license for my own projects outside Boost? - -

    Sure; there are no restrictions on the use of the license itself. - -

    Transition

    - -

    To ease the transition of the code base towards the new common -license, several people decided to give a blanket permission for all -their contributions to use the new license. This hopefully helps -maintainers to switch to the new license once the list contains enough -names without asking over and over again for each change. Please -consider adding your name to the list.

    - -

    Acknowledgements

    -

    Dave Abrahams led the Boost effort to develop better licensing. The legal -team was led by -Diane Cabell, -Director, Clinical Programs, Berkman -Center for Internet & Society, Harvard Law School. -Devin Smith, attorney, -Nixon Peabody LLP, wrote the Boost License. Eva Chan, Harvard Law School, -contributed analysis of Boost issues and drafts of various legal documents. -Boost members reviewed drafts of the license. Beman Dawes wrote this web page.

    -
    -

    Revised -27 August, 2004

    - -

    © Copyright 2003-2004 Beman Dawes, Daniel Frey, David Abrahams.

    -

    Distributed under the Boost Software License, Version 1.0. -(See accompanying file LICENSE_1_0.txt or -copy at www.boost.org/LICENSE_1_0.txt) -

    - - - - diff --git a/mailing_lists.htm b/mailing_lists.htm deleted file mode 100644 index 7658db8..0000000 --- a/mailing_lists.htm +++ /dev/null @@ -1,403 +0,0 @@ - - - - - Mailing Lists - - - - - - - - - - - - - - - - - - - - - - - - -
    -HomeLibrariesPeopleFAQMore
    - -

    Boost Mailing Lists and other resources

    - -

    The mailing lists are the heart of the Boost community.  You may - read the lists via full-content email, email digests, or via newsgroup - reader.

    - -

    Hosting for the mailing lists is donated by the Open Systems Lab at Indiana University.

    - -

    Access to Boost mailing lists via newsgroup (NNTP) is contributed by - GMANE.

    - -
    -

    Before Posting

    - -

    - - Read the Discussion Policy and - Guide to Effective Posting.  Doing so will help you - to ensure that your post is read by the people who can help you - and received in the spirit in which it was intended. - -

    - Subscribe your posting address.  As an anti-spam - measure, postings to most Boost mailing lists will only be - accepted if the posting's "From:" header contains an email - address that is subscribed to the list.  If you try to post from - an address that isn't subscribed, you will probably get a - message that says:

    - -
    - You are not allowed to post to this mailing list, and your message - has been automatically rejected. If you think that your messages are - being rejected in error, contact the mailing list owner at list - administrator's email address. -
    If you need to post from multiple email addresses, you - should subscribe each one separately.  You can configure your subscription - settings for any address to disable mail delivery via each mailing list's - web interface. - -

    Even postings made through the GMane news server need to be made from - subscribed addresses because GMane simply forwards your postings - on to the appropriate email list.  Don't be fooled by GMane's - authentication message that says "you are now authorized to post - to this list" after you answer its autogenerated mail; only - subscribed addresses may post.

    - -
    - -
    -
    Boost Users list - -
    Boost developers list
    - -
    -
    -
    Archives for the Boost developers - list
    -
    -
    - -
    Boost Announce list
    - -
    Boost Interest list
    - -
    Project-Specific lists
    - -
    -
    -
    Boost.Build list
    - -
    Python C++-Sig (for Boost.Python)
    - -
    Language Binding (for generalized C++ - bindings)
    - -
    Boost.Spirit lists
    - -
    Boost.Documentation list
    - -
    Testing list (about regression-testing the - boost libraries, not for the Boost.Test library specifically)
    - -
    Boost.uBlas (numerics) list
    - -
    Boost.Thread list
    -
    -
    - -
    Boost Sandbox
    - -
    #boost IRC channel
    -
    - -

    Boost Users mailing list (also available - via newsgroup)

    - -

    This list is oriented toward casual users of the Boost - libraries. It is a good place to start if you are having - trouble getting started with Boost or its individual libraries. Feel - free to post both "newbie" and more challenging questions, but - please check first to see if there's an - appropriate Project-Specific list; you'll - often get better answers in a forum dedicated to your problem - area.  This list is relatively - low volume (less than 500 per month).  Subscribe or unsubscribe - at the Boost Users list - home page. -

    - -

    For those who prefer to participate via an NNTP (newsgroup) interface, a gateway - to the Boost Users mailing list is available at news://news.gmane.org/gmane.comp.lib.boost.user. - You can also browse Gmane's - searchable archive.

    - -

    Boost developers mailing list (also - available via newsgroup)

    - -

    This is the main Boost mailing list.  It is high volume (over 1000 - messages per month), very technical, and oriented toward Boost library - developers. It is also read by many other members interested in watching - the Boost library development process.  Virtually all Boost decisions, - major or minor, technical or otherwise, are reached via public discussion - on this mailing list.  It is where the formal reviews of proposed - libraries take place. Subscribe or unsubscribe at http://lists.boost.org/mailman/listinfo.cgi/boost.

    - -

    When we talk about the "members of Boost", we are talking about those - signed up for this main mailing list.

    - -

    For those who prefer to participate via an NNTP (newsgroup) interface, a gateway to the Boost mailing list - is available at news://news.gmane.org/gmane.comp.lib.boost.devel. - -

    Preliminary libraries under discussion are available from the Vault.

    - -

    Archives for Boost developers - list

    - -

    Archives of Boost messages include the - Boost - GMane NNTP Archive, The Mail - Archive, The Free - Network Group, and of course there is a Google search link for our MailMan Archive on - our home page. - -

    Boost Announce mailing list

    - -

    This is an announce-only list for notification of upcoming software - releases and formal reviews of proposed libraries. One to three messages - per month.  Subscribe or unsubscribe at the Boost Announce - list home page.

    - -

    Boost Interest Mailing List

    - -

    This list is a moderated low-traffic announcement-only list of - interest to the Boost community. On topic messages will include - announcements of books, magazine articles, papers, talks, seminars, - products, tools, events, or conferences on advanced uses of C++, - generic/generative/meta-programming, and, of course, the Boost - libraries. Off topic will be discussion of any kind. Job postings - are accepted at the moderators' discretion. Subscribe or - unsubscribe at the Boost-Interest - home page.

    - -

    Project-Specific lists

    Several - mailing lists have been established for specific Boost projects: - -
    -
    -

    Boost.Build - list

    The mailing list for the Boost Build System is located here. GMane provides - NNTP - access and Searchable - Archives as well. - -

    Python C++-Sig (for - Boost.Python)

    The Python C++-sig is not - strictly Boost-specific, but nearly all the traffic concerns Boost.Python. See also the Language Binding list below. GMane provides NNTP access and - Searchable - Archives as well. There are also searchable archives at - ASPN. - -

    Language Binding

    The - Language - Binding list is for discussion of a generalized framework for - binding C++ to other languages and systems based on the technology of - Boost.Python and Luabind. The plan is to provide a - single front-end for describing bindings with runtime-pluggable back - ends for binding to specific languages. It is highly recommended - that new subscribers read through the - message history from the beginning before posting; it will - save time as much design progress has already been made. GMane provides - NNTP - access and - Searchable Archives as well. - - -

    Boost.Spirit lists

    Spirit has - two additional mailing lists. Spirit-general - for Spirit users and Spirit-devel - for Spirit developers (open to anyone who wishes to hang out with - Spirit coders). Both have GMane NNTP - access (Spirit-general - and Spirit-devel) - with searchable archives ( - Spirit-general and - Spirit-devel). - - -

    Boost.Documentation - list

    The SourceForge mailing list for the Boost Documentation System is located here. - GMane provides NNTP - access and - Searchable Archives as well. - - -

    uBLAS development (ublas-dev) - list

    A seperate user and developer mailing list for Boost uBLAS specific topics is - located here. - -

    Thread development (threads-devel) - list

    A seperate developer mailing list for Boost Thread specific topics is - located - here. -

    Important: This mailing list is for the discussion of - the specification and implementation of Boost.Threads only — - questions regarding usage should be directed to the - Boost Users list, or the main - Boost developers list. - - -

    GMane provides NNTP - access and - Searchable Archives as well. - - -

    Testing list

    - -

    The setup, procedures and tools necessary for running Boost - regression tests are discussed on this - list. The list main participants are regression runners - people - who run Boost tests on a variety of compilers and platforms, and the - maintainers of tools for collecting and processing test results.

    - -

    Important: questions relevant to a wider audience, including - questions about Boost.Test framework or test results for a particular - library, should be posted to main development list.

    NNTP - access and Searchable - Archives are available on GMane. - -

    Boost Subversion Commit Messages

    -

    The boost-commit - mailing list receives messages whenever a change is committed to - the Boost Subversion repository.

    - -
    -
    - -

    Boost Sandbox

    - -

    In addition to the main Boost CVS - repository, a separate Sandbox is available for Boost developers - wishing to collaborate on projects prior to formal acceptance of a new - library.  Read-only access is available via Subversion and web browser at - http://svn.boost.org/svn/boost/sandbox. - -

    Developer access to the sandbox uses the Subversion repository - at https://svn.boost.org/svn/boost/sandbox. For more information about the Boost Subversion repository, - please - see http://svn.boost.org.

    - -

    #boost IRC channel

    - -

    In addition to the mailing lists presented above, a #boost IRC channel on - freenode is frequented by some boost users. - As usual with IRC channels, one should not necessarily expect that his questions - will be answered. The channel is not moderated.

    -
    - -

    Revised - 04 December, 2005

    - -

    Copyright Beman Dawes and David Abrahams 2001-2005

    - -

    Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at http://www.boost.org/LICENSE_1_0.txt)

    - - diff --git a/moderators.html b/moderators.html deleted file mode 100644 index 249484d..0000000 --- a/moderators.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -Moderators - - - - - - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    -

    Boost Moderators

    -

    The Boost moderators are Dave Abrahams, -Carl Daniel, Beman Dawes, -Jeff Garland, -Doug Gregor, and -John Maddock. You can reach -the moderators at boost-owner@lists.boost.org. -

    -Note: The boost moderators do not moderate any mailing lists -other than the main Boost developers' list. For example, the -boost-users list moderators are at -boost-users-owner@lists.boost.org. -The moderators of every other Boost list can be reached -through its home page. -

    - -

    Moderator Functions

    -
      -
    • Monitor the mailing list to ensure dialog remains within the acceptable - boundaries set by the discussion policy. - When discussion strays, use private email to gently remind, strongly rebuke, - or outright ban, as the situation demands.
    • -
    -
      -
    • Approve the initial postings of new (and thus still moderated) members, - and move members to the "Group Policy" posting status.
    • -
    -
      -
    • Administer the internal operations of the Boost web site, the main Boost - mailing list, the CVS repository, and other Boost administrative machinery.
    • -
    -
      -
    • Act as an executive committee overseeing important administrative and - policy decisions.  Boost is a zero-budget organization with no income - and no expenses, so that eliminates the need for most management. Technical - decisions are worked out on the mailing list. The moderators handle the few - remaining decisions that need a definite answer.
    • -
    -
      -
    • Beyond the purely administrative duties, work to keep the Boost community - vibrant and alive. That may be as simple as saying "thank you" to - an individual member, or as complex as starting some major new - initiative.  Do whatever it takes!
    • -
    -
    -

    Revised 27 February, 2005 -

    -

    © Beman Dawes 2001-2004

    - -

    Distributed under the Boost Software License, Version 1.0. (See -accompanying file LICENSE_1_0.txt or copy -at http://www.boost.org/LICENSE_1_0.txt)

    - - - - \ No newline at end of file diff --git a/regression.html b/regression.html index 58a2c18..70c37ed 100644 --- a/regression.html +++ b/regression.html @@ -5,5 +5,14 @@ Automatically loading index page... if nothing happens, please go to http://www.boost.org/tools/regression/index.htm. +
    + +

    © Copyright Douglas Gregor, 2005

    + +

    Distributed under the Boost Software License, Version 1.0. See +www.boost.org/LICENSE_1_0.txt

    + +

     

    +

     

    - + \ No newline at end of file diff --git a/report-nov-2007.html b/report-nov-2007.html new file mode 100644 index 0000000..7d30787 --- /dev/null +++ b/report-nov-2007.html @@ -0,0 +1,423 @@ + + + + + + +Review Wizard Status Report for November 2007 + + + +
    +

    Review Wizard Status Report for November 2007

    +
    +

    News

    +
    +
    November 7, 2007 - Exception Library Accepted
    +
    Announcement: http://lists.boost.org/boost-users/2007/11/31912.php
    +
    +

    We need experienced review managers. Please take a look at the list +of libraries in need of managers and check out their descriptions. In +general review managers are active boost participants or library +contributors. If you can serve as review manager for any of them, +email Ron Garcia or John Phillips, "garcia at cs dot indiana dot edu" +and "jphillip at capital dot edu" respectively.

    +

    A link to this report will be posted to www.boost.org. +If you would like us to make any modifications or additions to this +report before we do that, please email Ron or John.

    +

    If you're library author and plan on submitting a library for review +in the next 3-6 months, send Ron or John a short description of your +library and we'll add it to the Libraries Under Construction below. +We know that there are many libraries that are near completion, but we +have hard time keeping track all of them. Please keep us informed +about your progress.

    +
    +
    +

    Review Queue

    +
      +
    • Finite State Machines
    • +
    • Floating Point Utilities
    • +
    • Switch
    • +
    • Property Map (fast-track)
    • +
    • Graph (fast-track)
    • +
    • Forward (fast-track)
    • +
    • Singleton (fast-track)
    • +
    • Factory (fast-track)
    • +
    • Lexer
    • +
    • Thread-Safe Signals
    • +
    • Logging
    • +
    • Flyweight
    • +
    • Unordered Containers
    • +
    +
    +
    +

    Finite State Machines

    + +++ + + + + + + + + + +
    Author:Andrey Semashev
    Review Manager:Martin Vuille
    Download:Boost Sandbox Vault
    Description:

    The Boost.FSM library is an implementation of FSM (stands for +Finite State Machine) programming concept. The main goals of the +library are:

    +
      +
    • Simplicity. It should be very simple to create state machines using +this library.
    • +
    • Performance. The state machine infrastructure should not be +very time and memory-consuming in order to be applicable in +more use cases.
    • +
    • Extensibility. A developer may want to add more states to an +existing state machine. A developer should also be able to +specify additional transitions and events for the machine with +minimum modifications to the existing code.
    • +
    +
    +
    +
    +

    Floating Point Utilities

    + +++ + + + + + + + + + +
    Author:Johan RÃ¥de
    Review Manager:Need Volunteer
    Download:Boost Sandbox Vault
    Description:

    The Floating Point Utilities library contains the following:

    +
      +
    • Floating point number classification functions: fpclassify, isfinite, +isinf, isnan, isnormal (Follows TR1)
    • +
    • Sign bit functions: signbit, copysign, changesign (Follows TR1)
    • +
    • Facets that format and parse infinity and NaN according to the C99 +standard (These can be used for portable handling of infinity and NaN +in text streams).
    • +
    +
    +
    +
    +

    Switch

    + +++ + + + + + + + + + +
    Author:Steven Watanabe
    Review Manager:Need Volunteer
    Download:Boost Sandbox Vault
    Description:The built in C/C++ switch statement is very efficient. Unfortunately, +unlike a chained if/else construct there is no easy way to use it when +the number of cases depends on a template parameter. The Switch library +addresses this issue.
    +
    +
    +

    Property Map (fast-track)

    + +++ + + + + + + + + + +
    Author:Andrew Sutton
    Review Manager:Jeremy Siek
    Download:http://svn.boost.org/svn/boost/sandbox/graph-v2
    Description:

    A number of additions and modifications to the Property Map Library, +including:

    +
      +
    • A constant-valued property map, useful for naturally unweighted +graphs.
    • +
    • A noop-writing property map, useful when you have to provide an +argument, but just don't care about the output.
    • +
    • See +ChangeLog +for details.
    • +
    +
    +
    +
    +

    Graph (fast-track)

    + +++ + + + + + + + + + +
    Author:Andrew Sutton
    Review Manager:Jeremy Siek
    Download:http://svn.boost.org/svn/boost/sandbox/graph-v2
    Description:

    A number of additions and modifications to the Graph Library, +including:

    +
      +
    • Two new graph classes (undirected and directed) which are intended +to make the library more approachable for new developers
    • +
    • A suite of graph measures including degree and closeness +centrality, mean geodesic distance, eccentricity, and clustering +coefficients.
    • +
    • An algorithm for visiting all cycles in a directed graph (Tiernan's +from 1970ish). It works for undirected graphs too, but reports cycles +twice (one for each direction).
    • +
    • An algorithm for visiting all the cliques a graph (Bron&Kerbosch). +Works for both directed and undirected.
    • +
    • Derived graph measures radius and diameter (from eccentricity) and +girth and circumference (from Tiernan), and clique number (from +Bron&Kerbosch).
    • +
    • An exterior_property class that helps hides some of the weirdness +with exterior properties.
    • +
    • runtime and compile-time tests for the new algorithms.
    • +
    • a substantial amount of documentation
    • +
    • Graph cores, implemented by David Gleich (@Stanford University)
    • +
    • Deterministic graph generators - capable of creating or inducing +specific types of graphs over a vertex set (e.g., star graph, wheel +graph, prism graph, etc). There are several other specific types that +could be added to this, but I haven't had the time just yet.
    • +
    +
    +
    +
    +

    Forward (fast-track)

    + +++ + + + + + + + + + +
    Author:Tobias Schwinger
    Review Manager:John Torjo
    Download:http://boost-consulting.com/vault/index.php?&direction=0&order=&directory=X-Files
    Description:A brute-force solution to the forwarding problem.
    +
    +
    +

    Singleton (fast-track)

    + +++ + + + + + + + + + +
    Author:Tobias Schwinger
    Review Manager:John Torjo
    Download:http://boost-consulting.com/vault/index.php?&direction=0&order=&directory=X-Files
    Description:Three thread-safe Singleton templates with an +easy-to-use interface.
    +
    +
    +

    Factory (fast-track)

    + +++ + + + + + + + + + +
    Author:Tobias Schwinger
    Review Manager:John Torjo
    Download:http://boost-consulting.com/vault/index.php?&direction=0&order=&directory=X-Files
    Description:Generic factories.
    +
    +
    +

    Lexer

    + +++ + + + + + + + + + +
    Author:Ben Hanson
    Review Manager:Need Volunteer
    Download:http://boost-consulting.com/vault/index.php?action=downloadfile&filename=boost.lexer.zip&directory=Strings%20-%20Text%20Processing&
    Description:A programmable lexical analyser generator inspired by 'flex'. +Like flex, it is programmed by the use of regular expressions +and outputs a state machine as a number of DFAs utilising +equivalence classes for compression.
    +
    +
    +

    Thread-Safe Signals

    + +++ + + + + + + + + + +
    Author:Frank Hess
    Review Manager:Need Volunteer
    Download:http://www.boost-consulting.com/vault/index.php?&direction=0&order=&directory=thread_safe_signals
    Description:A thread-safe implementation of Boost.signals that +has some interface changes to accommodate thread safety, mostly with +respect to automatic connection management.
    +
    +
    +

    Logging

    + +++ + + + + + + + + + +
    Author:John Torjo
    Review Manager:Need Volunteer
    Download:http://torjo.com/log2/
    Description:Used properly, logging is a very powerful tool. Besides aiding +debugging/testing, it can also show you how your application is +used. The Boost Logging Library allows just for that, supporting +a lot of scenarios, ranging from very simple (dumping all to one +destination), to very complex (multiple logs, some enabled/some +not, levels, etc). It features a very simple and flexible +interface, efficient filtering of messages, thread-safety, +formatters and destinations, easy manipulation of logs, finding +the best logger/filter classes based on your application's +needs, you can define your own macros and much more!
    +
    +
    +

    Flyweight

    + +++ + + + + + + + + + +
    Author:Joaquín M López Muñoz
    Review Manager:Need Volunteer
    Download:http://www.boost-consulting.com/vault/index.php?action=downloadfile&filename=flyweight.zip&directory=Patterns
    Description:Flyweights are small-sized handle classes granting +constant access to shared common data, thus allowing for the +management of large amounts of entities within reasonable memory +limits. Boost.Flyweight makes it easy to use this common +programming idiom by providing the class template flyweight<T>, +which acts as a drop-in replacement for const T.
    +
    +
    +

    Unordered Containers

    + +++ + + + + + + + + + +
    Author:Daniel James
    Review Manager:Need Volunteer
    Download:http://www.boost-consulting.com/vault/index.php?action=downloadfile&filename=unordered.zip&directory=Containers
    Description:An implementation of the unordered containers specified +in TR1, with most of the changes from the recent draft standards.
    +
    +
    +
    +

    Libraries under development

    +
    +

    Dataflow

    + +++ + + + + + + + +
    Author:Stjepan Rajko
    Description:The Dataflow library provides generic support for data +producers, consumers, and connections between the two. It also +provides layers for several specific dataflow mechanisms, namely +Boost.Signals, VTK data/display pipelines, and plain +pointers. The Dataflow library came out of the Signal Network +GSoC project, mentored by Doug Gregor.
    Status:I am polishing the Dataflow library for submission, and am expecting +to add it to the review queue in the next couple of months. +I am currently ironing out some faults in the design of the library, +filling in missing features, and testing it on / adapting it to +different dataflow mechanisms (currently VTK and soon +Boost.Iostreams). As soon as I'm pretty sure that things are going +the right way, I'll submit this to the review queue while I do the +finishing touches.
    +
    +
    +

    Constrained Value

    + +++ + + + + + + + + + +
    Author:Robert Kawulak
    Download:

    http://rk.go.pl/f/constrained_value.zip

    +

    http://rk.go.pl/r/constrained_value (Documentation)

    +
    Description:The Constrained Value library contains class templates +useful for creating constrained objects. The simplest example +of a constrained object is hour. The only valid values for an hour +within a day are integers from the range [0, 23]. With this library, +you can create a variable which behaves exactly like int, but does +not allow for assignment of values which do not belong to the +allowed range. The library doesn't focus only on constrained +objects that hold a value belonging to a specified range (i.e., +bounded objects). Virtually any constraint can be imposed using +appropriate predicate. You can specify what happens in case of +assignment of an invalid value, e.g. an exception may be thrown or +the value may be adjusted to meet the constraint criterions.
    Status:I'm planning to finish it in 1-2 months.
    +

    Please let us know of any libraries you are currently +developing that you intend to submit for review.

    +
    +
    +
    + + diff --git a/report-sep-2007.html b/report-sep-2007.html new file mode 100644 index 0000000..9bfc850 --- /dev/null +++ b/report-sep-2007.html @@ -0,0 +1,329 @@ + + + + + + +Review Wizard Status Report for September 2007 + + + +
    +

    Review Wizard Status Report for September 2007

    + +
    +

    News

    +
    +
    August 17, 2007 -- Time Series Accepted.
    +
    Announcement: http://lists.boost.org/boost-announce/2007/08/0142.php
    +
    July 24, 2007 -- Boost Version 1.34.1 Released.
    +
    This is a bug fix release addressing many problems with the 1.34.0 release. +Announcement: http://svn.boost.org/trac/boost/query?status=closed&milestone=Boost+1.34.1
    +
    +

    We need experienced review managers. Please take a look at the list +of libraries in need of managers and check out their descriptions. In +general review managers are active boost participants or library +contributors. If you can serve as review manager for any of them, +email Ron Garcia or John Phillips, "garcia at cs dot indiana dot edu" +and "jphillip at capital dot edu" respectively.

    +

    A link to this report will be posted to www.boost.org. +If you would like us to make any modifications or additions to this +report before we do that, please email Ron or John.

    +

    If you're library author and plan on submitting a library for review +in the next 3-6 months, send Ron or John a short description of your +library and we'll add it to the Libraries Under Construction below. +We know that there are many libraries that are near completion, but we +have hard time keeping track all of them. Please keep us informed +about your progress.

    +
    +
    +

    Review Queue

    +
    +
      +
    • Exception
    • +
    • Finite State Machines
    • +
    • Floating Point Utilities
    • +
    • Switch
    • +
    • Property Map (fast-track)
    • +
    • Graph (fast-track)
    • +
    +
    +
    +
    +

    Exception

    +
    + +++ + + + + + + + + + +
    Author:

    Emil Dotchevski

    +
    Review Manager:

    Need Volunteer

    +
    Download:

    http://www.revergestudios.com/boost-exception/boost-exception.zip

    +
    Description:

    The purpose of this library is to free designers of +exception classes from having to consider what data needs to be +stored in exception objects in order for the catch site to be +able to make sense of what went wrong.

    +

    When the exception class is used, arbitrary values can be stored +in any exception. This can be done directly in the +throw-expression, or at a later time as the exception object +propagates up the call stack. The ability to add data to any +exception object after it has been thrown is important, because +often some of the information needed to handle an exception is +unavailable at the time of the throw.

    +
    +
    +
    +
    +

    Finite State Machines

    +
    + +++ + + + + + + + + + +
    Author:

    Andrey Semashev

    +
    Review Manager:

    Martin Vuille

    +
    Download:

    Boost Sandbox Vault

    +
    Description:

    The Boost.FSM library is an implementation of FSM (stands for +Finite State Machine) programming concept. The main goals of the +library are:

    +
      +
    • Simplicity. It should be very simple to create state machines using +this library.
    • +
    • Performance. The state machine infrastructure should not be +very time and memory-consuming in order to be applicable in +more use cases.
    • +
    • Extensibility. A developer may want to add more states to an +existing state machine. A developer should also be able to +specify additional transitions and events for the machine with +minimum modifications to the existing code.
    • +
    +
    +
    +
    +
    +

    Floating Point Utilities

    +
    + +++ + + + + + + + + + +
    Author:

    Johan RÂde

    +
    Review Manager:

    Need Volunteer

    +
    Download:

    Boost Sandbox Vault

    +
    Description:

    The Floating Point Utilities library contains the following:

    +
      +
    • Floating point number classification functions: fpclassify, isfinite, +isinf, isnan, isnormal (Follows TR1)
    • +
    • Sign bit functions: signbit, copysign, changesign (Follows TR1)
    • +
    • Facets that format and parse infinity and NaN according to the C99 +standard. (These can be used for portable handling of infinity and NaN +in text streams.)
    • +
    +
    +
    +
    +
    +

    Switch

    +
    + +++ + + + + + + + + + +
    Author:Steven Watanabe
    Review Manager:Need Volunteer
    Download:Boost Sandbox Vault
    Description:The built in C/C++ switch statement is very efficient. Unfortunately, +unlike a chained if/else construct there is no easy way to use it when +the number of cases depends on a template parameter. The Switch library +addresses this issue.
    +
    +
    +
    +

    Property Map (fast-track)

    +
    + +++ + + + + + + + + + +
    Author:

    Andrew Sutton

    +
    Review Manager:

    Jeremy Siek

    +
    Download:

    http://svn.boost.org/svn/boost/sandbox/graph-v2

    +
    Description:

    A number of additions and modifications to the Property Map Library, +including:

    +
    +
      +
    • A constant-valued property map, useful for naturally unweighted +graphs.
    • +
    • A noop-writing property map, useful when you have to provide an +argument, but just don't care about the output.
    • +
    • See +ChangeLog +for details.
    • +
    +
    +
    +
    +
    +
    +

    Graph (fast-track)

    +
    + +++ + + + + + + + + + +
    Author:

    Andrew Sutton

    +
    Review Manager:

    Jeremy Siek

    +
    Download:

    http://svn.boost.org/svn/boost/sandbox/graph-v2

    +
    Description:

    A number of additions and modifications to the Graph Library, +including:

    +
      +
    • Two new graph classes (undirected and directed) which are intended +to make the library more approachable for new developers
    • +
    • A suite of graph measures including degree and closeness +centrality, mean geodesic distance, eccentricity, and clustering +coefficients.
    • +
    • An algorithm for visiting all cycles in a directed graph (Tiernan's +from 1970ish). It works for undirected graphs too, but reports cycles +twice (one for each direction).
    • +
    • An algorithm for visiting all the cliques a graph (Bron&Kerbosch). +Works for both directed and undirected.
    • +
    • Derived graph measures radius and diameter (from eccentricity) and +girth and circumference (from Tiernan), and clique number (from +Bron&Kerbosch).
    • +
    • An exterior_property class that helps hides some of the weirdness +with exterior properties.
    • +
    • runtime and compile-time tests for the new algorithms.
    • +
    • a substantial amount of documentation
    • +
    • Graph cores, implemented by David Gleich (@Stanford University)
    • +
    • Deterministic graph generators - capable of creating or inducing +specific types of graphs over a vertex set (e.g., star graph, wheel +graph, prism graph, etc). There are several other specific types that +could be added to this, but I haven't had the time just yet.
    • +
    +
    +
    +
    +
    +
    +

    Libraries under development

    +
    +

    Dataflow

    +
    + +++ + + + + + + + +
    Author:Stjepan Rajko
    Description:The Dataflow library provides generic support for data +producers, consumers, and connections between the two. It also +provides layers for several specific dataflow mechanisms, namely +Boost.Signals, VTK data/display pipelines, and plain +pointers. The Dataflow library came out of the Signal Network +GSoC project, mentored by Doug Gregor.
    Status:I am polishing the Dataflow library for submission, and am expecting +to add it to the review queue in the next couple of months. +I am currently ironing out some faults in the design of the library, +filling in missing features, and testing it on / adapting it to +different dataflow mechanisms (currently VTK and soon +Boost.Iostreams). As soon as I'm pretty sure that things are going +the right way, I'll submit this to the review queue while I do the +finishing touches.
    +
    +
    +
    +

    Constrained Value

    +
    + +++ + + + + + + + + + +
    Author:

    Robert Kawulak

    +
    Download:

    http://rk.go.pl/f/constrained_value.zip

    +

    http://rk.go.pl/r/constrained_value (Documentation)

    +
    Description:

    The Constrained Value library contains class templates +useful for creating constrained objects. The simplest example +of a constrained object is hour. The only valid values for an hour +within a day are integers from the range [0, 23]. With this library, +you can create a variable which behaves exactly like int, but does +not allow for assignment of values which do not belong to the +allowed range. The library doesn't focus only on constrained +objects that hold a value belonging to a specified range (i.e., +bounded objects). Virtually any constraint can be imposed using +appropriate predicate. You can specify what happens in case of +assignment of an invalid value, e.g. an exception may be thrown or +the value may be adjusted to meet the constraint criterions.

    +
    Status:

    I'm planning to finish it in 1-2 months.

    +
    +
    +

    Please let us know of any libraries you are currently +developing that you intend to submit for review.

    +
    +
    +
    + + diff --git a/requesting_new_features.htm b/requesting_new_features.htm deleted file mode 100644 index 5787ca4..0000000 --- a/requesting_new_features.htm +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - -Requesting New Features - - - - - - - - - - - - - -
    - boost.png (6897 bytes)Home - Libraries - PeopleFAQMore
    -

    Requesting new features for Boost libraries

    -

    If you have an idea for a feature or improvement to an existing Boost library -- go ahead and post it to either -boost-users list -or boost mailing list -(if you are posting for the first time, please read our -discussion policy -before you actually post).

    -

    You can also use our -feature request tracking facility at SourceForge, but experience has shown -that posting to either of the mailing lists is usually a more effective way to -get attention of boost developers.

    -

    If your proposal has its merits, it's very likely that it will generate a -constructive discussion that might actually result in (sometimes substantial) -improvement of the library - and your name being put on the library's - -Acknowledgements section!

    -
    -

    Revised 26 November, 2003 -

    - -

    © Copyright Aleksey Gurtovoy -2002

    -

    Distributed under the Boost Software License, Version 1.0. -(See accompanying file LICENSE_1_0.txt or -copy at www.boost.org/LICENSE_1_0.txt) -

    - - - - \ No newline at end of file diff --git a/separate_compilation.html b/separate_compilation.html deleted file mode 100644 index 3121aa4..0000000 --- a/separate_compilation.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - Guidelines for Authors of Boost Libraries Containing Separate Source - - - - - - - - -
    -

    C++ Boost

    -
    -

    Guidelines for Authors of Boost Libraries Containing Separate - Source

    -
    -
    -
    -

    These guidelines are designed for the authors of Boost libraries which have - separate source that need compiling in order to use the library. Throughout, - this guide refers to a fictitious "whatever" library, so replace all - occurrences of "whatever" or "WHATEVER" with your own library's name when - copying the examples.

    -

    Contents

    -
    -
    Changes Affecting Source Code -
    -
    -
    Preventing Compiler ABI Clashes
    Static - or Dymanic Libraries 
    Supporting Windows Dll's
    - Automatic Library Selection and Linking with auto_link.hpp -
    -
    -
    Changes Affecting the Build System -
    -
    -
    Creating the Library Jamfile
    Testing - Auto-linking
    -
    -
    Copyright
    -
    -

    Changes Affecting Source Code

    -

    Preventing Compiler ABI Clashes

    -

    There are some compilers (mostly Microsoft Windows compilers again!), which - feature a range of compiler switches that alter the ABI of C++ classes and - functions. By way of example, consider Borland's compiler which has the - following options:

    -
    -b    (on or off - effects enum sizes).
    --Vx   (on or off - empty members).
    --Ve   (on or off - empty base classes).
    --aX   (alignment - 5 options).
    --pX   (Calling convention - 4 options).
    --VmX  (member pointer size and layout - 5 options).
    --VC   (on or off, changes name mangling).
    --Vl   (on or off, changes struct layout). 
    -
    -

    These options are provided in addition to those affecting which runtime library - is used (more on which later); the total number of combinations of options can - be obtained by multiplying together the individual options above, so that gives - 2*2*2*5*4*5*2*2 = 3200 combinations! -

    -

    The problem is that users often expect to be able to build the Boost libraries - and then just link to them and have everything just plain work, no matter what - their project settings are. Irrespective of whether this is a reasonable - expectation or not, without some means of managing this issue, the user may - well find that their program will experience strange and hard to track down - crashes at runtime unless the library they link to was built with the same - options as their project (changes to the default alignment setting are a prime - culprit). One way to manage this is with "prefix and suffix" headers: these - headers invoke compiler specific #pragma directives to instruct the compiler - that whatever code follows was built (or is to be built) with a specific set of - compiler ABI settings.

    -

    Boost.config provides the macro BOOST_HAS_ABI_HEADERS which is set whenever - there are prefix and suffix headers available for the compiler in use, typical - usage in a header like this:

    -
    #ifndef BOOST_WHATEVER_HPP
    -#define BOOST_WHATEVER_HPP
    -
    -#include <boost/config.hpp>
    -
    -// this must occur after all of the includes and before any code appears:
    -#ifdef BOOST_HAS_ABI_HEADERS
    -#  include BOOST_ABI_PREFIX
    -#endif
    -//
    -// this header declares one class, and one function by way of examples:
    -//
    -class whatever
    -{
    -   // details.
    -};
    -
    -whatever get_whatever();
    -
    -// the suffix header occurs after all of our code:
    -#ifdef BOOST_HAS_ABI_HEADERS
    -#  include BOOST_ABI_SUFFIX
    -#endif
    -
    -#endif
    -
    -

    You can include this code in your library source files as well if you want, - although you probably shouldn't need to:  

    -
      -
    • - If you don't - use these in the library source files (but do in your library's headers) and - the user attempts to compile the library source with a non-default ABI setting, - then they will get compiler errors if there are any conflicts. -
    • - If you do include them in both the library's headers and the library - source files, then the code should always compile no matter what the compiler - settings used, although the result might not match what the user was expecting: - since we've forced the ABI back into default mode.
    -

    Rationale:

    -

    Without some means of managing this issue, users often report bugs along the - line of "Your silly library always crashes when I try and call it" and so on. - These issues can be extremely difficult and time consuming to track down, only - to discover in the end that it's a compiler setting that's changed the ABI of - the class and/or function types of the program compared to those in the - pre-compiled library. The use of prefix/suffix headers can minimize this - problem, although probably not remove it completely.

    -
    Counter Argument #1:
    -

    Trust the user, if they want 13-byte alignment (!) let them have it.

    -
    Counter Argument #2:
    -

    Prefix/suffix headers have a tendency to "spread" to other boost libraries - - for example if boost::shared_ptr<> forms part of your class's ABI, then - including prefix/suffix headers in your code will be of no use unless - shared_ptr.hpp also uses them. Authors of header-only boost libraries may not - be so keen on this solution - with some justification - since they don't face - the same problem.

    -

    Static or Dynamic Libraries

    -

    When the users runtime is dynamically linked the Boost libraries can be built - either as dynamic libraries (.so's on Unix platforms, .dll's on Windows) or as - static libraries (.a's on Unix, .lib's on Windows).  So we have a choice - as to which is supported by default:

    -
      -
    • - On Unix platforms it typically makes no difference to the code: the user just - selects in their makesfile which library they prefer to link to. -
    • - On Windows platforms, the code has to be specially annotated to support DLL's, - so we need to pick one option as the default and one as an alternative. -
    • - On Windows platforms, we can inject special code to automatically select which - library variant to link against: so again we need to decide which is to be the - default (see the section on auto-linking below).
    -

    The recomendation is to pick static linking by default.

    -

    Rationale:

    -

    There is no one policy that fits all here. -

    -

    The rationale for the current behaviour was inherited from Boost.Regex (and - it's ancestor regex++): this library originally used dynamic linking by - default whenever the runtime was dynamic. It's actually safer that way should - you be using regex from a dll for example. However, this - behavior brought a persistent stream of user complaints: mainly about - deployment, all asking if static linking could be the default. After regex - changed behavior the complaints stopped, and the author hasn't had one - complaint about static linking by default being the wrong choice.

    -

    Note that other libraries might need to make other choices: for example - libraries that are intended to be used to implement dll pluggin's would like - need to use dynamic linking in almost all cases.

    -

    Supporting Windows Dll's

    -

    On most Unix-like platforms no special annotations of source code are required - in order for that source to be compiled as a shared library because all - external symbols are exposed. However the majority of Windows compilers require - that symbols that are to be imported or exported from a dll, be prefixed with - __declspec(dllimport) or __declspec(dllexport). Without this mangling of source - code, it is not possible to correctly build shared libraries on Windows - (historical note - originally these declaration modifiers were required on - 16-bit Windows where the memory layout for exported classes was different from - that of "local" classes - although this is no longer an issue, there is still - no way to instruct the linker to "export everything", it also remains to be - seen whether 64-bit Windows will resurrect the segmented architecture that led - to this problem in the first place. Note also that the mangled names of - exported symbols are different from non-exported ones, so __declspec(dllimport) - is required in order to link to code within a dll).

    -

    In order to support the building of shared libraries on MS Windows your code - will have to prefix all the symbols that your library exports with a macro - (lets call it BOOST_WHATEVER_DECL) that your library will define to expand to - either __declspec(dllexport) or __declspec(dllimport) or nothing, depending - upon how your library is being built or used. Typical usage would look like - this:

    -
    #ifndef BOOST_WHATEVER_HPP
    -#define BOOST_WHATEVER_HPP
    -
    -#include <boost/config.hpp>
    -
    -#ifdef BOOST_HAS_DECLSPEC // defined in config system
    -// we need to import/export our code only if the user has specifically
    -// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
    -// libraries to be dynamically linked, or BOOST_WHATEVER_DYN_LINK
    -// if they want just this one to be dynamically liked:
    -#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_WHATEVER_DYN_LINK)
    -// export if this is our own source, otherwise import:
    -#ifdef BOOST_WHATEVER_SOURCE
    -# define BOOST_WHATEVER_DECL __declspec(dllexport)
    -#else
    -# define BOOST_WHATEVER_DECL __declspec(dllimport)
    -#endif  // BOOST_WHATEVER_SOURCE
    -#endif  // DYN_LINK
    -#endif  // BOOST_HAS_DECLSPEC
    -//
    -// if BOOST_WHATEVER_DECL isn't defined yet define it now:
    -#ifndef BOOST_WHATEVER_DECL
    -#define BOOST_WHATEVER_DECL
    -#endif
    -
    -//
    -// this header declares one class, and one function by way of examples:
    -//
    -class BOOST_WHATEVER_DECL whatever
    -{
    -   // details.
    -};
    -
    -BOOST_WHATEVER_DECL whatever get_whatever();
    -
    -#endif
    -
    - And then in the source code for this library one would use: -
     
    -// 
    -// define BOOST_WHATEVER SOURCE so that our library's 
    -// setup code knows that we are building the library (possibly exporting code), 
    -// rather than using it (possibly importing code): 
    -// 
    -#define BOOST_WHATEVER_SOURCE 
    -#include <boost/whatever.hpp> 
    -
    -// class members don't need any further annotation: 
    -whatever::whatever() { } 
    -// but functions do: 
    -BOOST_WHATEVER_DECL whatever get_whatever() 
    -{
    -   return whatever();
    -}
    -
    -

    Importing/exporting dependencies

    -

    As well as exporting your main classes and functions (those that are actually - documented), Microsoft Visual C++ will warn loudly and often if you try to - import/export a class whose dependencies are not also exported. Dependencies - include: any base classes, any user defined types used as data members, plus - all of the dependencies of your dependencies and so on. This causes particular - problems when a dependency is a template class, because although it is - technically possible to export these, it is not at all easy, especially if the - template itself has dependencies which are implementation-specific details. In - most cases it's probably better to simply suppress the warnings using:

    -
    #ifdef BOOST_MSVC
    -#  pragma warning(push)
    -#  pragma warning(disable : 4251 4231 4660)
    -#endif
    -
    -// code here
    -
    -#ifdef BOOST_MSVC
    -#pragma warning(pop)
    -#endif
    -
    -

    This is safe provided that there are no dependencies that are (template) - classes with non-constant static data members, these really do need exporting, - otherwise there will be multiple copies of the static data members in the - program, and that's really really bad. -

    -

    Historical note: on 16-bit Windows you really did have to export all - dependencies or the code wouldn't work, however since the latest Visual Studio - .NET supports the import/export of individual member functions, it's a - reasonably safe bet that Windows compilers won't do anything nasty - like - changing the class's ABI - when importing/exporting a class.

    -

    Rationale:

    -

    Why bother - doesn't the import/export mechanism take up more code that the - classes themselves?

    -

    A good point, and probably true, however there are some circumstances where - library code must be placed in a shared library - for example when the - application consists of multiple dll's as well as the executable, and more than - one those dll's link to the same Boost library - in this case if the library - isn't dynamically linked and it contains any global data (even if that data is - private to the internals of the library) then really bad things can happen - - even without global data, we will still get a code bloating effect. - Incidentally, for larger applications, splitting the application into multiple - dll's can be highly advantageous - by using Microsoft's "delay load" feature - the application will load only those parts it really needs at any one time, - giving the impression of a much more responsive and faster-loading application.

    -

    Why static linking by default? -

    -

    In the worked example above, the code assumes that the library will be - statically linked unless the user asks otherwise. Most users seem to prefer - this (there are no separate dll's to distribute, and the overall distribution - size is often significantly smaller this way as well: i.e. you pay for what you - use and no more), but this is a subjective call, and some libraries may even - only be available in dynamic versions (Boost.threads for example).

    -

    Automatic Library Selection and Linking with - auto_link.hpp

    -

    Many Windows compilers ship with multiple runtime libraries - for example - Microsoft Visual Studio .NET comes with 6 versions of the C and C++ runtime. It - is essential that the Boost library that the user links to is built against the - same C runtime as the program is built against. If that is not the case, then - the user will experience linker errors at best, and runtime crashes at worst. - The Boost build system manages this by providing different build variants, each - of which is build against a different runtime, and gets a slightly different - mangled name depending upon which runtime it is built against. For example the - regex libraries get named as follows when built with Visual Studio .NET 2003:

    -
    boost_regex-vc71-mt-1_31.lib
    -boost_regex-vc71-mt-gd-1_31.lib
    -libboost_regex-vc71-mt-1_31.lib
    -libboost_regex-vc71-mt-gd-1_31.lib
    -libboost_regex-vc71-mt-s-1_31.lib
    -libboost_regex-vc71-mt-sgd-1_31.lib
    -libboost_regex-vc71-s-1_31.lib
    -libboost_regex-vc71-sgd-1_31.lib
    -
    -

    The difficulty now is selecting which of these the user should link his or her - code to.

    -

    In contrast, most Unix compilers typically only have one runtime (or sometimes - two if there is a separate thread safe option). For these systems the only - choice in selecting the right library variant is whether they want debugging - info, and possibly thread safety. -

    -

    Historically Microsoft Windows compilers have managed this issue by providing a - #pragma option that allows the header for a library to automatically select the - library to link to. This makes everything automatic and extremely easy for the - end user: as soon as they include a header file that has separate source code, - the name of the right library build variant gets embedded in the object file, - and as long as that library is in the linker search path, it will get pulled in - by the linker without any user intervention.

    -

    Automatic library selection and linking can be enabled for a Boost library by - including the header <boost/config/auto_link.hpp>, after first defining - BOOST_LIB_NAME and, if applicable, BOOST_DYN_LINK.

    -
    //
    -// Automatically link to the correct build variant where possible. 
    -// 
    -#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_WHATEVER_NO_LIB) && !defined(BOOST_WHATEVER_SOURCE)
    -//
    -// Set the name of our library, this will get undef'ed by auto_link.hpp
    -// once it's done with it:
    -//
    -#define BOOST_LIB_NAME boost_whatever
    -//
    -// If we're importing code from a dll, then tell auto_link.hpp about it:
    -//
    -#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_WHATEVER_DYN_LINK)
    -#  define BOOST_DYN_LINK
    -#endif
    -//
    -// And include the header that does the work:
    -//
    -#include <boost/config/auto_link.hpp>
    -#endif  // auto-linking disabled
    -
    -

    The library's user documentation should note that the feature can be disabled - by defining either BOOST_ALL_NO_LIB or BOOST_WHATEVER_NO_LIB:

    -

    If for any reason you need to debug this feature, the header - <boost/config/auto_link.hpp> will output some helpful diagnostic messages - if you first define BOOST_LIB_DIAGNOSTIC.

    -

    Changes Affecting the Build System

    -

    Creating the library Jamfile

    -

    The Jamfile for building library "whatever" typically lives in - boost-root/libs/whatever/build, the only extra step required is to add a - <define> requirement to the library target so that your code knows - whether it's building a dll or static library, a typical Jamfile would like - like this:

    -
    -lib boost_regex : ../src/whatever.cpp : 
    -  <link>shared:<define>BOOST_WHATEVER_DYN_LINK=1 ;
    - 
    -

    Testing Auto-linking

    -

    Testing the auto-link feature is somewhat convoluted, and requires access - to a compiler that supports the feature: refer to - libs/config/test/link/test/Jamfile.v2 for an example.

    -
    -

    Revised - - 26 November, 2003

    -

    © Copyright John Maddock 1998- - 2003

    -

    Distributed under the Boost Software License, Version 1.0. (See accompanying - file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt)

    -

    The use of code snippets from this article does not require the reproduction - of this copyright notice and license declaration; if you wish to provide - attribution then please provide a link to this article.

    - - diff --git a/submission_process.htm b/submission_process.htm deleted file mode 100644 index 9a8108a..0000000 --- a/submission_process.htm +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -Boost Library Submission Process - - - - - - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    -

    Boost Library Submission Process

    -

    This page describes the process a library developer goes through to get a -library accepted by Boost.

    -

    See the Boost Library Requirements and Guidelines -page for issues of content.

    -

    Steps for getting a library accepted by Boost:

    - -

    Learn about Boost

    -

    Subscribe to the main developers mailing list for a -while, or look through the archives.  -Click around the web site.  Understand the Requirements.  -Read the rest of this page to learn about the process.  Otherwise, you will -just end up wasting everyone's time.

    -

    There is a culture associated with Boost, aimed at encouraging high quality -libraries by a process of discussion and refinement.

    -

    If what you really want is a site that will just post your library without -even looking at it, you should go elsewhere.

    -

    Determine interest

    -

    Potential library submitters should use the Boost developers mailing -list as a forum to gauge interest a possible submission.

    -

    A message might be as simple as "Is there any interest in a library -which solves Traveling Salesperson problems in linear time?"

    -

    A bit of further description or snippet of code may be helpful. Messages -should be plain text; not rich text, HTML, etc.

    -

    Please don't post lengthy descriptions, documentation, or code to the mailing -list, and no attachments, even small ones.  Please post lengthy material in -the Boost Vault

    -

    Preliminary submission

    -

    If response to an initial query indicates interest, then post the preliminary -submission files in the Boost Vault on -the sourceforge web site if you haven't already done so.

    -

    Refinement

    -

    Discuss, refine, resubmit.  Repeat until satisfied.

    -

    The exact details of this process varies a lot.  Sometimes it is public, -on the mailing list, sometimes a lot of discussion happens in private -emails.  For some libraries the process is over quickly, for others it goes -on for months.  It's often challenging, and sometimes leads off in -completely unexpected directions.  

    -

    The archive of past -messages is one way to see how this process worked for other Boost -libraries.

    -

    Submission for review 

    -

    All of the files which make up the library should be combined and compressed -into a single submission file using the .zip format.  Free encoders -and decoders for this format running on many different platforms are available -at the Info-ZIP web site, which -includes a FAQ and much other useful information about the .zip format. Many -commercial compressor-archiver utilities also support this format.

    -

    The submission file should contain material as if on the -boost.org web site.  The closer the submission file mirrors the final -directory -structure and format of the web site, the better. -

    Like a preliminary submission, post the final submission .zip file in the Boost Vault. -

    Formal Review

    -

    Before asking for formal review, your submission should be posted in the -Boost files/vault. Please verify that your submission compiles -and runs under at least two compilers.  This flushes out obvious -portability problems.  If you don't have access to a second compiler, ask -for help on the Boost mailing list.

    -

    Once a library author feels a submission (which presumably is now in the -files/vault) has matured enough for formal review, the author sends a message -requesting a formal review to the mailing list.  Please use a subject in -the form "Review Request: library" where library is replaced by -the library name.

    -

    See Formal Review Process for -details.

    -

    Formal Review schedules are posted on - the web site

    - -

    Boost web site posting

    -

    Once an accepted library is ready for inclusion on the Boost web site, the -submitter is typically given Boost CVS write access, and expected to check-in -and maintain the library in the CVS. Contact the moderators if you need write -access or CVS use isn't possible for you.

    -

    People page

    -

    If the boost.org web site doesn't already have your capsule biography -and  picture (optional, with not-too-serious pictures preferred), please -send them to the Boost webmaster. It is -up to you as to whether or not the biography includes your email address or -other contact information.  The preferred picture format is .jpg, but other -common formats are acceptable.  The preferred image size is 500x375 but the -webmaster has photo editing software and can do the image preparation if -necessary.

    -

    Lifecycle

    -

    Libraries are software; they lose their value over time if not maintained. -Postings on the Boost developers or users mailing lists can alert you to -potential maintenance needs; please plan to maintain your library over time. If -you no longer can or wish to maintain your library, please post a message on the -Boost developers mailing list and help someone else take over as the library -maintainer.

    -
    -

    Revised 26 November, 2003

    - -

    © Copyright Beman Dawes 2000

    -

    Distributed under the Boost Software License, Version 1.0. (See -accompanying file LICENSE_1_0.txt or copy -at http://www.boost.org/LICENSE_1_0.txt)

    - - - - diff --git a/test_policy.htm b/test_policy.htm deleted file mode 100644 index 3038800..0000000 --- a/test_policy.htm +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -Boost Test Policies and Protocols - - - - - - - - - - - - - -
    boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
    -

    Boost Test Policies and Protocols

    -

    The Boost libraries are intended to be both reliable and portable.  -Every experienced programmer knows that means each library must be tested against a suitable number of test cases, on a wide range of platforms, -and then tested again (regression tested) every time a change is made and before -every release. 

    -

    "Quality assurance based on a wide range of targeted tests" as one -of the key answers to C.A.R -Hoare's question -"How did software get so reliable without proof."

    -

    Regression test

    -

    Boost uses an automatic regression test suite which generates HTML -compiler -status tables.

    -

    Test Policy

    -

    Required

    -
      -
    • Every Boost library should supply one or more suitable test programs to be - exercised by the Boost regression test suite.  In addition to - the usual compile-link-run tests expecting successful completion, - compile-only or compile-and-link-only tests may be performed, and success - for the test may be defined as failure of the steps.
    • -
    • Test program execution must report errors by returning a non-zero value.  They - may also write to stdout or stderr, but that output should be relatively - brief.  Regardless of other output, a non-zero return value is the only - way the regression test framework will recognize an error has - occurred. Note that test programs to be included in the status tables must - compile, link, and run quickly since the tests are executed many, many, - times.
    • -
    • Libraries with time consuming tests should be divided into a - fast-execution basic test program for the status tables, and a separate - full-coverage test program for exhaustive test cases.  The basic test - should concentrate on compilation issues so that the status tables - accurately reflect the library's likelihood of correct compilation on a - platform.
    • -
    • If for any reason the usual test policies do not apply to a particular - library, an alternate test strategy must be implemented.
    • -
    • A Jamfile to drive the - regression tests for the library.   
    • -
    -

    Optional (but highly recommended)

    -

    The Boost Test Library provides many -useful components which ease the construction of test programs.

    -
      -
    • Use the library's - Test Tools for the construction of simple test - programs that do not need much structure.
    • -
    • Use the library's - Unit Test - Framework for the construction of more complex test programs that need to - be structured into individual tests - and test suites.
    • -
    -

    Suggested Protocol for Fixing Bugs or Adding Features.

    -
      -
    • First, add regression test cases that detects the bug or tests the - feature. Sometimes adding one case suggests similar untested cases, and they - are added too.
    • -
    • Second, for bugs, run the regression test and verify that the bug is now - detected.
    • -
    • Third, then, and only then, fix the bug or add the feature.
    • -
    • Finally, rerun the full regression tests - sometimes the change breaks - something else.
    • -
    -

    History

    -

    See Regression Test History.

    -

    Acknowledgements

    -

    Written by Beman Dawes. Jens Maurer, Paul Moore, Gary Powell and Jeremy Siek contributed helpful suggestions.

    -
    -

    Revised 08 January, 2004 -

    -

    © Copyright Beman Dawes 2001

    -

    Distributed under the Boost Software License, Version 1.0. (See -accompanying file LICENSE_1_0.txt or copy -at http://www.boost.org/LICENSE_1_0.txt)

    - - - - diff --git a/updating_the_website.html b/updating_the_website.html deleted file mode 100755 index 1ee97f5..0000000 --- a/updating_the_website.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - Updating The Boost Website - - - - - - - - - - - - - - - - - -
    -HomeLibrariesPeopleFAQMore
    - -

    Making Updates to the Boost Website Content

    - -

    Any boost developer can update the Boost website content between - releases.

    - -
      -
    • We strongly recommend the use of HTML Tidy when editing HTML and XHTML - files intented for the website. Using tidy helps in - preventing errors in the HTML, in keeping a clear revision history, and - in conforming to Web standards to help make the website readable by the - majority of people. The Boost web pages currently have a variety of - different types of HTML and XHTML content. Each needs to be dealt with - differently by tidy. Most pages are regular HTML 3.x/4.x, - for these use a tidy invocation of: -
      -tidy --tidy-mark no -i -wrap 78 -m some_page.html
      -
      Other pages are using the more recent XHTML 1.0 and XHTML 1.0 Strict -standards. Most notably this include the home -page. Some additional options are needed to make tidy -enforce the XHTML standard: -
      -tidy --tidy-mark no -i -wrap 78 -m -asxhtml some_page.html
      -
      That command is also useful if one is converting from HTML to XHTML. To -have tidy check for the XHTML 1.0 Strict format use: -
      -tidy --tidy-mark no -i -wrap 78 -m -asxhtml --doctype strict some_page.html
      -
      If you have a choice as to what format to use, prefer the XHTML 1.0 -Strict format as that opens the content to the widest audience. -
    • - -
    • If the change you are making is intended to be part of a release, you - should first make the change in our CVS repository, so it doesn't get - lost or overwritten by the next person that updates the page between - releases. Of course if you don't check in (say because the change is not - supposed to be in the next release), and someone else changes the page - after you, the change may be lost. This procedure does not account for - that case; you'll have to use your head and figure out what to do.
    • - -
    • You will upload the file(s) by scp'ing to the - appropriate subdirectory of - shell.sf.net:/home/groups/b/bo/boost/htdocs/. For example, - to update the page you are reading, I would issue -
      -scp updating_the_website.html david_abrahams@shell.sf.net:/home/groups/b/bo/boost/htdocs/more/
      -
      -
    • - -
    • It is crucial to ensure that you set group write permission on - every file you upload. If you don't do that, nobody else will be able to - change it, which is particularly deadly at release time. If you are on - Unix or Cygwin, you may be able to do that with a chmod command - before uploading the file. The absolutely failsafe thing to do is to - ssh into shell.sf.net and do the chmod there. - The files also need to have general read permission, and any - directories should have general execute permission and the "set user or - group ID on execution" (s) bit should also be set. If you're not - touching any directories, you can do it all with one command, e.g. -
      -ssh david_abrahams@shell.sf.net "chmod a+r,g+rw /home/groups/b/bo/boost/htdocs/more/updating_the_website.html"
      -
      -
    • -
    -
    - -

    Revised $Date$ -

    - -

    © Copyright David Abrahams 2005

    - -

    © Copyright Rene Rivera 2005

    - -

    Distributed under the Boost Software License, Version 1.0. (See - accompanying file LICENSE_1_0.txt or copy - at www.boost.org/LICENSE_1_0.txt)

    - - diff --git a/whos_using/Jamfile.v2 b/whos_using/Jamfile.v2 index 737c8b9..1cf60df 100644 --- a/whos_using/Jamfile.v2 +++ b/whos_using/Jamfile.v2 @@ -1,7 +1,7 @@ -# Copyright John Maddock 2005. Use, modification, and distribution are -# subject to the Boost Software License, Version 1.0. (See accompanying -# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# Copyright John Maddock 2005. Distributed under the +# Boost Software License, Version 1.0. (See accompanying file +# LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) using quickbook ; diff --git a/whos_using/using.qbk b/whos_using/using.qbk index 37c2086..a747c5d 100644 --- a/whos_using/using.qbk +++ b/whos_using/using.qbk @@ -1,4 +1,5 @@ [article Who's Using Boost? + [quickbook 1.4] [copyright 2005 Various Authors] [license Distributed under the Boost Software License, Version 1.0. @@ -10,7 +11,66 @@ [last-revision $Date$] ] -[section:intro] +[/ begin by defining some links to Boost libraries] + +[def __regex [@../../libs/regex/index.html Boost.Regex]] +[def __functional [@../../libs/functional/index.html Boost.Functional]] +[def __format [@../../libs/format/index.html Boost.Format]] +[def __function [@../../libs/function/index.html Boost.Function]] +[def __bind [@../../libs/bind/index.html Boost.Bind]] +[def __smart [@../../libs/smart_ptr/index.html Boost.SmartPointers]] +[def __date_time [@../../libs/date_time/index.html Boost.DateTime]] +[def __iterator [@../../libs/iterator/index.html Boost.Iterator]] +[def __thread [@../../libs/thread/index.html Boost.Thread]] +[def __preprocessor [@../../libs/preprocessor/index.html Boost.Preprocessor]] +[def __any [@../../libs/any/index.html Boost.Any]] +[def __tokenizer [@../../libs/tokenizer/index.html Boost.Tokenizer]] +[def __signals [@../../libs/signals/index.html Boost.Signals]] +[def __property_map [@../../libs/property_map/index.html Boost.PropertyMap]] +[def __array [@../../libs/array/index.html Array]] +[def __operators [@../../libs/utility/operators.htm Boost.Operators]] +[def __tuple [@../../libs/tuple/index.html Boost.Tuple]] +[def __random [@../../libs/random/index.html Boost.Random]] +[def __variant [@../../libs/variant/index.html Boost.Variant]] +[def __string_algo [@../../libs/algorithm/string/index.html Boost.StringAlgorithms]] +[def __mpl [@../../libs/mpl/index.html Boost.MPL]] +[def __type_traits [@../../libs/type_traits/index.html Boost.TypeTraits]] +[def __dyn_bitset [@../../libs/dynamic_bitset/index.html Boost.DynamicBitset]] +[def __enable_if [@../../libs/utility/enable_if.html Boost.EnableIf]] +[def __timer [@../../libs/timer/index.html Boost.Timer]] +[def __phoenix [@../../libs/spirit/phoenix/index.html Boost.Phoenix]] +[def __spirit [@../../libs/spirit/index.html Boost.Spirit]] +[def __pointer_cont [@../../libs/ptr_container/index.html Boost.PointerContainer]] +[def __serialization [@../../libs/serialization/index.html Boost.Serialization]] +[def __lambda [@../../libs/lambda/index.html Boost.Lambda]] +[def __lexical_cast [@../../libs/conversion/lexical_cast.htm Boost.LexicalCast]] +[def __tribool [@../../doc/html/tribool.html Boost.Tribool]] +[def __numeric_cast [@../../libs/conversion/cast.htm#numeric_cast Boost.NumericCast]] +[def __ref [@../../libs/bind/ref.html Boost.Ref]] +[def __mem_fun [@../../libs/bind/mem_fn.html Boost.MemFn]] +[def __static_assert [@../../libs/static_assert/index.html Boost.StaticAssert]] +[def __shared_ptr [@../../libs/smart_ptr/index.html Boost.SharedPointer]] +[def __assign [@../../libs/assign/index.html Boost.Assign]] +[def __crc [@../../libs/crc/index.html Boost.CRC]] +[def __file_system [@../../libs/filesystem/index.html Boost.FileSystem]] +[def __optional [@../../libs/optional/index.html Boost.Optional]] +[def __utility [@../../libs/utility/index.html Boost.Utility]] +[def __integer [@../../libs/integer/index.html Boost.Integer]] +[def __multi_index [@../../libs/multi_index/index.html Boost.MultiIndex]] +[def __program_options [@../../libs/program_options/index.html Boost.ProgramOptions]] +[def __range [@../../libs/range/index.html Boost.Range]] +[def __concept_check [@../../libs/concept_check/index.html Boost.ConceptCheck]] +[def __graph [@../../libs/graph/index.html Boost.Graph]] +[def __ublas [@../../libs/numeric/ublas/index.html Boost.Ublas]] +[def __python [@../../libs/python/doc/index.html Boost.Python]] +[def __conversion [@../../libs/conversion/index.html Boost.Conversion]] +[def __test [@../../libs/test/index.html Boost.Test]] +[def __rational [@../../libs/rational/index.html Boost.Rational]] +[def __asio [@../../libs/asio/index.html Boost.Asio]] +[def __bjam [@../../tools/build/v2/index.html Boost.Build]] +[def __gil [@../../libs/gil/doc/index.html Boost.GIL]] + +[section:intro Introduction] Open source isn't just for nerds and researchers. Real world programming challenges, irrespective of whether they are open or closed source, can benefit enormously from @@ -34,7 +94,8 @@ Boost has found it's way into many products that are available "off the shelf", including consumer applications from Adobe, through to business middleware from SAP. -[blurb [*Adobe Photoshop CS2]\n\n +[blurb [*Adobe Photoshop CS2] + [@http://www.adobe.com/products/photoshop/main.html Adobe Photoshop CS2] uses the [@http://opensource.adobe.com/ Adobe Software Libraries], which in @@ -43,268 +104,305 @@ Adobe Software Libraries] are being rolled out across the Adobe product line to provide cross platform user interface logic. ] -[blurb [*Adobe Indesign]\n\n +[blurb [*Adobe Indesign] + [@http://www.adobe.com/products/indesign/main.html Adobe Indesign] offers best of breed page design: Indesign and it's asociated SDK depend upon Boost -[@../../libs/regex/index.html Regex], -[@../../libs/functional/index.html Functional] and others. +__regex, __functional and others. ] -[blurb [*SAP NetWeaver]\n\n +[blurb [*SAP NetWeaver] + [@http://www.sap.com/solutions/netweaver/index.epx SAP NetWeaver] is the technical foundation of mySAP Business Suite solutions, SAP xApps composite applications, partner solutions, and customer -custom-built applications. [@../../libs/regex/index.html The Boost Regex library] +custom-built applications. __regex provides the regular expression implementation for SAP's [@https://www.sdn.sap.com/sdn/developerareas/abap.sdn?node=linkDnode6-3 ABAP language].] -[blurb [*Real Networks, Rhapsody]\n\n +[blurb [*Real Networks, Rhapsody] + The [@http://www.real.com/ Rhapsody Music Service] allows its subscribers to legally download/transfer/burn over a million songs. The Rhapsody client -software was built with many Boost libraries:\n\n -['"[@../../libs/format/index.html Format]: Boost.Format is top notch. Using it is a bliss.\n -[@../../libs/functional/index.html Functional], -[@../../libs/function/index.html Function], -and [@../../libs/bind/index.html Bind]: These three libraries, -along with smart pointer are the most used in our application. I could not imagine -not having them handy.\n -[@../../libs/smart_ptr/index.html Smart Pointer]: Hands down, the most useful, and used library of the lot!\n -[@../../libs/date_time/index.html Date Time]: Simple to use, effective, does the job. I love the +software was built with many Boost libraries: + +__format: Boost.Format is top notch. Using it is a bliss. + +__functional, +__function, +and __bind: These three libraries, +along with __smart are the most used in our application. I could not imagine +not having them handy. + +__smart: Hands down, the most useful, and used library of the lot! + +__date_time: Simple to use, effective, does the job. I love the flexible input string parsing facilities, and the -human readable ISO output.\n -[@../../libs/iterator/index.html Iterators]: Wow. Moving legacy iterating interfaces, or +human readable ISO output. + +__iterator: Wow. Moving legacy iterating interfaces, or interfaces that should of been properly designed as iterators to STL compliant iterators was easy and painless. The gains in functionality to our -code made by this library are invaluable.\n -[@../../libs/regex/index.html Regex]: When you need it, it works magic.\n -[@../../libs/thread/index.html Thread]: Used to implement the monitor pattern in key areas.\n -[@../../libs/preprocessor/index.html Preprocessor]: Used to implement repetitive unit-test +code made by this library are invaluable. + +__regex: When you need it, it works magic. + +__thread: Used to implement the monitor pattern in key areas. + +__preprocessor: Used to implement repetitive unit-test code generation. The codebase benefited -greatly from the clarity boost.preprocessor -brought."] +greatly from the clarity __preprocessor +brought. ] -[blurb [*McAfee, Managed VirusScan 3]\n\n +[blurb [*McAfee, Managed VirusScan 3] + [@http://www.mcafeesecurity.com/us/products/mcafee/smb/managed_services/managed_vs_smb.htm McAfee Managed VirusScan], is an always on, automatic virus protection for desktops -and servers.\n\n More details of the Boost libraries used can be found +and servers. + +More details of the Boost libraries used can be found [@http://betavscan.mcafeeasap.com/beta/docs/readme/Readme.html here].] -[blurb [*DataSolid GmbH Germany, CADdy++ Mechanical Design (c)]\n\n +[blurb [*DataSolid GmbH Germany, CADdy++ Mechanical Design (c)] + [@http://www.DataSolid.com CADdy++ Mechanical Design professional (c)] is a fully parametric 3D CAD application with unbroken link between 3D models and 2D drawings. CADdy++ uses the Boost libraries: -[@../../libs/any/index.html Any], -[@../../libs/tokenizer/index.html Tokenizer], -[@../../libs/signals/index.html Signals], -[@../../libs/property_map/index.html Property Map], -[@../../libs/array/index.html Array], -[@../../libs/bind/index.html Bind], -[@../../libs/utility/operators.htm Operators], -[@../../libs/tuple/index.html Tuple], -[@../../libs/random/index.html Random].\n\n +__any, +__tokenizer, +__signals, +__property_map, +__array, +__bind, +__operators, +__tuple, +__random. + ['"Many thanks to all the boost developers for their great work and effort spending into boost."]] -[blurb [*Dimension 5, Miner3D]\n\n - Data visualization technology enabling advanced data analysis, - visualization, sonification and speech applications for business and science.\n - The [@http://www.miner3D.com Miner3D] application provides means for interactive visual analysis of - arbitrary tabular data from various data sources. It has a powerful OpenGL-based - visualization engine and an intuitive GUI. This combination helps a human eye - guide the application of statistical tools and spot the patterns that - might otherwise remain hidden. +[blurb [*Dimension 5, Miner3D] + +Data visualization technology enabling advanced data analysis, +visualization, sonification and speech applications for business and science. + +The [@http://www.miner3D.com Miner3D] application provides means for interactive visual analysis of +arbitrary tabular data from various data sources. It has a powerful OpenGL-based +visualization engine and an intuitive GUI. This combination helps a human eye +guide the application of statistical tools and spot the patterns that +might otherwise remain hidden. + ['"We are using the following boost libraries: -[@../../libs/date_time/index.html Date Time], -[@../../libs/variant/index.html Variant], -[@../../libs/regex/index.html Regex], -[@../../libs/format/index.html Format], -[@../../libs/algorithm/string/index.html String Algorithms], -[@../../libs/smart_ptr/index.html Smart Pointers], -[@../../libs/mpl/index.html MPL], -[@../../libs/type_traits/index.html Type Traits], -[@../../libs/utility/operators.htm Operators], -[@../../libs/dynamic_bitset/index.html Dynamic Bitset], -[@../../libs/utility/enable_if.html Enable If], -[@../../libs/timer/index.html Timer]."] +__date_time, +__variant, +__regex, +__format, +__string_algo, +__smart, +__mpl, +__type_traits, +__operators, +__dyn_bitset, +__enable_if, +__timer."] ] -[blurb [*Synergy, mailIntercept]\n\n +[blurb [*Synergy, mailIntercept] + [@http://www.mintercept.com mailIntercept] from [@http://www.synergy.com.br Synergy] -is a mail interceptor service for Exchange Server 2000/2003.\n +is a mail interceptor service for Exchange Server 2000\/2003. + mailIntercept intercepts and interprets the e-mails from a LAN using Exchange Server and converts the microsoft proprietary format to MIME and passes them to an SMTP filter and returns the emails to the Exchange Server as modified by the SMTP filter, converted back to the microsoft proprietary format and with its -features preserved.\n\n +features preserved. + mailIntercept was built using the following Boost libraries: -[@../../libs/mpl/index.html MPL], -[@../../libs/algorithm/string/index.html String Algorithm], -[@../../libs/bind/index.html Bind], -[@../../libs/spirit/phoenix/index.html Phoenix], -[@../../libs/spirit/index.html Spirit], -[@../../libs/ptr_container/index.html Pointer Container], -[@../../libs/serialization/index.html Serialization], -[@../../libs/regex/index.html Regex], -[@../../libs/iterator/index.html Iterators], -[@../../libs/lambda/index.html Lambda], -[@../../libs/conversion/lexical_cast.htm Lexical Cast], -[@../../libs/utility/operators.htm Operators], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../doc/html/tribool.html Tribool] and -[@../../libs/type_traits/index.html Type Traits] +__mpl, +__string_algo, +__bind, +__phoenix, +__spirit, +__pointer_cont, +__serialization, +__regex, +__iterator, +__lambda, +__lexical_cast, +__operators, +__smart, +__tribool and +__type_traits ] -[blurb [*Integrated Research P/L, PROGNOSIS IP Telephony Manager and IP Telephony Express]\n\n - [@http://www.ir.com PROGNOSIS] is a suite of IP telephony management software products, - specifically designed to address the key challenges of IP telephony - life cycle management, including network-readiness, assessment, - pre-deployment assurance testing, and ongoing Day-2 management of - Cisco CallManager, Cisco Unity, and Cisco AVVID infrastructure. +[blurb [*Integrated Research P/L, PROGNOSIS IP Telephony Manager and IP Telephony Express] + +[@http://www.ir.com PROGNOSIS] is a suite of IP telephony management software products, +specifically designed to address the key challenges of IP telephony +life cycle management, including network-readiness, assessment, +pre-deployment assurance testing, and ongoing Day-2 management of +Cisco CallManager, Cisco Unity, and Cisco AVVID infrastructure. ['"The Boost libraries used were: -[@../../libs/any/index.html Any], - [@../../libs/bind/index.html Bind], - [@../../libs/function/index.html Function], - [@../../libs/conversion/lexical_cast.htm Lexical Cast], - [@../../libs/mpl/index.html MPL], - [@../../libs/conversion/cast.htm#numeric_cast Numeric Cast], - [@../../libs/bind/ref.html Ref], - [@../../libs/regex/index.html Regex], - [@../../libs/smart_ptr/index.html Smart Pointer], - [@../../libs/thread/index.html Thread], - [@../../libs/type_traits/index.html Type Traits]."] +__any, + __bind, + __function, + __lexical_cast, + __mpl, + __numeric_cast, + __ref, + __regex, + __smart, + __thread, + __type_traits."] ] -[blurb [*Kinook Software, Visual Build Professional]\n\n +[blurb [*Kinook Software, Visual Build Professional] + [@http://www.visualbuild.com/ Visual Build Professional] is a tool that enables developers, software process engineers, and build specialists to create an automated, repeatable process for building their software. Visual Build provides built-in support for Microsoft Visual Studio .NET and 2005, Visual Basic, Visual C++, Visual J++, SourceSafe, eMbedded Tools, -Borland Delphi, JBuilder, C++Builder, and more.\n\n +Borland Delphi, JBuilder, C++Builder, and more. + The following Boost Libraries were used: -[@../../libs/any/index.html Any], -[@../../libs/bind/mem_fn.html Mem_fn], -[@../../libs/regex/index.html Regex], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/static_assert/index.html Static Assert] +__any, +__mem_fun, +__regex, +__smart, +__static_assert ] -[blurb [*Kinook Software, Ultra Recall]\n\n +[blurb [*Kinook Software, Ultra Recall] + [@http://www.ultrarecall.com/ Ultra Recall] is a personal information management (PIM) / knowledge management (KM) application for Microsoft Windows. It helps you capture, organize, and recall all of your electronic information -across all the applications that you use.\n\n +across all the applications that you use. + Used the following Boost libraries: -[@../../libs/format/index.html Format], -[@../../libs/smart_ptr/index.html Shared Pointer], -[@../../libs/static_assert/index.html Static Assert] +__format, +__shared_ptr, +__static_assert ] -[blurb [*Applied Dynamics International, ADvantageDE]\n\n +[blurb [*Applied Dynamics International, ADvantageDE] + [@http://www.adi.com Applied Dynamics International (ADI)] provides state-of-the art software and hardware tools to the automotive, aerospace, and defense industries to design and test embedded control systems. ADI's tools provide advanced capabilities in real-time hardware-in-the-loop (HIL) simulation, rapid prototyping, and embedded controller software development. We have been a leading supplier of HIL simulation solutions -since 1957.\n\n +since 1957. + ADvantageDE is the development environment. It allows simulation models to be easily connected to one another or to hardware components for real-time simulation. ADvantageDE projects can be created for execution on your PC, -Unix workstation or on our real-time platforms.\n\n +Unix workstation or on our real-time platforms. + ADvantageVI is the point of control and the graphical user interface for all of the run-time activities. The run-time architecture includes extensive features for interacting with, visualizing, and automating simulation and -test activities.\n\n +test activities. + DasCom provides access to real-time simulation data from most Windows -applications, such as Micrsoft Excel, National Instruments Labview, etc.\n\n +applications, such as Micrsoft Excel, National Instruments Labview, etc. + The following Boost Libraries are used: -[@../../libs/array/index.html Array], -[@../../libs/assign/index.html Assign], -[@../../libs/bind/index.html Bind], -[@../../libs/crc/index.html CRC], -[@../../libs/dynamic_bitset/index.html Dynamic Bitset], -[@../../libs/utility/enable_if.html Enable If], -[@../../libs/filesystem/index.html File System], -[@../../libs/function/index.html Function], -[@../../libs/functional/index.html Functional], -[@../../libs/iterator/index.html Iterators], -[@../../libs/lambda/index.html Lambda], -[@../../libs/optional/index.html Optional], -[@../../libs/preprocessor/index.html Preprocessor], -[@../../libs/bind/ref.html Ref], -[@../../libs/regex/index.html Regex], -[@../../libs/serialization/index.html Serialization], -[@../../libs/signals/index.html Signals], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/static_assert/index.html Static Assert], -[@../../libs/spirit/index.html Spirit], -[@../../libs/algorithm/string/index.html String Algorithm], -[@../../libs/tokenizer/index.html Tokenizer] -[@../../libs/tuple/index.html Tuple], -[@../../libs/utility/index.html Uutility(Non-Copyable)] and -[@../../libs/variant/index.html Variant] +__array, +__assign, +__bind, +__crc, +__dyn_bitset, +__enable_if, +__file_system, +__function, +__functional, +__iterator, +__lambda, +__optional, +__preprocessor, +__ref, +__regex, +__serialization, +__signals, +__smart, +__static_assert, +__spirit, +__string_algo, +__tokenizer, +__tuple, +__utility and +__variant ] -[blurb [*PeerGuardian]\n\n +[blurb [*PeerGuardian] + [@http://methlabs.org/projects/peerguardian-2-windows/ PeerGuardian 2] is Methlabs premier IP blocker for Windows. With features like support for multiple lists, a list editor, automatic updates, and blocking all of IPv4 (TCP, UDP, ICMP, etc), -PeerGuardian 2 is the safest and easiest way to protect your privacy on P2P.\n\n -Boost Libraries used include -[@../../libs/crc/index.html CRC], -[@../../libs/bind/index.html Bind], -[@../../libs/integer/index.html Integer], -[@../../libs/function/index.html Function], -[@../../libs/functional/index.html Functional], -[@../../libs/smart_ptr/index.html Smart Pointers], -[@../../libs/conversion/lexical_cast.htm Lexical cast], -[@../../doc/html/string_algo.html String Algorithms], -[@../../libs/random/index.html Random], -[@../../libs/format/index.html Format], -[@../../libs/utility/index.html Utility].] +PeerGuardian 2 is the safest and easiest way to protect your privacy on P2P. + +Boost Libraries used include +__crc, +__bind, +__integer, +__function, +__functional, +__smart, +__lexical_cast, +__string_algo, +__random, +__format, +__utility.] + +[blurb [*DECOMSYS::DESIGNER PRO] -[blurb [*DECOMSYS::DESIGNER PRO]\n\n [@http://www.decomsys.com/ DECOMSYS::DESIGNER PRO] enables the user to design a highly complex [@http://www.flexray.com/ FlexRay] communication system, which is going to be the fundament for tomorrow's -automotive electronics.\n\n +automotive electronics. + ['"Boost Libraries used: -[@../../libs/bind/index.html Bind], -[@../../libs/dynamic_bitset/index.html Dynamic Bitset], -[@../../libs/format/index.html Format], -[@../../libs/function/index.html Function], -[@../../libs/iterator/index.html Iterators], -[@../../libs/mpl/index.html MPL], -[@../../libs/multi_index/index.html Multi Index], -[@../../libs/utility/utility.htm#Class_noncopyable Non-Copyable], -[@../../libs/utility/operators.htm Operators], -[@../../libs/preprocessor/index.html Preprocessor (nice for generating data for unit tests)], -[@../../libs/program_options/index.html Program Options (for the unit test programs)], -[@../../libs/bind/ref.html Ref], -[@../../libs/regex/index.html Regex], -[@../../libs/serialization/index.html Serialization], -[@../../libs/signals/index.html Signals], -[@../../libs/smart_ptr/index.html SmartPointer], -[@../../libs/spirit/index.html Spirit], -[@../../libs/timer/index.html Timer] and -[@../../libs/variant/index.html Variant]\n\n -We are also planning to use Andreas Huber's FSM library and Iostreams +__bind, +__dyn_bitset, +__format, +__function, +__iterator, +__mpl, +__multi_index, +__utility, +__operators, +__preprocessor (nice for generating data for unit tests), +__program_options (for the unit test programs), +__ref, +__regex, +__serialization, +__signals, +__smart, +__spirit, +__timer and +__variant] + +['"We are also planning to use Andreas Huber's FSM library and Iostreams (together with Serialize) once they are officially released."] ] -[blurb [*Wise Riddles Software, Audiomatic]\n\n +[blurb [*Wise Riddles Software, Audiomatic] + [@http://www.WiseRiddles.com/Audiomatic Audiomatic] is a tool used to make system-wide macros and then launch those macros with a voice command or keyboard shortcut at any time... from any @@ -312,35 +410,56 @@ Windows application. Audiomatic enables you to launch programs, files, or websites; simulate keystrokes; play sounds; speak text; or even run scripts. You can do it all with a voice command or keyboard shortcut! ['"Boost libraries Used: -[@../../libs/bind/index.html Bind], -[@../../libs/function/index.html Function], -[@../../libs/smart_ptr/index.html Smart Pointers], -[@../../libs/date_time/index.html Date Time], -[@../../libs/algorithm/string/index.html String Algorithm], -[@../../libs/utility/index.html Utility (Non-Copyable, Ref)], -[@../../libs/regex/index.html Regex], -[@../../libs/thread/index.html Thread], -[@../../libs/mpl/index.html MPL] and -[@../../libs/type_traits/index.html Type Traits]."] +__bind, +__function, +__smart, +__date_time, +__string_algo, +__utility, +__regex, +__thread, +__mpl and +__type_traits."] ] -[blurb [*Megahard Software Technologies Inc., Rule in Hell]\n\n +[blurb [*SMProcess FxEngine] + +The [@http://www.smprocess.com/Bin/FxEngineSetup.exe FxEngine] +from [@http://www.smprocess.com SMProcess] is a Free Framework for data flow processing and the +design of dynamic systems using plugins. The Framework provides a full +control to the plugin architecture for applications that require +custom solutions. + +The Framework is essentially based on three boost libraries: +__thread: Used to implement each "Pin" work. __thread includes +everything what we were looking for a portable framework like +mutex and condition components. +__functional and __bind: Provide a great flexibility compared to the STL. +__timer: A very straightforward and effective timer. + +] + +[blurb [*Megahard Software Technologies Inc., Rule in Hell] + [@http://www.ruleinhell.com Rule in Hell] is a -Massively Multiplayer Online Role Playing Game (still in beta).\n\n +Massively Multiplayer Online Role Playing Game (still in beta). + The Boost libraries used were: -[@../../libs/bind/index.html Bind], -[@../../libs/function/index.html Function], -[@../../libs/any/index.html Any], -[@../../libs/tuple/index.html Tuples], -[@../../libs/bind/ref.html Ref], -[@../../libs/smart_ptr/index.html Shared Pointer], -[@../../libs/type_traits/index.html Type Traits] and -[@../../libs/utility/utility.htm#Class_noncopyable Non-Copyable].\n\n -['"By far the combination of Bind, Function, Shared Pointer and Ref is what we use +__bind, +__function, +__any, +__tuple, +__ref, +__shared_ptr, +__type_traits and +__utility. + +['"By far the combination of __bind, __function, __shared_ptr and __ref is what we use most heavily".] ] -[blurb [*Dr. Detlef Meyer-Eltz, TextTransformer]\n\n +[blurb [*Dr. Detlef Meyer-Eltz, TextTransformer] + The [@http://www.texttransformer.com TextTransformer] is a Windows IDE for the generation of top down parsers with included c++ interpreter code for semantic actions. Both @@ -350,46 +469,51 @@ including as well the interpretable code as any arbitrary other code. Tokens are defined as POSIX regular expressions and rules are defined in a similar syntax quasi as regular expressions of regular expressions. The construction of parse trees and their traversal is -supported.\n\n -['"The TextTransformer is essentially based on the Boost Regex library, -by which the tokens for a parser can be defined. The Lexical Cast and +supported. + +['"The TextTransformer is essentially based on the __regex, +by which the tokens for a parser can be defined. The __lexical_cast and the Format library are used for the integrated c++ interpreter. For -the future also an interpreter version of the String Algorithm library is -planned. The Program Options library will be used too to improve the +the future also an interpreter version of the __string_algo is +planned. The __program_options library will be used too to improve the command line version of the texttransformer."] ] -[blurb [*Redshift Software, The Thot Tool]\n\n +[blurb [*Redshift Software, The Thot Tool] + [@http://thot-tool.com/ The Thot Tool] is an asset management tool for a group of game developers. Thot combines assets, both binary and text, with workflow automation into a unified whole, and was built using Boost -[@../../libs/thread/index.html Threads], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/regex/index.html Regex], -[@../../libs/mpl/index.html MPL], -and [@../../libs/type_traits/index.html Type Traits]. +__thread, +__smart, +__regex, +__mpl, +and __type_traits. ] -[blurb [*Paragent, Paragent Manage 2.1]\n\n +[blurb [*Paragent, Paragent Manage 2.1] + [@http://www.paragent.com/ Paragent Manage] is a Desktop Management Application that uses a lightweight agent written in C++. Unlike traditional desktop management solutions, Paragent Manage avoids the complexity and cost of servers by using peer-to-peer communication between agents and the administrative console. This allows real-time inventory searching, alerting and -software auditing in an easy-to-deploy and maintain package.\n\n +software auditing in an easy-to-deploy and maintain package. + ['"We have used Boost extensively throughout our agent, including: -[@../../libs/thread/index.html Thread], -[@../../libs/smart_ptr/index.html Shared Pointer], -[@../../libs/bind/index.html Bind], -[@../../libs/spirit/index.html Spirit], -[@../../libs/date_time/index.html Date Time], -[@../../libs/algorithm/string/index.html String Algorithms], -[@../../libs/multi_index/index.html Multi Index], -[@../../libs/filesystem/index.html Filesystem].\n\n -Apart from some read_write_mutex issues we had, Boost has been a +__thread, +__shared_ptr, +__bind, +__spirit, +__date_time, +__string_algo, +__multi_index, +__file_system.] + +['"Apart from some read_write_mutex issues we had, Boost has been a seamless part of our development, and has allowed us to develop and deploy a very complex, highly threaded networking agent with a built-in lisp-like xml-based scripting language all done in C++. Our entire @@ -397,14 +521,16 @@ development team would like to thank everyone for their hard work on behalf of C++ coders everywhere."] ] -[blurb [*LW-WORKS Software, Clipboard Recorder]\n\n +[blurb [*LW-WORKS Software, Clipboard Recorder] + [@http://www.lw-works.com/clipboard-recorder Clipboard Recorder] is an application that helps users to manage their clipboard history and provides easy ways for users to access their -saved clipboard data.\n\n +saved clipboard data. + Libraries used: -Smart Pointer, Serialization, Asio, String Algorithms, Bind, Thread, -Conversion/Cast, Iostreams. +__smart, __serialization, __asio, __string_algo, __bind, __thread, +__conversion, Iostreams. ] [endsect] @@ -419,31 +545,36 @@ Others are in highly specialized niche markets, ranging from probability theory astronomy, via mass spectroscopy: whatever your field of interest you'll find something of value in Boost. -[blurb [*Adobe Software Libraries]\n\n +[blurb [*Adobe Software Libraries] + The [@http://opensource.adobe.com/ Adobe Software Libraries] provide components for modeling the human interface appearance and behavior in a software application. The Adobe Software Libraries depend on many -parts of Boost including [@../../libs/any/index.html Any], -[@../../libs/bind/index.html Bind], [@../../libs/function/index.html Function], -[@../../libs/mpl/index.html MPL], [@../../libs/utility/operators.htm Operators], -[@../../libs/range/index.html Range], [@../../libs/static_assert/index.html Static Assertions], -[@../../libs/thread/index.html Threads], and [@../../libs/type_traits/index.html Type Traits].\n\n +parts of Boost including __any, +__bind, __function, +__mpl, __operators, +__range, __static_assert, +__thread, and __type_traits. + Currently Boost and the Adobe Software Libraries are in use in around 30 Adobe products. ] -[blurb [*LyX Document Editor]\n\n +[blurb [*LyX Document Editor] + [@http://www.lyx.org/ The LyX Document Editor] is an advanced open source document processor that encourages an approach to writing based on the structure of your documents, not their appearance. LyX produces high quality, professional output, -using LaTeX, an industrial strength typesetting engine.\n\n -LyX uses many parts of Boost, including [@../../libs/array/index.html Array], -[@../../libs/bind/index.html Bind], [@../../libs/regex/index.html Regex], -[@../../libs/type_traits/index.html Type Traits], -[@../../libs/function/index.html Function], -and [@../../libs/signals/index.html Signals].] +using LaTeX, an industrial strength typesetting engine. + +LyX uses many parts of Boost, including __array, +__bind, __regex, +__type_traits, +__function, +and __signals.] + +[blurb [*CodeSynthesis XML Schema to C++ Data Binding Compiler (XSD) by Code Synthesis Tools CC] -[blurb [*CodeSynthesis XML Schema to C++ Data Binding Compiler (XSD) by Code Synthesis Tools CC]\n\n [@http://codesynthesis.com/products/xsd/ CodeSynthesis XML Schema to C++ Data Binding Compiler (XSD)] is an open-source, cross-platform XML Data Binding implementation for C++. @@ -453,110 +584,177 @@ serialization code. You can then access the data stored in XML using types and functions that semantically correspond to your application domain rather than dealing with elements, attributes, and text in a direct representation of XML such as DOM or SAX. -\n\n -XSD uses the [@../../libs/regex/index.html Regex] and -[@../../libs/filesystem/index.html Filesystem] libraries from Boost. -[@../../libs/regex/index.html Regex] is used + +XSD uses __regex and +__file_system libraries from Boost. +__regex is used to perform transformations on file, type and member names. -[@../../libs/filesystem/index.html Filesystem] is used to +__file_system is used to capture and manipulate XML Schema include and import paths. Additionally, we are planning to provide an optional mapping of XML Schema date and time types to C++ types from the Boost -[@../../libs/date_time/index.html Date Time] library. +__date_time library. ] -[blurb [*CGAL]\n\n +[blurb [*CodeShop] + +I am happy to announce Amsterdam based [@http://www.code-shop.com CodeShop] +has been using Boost +since 2005 on all of it's projects (and CodeShop memebers have been +using Boost since 2001). + +We used it on the following: + +['OpenZoep] + +An open source voip stack (xmpp-sip/rtp/(port)audio/codecs), capable of +pc2pc calls and pc2pstn calls - it's a message based sdk, so you could +write your own Gtalk or Skype ... + +Boost is used everywhere: from the xmpp implementation (__function, +__asio) to the codecs-wrapper (__smart) - and more. +Boost made the code a lot easier, more fun, safer and faster to develop. +Bjam was used as build system. + +See [@http://www.code-shop.com/2007/1/14/openzoep description] +and [@http://www.code-shop.com/openzoep trac&svn]. + +['Abonja \/ Whitelabelvideo] + +Online videosharing platform: you can upload and watch flashvideo +online, but at the same time run your pc client and download all your +preferences automatically for viewing later at home + +Boost and C++ are used for the serverside tooling. Bjam is used as +build system. + +[@http://www.abonja.nl www.abonja.nl] and +[@www.whitelabelvideo.nl www.whitelabelvideo.nl] (Dutch only: a javascript sdk for viewing and +uploading - Boost is used serverside also). + +Code from above and other projects made available as plain download or +as library. + +Pieces address 'simple' problems like a windows registry wrapper to more +system like parts as for instance a drm implementation. Boost is used +all over (__filesystem, __thread, __asio, __spirit etc); +__bjam is used as build system. +] + +[blurb [*CGAL] + [@http://www.cgal.org/ CGAL] is the Computational Geometry Algorithms Library, an open source C++ library providing generic components such as triangulations, convex hulls algorithms, boolean operations of polygons and many other things. ['"We currently use the following Boost libraries : - [@../../libs/utility/operators.htm Operators], - [@../../libs/iterator/index.html Iterators], - [@../../libs/tuple/index.html Tuples], - [@../../libs/concept_check/index.html Concept Check], - [@../../libs/mpl/index.html MPL], - [@../../libs/bind/index.html Bind], - [@../../libs/optional/index.html Optional] and - [@../../libs/smart_ptr/index.html Smart Pointers]."] + __operators, + __iterator, + __tuple, + __concept_check, + __mpl, + __bind, + __optional and + __smart."] ] -[blurb [*ALPS]\n\n +[blurb [*ALPS] + [@http://alps.comp-phys.org/ ALPS] is an open source project to develop codes for the accurate simulation of quantum lattice models, such as quantum magnets, electronic systems and Bose-Einstein condensates. The main Boost libraries used are: -[@../../libs/graph/index.html Graph], -[@../../libs/random/index.html Random], -[@../../libs/multi_array/index.html Multi Array], -[@../../libs/program_options/index.html Program Options], -[@../../libs/conversion/lexical_cast.htm Lexical Cast], -[@../../libs/serialization/index.html Serialization], -[@../../libs/regex/index.html Regex], -[@../../libs/tuple/index.html Tuple], -[@../../libs/filesystem/index.html Filesystem], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/bind/index.html Bind], -[@../../libs/functional/index.html Functional] and -[@../../libs/type_traits/index.html Type Traits] +__graph, +__random, +__multi_index, +__program_options, +__lexical_cast, +__serialization, +__regex, +__tuple, +__file_system, +__smart, +__bind, +__functional and +__type_traits ] -[blurb [*SmartWin++]\n\n +[blurb [*SmartWin++] + [@http://smartwin.sourceforge.net/ SmartWin++] is a 100% free GUI library for developing Windows applications, it's free both as in "free beer" and as in "free speech", you can freely use SmartWin++ for commercial applications and for Open Source applications! ] -[blurb [*Open VRML]\n\n +[blurb [*Open VRML] + [@http://openvrml.org/ Open VRML] is a free cross-platform runtime for VRML. The basic OpenVRML distribution includes libraries you can use to add VRML support to an application, and Lookat, a simple stand-alone VRML browser. ] -[blurb [*Bayes++]\n\n +[blurb [*Bayes++] + [@http://bayesclasses.sourceforge.net/Bayes++.html Bayes++] is an open source library that represents and implements a wide variety of numerical algorithms for Bayesian Filtering of discrete systems from the [@http://www.acfr.usyd.edu.au/ Australian Centre for Field Robotics]. -Bayes++ makes particularly heavy use of [@../../libs/numeric/ublas/index.html the Boost Ublas library] +Bayes++ makes particularly heavy use of __ublas for matrix and numeric computations. ] -[blurb [*The C++/Tk Library]\n\n +[blurb [*Kohonen Neural Network Library (KNNL)] + +[@http://knnl.sourceforge.net/ Kohonen neural network library] +is a set of classes and functions for design, +train and use Kohonen networks (self organizing maps). + +KNNL Uses __bind, __function, __type_traits +__program_options. + +] + +[blurb [*The C++/Tk Library] + [@http://cpptk.sourceforge.net The C++/Tk Library] is an open source C++ interface to the Tk GUI Library. ] -[blurb [*GluCat]\n\n +[blurb [*GluCat] + [@http://glucat.sourceforge.net/ GluCat] is a library of template classes which model the universal Clifford algebras over the real or complex fields, with arbitrary dimension and arbitrary signature. ] -[blurb [*OpenMS]\n\n +[blurb [*OpenMS] + [@http://open-ms.sourceforge.net/main.html OpenMS] is an open source C++ library for LC/MS data management, reduction, evaluation, visualization, storage and sophisticated statistical analyses. It can be used to develop mass spectrometry related applications. ] -[blurb [*libpdf++]\n\n +[blurb [*libpdf++] + [@http://libpdfxx.sourceforge.net/doc/index.html libpdf++] is an object-oriented library for generating PDF (portable document format) files. It is designed in a way that the objects in the document are mapped directly to classes in the library. ] -[blurb [*Regina]\n\n +[blurb [*Regina] + [@http://regina.sourceforge.net/ Regina] is a suite of mathematical software for 3-manifold topologists. It focuses upon the study of 3-manifold triangulations and includes support for normal surfaces and angle structures. ] -[blurb [*MetaFS]\n\n +[blurb [*MetaFS] + [@http://metafs.sourceforge.net/ MetaFS] is a daemon for Linux (and Linux only) that allows you to access information about your files (such as MP3 tags or JPEG's EXIF tags) easily and consistently @@ -565,13 +763,15 @@ using this information. MetaFS is extensible, so anyone can write plug-ins to access new types of metadata. ] -[blurb [*The ASN.1 Tool]\n\n +[blurb [*The ASN.1 Tool] + Abstract Syntax Notation One (ASN.1) is a formal language for abstractly describing messages to be exchanged among an extensive range of applications involving the Internet, intelligent network, cellular phones, ground-to-air communications, electronic commerce, secure electronic services, interactive television, intelligent transportation -systems, Voice Over IP and others. \n\n +systems, Voice Over IP and others. + [@http://iiiasn1.sourceforge.net/main.html The ASN.1 Tool] includes two parts : an ASN.1 compiler "asnparser" which compiles the Abstract Syntax to c++ files, and a runtime library which is used to link with the c++ files generated by @@ -579,60 +779,71 @@ asnparser. Based on the works of Open H.323 projects, it is developed for the needs of H.450 series protocol. ] -[blurb [*DGD]\n\n +[blurb [*DGD] + [@http://dgd.sourceforge.net/dgd_home.html DGD] (Depression Glass Debug) is simple, easy to use C++ ostream extension created with a goal to produce nice, readable and easy to understand trace logs] -[blurb [*FEAR]\n\n +[blurb [*FEAR] + [@http://fear.sourceforge.net/ FEAR] is a language independent open-source project providing portable support for the creation of genuine Artificial Intelligence within realistic simulated worlds.] -[blurb [*XEngine]\n\n +[blurb [*XEngine] + [@http://xengine.sourceforge.net/features.php XEngine] is a platform- and rendering-API-independent 3D engine for real-time visualization with support for programmable graphics pipeline architectures and is implemented in C++.] -[blurb [*Spheral++]\n\n +[blurb [*Spheral++] + [@http://spheral.sourceforge.net/ Spheral++] is a numerical tool for simulating the evolution of a set of fluid or solid materials subject to hydrodynamic, gravitational, and radiative effects. -Spherical++ uses [@../../libs/python/doc/index.html the Boost Python library].] +Spherical++ uses __python.] + +[blurb [*C++ XML Objects] -[blurb [*C++ XML Objects]\n\n [@http://cppxmlobj.sourceforge.net/ C++ XML Objects] is a framework for persisting hierarchies of C++ objects to and from XML.] -[blurb [*HippoDraw]\n\n +[blurb [*HippoDraw] + [@http://www.slac.stanford.edu/grp/ek/hippodraw/index.html HippoDraw] provides a highly interactive data analysis environment. -HippoDraw uses [@../../libs/python/doc/index.html the Boost Python library].] +HippoDraw uses __python.] + +[blurb [*Orocos] -[blurb [*Orocos]\n\n [@http://people.mech.kuleuven.ac.be/~psoetens/orocos/doc/orocos-control-manual.html The Orocos Robot Control Software Application Framework].] -[blurb [*ECell]\n\n +[blurb [*ECell] + The [@http://www.e-cell.org/ E-Cell Project] is an international research project aiming at developing necessary theoretical supports, technologies and software platforms to allow precise whole cell simulation.] -[blurb [*VCS Made Easy]\n\n +[blurb [*VCS Made Easy] + [@http://vcsme.sourceforge.net/ VCS Made Easy], or vcsme for short, is an utility whose main purpose is to simplify the maintenance of file trees managed by a version control system, such as the well known CVS or Subversion. Simply put, it automates the process of bringing all these directories to an up-to-date -status with a single and simple command.\n\n +status with a single and simple command. + ['"The following Boost libraries were used: -[@../../libs/format/index.html Format], -[@../../libs/smart_ptr/index.html Smart Pointers], -[@../../libs/utility/index.html Utility (noncopyable)] and -[@../../libs/filesystem/index.html Filesystem]."] +__format, +__smart, +__utility and +__file_system."] ] -[blurb [*Monotone]\n\n +[blurb [*Monotone] + [@http://www.venge.net/monotone/ Monotone] is a free distributed version control system. It provides a simple, single-file transactional version store, with fully disconnected @@ -641,63 +852,71 @@ is a free distributed version control system. It provides code review and 3rd party testing. It uses cryptographic version naming and client-side RSA certificates. It has good internationalization support, has no external dependencies, runs on linux, solaris, OSX, windows, and - other unixes, and is licensed under the GNU GPL.\n\n + other unixes, and is licensed under the GNU GPL. + ['"The followind Boost libraries were used: -[@../../libs/date_time/index.html Date Time], -[@../../libs/filesystem/index.html Filesystem], -[@../../libs/conversion/index.html Conversion], -[@../../libs/optional/index.html Optional], -[@../../libs/random/index.html Random], -[@../../libs/regex/index.html Regex], -[@../../libs/smart_ptr/index.html Smart Pointers], -[@../../libs/static_assert/index.html Static Assertions], -[@../../libs/tokenizer/index.html Tokenizer], -[@../../libs/tuple/index.html Tuple] and -[@../../libs/test/index.html Test]."] +__date_time, +__file_system, +__conversion, +__optional, +__random, +__regex, +__smart, +__static_assert, +__tokenizer, +__tuple and +__test."] ] -[blurb [*Hydranode Engine]\n\n +[blurb [*Hydranode Engine] + [@http://hydranode.com/ Hydranode Engine] is a plugin-driven P2P client engine that relies heavily on Boost libraries. Hydranode codebase is licenced under GNU GPL, and is developed mainly by Alo Sarv. Currently in Beta phase, Hydranode runs on wide range of platforms, including Windows, Linux, -BSD, Mac OS, Solaris etc.\n\n +BSD, Mac OS, Solaris etc. + ['"Hydranode Engine and plugins rely heavily on the following Boost -libraries: Bind, Function, Lambda, MultiIndex, Signals, Threads, -Smart Pointer, Format, Lexical Cast. Other Boost libraries being used -include FileSystem, String Algorithm, Date Time, Program Options, Spirit, -Random, Tokenizer, Type Traits, Tribool, Tuple and Any. Once Boost 1.33 +libraries: __bind, __function, __lambda, __multi_index, __signals, Threads, +__smart, Format, __lexical_cast. Other Boost libraries being used +include __file_system, __string_algo, __date_time, __program_options, __spirit, +__random, __tokenizer, __type_traits, __tribool, __tuple and __any. Once Boost 1.33 is released, I'm also looking forward to using the Boost Iostreams library -in Hydranode.\n\n -All complex data structures in Hydranode are implemented using -Multi Index containers, which significantly reduced development time +in Hydranode.] + +['"All complex data structures in Hydranode are implemented using +__multi_index containers, which significantly reduced development time and kept code clean. Format is being used for all text formatting. -Having Threads and FileSystem libraries available made cross-platform +Having __thread and __file_system libraries available made cross-platform development lot easier in those areas."] ] -[blurb [*Hugin]\n\n +[blurb [*Hugin] + With [@http://hugin.sourceforge.net/ hugin] you can assemble a mosiac of photographs into a complete immersive panorama, stitch any series of overlapping pictures and much more.] -[blurb [*Enblend]\n\n +[blurb [*Enblend] + [@http://enblend.sourceforge.net/ Enblend] is a tool for compositing images. Given a set of images that overlap in some irregular way, Enblend overlays them in such a way that the seam between the images is invisible, or at least very difficult to see.] -[blurb [*GNU Source-highlight]\n\n +[blurb [*GNU Source-highlight] + [@http://www.gnu.org/software/src-highlite/source-highlight.html GNU Source-highlight], given a source file, produces a document with syntax highlighting. The colors and the styles can be specified (bold, italics, underline) by means of a configuration file, and some other options can be specified at the command line. The output format can be HTML, XHTML and ANSI color escape sequences. GNU Source Highlight -is build around [@../../libs/regex/index.html the Boost Regex library]] +is build around __regex] + +[blurb [*Luabind] -[blurb [*Luabind]\n\n [@http://luabind.sourceforge.net/ Luabind] is a library that helps you create bindings between C++ and lua. It has the ability to expose functions and classes, written in C++, to lua. It will also supply the functionality to define classes @@ -705,59 +924,68 @@ in lua and let them derive from other lua classes or C++ classes. Lua classes can override virtual functions from their C++ baseclasses. It is written towards lua 5.0, and does not work with lua 4.] -[blurb [*C++/Tcl]\n\n +[blurb [*C++/Tcl] + [@http://cpptcl.sourceforge.net/ C++/Tcl] is a library that allows the easy integration of C++ and Tcl.] -[blurb [*QuantLib]\n\n +[blurb [*QuantLib] + The [@http://quantlib.org/ QuantLib] project provides a comprehensive software -framework for quantitative finance. QuantLib is a free/open-source library +framework for quantitative finance. QuantLib is a free\/open-source library for modeling, trading, and risk management in real-life. Boost components used include -[@../../libs/smart_ptr/index.html Smart Pointers], -[@../../libs/iterator/index.html Iterators], -and [@../../libs/test/index.html the Test Framework]. +__smart, +__iterator, +and __test. ] -[blurb [*CBCanaylzer]\n\n +[blurb [*CBCanaylzer] + [@http://www.biozentrum.uni-wuerzburg.de/index.php?id=524 CBCanaylzer] is developed by the Department of Bioinformatics, -at the University of Wuerzburg.\n\n +at the University of Wuerzburg. + ['"CBCAnalyzer (CBC = compensatory base change) is a tool to create ``small'' phylogenetic trees from sequence alignments. To measure the distance of sequences the compensatory base changes are detected and counted. The bionj algorithm is then used to construct a tree. CBCAnalyzer is available on -Windows, Linux and partly works on MacOSX. \n\n -Boost libraries used: - [@../../libs/program_options/index.html Program Options] +Windows, Linux and partly works on MacOSX. ] + +['"Boost libraries used: + __program_options - creates really nice output, and is both easy to extend and simple to handle. - [@../../libs/iterator/index.html Iterator], - [@../../libs/spirit/index.html Spirit] + __iterator, + __spirit - Saved a lot of my time, and makes the vast amount of biological file formats simple to support, - [@../../libs/smart_ptr/index.html Shared Pointer], - [@../../libs/lambda/index.html Lambda].] + __shared_ptr, + __lambda.] ] -[blurb [*Profdist]\n\n +[blurb [*Profdist] + [@http://www.biozentrum.uni-wuerzburg.de/index.php?id=523 Profdist] -is developed by the Department of Bioinformatics, at the University of Wuerzburg.\n\n +is developed by the Department of Bioinformatics, at the University of Wuerzburg. + ['"Profdist is a tool for the construction of large phylogenetic trees based on profile distances. The input alignment data gets extended by random picking of rows, and a clustering technique is used to create profiles of the most frequent subtrees. The iterative approach allows working on large datasets. Currently the application is very limited by the quality of -wxWidgets, and only available for Windows and Linux. \n\n -The Boost librarie used were: - [@../../libs/algorithm/string/index.html String Algorithms], - [@../../libs/bind/ref.html Ref], - [@../../libs/iterator/index.html Iterator], - [@../../libs/spirit/index.html Spirit], - [@../../libs/smart_ptr/index.html Shared Pointer] and - [@../../libs/lambda/index.html Lambda]."] +wxWidgets, and only available for Windows and Linux. ] + +['"The Boost librarie used were: + __string_algo, + __ref, + __iterator, + __spirit, + __shared_ptr and + __lambda."] ] -[blurb [*The Yake Engine]\n\n +[blurb [*The Yake Engine] + [@http://www.yake.org/ The Yake Engine] is a component-based, object-oriented engine written in C++ and primarily designed for VR applications and games. It abstracts typical @@ -765,17 +993,20 @@ low-level and middleware APIs and provides various low, mid and application level functionality as well as tools to create and import content. ] -[blurb [*Python-Ogre]\n\n +[blurb [*Python-Ogre] + [@http://python-ogre.python-hosting.com/ Python-Ogre] is a Python bindings for Ogre 3D - a scene-oriented, -flexible 3D engine.\n -Python-Ogre uses Boost.Python to expose next libraries to Python:\n - * Ogre\n - * Newton\n - * ODE\n - * OgreAL\n - * CEGUI\n - * OIS\n +flexible 3D engine. + +Python-Ogre uses __python to expose next libraries to Python: + +* Ogre\n +* Newton\n +* ODE\n +* OgreAL\n +* CEGUI\n +* OIS\n ] [endsect] @@ -786,147 +1017,184 @@ Whether you're a government department, an internet startup, or a specialist con developement using the Boost Libraries can significantly shorten your development cycles. -[blurb [*Google]\n\n +[blurb [*Google] + [@http://code.google.com/p/google-gtags/ google-gtags] Provides server-based tags serving for large codebases. This is an extension to GNU Emacs and X-Emacs -TAGS functionality, that uses [@../../libs/test/index.html Boost.Test] as its +TAGS functionality, that uses __test as its unit test framework. ] -[blurb [*LiquidNet]\n\n +[blurb [*LiquidNet] + [@http://www.liquidnet.com/ LiquidNet] is Americas number one electronic marketplace for large block trading, and the 5th fastest growing company -according to Inc Magazine. \n\n -"['Boost Libraries most used, in order of importance:\n -[@../../libs/smart_ptr/index.html Shared Pointer], -[@../../libs/bind/index.html Bind], -[@../../libs/python/doc/index.html Python], -[@../../libs/conversion/lexical_cast.htm Lexical Cast], -[@../../libs/optional/index.html Optional], -[@../../libs/any/index.html Any] and -[@../../libs/tuple/index.html Tuple]] +according to Inc Magazine. + +"['Boost Libraries most used, in order of importance:] + +['"__shared_ptr, +__bind, +__python, +__lexical_cast, +__optional, +__any and +__tuple] ] -[blurb [*MetOcean Engineers]\n\n +[def __oce Oc'''é'''] + +[blurb [*__oce-Technologies B.V.] + +Throughout the world +[@http://www.oce.com __oce] is one of the major suppliers of document +management and printing systems and the related services. We develop, +manufacture, service and sell printers, scanners, peripheral +equipment and media, supported by unique software. __oce +products for the corporate and commercial market are widely known for +their quality, ease of use, speed and reliability. + +The Boost libraries enable us to get a higher degree of uniformity and +quality in our code. During a redesign last year we found that lots of +small constructions from Boost shortens development time and prevents +having to reinvent many wheels. Libraries that we use include +__assign, __date_time, __enable_if, __file_system, __format, __function, __iterator, +__multi_index, __operators, __optional, __pointer_cont, __signals, __smart, +__thread, and __variant. +] + +[blurb [*MetOcean Engineers] + [@http://www.metoceanengineers.com MetOcean Engineers] are a leading consultancy providing oceanographic and meteorological services in support of coastal and ocean engineering and environmental protection. Core activities encompass: oceanographic measurements; metocean monitoring systems; coastal and ocean engineering; environmental -consultancy; data management.\n\n +consultancy; data management. + Boost Libraries currently in use: -[@../../libs/any/index.html Any], -[@../../libs/assign/index.html Assign], -[@../../libs/bind/index.html Bind], -[@../../libs/date_time/index.html Date Time], -[@../../libs/iterator/index.html Iterators], -[@../../libs/conversion/lexical_cast.htm Lexical Cast], -[@../../libs/mpl/index.html MPL], -[@../../libs/spirit/phoenix/index.html Phoenix], -[@../../libs/program_options/index.html Program Options], -[@../../libs/bind/ref.html Ref], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/spirit/index.html Spirit], -[@../../libs/algorithm/string/index.html String Algorithm], -[@../../doc/html/tribool.html Tribool] and -[@../../libs/variant/index.html Variant] +__any, +__assign, +__bind, +__date_time, +__iterator, +__lexical_cast, +__mpl, +__phoenix, +__program_options, +__ref, +__smart, +__spirit, +__string_algo, +__tribool and +__variant ] -[blurb [*TeraView Ltd]\n\n +[blurb [*TeraView Ltd] + [@http://www.teraview.com TeraView Ltd] develop terahertz based systems for a variety of applications -including spectroscopy and imaging.\n\n +including spectroscopy and imaging. + ['"We use: -[@../../libs/thread/index.html Thread], -[@../../libs/filesystem/index.html Filesystem], -[@../../libs/date_time/index.html Date Time], -[@../../libs/serialization/index.html Serialization], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/function/index.html Function], -[@../../libs/bind/index.html Bind], -[@../../libs/iterator/index.html Iterator], -[@../../libs/conversion/lexical_cast.htm Lexical Cast], -[@../../libs/format/index.html Format], -[@../../libs/tuple/index.html Tuple], -[@../../libs/any/index.html Any] and -[@../../libs/optional/index.html Optional]"] +__thread, +__file_system, +__date_time, +__serialization, +__smart, +__function, +__bind, +__iterator, +__lexical_cast, +__format, +__tuple, +__any and +__optional"] ] -[blurb [*NPC International]\n\n +[blurb [*NPC International] + With about 800 restaurants, [@http://www.npcinternational.com NPC International] -is the world's largest Pizza Hut franchisee.\n\n +is the world's largest Pizza Hut franchisee. + ['"We make extensive use of boost in our internally developed point of sale, restaurant management, communications, and accounting systems. We use the following Boost libraries in approximate order of frequency of use: -[@../../libs/bind/index.html Bind], -[@../../libs/function/index.html Function], -[@../../libs/optional/index.html Optional], -[@../../libs/smart_ptr/index.html Shared Pointer], -[@../../libs/date_time/index.html Date Time], -[@../../libs/thread/index.html Thread], -[@../../libs/lambda/index.html Lambda], -[@../../libs/type_traits/index.html Type Traits], -[@../../libs/mpl/index.html MPL], -[@../../libs/tuple/index.html Tuple], -[@../../libs/utility/enable_if.html Enable If], -[@../../libs/variant/index.html Variant], -[@../../libs/spirit/index.html Spirit], -[@../../libs/algorithm/string/index.html String Algorithm], -[@../../libs/preprocessor/index.html Preprocessor], -[@../../libs/filesystem/index.html Filesystem], -[@../../libs/utility/operators.htm Operator], -[@../../libs/iterator/index.html Iterators] and -[@../../libs/tokenizer/index.html Tokenizer]."] +__bind, +__function, +__optional, +__shared_ptr, +__date_time, +__thread, +__lambda, +__type_traits, +__mpl, +__tuple, +__enable_if, +__variant, +__spirit, +__string_algo, +__preprocessor, +__file_system, +__operators, +__iterator and +__tokenizer."] ] -[blurb [*Rational Discovery LLC]\n\n +[blurb [*Rational Discovery LLC] + [@http://www.rationaldiscovery.com Rational Discovery] provides computational modeling, combinatorial library design and custom software development services to the -pharmaceutical, biotech and chemical industries.\n\n +pharmaceutical, biotech and chemical industries. + ['"We do a substantial amount of internal research to develop new approaches for applying machine-learning techniques to solve chemical problems. Because we're a small organization and chemistry is a large and complex field, it is essential that we be able to quickly and easily prototype and test new algorithms. We have found the Boost libraries, a reliable source of high-quality code, to be -indispensable.\n\n -Boost libraries used: -[@../../libs/python/index.html Python], -[@../../libs/graph/index.html Graph], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/any/index.html Any], -[@../../libs/conversion/lexical_cast.htm Lexical Cast], -[@../../libs/random/index.html Random], -[@../../libs/algorithm/string/index.html String Algorithms], -[@../../libs/tuple/index.html Tuple], -[@../../libs/numeric/ublas/index.html uBLAS]."] +indispensable.] + +['"Boost libraries used: +__python, +__graph, +__smart, +__any, +__lexical_cast, +__random, +__string_algo, +__tuple, +__ublas."] ] -[blurb [*Archelon LLC]\n\n +[blurb [*Archelon LLC] + [@http://www.archelon-us.com Archelon LLC] is a global securities firm headquartered in Chicago. We actively trade equities, futures and derivatives in both electronic and floor-based markets. Archelon is one of the highest volume market makers on EUREX and a leading -U.S. option market maker focusing on the most active securities.\n\n +U.S. option market maker focusing on the most active securities. + ['"We use: -[@../../libs/any/index.html Any], -[@../../libs/array/index.html Array], -[@../../libs/bind/index.html Bind], -[@../../libs/date_time/index.html Date Time], -[@../../libs/function/index.html Function], -[@../../libs/conversion/lexical_cast.htm Lexical Cast], -[@../../libs/optional/index.html Optional], -[@../../libs/rational/index.html Rational], -[@../../libs/regex/index.html Regex], -[@../../libs/signals/index.html Signals], -[@../../libs/smart_ptr/index.html Smart Pointer], -[@../../libs/tokenizer/index.html Tokenizer], -[@../../libs/tuple/index.html Tuple] and -[@../../libs/utility/index.html Utility]."] +__any, +__array, +__bind, +__date_time, +__function, +__lexical_cast, +__optional, +__rational, +__regex, +__signals, +__smart, +__tokenizer, +__tuple and +__utility."] ] -[blurb [*Automated Trading Deck] \n\n +[blurb [*Automated Trading Deck] + [@http://www.atdesk.com Automated Trading Deck] (ATD) uses a large number of Boost libraries. ATD is a technology company specializing in automated trading and customized equity execution solutions for its @@ -937,6 +1205,18 @@ and automated limit-order trading algorithms apply advanced expert systems to limit-order trading and customer executions. ] +[blurb [*"EB" Automotive] + +[@http://www.elektrobit.com/static/en/index.html "EB" Automotive] +is currently using __gil, __mpl and __string_algo +for a in house tool. Additionally we use Stefan Seefelds Boost.XML from +sandbox, with a few small extensions. + +['"Especially __gil gave our image preprocessing routines a strong +speed boost and greatly simplified our code".] +] + + [endsect] [section:submit Submissions]