diff --git a/doc/Jamfile.v2 b/doc/Jamfile.v2 new file mode 100644 index 0000000..4804221 --- /dev/null +++ b/doc/Jamfile.v2 @@ -0,0 +1,73 @@ +# Boost.Ratio library documentation Jamfile --------------------------------- +# +# Copyright Vicente J. Botet Escriba 2010. Use, modification and +# distribution is 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) +# +# See http://www.boost.org for updates, documentation, and revision history. + +#import doxygen ; +import quickbook ; + +#doxygen autodoc +# : +# [ glob ../../../boost/chrono/*.hpp ] +# [ glob ../../../boost/chrono/allocators/*.hpp ] +# : +# EXTRACT_ALL=NO +# HIDE_UNDOC_MEMBERS=YES +# EXTRACT_PRIVATE=NO +# EXPAND_ONLY_PREDEF=YES +# PREDEFINED=BOOST_INTERPROCESS_DOXYGEN_INVOKED +# "boost.doxygen.reftitle=Boost.Chrono Reference" +# ; + +xml ratio : ratio.qbk ; + +boostbook standalone + : + ratio + : + # HTML options first: + # Use graphics not text for navigation: + navig.graphics=1 + # How far down we chunk nested sections, basically all of them: + chunk.section.depth=0 + # Don't put the first section on the same page as the TOC: + chunk.first.sections=1 + # How far down sections get TOC's + toc.section.depth=4 + # Max depth in each TOC: + toc.max.depth=2 + # How far down we go with TOC's + generate.section.toc.level=10 + # Path for links to Boost: + boost.root=../../../.. + # Path for libraries index: + boost.libraries=../../../../libs/libraries.htm + # Use the main Boost stylesheet: + html.stylesheet=../../../../doc/src/boostbook.css + + # PDF Options: + # TOC Generation: this is needed for FOP-0.9 and later: + fop1.extensions=0 + # Or enable this if you're using XEP: + xep.extensions=1 + # TOC generation: this is needed for FOP 0.2, but must not be set to zero for FOP-0.9! + fop.extensions=0 + # No indent on body text: + body.start.indent=0pt + # Margin size: + page.margin.inner=0.5in + # Margin size: + page.margin.outer=0.5in + # Yes, we want graphics for admonishments: + admon.graphics=1 + # Set this one for PDF generation *only*: + # default pnd graphics are awful in PDF form, + # better use SVG's instead: + pdf:admon.graphics.extension=".svg" + pdf:admon.graphics.path=$(boost-images)/ + pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/libs/regex/doc/html + ; diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..eec14a7 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,15 @@ + + + + + +Automatic redirection failed, please go to +../../doc/html/ratio.html +

© Copyright 2009-2010 Vicente J. Botet Escribá. +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/doc/ratio.pdf b/doc/ratio.pdf new file mode 100644 index 0000000..8145225 --- /dev/null +++ b/doc/ratio.pdf @@ -0,0 +1,6740 @@ +%PDF-1.4 +% +38 0 obj +<> +stream +xڍmsו8U Y5u_dg*3IlL>*ES3ew/h\wj*O/&/yߵ{/_ìM)6~b0մCV٤ ^|nz6f^_uV^y7>+ݏ~8"W:ꀬ~}u͛Po;a6Meu]\7M4O,RMyqm]Xڥ:p>6)W׻nfu\q%.[;8,-}qn<mv>ݰL]kת:X-qG|rymׅy$&MCH,mƺ>""iY=:94oNe-v ]Odַ婎ks~2}[r24XϱWݣvRԺ'?-MZ<8p>`>iY<|Zy4>7>/>oOWo7vX?^}>l?v7'[/ʾ1~dzmh]\?]?~ߧݯf8_}̛r懳|ͻ!yy?/_~қkZy^]Si_2{/Nnez?nO漙᭤}#Mׇ@9 (V{~;|}> v߾8m&U}/6pr]vMG|kwp}/ 1ϼv)k89=K8O`i`Ox<O'999%K/_ ~ ++W_4 ofدI v3333 ~~~~ %K/_~ +UW~6ΰ;챟M=y`OO'ssssK/_ ~aaa!AC?!AC?!AC?!AC?!pppppppp?>BcΫӄV])]4~5^KĦ<9'{{Ow{ +]O'999%K/_ ~ ++W_9x7_?'{ωŻ`?????O/_~2e+W_ +~jωŻsb.c~N, ; ~????~ e_~*U_?'=?!AC?!AC?!AC?!Aá?á?á?á?á?á?á?á?ß鏓S]?H3|< ^6]xox7' %K/_ ~ +W_qai]~ à?!AC?!AC?!AC?!AC?!pppppppgklS1mwz?nv79d5Ŭ"l⹆3`x.@$c5RbX-j9V˱ZJVbXj5TU0{]k_|ٛr+ o\[9<_~ݽ9]\7?߇}/_4%_t&N5 {~ w{`?O'sssK/_ ~2+W_-{=[5opgggg' %K/_ ~ +W_| w=[5{k v333 ~~~~~ %/_~ +UWc%_]~I>j:Md枯G+kɲEgp?Yw?b6 {<v333 ~???~ e/_~*U_Ox7_Oxwc.O'999%K/_ ~ ++W_4w=/w4w=~~~~?/_~2e+WC?á?á?á?á?á?á?á?8 4<*)$?>Mijzz g59=K8[B8+c5j)VXc5RbX-j9V˱ZJVbXj=99ss3=Cޚx,VXb5)VS汚jX-j)VKZrcXj5VZjփ2=C^xzJsXb5,VSXMjyZRbX-j%V+ZJVcPb8+C56 |v75J~ 2eW_~*o'{7O#{=v ~?/_~2eW_ +~jg`lawc?'; ~???~ %/_~*UWc?3{i]~G ;AC?!AC?!AC?á?á?á?á?á?á?á?89)0zoTzW/uS:ͻwN3`yH!.sԄ`R; ~?_~ 2e_~*oyH oyH;pgggg' %K/_ ~ +W_-w-w=~~~~?/_~2e+W_ +~pppppppg㤐~We-=>/Wvn_.Ϯ(~V=|b.sbn'kb~5[~*=[~*{=[~*; ~?_~ 2e_~*o| o|;Spgggg' %K/_ ~ +W_ʇ-?w-?w=~~~~?/?!AC?!ppppppp?N<)?ಽ4E __rK/Hwho;pz/RK8qyV3XN>[w?^|W>gIxY?Ʋk7,|}6#.c^[x<-/9\W׻n~;oow7g7 ny+Gټ|5˽w:|?i/l/Յ'fVr]:ȴyV>?6kf{ן; ̺||s}I(k_'~sÇ^BoL> vw>KS=|>:z^nFNY/nuYe_/_k˚c雜O}}folWp uum~{}خvO寋^ohf_{۾ >m?<JkWnS./mMǏXҚen x;8}2?XVtZO}Џǽٶ槫1l՛MpGoza}noO T^]/~3vrձΞ-P>`ϿW\x=E}59waCZ}rp_z?ہm^\Ѿ,/rL'ŭ} iF,G_@>lϸ;J{r:l/s_`lwOy]-ˇS,7(t~6x6ۿ Ox#K*y;o|7{:k߹>\^ڗ}{X]UM˷gOvEe{}ϟ?~l7twf˻[_kfl7uj ZW8xc_p{ +endstream +endobj +39 0 obj +8798 +endobj +98 0 obj +<> +stream +xڥZmoF_})h4uMdT3KRڡ(M.gfggyۍ/v-/^]n!1ǏA$Hz:wg|_~qŕ$" 5x(Ym|5x4*kͥ(ZQ4٘ G5hFyfbUIÔJ^(Cw^#ڇo(RWE^*Ko5}oGkD^D?(E^͍XTe+rᦳ>.ժrUס3s"ɺMtO/+ +<ҝ[EzKG{R"ؕ{BDc92L#d-ʫVDyaXgy](J"/TxL]ó_)8v1u5Q M"DA ̢ԋB(p$}I9_c3ҹUa%l~C=q{1CfZڶ:Y*RXz~ZC@/b"JCLC;t&@@uyͦmlR;EYE.6uԘj< ⾃[+O]/Go_]|wD,XR:0baU!$XYb$#݄N3f* W4q'\*MqR'l)R#Bp 7)A>l6'IhEQlw6#Zn( U_&ʹ)0jX I dTnhDaʟ#AFceOibwXMjF qbY_ЂD{b,"+ֶ/G +h6zmAeK +.*Q̵{[p|r rǦj2NVג!_(D8dt # a(a$Vw+c6tA3Q RҗL'x{iUCSnCm @8qMyd]u+k; +!gd燞8Agd~1̄k8<#{-e?y@nHVSmPIJl4w '^4Td?Da:k<3 bspX >NP.XȚ~?}18$t$#>::E +}ӹ9c[VNp3Y;l}J%i-WfT %ʬD8L v}/w6G}Wgwէ5HFHA! I¬KPb5ݫ'~BNxk ԓ%HNK3OU`dgX֦,kcLQ?eumĻ_X = BovR{`clRFTQ7;12۞>JM +6OD1f ځP?vW?{t0߲Q4%~fGN[qvP8 #fS2; SM BwҪs ׋VPUi71DY\4ƺI ]tt fC `LzZ8?A1ؚҡ}/jCVܙ`|w`<ވ.Al' dA =q<ꃘ@ue:U$FJR?#هdrR;DeyR[v'aIut`y ͛<޼3 +Lc^IsC/X#7|eXoM97{w?^J(bJQu֎z.u-FF=z6x,jO>3>r2[t #7Qb) +endstream +endobj +99 0 obj +3019 +endobj +121 0 obj +<> +stream +xڕX[S8~ϯ#nR`]J[:1hةeHvb) wnrQDP575az2 }B3&h>8ڨ|)ZƏiO@ NAأ%X/v~Mu%(E3e"_\=Wi2k)%8\SKT?)Ǩ.QV*(-\9s͕[31m3myUɹ,jmTӤDI#r!r lcIIѵ2 q=eTkufO~A{rEZՀTꌿ9&µ(+]ȫi ?O+(!K\>FK/ق'.ߐ.~.Xӡn ˛ʚ<\$a$\)jN8~-+˗|_7zYx7S'S6xŮ $BV^Nʄ |6բR"1ѐ w[rΙw%rXq<3FeF̨+P] +6q΋?}#eq eU`2?Ey9UYm.kv/n<rBq!px܃ᖖcMƦ;Bzp6g`0)9Ր06&DA1#?a+0=UBUU1QXH+KM]=gnK۲IlěYS2ճԞہ$8o6Yt7$GpMd9>t{W\BӉ{aeǾϺs4iǬ*LPZI)HM +:k +@J/kyyQv!]W% + m +l!<4m*.iG +m2..Y|em5 ďRfFREYCaWpT{ 9c{c(c)4ěx5^SE Û +Fܑ,Rn}a,%4˦\~ [kLrP#W"MT\CVqpgFnC?5ppgU16bH\R6ϵl<~d?w?8xS)AJUj'WJjYq믫of)Xncwh^甒0{%閏$~.ܼkDe9o+1pn8lC*n~|Mp5|aJѪm@:6^ca ѾGz f4L硾L8zv> +stream +xڵZ[oԺ~ﯰHō86MJ3Ldȅ_>;7;)QEI쵾uGSz볗gW0 ޞ10`Tz{M5YO;!M:+ Ǩ4nԊťM%x +I}$ِA|ʩ?f@Q۟ۢi۬hH%z6٫3P1ٞI r ĔVң,↽FqB=#pz氆Β\žZsn >L'%sʃ䌤3Iq|w=1xɟq' mA7u$i,ccZu `ΘJjErՐ&ߊ$6Þl\d n teIlTEvyܖնH."q O6-ҏL ~'oY},zf^G C[wY3ž܆rӱ͗u|CdO|DU"IJ.|o 6slU['УLP&ڕ蛒ܔeݐIYy.+'H +ߝrm}&` +,CH3'mSVH!As pC!FRNXW>L@Jd8Vp89!kU +mVfk,ϚɊzUHR7 @L$yPrb G =p_$]8]X#(mv`-0urL(b4Rs/ן I҇(COYho|ifa]oP3s1}I,H'uMҤI7z[yNTUUMP#qG]*{ 7D*2-YMvqx؃]i7G ~)BsdɀlYPp";LڑVr +H{ vl+!i6D65[!&)ReW؅# @u?ma4*;5 ǃ!@=6Pvc[l9:OlVKM[qGM&w_LP+銬4i04XSCV I˝H.!ͮ+Aզ(nu ]A^}ĕ۳"Hэ[K MT0ɳl9 +:l>E#D'@[بJ&iEVŖpVt}-،. [f^U`0 + hTɹRY+DHEނ)(rfg"I6vbgRi6H"I-B#VqC8嬂Dl9㟏ܒ6?ٓ/&j8PE,/y}=urf +QvM3m= $obuäilv;;hXMDS~u B.>Gjz<$!CCad:$3#~ x(ݝwS'Χ P`*f#ȉ&eY^?p ny0 &jN)c0FG[:1yXO6g|xi +]#S;oRѹx)RE ;!6Vq-c1{bmkҰ缸%_^"p'a1>%_Yl3k + 3G-^=$Vz Gb|}z: 6&Qp`O']Wu飏`?l bǤ a-R}/./IZjZ= $d m<Q<4#y >Ai{?{ya_Iq)i;05YJպq#Ff1oxUBrt2Pu**Cy-=OmxΦA}:[]oN+a9r] IآB[ColR1t?3Ji.txMlCԫPZcImsӐs[)'ºutcxs#B wߌ p ;fmᴲ(:\wTyYё㈒`74-$ԍ2(&{gUO*kbWpԛ{ n Dy|}nE<tJe;R + +͢>V#WaWB=͍I#8U}&_'?}v\> +stream +xڥ[mo8_A>4Ź2_Di>, +vC8JC,|inzPdJmVr晡DzQC .ND$ bd{"ea;pQDj@} +OH^kzFr2~tnP` +55LDYAHvN/NW>o#>xPC؞/O]rzb:7hG&K|2Nf( kr <)M X$E4-䙮B[7rf[IΤ.j2Zr#,o+HVW-]-[Qym\Vy&":%$0fTJM&/r;"3ɋ&}@?ݢE!CϏB{X%ۓ2%_kc{ʁlWܤmRE*hQ[w=F8,&K(:=% c̓&kT<TuV4!JA lK &[dB1\J9E%'g.jg5 }UKbv5sRl"٥jUn9zQҲ*Cثc3E^@Հanfd]q͇8XL@*KMrؓ2R&}M^#6yX +fUM♙"B^!͉_ bxījSxrthZBHZj( !j8FfuXn*#܂>[?KbRmø]11nʷ RUF|FnA}/]!wVLBQū1M%j\ew6=>w=*qiܤ!ݹYRn%$g7F߹q4=d,rPS(2jyw%+MDݼ:-2irJ} +jӥWo~w3yvb+X"HN HA^:垕}.D*t lsOjJ0kspS 2j\Q!>ppH?p3!@o%6tJz}$]ewIS#X>DB$g^ fQz"= cOF&9bsk4#fu>AL]öYTϏ:Yin*eChWb_UX#9FG͸O.GuьpHs>G8e>:?iF%j$(GJN3X9>18lUx =5GsDA&]=0>3xaK80 fY^yͅ3ns) ] sDt#=+u:u}Y?=Υ=!IC)II6d='|n7iaw$Qjn. +Dtu\..my d\Y4UJAVu*QoNCc@2n@RV0f&Ye8Q#/Ѱ9Xǩvozzw0hSJZut$ ~-fj(!5CQ3פl$10|{ɍe^N#a[WK[] _]_' xiBB:8?2s'p#D"liDHpj<x~4Ģ,]& ;bc]X4" NYt,R|o'{FN$'[$txê!B' B#ۉY8!c: r!'sN^p#D"liDHpj<xNѝӉlE,'v""r^Hp cC’SYtxꐯRr(c"TG!4<1S㪯ǿJ3X@?k.PCOV'x{կ +G=ZX|1RQ1=)ߗbCv+E?2]\(/HF2ЖN}Guˇ j2W&_$Kv_ȗ/guA廫~QP.ԫ{WeQ$;7Ff俛|S}NZOk}VY_|Dox:ϟP +I2ޮ7omu~-#C!@ +,cR1O )?R +endstream +endobj +165 0 obj +2874 +endobj +178 0 obj +<> +stream +xڥ\mo6_ACw&DQo6v{zw6-p[^[}R6 o(CQH7Y/3 0S,Neimϒ$ҬqO7BgsZ Ix VxؕF +c,Z"nti$YRn%!f9|-Xnn"oxZ,I~lf}q?Ҭ ުQ{b *caOA7?B#LrTVCFsvwrG߽|D2"ZX;x­2ܡEB9̀63zPf5gfվqsja-;k; jʤPq=meܹZPV5geufufvfdZC38HO73 faf@͙DGdcF&+FV3g‚ n3&sZRLH/\SZ3桰zzҜV\#%CeX%Ej_?aduO7=S=F3Feƌ7'qt^|o"\ :/9yXx kyoZ0w=œFx{ofl{i7MH \,9N\=vZl[#dt4Uѯ?ݦ%kNn?Giô߬75+rI)5m),fͺduɪ[gYbAQ. b,:בF}JTRR!ɠ!fV#xc(I@f`Hsq̚- qWuqgr +c=ZAXhkk_LjP6:W%"/C ͪ2%@2s֩,?0~Wt8дE8Ja;(f<'j.eDn¨?H|4eʌ оY/@\7F7. +p=:b3U`(1> K cT@pzExj%4CeH;4 ||,׮ 썣_z[='8{vjb}|5} 8,=y1sj P܈ +.#ZEظcɕ۲'BѲ5ApY=A(ƲvBW=Ene|Yn놈e^DAIA,;-? -JE8 -+Y32o Br73!qdr*Fo&~|8p $O9>4P@ԃcV9 xbo2VIP,7׹NQQDd5#NGdM?$ 4>>BlQ:fh# RP{ֹ'mGWx$*}C$QM FTQ*5欛Ynɭ?VOn:^kf|;M#>ӧz\@L05. z\0Gt^ފScn(,鼦i`Qhjg)O"n3/BS'L)o{>~9?U[5ur'Y.N + -VCQc']"n?c+UKEqYUN:/z?GB#!ϑyy#!~ޑ 8; %& =Ҕ#yP9 >8oGB#4rm>{3F7D5oQrb]߳Zn4[R782=L9섓w + >pOaqp&ow;[Eb(Y c=oumQPzNWSPIvu5}x1.C8QXD#n6eS9{[?` .bgџ?# i_,]q/V e?mm'S$_]Fad JHAӝ( GN}0g}QSb ]?6E,ɗ'< &OjODYҙ((EN=0W cDEDD<yԓ,Br&t{''6 <=)˶-A(s|QZ7USM}(-qUrGE:lhliLӈrW7ncy{{*rk V*cB&AX드#>jOTpdX/+kxUԝO:tibFyqD)|M'5a_$abnm&X11#]6ItA,:64őLiA9Qnp Ї#o}yߊ&\zEdU--ijҮ$WY= +CGs9zx= .:<1&qehqQ!!Ȟ;imت=wrgt1`x۰xJ.ojp +:4p*J?'JU+L. K<ᆴcXJ,3pGlKTyP€J3n/* p!G̷'<͂(=9sV ty2DTK̚Ϥ18 БrԵ؅ȽT<աަؗ#Qevn9LBfSGSl;O&20SBG$$i~v[Mu/M((U]n俔fLweߛ/X,T4ͮx˕{7T.neŔf삆$amjZ_"ϱz;iw%oo`zEƉ3&Sz~xlHVDݥZ-77"ÍTWaRN&NgAb$)U<6RnRtϖ&:~;Aeo{^J91CD>IɈm'*{mѡ[ƫ._%a foݪܿeof7vQ&J{RKQ+NY@Uæ44d4ao"}: m4WOOOk4hxncݾ_M(/~i-Cq Ru#l= vTmj +endstream +endobj +179 0 obj +3904 +endobj +196 0 obj +<> +stream +xڥ\o8~_HdPl(ms>W8`[,7ߏH$]$6=g8'Y^>͋ljy)N0؈B$ՀW}yak#ӄAzQؾm怡fǩ+dWo&U3Qr\XEQLG|ɇ6 ){H=$#1Nޔ/l= g ?+z#MP^ৼޞ n6R߳g*]nbVgXuiQq-=-&3(5кxEVt-`PF=nHHy-T-} +3Srܭ4rz wU2נ+v,;PEkB?c}9(|7!jMJ;,R2ɡFV(aHs5rJ(fGjmQC[ݬJ'Z7ZX׬\Vc(01 Tcg1 TcTIHj]j Fk u]\Bk~0l/6zНT7u%{-4(J&f\+;.3+M3 ]2 q㙅.eAfJe"3KSY,׽I)yl[ZfF3K[K*~ 9BUjHfZ Z3H:YJ-tL-@uI-ˡ5:ӡyiZO-\K5ˡ`ʬ3Қ4ltĞ$] 6U@<7X}zK?O58ڬ;q!Uj G"eFF @UfPL4FSc5 4ME(K8kp5U_¢6'̉13BmU- 1rY?EV` .Ǟ_L9wm4l+ď|naDE7WZh7Ow@6'˴@$~;zOpY\OiBSK4lk/3uε "~bCσ,6}7֓ Yf",bu `bK>od&Mz|?|A^v溃Buхxu ӶWq61ss=&ʌ)=ne=&acjjSP=Twj Iy,M!+W+;]9VkdU͋T$vB 3Xoou0Y!x-ـN./!nB} +6e.*+2"Y]2.(lzu AA3Ah~e=rf=~ǀ=A;AhZ;BYFYx =Y\xά#A(AAփ0[փ3WփSP;փq֣qqb=.T'+\XNX!sV@ +~W5Asݯ@ lp}(Le=ÒhjSe=Uw%[FΣ܃*:ke=#FGո o|m^(#T +p`G~a980AAkƃQ㲸6-n93΂rb<tfJ8ء0=@%LLaLfŖi șiTvLE.yfsǮyВih <[; h444\vsz{ATK߭%o6:x eNE&x9Ld ~~Ȗs"rǻv>J) COcԯ{_>Ѽp]1?&aŀj%hHZW`_"PIkRe!c/lj½ULDQiiWhe#4%_Ra'F~'68iPQ0X +DtF}ۭ;bU~H{#xn_׏_ѦF">Iˏ̴}+c}&R.$P+ Xӄ 4+m[~6>??kF*2^Q/"NU $T7Uu48dd'( +endstream +endobj +197 0 obj +2823 +endobj +213 0 obj +<> +stream +xڥ\]o8}ϯb:Ȓ϶Eؙ4؅(wΦbP)4yN֖.g("-gqQʢҚ򼊊r yj/pxxv߽yKkyeuP\+ piߐ-r|õeJcڑbv?QQ%=ݜͮ2V%,KYQ\f}Ssܿ`8+*5<o}:2Խ8"T="qv_$2IS&tn~Xn=+&Gyʿ;sgFc]Ӹ6xyn` +8Kyj´Wu|! #81sBdå-<) ;El)ɚb1 C +P7Y0#0!d5LV"! bBa!!Td!dZ:68IV 1YI$şv$jlb6cf܅]p,CP70#0!l7v5vRB8=,ۿ#0DBd;Ic0,|U7Ɔ2B ֡`Bx T.B_InsA+ H/ X C̈;ㅁOMssPT}6m[E'=Xn҃aF&=`BHSJz#% cBHÁa1HoC0a*1Vҏ NCŢY57GjnD:q_)17uGxSKWR߶dɽ'gpO 4`+m1RN UB %/۞6s9qA{F:j>Q`mh3zeFw̉ӓ_/MOmM W]sxm\c_Yiq&kZ T8X)mH!mC1 䞪=br{ IrOtmi=ن#!jCI5P; 6$b)%i.!\B45#@(30v @Ca&8HemM +ME"VvR$`T$ X @E>*Cm>"HF)# pknOi>"#G4l>"|DCj16jA6cy|v&.==jA)HŷrgϛEp 7}.V[ź{*FZy[an >}J/5q+i߫J]ʏ|(Xí=`4XfW +ioE,7-WvMkخg2wE93U+"LmVz{f`dz?F/c +endstream +endobj +214 0 obj +3270 +endobj +231 0 obj +<> +stream +xڥ]ms6_ї$="^ĝi/u3AsEcY+Ru2[ (i#,b 8S3F)"bٜ%IY 8|v|yzpTOI[`Ձm*rZ"n +4_%)&7O+,JܝQ_JXZ,IuU/-1@jy<[$GNePǞjIr=eyK=edU"rfUܬ7%%0BJ`,jU>em]SKPSuiF;-)2(UZe}oZU$ CO45P +Q$O;>A`'Hޯ˽<(cp2jˈ$fdfZQSx-҈5/d˽K,*_#'H1?( yzڑOhcVW$1+q 5_*BYo로ʼn$֝`,QaNBɔȟ*o[ +PX9:n˻A:ӆbqҌyi1]\:R]=jU5!G{;(FU>,Ü e ?n~ǿXBa)SLNtă4&+,c~ɮ?-]ak&ޖpʬZ-9x[ B"ȉN "J4gBm0.GPj*"OyC ~{F7̷,xHӁ Arja ^Y$|'dSL %I{Q4zP|Z>K-_N-@RzAAz( +ӵ&h3 6vԧ{*bߨ>bBQ(e=Q%=t<U =Ar}s}87E g60!1&$9&tߺoFxj5x Bw^!3j6rT4B7N=U}YQ +ᆛP, v,aZv6y4I,ÆmU?|J}/'Vu1vk70KmmKiX[=bؾ11)## 16tF:f?`Ǚ/0'V=vͦvDc`t̾!uYͪcGiXL#cGlGc?".;BװO22FH&VaI}܇xK'"=q'm'FKBVT²Fo{{b]QaƾY P̔pIΏ+/!=n$CGqyEp+BZhZPǒfzй]Y^~y$_郊NS5b#c[_N0anVacOH.*gI?{lΊ!=IG/ F^Ogbx: Dqf!DH5QEMnfx?Mۑ@ޯ#(^mNbxN礂XpİT똵=IfafabcX +X 'تĜ( ZX=۾z[ڰ/ٔuUmՆ5Qi˅J{n%rόqyw(4O$,1\>ykL@K I@S$`rq=7L08-ww?(mχZKFsd;l D6KSBnDt V_@Ih`~XfHYG?ĚT{Ryj97RۈniHzdF&cEAF-G"_s_$8&"ťz>T]Ð˰i ga5wÂ,fdea3#4Q ld0:F:<.xjtj)^sDbL IV zFCB.Deܪ? ~~t,pl qK?4Ԉ vI +ș{[j·s'8<[\oLٕ8wCcrMaHǬFGˆpbx{8Cș?鬇@ ϱqU1Dh +6mC$8Kl"-%7 ZQ`:mq'Rb="_|>"`6 +'4AMK]ߑ}ߑ :1;ןnrSs c IAeر}ߑ(7at!щaHix#ZˑT|zp x4:uq IJ7_HNьMh#aE1Ib3Gc9æhcF׫zˇ^ZP}zq[q+âuK9^sR11s|9X HhFɲڇY!l>Dz wk&rqnwEc&+1qFBs}cA;wA\y_@z0*vj2 KSČbIL^ +܆~oo-`YlбqαGU :VH-iE=}_ocPJZ=naةC`10fF <(p ޚƹ VH ȥtة+sTR5ƹ &M_\Űkƻ[BUW' Mupͯ2o.זʲXo.bU{P^.8n"^> jN_HXy\iL,jk^UQB~P1yM2tnn6cnܽ +w/m>ɋlj.3u~""u}paխ5;,R`?=BYU8WCˋ损V~7$ LhIܛuNXW*H8u#9x*6M/'8JLo%l1WϦgb">WLWq+<~f-2GL +endstream +endobj +232 0 obj +4217 +endobj +247 0 obj +<> +stream +xڅWmS8_/GDdIonnP+fn_;RJI0Ezg̀$?d2q2d6B!L-d׶*ɿ-RPxj+5+#IqMӤVpZ,Y][[i0`1;;´gLcEaLcW(e#\`ׄ3ӄ-sbdnaYT5$z^YY-JƩ;a J;S`43(ƷCϐUOq;cʾwL˟Wʘ KJ0n2˨*[a-`Z6AΗRx78C45jK#`H Q`=H3Aktn֮K$@aLqY,ᢠ5h%UjCAT@v8cpy41R :d DD@=mcdg tFD`38O(ItQHKH`R.Z K`+ d9<&:E3$.V'WcXQH%lj+dD +EТ1f+oX&pP1Ǐ4Pj-Oyɑ5fx+cr~{Bbj`կO\0V -MϨ3KG[X7Q)K,EXNr8)j[YC]hn/Jh/VAchzR3.D46ա/l2E*i蓸ź "E<GG>6S6_|ݷE3 ͳ +#M n +pPe4jpcV@8$VD,7O[=^>ZXI+P(5ˁ/~YFh/"|kЮ惙@wE28^]Tj~ڮ%F{G u_'tn|xϮA0dwdnNGkxN}|ӱ}`q,1JF6K7A\}V$a<#7\>+EFt% +Kڒ@ĝ E +fR8ڏX y(In^>m6o2vJo6~_}d8W/nr}4ޅr|x +endstream +endobj +248 0 obj +1255 +endobj +265 0 obj +<> +stream +xڭmo8S7]ER-nI +$eVoOɉ8`S?9HdID*HQTN0x_:h S|QⅡuWWI#뒺Ǧ(ZY. j( R%S/.̯9/Xl/'//OfgHՉ4RSQ*04'ewlpOFOzͽ@Q}pJx~O=đnZ:V[2Vű~I5R dϟm [eQVJx+OڧQ2l C7Tx7ƫ4 roB_ H*x*GZCz~r%OS.ϗnU ;dq<6~0HѠÑ)B'r6u"*9wj?Y/\[OB`&T7X # 0:K{ir=52 "gT +-zUEzb16?2RI[Pf ţ3c(b3^˘#c(b3bck~ټ[4ԳAK*x40v D|М@s D|@ t heUl 4@ 㠁;h ^+h bhk@[ߊH4ռD/ +OՆݺ"㩛0(ȂxY0vGD|d됵sED|dABt l9Fx^U4u%2SO{e{OY\WNX4-|@iNuY">i femRjِZ 2P!8d`9Af +9g?pZ/ġGQCcgPFͽ5=GPF Pנv)[(gssq؝39srrϕ3913Y9jQT_(Jxg!&:巼,r7jTq4Xl̅4ݷ{K괙0P|vC=eKD`-gUvnU,ۦ `΢tSi*iD SQ:\QUg!,9,@7qYv.lwP+ s5Tldr8T +w@``|@ +HʬtTlp}0gA@ bL@JHV|@FL9n"X3(" fˈ?㏒U\nG;I ќM?TqIFA~r ?CN:nj +O]5 YmG;Qќ(v0VnF$8d5(~(gɹ_jNVwckAr]@>0gtU8_]A75شsAX:~Xi¯ԴOAK #@_GLV$uo8de~`"@ə_ `\ Prr +A8C$;u ~3x }V,?*`#V*q H bT+r:M9 s8@`SӢuLDr9M^9*6 +2C4gW)_v4@5Si@Oi+ ɿGvjz=p 1;S >3mSFk-mLģNE@Fƻl!x{22Oq6I{"m)b؉L\$׫6ˢw7(nwRmyqu_2UliUYY/v9hגI{G[$++ 5C^)h_LDL݉OO6eUVu߳ՆSa0NEݟmaXÌIW%vѕ*>5X/WH)ZJ0%I]Cf bϏxDWrx)꒦-VI-8X߭Q-W.*o%Iv!NӉ7ha)lJ] :y(Y(͌ z_\~>?|?.^_|?^\>8>?ygxޝ w \bf;"_c[nd5 ^ImYgO{Ow +r{=bvf3hC||M/SQfߊ9Ļ|I{l]vhmJv/h7;{#C6!M|mp(t) Civ`XcD{hB&Z[BիHT m;@& .;бc#fymuOz[`wdC {=YFa=zîmuq3iN]s3&]pdi0/ʈ-AK#i>ُXMvė&Ky)Z}+(2';Q\cC|:JqLD*s8\{Xlr6_E'E$'G'Q_. o| ͅ +)^O~x*ɽhWFe@ypDqA^Y(Rt6_?N~/ά??oVU*Id{BaD7ZeUQ +M=ߊ]QdY/Mm +!vSUݝ4͉Yud褁~'A + aeP׬4X6@e7'İ +endstream +endobj +266 0 obj +3118 +endobj +307 0 obj +<> +stream +xڭko6ҤphI $va [isCޥmVVoHI!%5h =!!W{_{N8axLj> |F=\{/xy~~yus՟08\ zuz~n]^_`xʄOdyER׎K-s/2 Ճ$wrcԍ0$'6_$.dqI4 ١ph@~;>ݹ!I +9ZpѳZlJx UuE;PCv/X!{BІ +ʧq*4zm,,$F3p0)ӳèkmՊ-;/Tl.aֵ18zZ-܃bv>{3 \~ԃmzvZOeЃZַ&N-}Q[ͅSz Uȷyָ@<Oq ]71q hvP~S% Hv AV~u!ȍ.duqޥo+ xt;TEf8FunC;AX\ g"e!?$fpL^is&0BE7Am}D/_!ѤEv16jS}|~5Lt-awl€9cos H}f;|q h~c^j[8%4lp%Ո%y w O7D#anGH@[#J'H@'ɦ|b|Uσv(Z!{۷#p}<[caLL[0ޠ/Bm]mm6&xM^1- L~shߋ0r!u}yBTIcK{UMe[pe9Q@}xب5J"Ӥ$wdlFdTZw (3*hjV@lYĊǤzhD֮ +byX}ݬm`ʿOtNO2_+IGN xj8ȕX` s䲐bh#KʅJq`\6y Ox4rMӜlDlؽ N[؆,u!AqpH) _˰d}E9q6pzݝ?Cdϧ0.ʁIAVj_9)d(4&e.-vC5p6l\:QM ͑E wA&TL21UX8NXhғf XhzLJ=_GPuF`"xSd2u\/kUbH!=ڎ4 ".L0wU7mӧO=mEp6.z*am:$LoeQ xߔ,/x"ƌ+^\DJY*Qj^X9"8%9{ϴU}1w"䃬Fre8҃Ҏ>;Tud iA95]ܥ0$%dsnKɖ&6HCl5*pӯ`mF0\wO;['1`79l.w`moJ˔nsM?@#dFr1tӜΈ9;؎1m Ŵc&Æ/_ oP2*GP0<$D51p.4L9-,  ſD U3T> +stream +xڭo۶ৢRF|f(gnX@De,C%ْ E# }f)̄O}fJ5T@VBlU= E+u+mk{GT5ahl u(ivuR;$m#~}? t\\fLF$܏H|Ef/$[e0RDp(Fz\7r~A)ȏ`JAI3IU/gƍn*JRm\qGzQ94iF]N +˱~Nj|Si#=Q]V܋@?3TtzS *EN??=WyxsTr^XEY̵9o  #mQ7Ĥ; cܱ&ʶc&¶ɯP[~ዤUWU#9iU۴8Tx!۰ەp/2w-yHkKrot q_80ʽwJ<^mR6( 5gBpʔc`!\IrMHg edIVP$,DnAw<-MGЌ%aY .shTbY_8mZf ̌ٙ\*CCX;2i<$iċ[\c^zHHzylA3۴;~HPs4^^hSD$K6e\+o׉v C2]@cOv@s0E*Pg13{,9CX/?{w"T<8pPDn'04?sR\.YNY +/bWr$7lå^UcpQ5Ze`Rb`jeu>UBPVcTUV˥qZDױvX&~R:4hz:ߌN 8͔ 6BFUℕNF'ʛM^" llxuƉr[^Er8(8ayV}ԹceocPE$p' w|ݏ3^;|NJ$aHҼ#Aք I +*;e "q[w/eG4JcR| {Tpc0 II` +>𽾑{^ HG̵ۤõ#H6>O~&cQ; )2qriIv?;jD쫯rO +pley7?=}xpI{[]٩_`9yY&V:^V<( c_JH +endstream +endobj +327 0 obj +2607 +endobj +349 0 obj +<> +stream +xڥ\]۸}`߶݉F$E}ynEw)--Oڲ#k23]/)Qҡ$KDsy{Cʴ}rZJ{}Տ7' ݮ(yHz r{X}W)?/?g{q"ssqz}'A채VB^{YxLĪն V.wxURW>`dVѵB+< iR?$Iua5„D\x~U^f>-7/+D-6TާsA=1yO<6:*|h$<6^ὲ ,3xXc1`_oXM:,u==wѮ:T&w㹴L6Fx3ZCYev_Oc~.|?5Y " IxPeE J)(b1h `̗cpx,AF l)“xʯaf6 ^a~㇆94b(gMj$msܣZQjhJ:QT%5Ѳr@4MjJ: +JJVVJQGhAc (%"qFJ#bgAhF3d[DS|ʮH?g<<_vc9ǣJ٥jAHxP+(C4%X!h9VNɚN`-m+M W%G(#A9,uS)bgArjS3h8/}]40/}t@K'~+m)}-,I_F^"ZtI'\ ndל= k?|/;c퇎]_vg]0 .]*t:4:9 ]xZ,ABy3Jvr}/NrNrNX.;p.wv;@`r';pV7NȬFCba'h0D 9rDH^[޵ny5Xo?gd^ʋ/V"W$=|A[|W^G9u }/&b|֝l-. PqvH^aqQg~T^Ӭj۵1J{tN/є}> !35=.yU*YkY^T4ߌ{,4)|Ԏ/xrM?t>/wKVs>f\g@ٯ_'PCaιlq.˅ .,rЌ[@&_`Tl{M US9]K`$`K5['@C9[}/[%sҫI?N?俻a٧ɲ\0Ǭn-z5R`4{`e>`Á / 540$;k̕jb]C}h]4@ i``KM I4@3 h:q.4+ V]880|,eaM3 )+m0g&D5!\oŒl2dHi2!ɞ渠Ϙ!:|t~*ng=Q&7(k=mzuN0{$-2j[H.= GuNGRʠ,FX.@{lt[udq CJA~q\Elk!PB<aIY4C7'O{1_xq'g=K^y^/hba38ѤFIp3sizWT.Su6NcQf+S}25~ }wyyH>3ŗhz H{#+hx"whhPV ʏer|XB=5f$O^H>T~R]744JłW,^TA(IPcyWG +h3e]A^c +ULL>=JdyKܲ|c5/dᗊ;ɹ뷔t\&ЩI* .БHu dD2UPyHODe͝H7g>7Y||+݋7#+u24?Ƴ$H?:X7L|ݝw%yURr-FWp}.qؗj䭏kߪN}pEvʠRc>ArY*N +endstream +endobj +350 0 obj +3217 +endobj +381 0 obj +<> +stream +xڥks~MԞ{Uel'J<։iA3D|-)$AwdKa_/3Fn'plt- 3Np" I ڐً[˛1?c^VEiRFYaH5]mrW=j@;V$\xQ%1jYӺ$eȟ>1Odܾ±CsxJ:3*塭y!1 (&[8hо}yNRFQlj\z6/JRmUYW^VkE7Xa(<ŢE24>\m#͟ÂQAў?WCLTt*iz l}fc'"(kdE@ϳ +,ٲyZQqTKzdypҶK֠KQvN_8* @ÿ,M((C3Cͽ%̡hzh~""0}*>eQ@.l85Y|~vvVy{kpCثŞK 1R1 J6Q[ۦI&\I3wq(HaH$2Y57T`4>V^ +mNl 8ء%WW)%4\t4@6DlZ ™_)P"aSve [i)Gڕ]aWRڦhwmڥE(VRb)bԷX) +=@+$ n45GάvT3*U:#Li_Dl#LA4~@Hɇi9]k,8tc!o4  a|lAc!8RBH{Ik"~dLWE8T!k~7:hDn_ۗG`f\fc!l.*J>@>)HV%QxT֮D%i<]م_lw +"+b)1qz"m,̦dh0ַLaXVh0aYc +4npVHòz`c}6wu7c_h_^<©qh,H ݆{A('7Fի#jzݜVډjm-Gm.Zdijw\*xS t:ͦRpT-lF~sZdm_ī&p/IvݷF k|*Y21"c~F!E\;B(<2w/90!޻B{k +joi_/dFRg{6E-]/sP)؛B+;a+k6z.2FsxfZgXN?yuܑim|Β"pp-yXjVME OϬ}{p,lӺ^_Fe+> +stream +xڥ[msܶ_|u'c3v<ĆGy<]_$H8"b},Byp5#77 FvP4>\}Q3&He4<,%eUo"}Oդyfiv*q!o~JN7RZ-LuV6vUJRݓ|gm " {d{Y!{OeE>dJaUMnjrVdW7UkgF0G^>E;mH=iϕ7\vlE KV\5ٮA!Ez?IF#雤LTDhG9#YWm^dMڨWNjdM&24|) ,%$b= HZ9Y R`_4*l /wE"wÕҰo wlENDY HKH07HY/ޔrQ#'8FY݆G* vHaV$Z}!{KAVoWurmNXmj"oզ刐SɑIO?"D]&bWt(a? +T%CVf5f1{ \.# +2w$Bbقjg" h߸UFRE-J2ueDgӬtrAmSD1E;S̀Tc!+Fѽah 'Pܽ8y 9B: H+m?qxYwZ{ޝra}#TGg=02?)r)RxGD{"TaWyJ4[NSNr`!!Iv#Tvq2K2<1kx@H# +XPXbX]n7k=8xeHc1%k` ,Y䅉Z9Z?b{}ʀtxe[uFn.~O,DA(}PiǖZ-pXa<^($=S6GyRubSiL)ljpʍh†f)]Pk'采aH8$/ X#?ezk,X2s0Cn\rY/y :c:`>hd3 h+rRGp*_w|_/A.o~Wg 8F8\#~5\z[ ͉š4z8}L^Gq9P'u^P 89,٨ԟC%Kp.*YCΣ{.*نOҒ :TƜG%nQi=*-p|JPic:TB?J&=У%9ܽ^JӶwvG%[\T:{WM {!.Ua:K%2Sكa-8]@zn r$ {o + 2d$9Jg6\}{;YC*5LSyTJV sh)_Ab2Oysk0l/(>L- bb v6G MCHe0bzGG> +stream +xڵ\o9_&Gu=\b=n/!wf5#ɑ<hg4$E"ş4hkՈJE-+T'WUu36щ/WR+Q;TuQv^s}46E=! IIymU mHtgD-KsmyF +o(A>7x|4b!!,9Se\Th ͥÜ!ZhvȆɎUgbI;V2Fd#8\&w59>"-Qa΄nF~e:B)BhB#ˡ]N0v)i"ڥ,sh%]lncY˄']Kih7aRTuY9#&;]{"ڍnaN}F*vSn,?,h7?rbnvs hw.^=D o,vC;Dqh7;D9hw>rl% h3B(g0\+:S_D='.A}8r8r8c.n 3-M2t:ގ\I +'TlVǏs(aqN\(ab GYsw8R,B'>t,(e*\d7>V YuƄnRBP@&6@ 6tX&? a m!Pր?K{9Cx¾oXb(Qէ#܄Nq0q&=_7r gB I;:9S 1ON𭜸𵜜CV:0ybOW~: ~yӭļaJG H?m*}YT*m1U뉋 $Gi1Q`6Gi//Jۯϧw"N2ʎIڋuyOK~sϛB|-A1qk .vQҜ`}`vV{s_d ycons,v b [w7 T0R0TT󄠢]UcPX~ ǠO<*0cPMlRȶD㛊ueyF{):.J*|->;qX>WbɿR_ן͈֞jBKZ.>qD(J[|#[q{Bܷ:6AzZ>O?*>!(vE]~'5utZZv[msܜףX_gpǟ%7nO_W}v4š~pL +`&;W+=m?;y +endstream +endobj +423 0 obj +3392 +endobj +430 0 obj +<> +stream +xڕZ[oܸ~_5mW՗ERt[hp6='q:IC˒MY EI.6#7/ Fn}X|Yք~ NdFSzvl6~v_nY:[VՎ :V(ZbgƽayFL䝹⏛(*2*JR/.h J*,=?.MI0R6B(7~@3Pb՝t:48ԤNJ< U3K͂1لqID,59$LϷJU`Ezx?j:g9eSSyt{G )+4BuZR7^ѥ>tWJ2&}@%S޶d{VҾ` Ϲ7@Cquda_~>T;Q0QCszo]S?uٯJ3Z 5=6KA{#s ){{F.\C@ӱMK{*EG4jړfkf͔М҅y<˿ͼykQg?Lzѩe>oj0_v_ʐ&%Ll⧓*M&!}@pH<~ sܮTV X-S;\ /$ubXT]\c^$'o\Q]$3M`ڲvԥt$m̉VԾ=E` +$/y}{!pqHl S&6c[,p(6k:ouWN>5kaips`+%cN??u{+w&Y9wjO~/7;Ӆm[yݒh&%=YP0+l ضOx_b(;CY35k33 ++.W3cZ =."[d +endstream +endobj +431 0 obj +2322 +endobj +438 0 obj +<> +stream +xڕ\[sܶ~ׯ>Pkq}nru$33 ht!R`k gMj"~_*D]j,Q4pq7UVjlnV +:d2"ڰ.q6-C3vhͳs =7W ъ )r'E2U.,okqZoZVc0Wm~0-yӯF#XY?2}55|Ղj˨;&.ejR+<ѳ,cתU[YعKu¹N{rj2d췫m/GOʸ;At^ cO=riw{JmtjȨ +Ӌ~}.῟V?|_^lFL_*km8O$~DZmMTNd@p?T%Q<1ɉ6[IMQihnMhTmV4-Y4avТ/ hDZH5Eydz>EK\[EcZ8autJG:|@gDZLtoƢNtsC@;7^5/itd'M̫ǁw6.μyd nHvmǼ3sxHmzKTifpv*1?E$ ij0yaH!%9n ~%#aD,];^L$LtgSJC៩+ +V٧8>b5QX rm̓" ۧg~IqmvwݱC@&/a7vfG1T!J>aW 7 z} $p2-+2m3e5N8#lElWm3|$>S*K9 ?Ή6[IMnhn%&pe+%r[NgM-').u9=I +GD_37epwep%fpep%fpoc9Vԓu\bdMqKtAͮE: 'cgd臹y٫nFfnML@cL$`*cH!Tn2Xeђ^J[.^9R^r=}"2/lVjaz5`JJ钝^g)#Rwz:j`^k{OkH@[Ù$KdL*c6u&1om=bt prlrf\p=? ZnFIɴx@R5%h/ꁱ܌kMI,/=h/h%k7 +jp0w(@coj9plDffhh`Ri@5e Oq +A@Ŧǵhm1J52@[^ &> oj`lhbd=`0vDb>,=^ /X ?L5Z癔v[~oK;e| (*Ɠ*TZEŦb^<1hRf3T*<[,SL7{ڮƷ{v;FVvp?l '4i*kVÔ^iK>y3.s?ۊw:4܏v7n:@`-y0nkv"fm;E +h D` [qraX@a(v_aTMoQu}`٠[DEU.7wfNmï+F\<wN|kT~.,0@#~~">OVz2\C?ݯ= Z s8wTSر|.KH@/Ao^\;=CoRԝ=<>iۋ|ߊn=m܁`=da3C4(k2{2K S +M)P oӲdB\FʹȮk3 "{ +.|}) CQ-:,K~ݧ_Q-fT&ۨ+'u+o/)t_o>Ʌ>|(]Nn'7CBi>!7}KF?@q|w!&Ż5#2r(!$ ~e4;0_"\Xg~ +25&]˯WXht`mk{j|0{Sp #bך9 q%s0c +?ax2+{;@}n2\ȕ OeQb v6w +endstream +endobj +439 0 obj +4467 +endobj +450 0 obj +<> +stream +xڍTMo0 WOڱhS谶vR5ǩ4ۿ%Tnr ;H>QP + +?72I:"lXmI 1Y|O߷u0m0u8">B(\0IU`fD)Mx~nZRL&y=ᚓL$> +endobj +48 0 obj +<> +stream +xOjB1WYv^^zz+zOwvG d6;Śg:Q`y13d*X! *@蓎&F`:P~C^4 <^F؞ohiM%2rtGY sS(T6UE_lr7lAQTRDDhB32yg*Cb.Wѐ[}ki[1u;Qy +endstream +endobj +458 0 obj +222 +endobj +459 0 obj +<> +>> +endobj +92 0 obj +<> +stream +xڝYK, *jO(귂@7As(\l(~~o{ +SzO+˧_zJYi1_ԵZo? 1F +HRB,۟?_"1-J0%r_3$ +8n@KT'1!W!R\U)煸0dU2Fele&9Ӣc5N5.juV' Kg&Ճq5Nڿr'Z…w9'_#ʈ@R.pNqtEm_߭8->g֚'G÷v>yטּ=x?SlO?4 q켒\PB0.oJP ykeH.属0ډk>ɹ\N2 !7f4A\,dؒ +.ƈBa6lf$x{I 3GCߴ<lnE@5 fKV=s;1ԩ2 6e|˜Ùd[5 ڜv~ +uɲҷ +wNP'ĉ3eMC*9+"Gͪ8 VEYkD m2eMS?fh2XJ!ozzAWYfVrE(y$~8sKzHVЋ~fArӀ! ĉSY7P?x<E@eY~d5 hiN .oz `@8ZQ>8mW%O /p*RX 0 ?803RHtޚ T;Z N4]_< B?sE4QkfμRoTVnҬ!rzbѳLiy u‘ + ¸^:7=k}$eY=hx' ԃ +e11M"XlVdaW!ԯZ:B! Mc թ JOCWÀ_|kwqoPdXLboЄ-CPmn@$9X9Vyt>R,6)^ 6Ly.pΥ=R0N"U^o]%|,HA o(<TCA!qo &aWAw4U/@!pKDۥ%SJbF`) Og[_i5O +NscduN +bmAL;Iz(:ǴTgN8) +yVї1\V+L߹ *"λDW@"lElG5(Y sQL=ñ1 slU񈵰>N '價V +Ǭ1zP1dBɊȦAF,0^\m>$3K o_hG$ӈ'1ֺ !CX'F2Yuj58ȕВi.$>s dm< 3RpxxGq"6@wb/czn\5ԾZ9Ⓖ3b,q{INhh:ƾr& +ҏ{E~m5J87I' abq3"%9:yFPDie.2C: {l3ǍagYWWq8'<<ɩH-JHVft{ND+qch7s\$Q'F5!cœŋ 센mK'uLdVJeCQL>`tlp vԣIxYDlȸ2մ SjGwㆮ"_ `@i]j12*1؀2X}^Vo 4uKFEߣ;mj7Xԣpy5H5;/ I圎s:0,vxR;ͯCW;_$Jc#L_>2:As;Ns ZE&&dwD @t:DuHXu|$a";>f1MMr 6Nd% +endstream +endobj +463 0 obj +2392 +endobj +464 0 obj +<> +>> +endobj +102 0 obj +<> +stream +xœJA $3;;{RP(B2M +LrdLtեfХĆCL5Imj4'3xoiQiRa.da!Q?cl˲,DRVUc0;F i1q1ƕ82\Dgݱwfwlt/8S횺eV~ƐVRZgRZwu +endstream +endobj +465 0 obj +332 +endobj +466 0 obj +<> +>> +endobj +47 0 obj +<> +endobj +467 0 obj +<> +endobj +468 0 obj +<> +endobj +469 0 obj +<> +stream +x]͊`}0]X?Η" h; +5 Q})tCqnwy"g-k_[˗xI׾Ǧפ]>bH܏ty{;_ٷjo󥿥?}csH6x{?Ku~<4}d߉.x?h>v,R]~<6w ʱ k;5;= +endstream +endobj +470 0 obj +570 +endobj +250 0 obj +<> +endobj +471 0 obj +<> +endobj +472 0 obj +<> +endobj +473 0 obj +<> +stream +x]j@>PHVI@C0c*UVswfGRA[LJcnM0} 4z`IEG +'մָ9ximLi4[wssu'郢Pщ6)>AڋZ|*ZWa,>D.u*ښ^ ^ CAǥ*2@k% -F.(hS!nT{B,3d2KT9NW+L8c΅sfy#a}r#l-g\rv3bq‡<&7_9-~v> +endobj +475 0 obj +<> +endobj +476 0 obj +<> +endobj +477 0 obj +<> +stream +x]j0y顰=X㺬,Xzhh2@MB߾#[!oofõM\n80LNn^),WX!4($[n6m:[9(R\rf]D9n].Z%Uyy&_K/j})NHJJ+(/rX3> +endobj +479 0 obj +<> +endobj +480 0 obj +<> +endobj +481 0 obj +<> +stream +x]͊0F~ +uQ.R;t5&0 ͢0nFqyЅ#tOǰi>W-\kraE?|9qQk\5ѧ{:mj}=]p>a*Voy󲤛zX;~*ɇ4ƓzpqQU)\(|A69Ttpw!v}y!fqpT5B*2;{r0A|%o5 YG)fFn X5ؐ 55jjԨ{rCfCCC^ {Wp^a W+ d fMYkNw"t8 \pB,ecc?d`t0))]'CL1O3/ρs +endstream +endobj +482 0 obj +431 +endobj +43 0 obj +<> +endobj +483 0 obj +<> +endobj +484 0 obj +<> +endobj +485 0 obj +<> +stream +x]0~ +PR;4 &,͡nFqyCxAkyc7¼xM>nߚ)/ǡMF_tҽƴvgB2qƬLf?RNס^48̦{b-.ߛs4s:Rn}!^ UE7>CSi;IYCiQ,? +Y[dNrKނw!7`-qֲޢ޲ޢޖl,d>O'0˲/,ͱ/=<=<=<=<=<=<=> +endobj +487 0 obj +<> +endobj +488 0 obj +<> +endobj +489 0 obj +<> +stream +x]n@E|tQ)]`y/UT/F }\+93?T04qS|k G=&wI_Wq6mׇimnB2o,M<<$)ĩOϡZ8sg% ]9)|fy߃߷1|!^ǩO1)lo}3㒦o9^Ͳ岰ܐ'{p p$GpKn.Y ؒ rɏ\P`u------#;0kYԲע_#eQ˲_~-ڵ.ױ_~}|}|}|%[0}|򅙂La S)f +2La~|s.]]8sA8OsPz*< +OSTz*< +OSTM~8_i9Yi]NMǏ=#VȦ~ +endstream +endobj +490 0 obj +496 +endobj +124 0 obj +<> +endobj +491 0 obj +<> +endobj +492 0 obj +<> +endobj +493 0 obj +<> +stream +x]j0D)) +B}hdi +bI*RaHopiv[WL +MzX_ȩjp0 +YS.Sce )`UQ7@c/,rDGTI~8yBTPCy[RN +q8yIu;"dZ> +endobj +495 0 obj +<> +endobj +496 0 obj +<> +endobj +497 0 obj +<> +stream +x]n0 y0;0(-RթZ۪=$C +зN9<>hg\9gko hI'tl;k\#tV,Si:=Yx~nnѶNx9N&aⓈ?ً\|+̫0@v(Ki̫]|iȗA;Pk𵽀(P +]:4(R*M -sc@e` \SM1g yK5a6Ĭ!' 9ibt9%湊55(ҠX" 5` sf&Zv}7<'; apuBD +endstream +endobj +498 0 obj +330 +endobj +234 0 obj +<> +endobj +499 0 obj +<> +endobj +500 0 obj +<> +endobj +501 0 obj +<> +stream +x]j0D)) +B}hdi +bI*RaHopiv[WL +MzX_ȩjp0 +YS.Sce )`UQ7@c/,rDGTI~8yBTPCy[RN +q8yIu;"dZ> +endobj +503 0 obj +<> +endobj +504 0 obj +<> +endobj +505 0 obj +<> +stream +x]͊`}0]Xce,c{1yc5 Q})t$i!ubK^u}~O8ce"muvKfoe?ecƶ;_tßtJ%vL_4YO׾ZL6P+N硬Xvǔm|6,u94r6n0BfяGt.]+tͮщ ZxGxD؂Vmhg;~_~_~_~_~_iVfYiVfYiVfYiVfYiVfYiVfYiVfYiV377~7~7~7f4861xipipip9C 9C 69C N9C f9r3G#H?G#H?G#Op,R]q6 6Iۥ%7_:9@ +endstream +endobj +506 0 obj +568 +endobj +46 0 obj +<> +endobj +507 0 obj +<> +endobj +508 0 obj +<> +endobj +509 0 obj +<> +stream +x]PAj0C!=!6di +jIzXavfgGe{, .8K,wm0z!%e(rnN,*HK +6#쾛.nq'4kP8DCLެ,bZOfVD/̈bt _ ϝ^ˈ9|;'WVm۾r>."nݜu*:yU +endstream +endobj +510 0 obj +249 +endobj +461 0 obj +<> +endobj +462 0 obj +<> +endobj +460 0 obj +<> +endobj +457 0 obj +<> +>> +endobj +456 0 obj +<> +>> +endobj +455 0 obj +<> +>> +endobj +454 0 obj +<> +>> +endobj +453 0 obj +<> +>> +endobj +448 0 obj +<> +>> +endobj +447 0 obj +<> +>> +endobj +446 0 obj +<> +>> +endobj +445 0 obj +<> +>> +endobj +444 0 obj +<> +endobj +443 0 obj +<> +endobj +442 0 obj +<> +endobj +441 0 obj +<> +endobj +436 0 obj +<> +>> +endobj +435 0 obj +<> +>> +endobj +434 0 obj +<> +>> +endobj +433 0 obj +<> +>> +endobj +428 0 obj +<> +>> +endobj +427 0 obj +<> +>> +endobj +426 0 obj +<> +>> +endobj +425 0 obj +<> +>> +endobj +420 0 obj +<> +>> +endobj +419 0 obj +<> +>> +endobj +418 0 obj +<> +>> +endobj +417 0 obj +<> +>> +endobj +416 0 obj +<> +endobj +415 0 obj +<> +endobj +414 0 obj +<> +endobj +409 0 obj +<> +>> +endobj +408 0 obj +<> +>> +endobj +407 0 obj +<> +>> +endobj +406 0 obj +<> +>> +endobj +405 0 obj +<> +endobj +404 0 obj +<> +endobj +403 0 obj +<> +endobj +402 0 obj +<> +endobj +401 0 obj +<> +endobj +400 0 obj +<> +endobj +399 0 obj +<> +endobj +398 0 obj +<> +endobj +397 0 obj +<> +endobj +396 0 obj +<> +endobj +395 0 obj +<> +endobj +394 0 obj +<> +>> +endobj +393 0 obj +<> +endobj +392 0 obj +<> +endobj +391 0 obj +<> +endobj +390 0 obj +<> +endobj +389 0 obj +<> +endobj +388 0 obj +<> +endobj +387 0 obj +<> +endobj +386 0 obj +<> +>> +endobj +385 0 obj +<> +>> +endobj +384 0 obj +<> +>> +endobj +379 0 obj +<> +>> +endobj +378 0 obj +<> +>> +endobj +377 0 obj +<> +>> +endobj +376 0 obj +<> +>> +endobj +375 0 obj +<> +endobj +374 0 obj +<> +endobj +373 0 obj +<> +endobj +372 0 obj +<> +endobj +371 0 obj +<> +endobj +370 0 obj +<> +endobj +369 0 obj +<> +endobj +368 0 obj +<> +endobj +367 0 obj +<> +endobj +366 0 obj +<> +endobj +365 0 obj +<> +endobj +364 0 obj +<> +endobj +363 0 obj +<> +endobj +362 0 obj +<> +endobj +361 0 obj +<> +endobj +360 0 obj +<> +endobj +359 0 obj +<> +endobj +358 0 obj +<> +>> +endobj +357 0 obj +<> +endobj +356 0 obj +<> +endobj +355 0 obj +<> +endobj +354 0 obj +<> +endobj +353 0 obj +<> +endobj +352 0 obj +<> +endobj +347 0 obj +<> +>> +endobj +346 0 obj +<> +>> +endobj +345 0 obj +<> +>> +endobj +344 0 obj +<> +>> +endobj +343 0 obj +<> +endobj +342 0 obj +<> +endobj +341 0 obj +<> +endobj +340 0 obj +<> +endobj +339 0 obj +<> +endobj +338 0 obj +<> +endobj +337 0 obj +<> +endobj +336 0 obj +<> +endobj +335 0 obj +<> +endobj +334 0 obj +<> +endobj +333 0 obj +<> +endobj +332 0 obj +<> +endobj +331 0 obj +<> +endobj +330 0 obj +<> +endobj +329 0 obj +<> +endobj +324 0 obj +<> +>> +endobj +323 0 obj +<> +>> +endobj +322 0 obj +<> +>> +endobj +321 0 obj +<> +>> +endobj +320 0 obj +<> +endobj +319 0 obj +<> +endobj +318 0 obj +<> +endobj +317 0 obj +<> +endobj +316 0 obj +<> +endobj +315 0 obj +<> +endobj +314 0 obj +<> +endobj +313 0 obj +<> +endobj +312 0 obj +<> +endobj +311 0 obj +<> +endobj +310 0 obj +<> +endobj +305 0 obj +<> +>> +endobj +304 0 obj +<> +>> +endobj +303 0 obj +<> +>> +endobj +302 0 obj +<> +>> +endobj +301 0 obj +<> +endobj +300 0 obj +<> +endobj +299 0 obj +<> +endobj +298 0 obj +<> +endobj +297 0 obj +<> +endobj +296 0 obj +<> +endobj +295 0 obj +<> +endobj +294 0 obj +<> +endobj +293 0 obj +<> +endobj +292 0 obj +<> +endobj +291 0 obj +<> +endobj +290 0 obj +<> +endobj +289 0 obj +<> +endobj +288 0 obj +<> +endobj +287 0 obj +<> +endobj +286 0 obj +<> +endobj +285 0 obj +<> +endobj +284 0 obj +<> +endobj +283 0 obj +<> +endobj +282 0 obj +<> +endobj +281 0 obj +<> +endobj +280 0 obj +<> +endobj +279 0 obj +<> +endobj +278 0 obj +<> +endobj +277 0 obj +<> +endobj +276 0 obj +<> +endobj +275 0 obj +<> +endobj +274 0 obj +<> +endobj +273 0 obj +<> +endobj +272 0 obj +<> +endobj +271 0 obj +<> +endobj +270 0 obj +<> +endobj +269 0 obj +<> +endobj +268 0 obj +<> +endobj +263 0 obj +<> +>> +endobj +262 0 obj +<> +>> +endobj +261 0 obj +<> +>> +endobj +260 0 obj +<> +>> +endobj +259 0 obj +<> +endobj +258 0 obj +<> +endobj +257 0 obj +<> +>> +endobj +256 0 obj +<> +>> +endobj +255 0 obj +<> +>> +endobj +254 0 obj +<> +>> +endobj +253 0 obj +<> +>> +endobj +252 0 obj +<> +>> +endobj +251 0 obj +<> +endobj +245 0 obj +<> +>> +endobj +244 0 obj +<> +>> +endobj +243 0 obj +<> +>> +endobj +242 0 obj +<> +>> +endobj +241 0 obj +<> +>> +endobj +240 0 obj +<> +endobj +239 0 obj +<> +endobj +238 0 obj +<> +endobj +237 0 obj +<> +endobj +236 0 obj +<> +endobj +235 0 obj +<> +endobj +229 0 obj +<> +>> +endobj +228 0 obj +<> +>> +endobj +227 0 obj +<> +>> +endobj +226 0 obj +<> +>> +endobj +225 0 obj +<> +endobj +224 0 obj +<> +endobj +223 0 obj +<> +endobj +222 0 obj +<> +endobj +221 0 obj +<> +endobj +220 0 obj +<> +endobj +219 0 obj +<> +endobj +218 0 obj +<> +endobj +217 0 obj +<> +endobj +216 0 obj +<> +endobj +211 0 obj +<> +>> +endobj +210 0 obj +<> +>> +endobj +209 0 obj +<> +>> +endobj +208 0 obj +<> +>> +endobj +207 0 obj +<> +endobj +206 0 obj +<> +endobj +205 0 obj +<> +endobj +204 0 obj +<> +endobj +203 0 obj +<> +endobj +202 0 obj +<> +endobj +201 0 obj +<> +endobj +200 0 obj +<> +endobj +199 0 obj +<> +endobj +194 0 obj +<> +>> +endobj +193 0 obj +<> +>> +endobj +192 0 obj +<> +>> +endobj +191 0 obj +<> +>> +endobj +190 0 obj +<> +endobj +189 0 obj +<> +endobj +188 0 obj +<> +endobj +187 0 obj +<> +endobj +186 0 obj +<> +endobj +185 0 obj +<> +endobj +184 0 obj +<> +endobj +183 0 obj +<> +endobj +182 0 obj +<> +endobj +181 0 obj +<> +endobj +176 0 obj +<> +>> +endobj +175 0 obj +<> +>> +endobj +174 0 obj +<> +>> +endobj +173 0 obj +<> +>> +endobj +172 0 obj +<> +>> +endobj +171 0 obj +<> +>> +endobj +170 0 obj +<> +>> +endobj +169 0 obj +<> +endobj +168 0 obj +<> +endobj +167 0 obj +<> +endobj +162 0 obj +<> +>> +endobj +161 0 obj +<> +>> +endobj +160 0 obj +<> +>> +endobj +159 0 obj +<> +>> +endobj +158 0 obj +<> +endobj +157 0 obj +<> +endobj +156 0 obj +<> +endobj +155 0 obj +<> +endobj +154 0 obj +<> +endobj +153 0 obj +<> +endobj +152 0 obj +<> +endobj +151 0 obj +<> +endobj +150 0 obj +<> +endobj +149 0 obj +<> +endobj +148 0 obj +<> +endobj +147 0 obj +<> +endobj +146 0 obj +<> +endobj +145 0 obj +<> +endobj +140 0 obj +<> +>> +endobj +139 0 obj +<> +>> +endobj +138 0 obj +<> +>> +endobj +137 0 obj +<> +>> +endobj +136 0 obj +<> +endobj +135 0 obj +<> +endobj +134 0 obj +<> +endobj +133 0 obj +<> +endobj +132 0 obj +<> +>> +endobj +131 0 obj +<> +>> +endobj +130 0 obj +<> +>> +endobj +129 0 obj +<> +>> +endobj +128 0 obj +<> +>> +endobj +127 0 obj +<> +>> +endobj +126 0 obj +<> +endobj +125 0 obj +<> +endobj +119 0 obj +<> +>> +endobj +118 0 obj +<> +>> +endobj +117 0 obj +<> +>> +endobj +116 0 obj +<> +>> +endobj +115 0 obj +<> +endobj +114 0 obj +<> +>> +endobj +113 0 obj +<> +>> +endobj +112 0 obj +<> +>> +endobj +111 0 obj +<> +endobj +110 0 obj +<> +endobj +109 0 obj +<> +endobj +108 0 obj +<> +endobj +107 0 obj +<> +endobj +106 0 obj +<> +endobj +105 0 obj +<> +endobj +104 0 obj +<> +>> +endobj +103 0 obj +<> +endobj +96 0 obj +<> +>> +endobj +95 0 obj +<> +>> +endobj +94 0 obj +<> +>> +endobj +93 0 obj +<> +>> +endobj +91 0 obj +<> +endobj +90 0 obj +<> +endobj +89 0 obj +<> +endobj +88 0 obj +<> +endobj +87 0 obj +<> +endobj +86 0 obj +<> +endobj +85 0 obj +<> +endobj +84 0 obj +<> +endobj +83 0 obj +<> +endobj +82 0 obj +<> +endobj +81 0 obj +<> +endobj +80 0 obj +<> +endobj +79 0 obj +<> +endobj +78 0 obj +<> +endobj +77 0 obj +<> +endobj +76 0 obj +<> +endobj +75 0 obj +<> +endobj +74 0 obj +<> +endobj +73 0 obj +<> +endobj +72 0 obj +<> +endobj +71 0 obj +<> +endobj +70 0 obj +<> +endobj +69 0 obj +<> +endobj +68 0 obj +<> +endobj +67 0 obj +<> +endobj +66 0 obj +<> +endobj +65 0 obj +<> +endobj +64 0 obj +<> +endobj +63 0 obj +<> +endobj +62 0 obj +<> +endobj +61 0 obj +<> +endobj +60 0 obj +<> +endobj +59 0 obj +<> +endobj +58 0 obj +<> +endobj +57 0 obj +<> +endobj +56 0 obj +<> +endobj +55 0 obj +<> +endobj +54 0 obj +<> +endobj +53 0 obj +<> +endobj +52 0 obj +<> +endobj +51 0 obj +<> +>> +endobj +1 0 obj +<> +] >> +/Names 41 0 R +/PageMode /UseOutlines +/Outlines 5 0 R +/OpenAction [37 0 R /XYZ 0 841.9 0] +/Metadata 3 0 R +>> +endobj +2 0 obj +<> +endobj +511 0 obj +<> +endobj +512 0 obj +<> +endobj +37 0 obj +<> +endobj +40 0 obj +<> +/XObject <> +>> +endobj +513 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +514 0 obj +44 +endobj +97 0 obj +<> +endobj +100 0 obj +<> +/XObject <> +>> +endobj +515 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +516 0 obj +44 +endobj +120 0 obj +<> +endobj +123 0 obj +<> +/XObject <> +>> +endobj +517 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +518 0 obj +44 +endobj +141 0 obj +<> +endobj +144 0 obj +<> +/XObject <> +>> +endobj +519 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +520 0 obj +44 +endobj +163 0 obj +<> +endobj +166 0 obj +<> +/XObject <> +>> +endobj +521 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +522 0 obj +44 +endobj +177 0 obj +<> +endobj +180 0 obj +<> +/XObject <> +>> +endobj +523 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +524 0 obj +44 +endobj +195 0 obj +<> +endobj +198 0 obj +<> +/XObject <> +>> +endobj +525 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +526 0 obj +44 +endobj +212 0 obj +<> +endobj +215 0 obj +<> +/XObject <> +>> +endobj +527 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +528 0 obj +44 +endobj +230 0 obj +<> +endobj +233 0 obj +<> +/XObject <> +>> +endobj +529 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +530 0 obj +44 +endobj +246 0 obj +<> +endobj +249 0 obj +<> +/XObject <> +>> +endobj +531 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +532 0 obj +44 +endobj +264 0 obj +<> +endobj +267 0 obj +<> +/XObject <> +>> +endobj +533 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +534 0 obj +44 +endobj +306 0 obj +<> +endobj +309 0 obj +<> +/XObject <> +>> +endobj +535 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +536 0 obj +44 +endobj +325 0 obj +<> +endobj +328 0 obj +<> +/XObject <> +>> +endobj +537 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +538 0 obj +44 +endobj +348 0 obj +<> +endobj +351 0 obj +<> +/XObject <> +>> +endobj +539 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +540 0 obj +44 +endobj +380 0 obj +<> +endobj +383 0 obj +<> +/XObject <> +>> +endobj +541 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +542 0 obj +44 +endobj +410 0 obj +<> +endobj +413 0 obj +<> +/XObject <> +>> +endobj +543 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +544 0 obj +44 +endobj +421 0 obj +<> +endobj +424 0 obj +<> +/XObject <> +>> +endobj +545 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +546 0 obj +44 +endobj +429 0 obj +<> +endobj +432 0 obj +<> +/XObject <> +>> +endobj +547 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +548 0 obj +44 +endobj +437 0 obj +<> +endobj +440 0 obj +<> +/XObject <> +>> +endobj +549 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +550 0 obj +44 +endobj +449 0 obj +<> +endobj +452 0 obj +<> +/XObject <> +>> +endobj +551 0 obj +<> +stream +x+2P0P24327sl C= K% + +endstream +endobj +552 0 obj +44 +endobj +3 0 obj +<> +stream + + + + +application/pdf + + + Boost.Ratio 1.0.0 + + + + + Howard Hinnant, Beman Dawes, and Vicente J. Botet Escriba + + + + +XEP 4.14 build 20081212 + + +DocBook XSL Stylesheets V1.69.1 +2011-01-01T13:58:53Z +2011-01-01T13:58:53Z + + + + + +endstream +endobj +5 0 obj +<> +endobj +18 0 obj +<> +endobj +20 0 obj +<) +/Parent 18 0 R +/Next 28 0 R +/Prev 19 0 R +/First 21 0 R +/Last 27 0 R +/Count -6 +>> +endobj +27 0 obj +<> +endobj +26 0 obj +<> +endobj +25 0 obj +<> +endobj +24 0 obj +<> +endobj +22 0 obj +<) +/Parent 20 0 R +/Next 24 0 R +/Prev 21 0 R +/First 23 0 R +/Last 23 0 R +/Count -1 +>> +endobj +23 0 obj +<> +endobj +21 0 obj +<> +endobj +19 0 obj +<) +/Parent 18 0 R +/Next 20 0 R +>> +endobj +28 0 obj +<) +/Parent 18 0 R +/Prev 20 0 R +>> +endobj +29 0 obj +<> +endobj +36 0 obj +<> +endobj +35 0 obj +<> +endobj +34 0 obj +<> +endobj +33 0 obj +<> +endobj +32 0 obj +<> +endobj +30 0 obj +<> +endobj +31 0 obj +<> +endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +13 0 obj +<> +endobj +17 0 obj +<> +endobj +15 0 obj +<> +endobj +16 0 obj +<> +endobj +14 0 obj +<> +endobj +8 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +7 0 obj +<> +endobj +6 0 obj +<> +endobj +41 0 obj +<> +endobj +42 0 obj +<> +endobj +971 0 obj +<> +endobj +973 0 obj +<> +endobj +974 0 obj +<> +endobj +975 0 obj +<> +endobj +976 0 obj +<> +endobj +977 0 obj +<> +endobj +978 0 obj +<> +endobj +979 0 obj +<> +endobj +980 0 obj +<> +endobj +981 0 obj +<> +endobj +982 0 obj +<> +endobj +983 0 obj +<> +endobj +984 0 obj +<> +endobj +985 0 obj +<> +endobj +986 0 obj +<> +endobj +987 0 obj +<> +endobj +988 0 obj +<> +endobj +972 0 obj +<> +endobj +989 0 obj +<> +endobj +990 0 obj +<> +endobj +991 0 obj +<> +endobj +992 0 obj +<> +endobj +993 0 obj +<> +endobj +994 0 obj +<> +endobj +995 0 obj +<> +endobj +996 0 obj +<> +endobj +997 0 obj +<> +endobj +998 0 obj +<> +endobj +999 0 obj +<> +endobj +938 0 obj +<> +endobj +952 0 obj +<> +endobj +580 0 obj +<> +endobj +564 0 obj +<> +endobj +565 0 obj +<> +endobj +586 0 obj +<> +endobj +875 0 obj +<> +endobj +608 0 obj +<> +endobj +603 0 obj +<> +endobj +648 0 obj +<> +endobj +719 0 obj +<> +endobj +788 0 obj +<> +endobj +575 0 obj +<> +endobj +962 0 obj +<> +endobj +652 0 obj +<> +endobj +947 0 obj +<> +endobj +753 0 obj +<> +endobj +920 0 obj +<> +endobj +694 0 obj +<> +endobj +630 0 obj +<> +endobj +953 0 obj +<> +endobj +667 0 obj +<> +endobj +725 0 obj +<> +endobj +954 0 obj +<> +endobj +932 0 obj +<> +endobj +661 0 obj +<> +endobj +968 0 obj +<> +endobj +936 0 obj +<> +endobj +824 0 obj +<> +endobj +571 0 obj +<> +endobj +897 0 obj +<> +endobj +969 0 obj +<> +endobj +846 0 obj +<> +endobj +803 0 obj +<> +endobj +918 0 obj +<> +endobj +834 0 obj +<> +endobj +840 0 obj +<> +endobj +695 0 obj +<> +endobj +666 0 obj +<> +endobj +745 0 obj +<> +endobj +640 0 obj +<> +endobj +634 0 obj +<> +endobj +591 0 obj +<> +endobj +635 0 obj +<> +endobj +818 0 obj +<> +endobj +656 0 obj +<> +endobj +555 0 obj +<> +endobj +802 0 obj +<> +endobj +743 0 obj +<> +endobj +594 0 obj +<> +endobj +593 0 obj +<> +endobj +811 0 obj +<> +endobj +838 0 obj +<> +endobj +821 0 obj +<> +endobj +843 0 obj +<> +endobj +574 0 obj +<> +endobj +681 0 obj +<> +endobj +672 0 obj +<> +endobj +941 0 obj +<> +endobj +919 0 obj +<> +endobj +893 0 obj +<> +endobj +870 0 obj +<> +endobj +908 0 obj +<> +endobj +720 0 obj +<> +endobj +765 0 obj +<> +endobj +849 0 obj +<> +endobj +901 0 obj +<> +endobj +878 0 obj +<> +endobj +877 0 obj +<> +endobj +833 0 obj +<> +endobj +815 0 obj +<> +endobj +945 0 obj +<> +endobj +899 0 obj +<> +endobj +569 0 obj +<> +endobj +554 0 obj +<> +endobj +959 0 obj +<> +endobj +611 0 obj +<> +endobj +609 0 obj +<> +endobj +966 0 obj +<> +endobj +965 0 obj +<> +endobj +615 0 obj +<> +endobj +716 0 obj +<> +endobj +678 0 obj +<> +endobj +643 0 obj +<> +endobj +627 0 obj +<> +endobj +595 0 obj +<> +endobj +733 0 obj +<> +endobj +698 0 obj +<> +endobj +676 0 obj +<> +endobj +653 0 obj +<> +endobj +760 0 obj +<> +endobj +717 0 obj +<> +endobj +685 0 obj +<> +endobj +657 0 obj +<> +endobj +776 0 obj +<> +endobj +774 0 obj +<> +endobj +761 0 obj +<> +endobj +754 0 obj +<> +endobj +738 0 obj +<> +endobj +736 0 obj +<> +endobj +718 0 obj +<> +endobj +714 0 obj +<> +endobj +702 0 obj +<> +endobj +687 0 obj +<> +endobj +686 0 obj +<> +endobj +677 0 obj +<> +endobj +805 0 obj +<> +endobj +796 0 obj +<> +endobj +755 0 obj +<> +endobj +556 0 obj +<> +endobj +619 0 obj +<> +endobj +583 0 obj +<> +endobj +701 0 obj +<> +endobj +715 0 obj +<> +endobj +793 0 obj +<> +endobj +906 0 obj +<> +endobj +892 0 obj +<> +endobj +596 0 obj +<> +endobj +890 0 obj +<> +endobj +935 0 obj +<> +endobj +931 0 obj +<> +endobj +928 0 obj +<> +endobj +895 0 obj +<> +endobj +859 0 obj +<> +endobj +589 0 obj +<> +endobj +807 0 obj +<> +endobj +844 0 obj +<> +endobj +842 0 obj +<> +endobj +829 0 obj +<> +endobj +822 0 obj +<> +endobj +800 0 obj +<> +endobj +916 0 obj +<> +endobj +734 0 obj +<> +endobj +732 0 obj +<> +endobj +625 0 obj +<> +endobj +705 0 obj +<> +endobj +798 0 obj +<> +endobj +614 0 obj +<> +endobj +570 0 obj +<> +endobj +680 0 obj +<> +endobj +646 0 obj +<> +endobj +756 0 obj +<> +endobj +704 0 obj +<> +endobj +873 0 obj +<> +endobj +826 0 obj +<> +endobj +658 0 obj +<> +endobj +616 0 obj +<> +endobj +573 0 obj +<> +endobj +688 0 obj +<> +endobj +649 0 obj +<> +endobj +757 0 obj +<> +endobj +721 0 obj +<> +endobj +679 0 obj +<> +endobj +786 0 obj +<> +endobj +749 0 obj +<> +endobj +557 0 obj +<> +endobj +939 0 obj +<> +endobj +955 0 obj +<> +endobj +613 0 obj +<> +endobj +610 0 obj +<> +endobj +946 0 obj +<> +endobj +584 0 obj +<> +endobj +963 0 obj +<> +endobj +675 0 obj +<> +endobj +777 0 obj +<> +endobj +879 0 obj +<> +endobj +904 0 obj +<> +endobj +567 0 obj +<> +endobj +644 0 obj +<> +endobj +647 0 obj +<> +endobj +585 0 obj +<> +endobj +572 0 obj +<> +endobj +956 0 obj +<> +endobj +558 0 obj +<> +endobj +731 0 obj +<> +endobj +889 0 obj +<> +endobj +937 0 obj +<> +endobj +560 0 obj +<> +endobj +599 0 obj +<> +endobj +662 0 obj +<> +endobj +860 0 obj +<> +endobj +898 0 obj +<> +endobj +902 0 obj +<> +endobj +682 0 obj +<> +endobj +602 0 obj +<> +endobj +601 0 obj +<> +endobj +577 0 obj +<> +endobj +576 0 obj +<> +endobj +708 0 obj +<> +endobj +620 0 obj +<> +endobj +709 0 obj +<> +endobj +750 0 obj +<> +endobj +744 0 obj +<> +endobj +785 0 obj +<> +endobj +814 0 obj +<> +endobj +751 0 obj +<> +endobj +787 0 obj +<> +endobj +929 0 obj +<> +endobj +683 0 obj +<> +endobj +723 0 obj +<> +endobj +707 0 obj +<> +endobj +706 0 obj +<> +endobj +691 0 obj +<> +endobj +684 0 obj +<> +endobj +933 0 obj +<> +endobj +779 0 obj +<> +endobj +891 0 obj +<> +endobj +703 0 obj +<> +endobj +592 0 obj +<> +endobj +841 0 obj +<> +endobj +930 0 obj +<> +endobj +905 0 obj +<> +endobj +797 0 obj +<> +endobj +940 0 obj +<> +endobj +926 0 obj +<> +endobj +784 0 obj +<> +endobj +605 0 obj +<> +endobj +633 0 obj +<> +endobj +828 0 obj +<> +endobj +867 0 obj +<> +endobj +848 0 obj +<> +endobj +964 0 obj +<> +endobj +621 0 obj +<> +endobj +739 0 obj +<> +endobj +618 0 obj +<> +endobj +664 0 obj +<> +endobj +778 0 obj +<> +endobj +934 0 obj +<> +endobj +692 0 obj +<> +endobj +581 0 obj +<> +endobj +597 0 obj +<> +endobj +813 0 obj +<> +endobj +726 0 obj +<> +endobj +766 0 obj +<> +endobj +559 0 obj +<> +endobj +801 0 obj +<> +endobj +724 0 obj +<> +endobj +587 0 obj +<> +endobj +651 0 obj +<> +endobj +810 0 obj +<> +endobj +790 0 obj +<> +endobj +624 0 obj +<> +endobj +967 0 obj +<> +endobj +924 0 obj +<> +endobj +789 0 obj +<> +endobj +872 0 obj +<> +endobj +913 0 obj +<> +endobj +741 0 obj +<> +endobj +858 0 obj +<> +endobj +696 0 obj +<> +endobj +927 0 obj +<> +endobj +885 0 obj +<> +endobj +604 0 obj +<> +endobj +960 0 obj +<> +endobj +631 0 obj +<> +endobj +847 0 obj +<> +endobj +612 0 obj +<> +endobj +655 0 obj +<> +endobj +561 0 obj +<> +endobj +737 0 obj +<> +endobj +823 0 obj +<> +endobj +812 0 obj +<> +endobj +671 0 obj +<> +endobj +654 0 obj +<> +endobj +628 0 obj +<> +endobj +598 0 obj +<> +endobj +645 0 obj +<> +endobj +871 0 obj +<> +endobj +917 0 obj +<> +endobj +582 0 obj +<> +endobj +638 0 obj +<> +endobj +607 0 obj +<> +endobj +606 0 obj +<> +endobj +568 0 obj +<> +endobj +553 0 obj +<> +endobj +673 0 obj +<> +endobj +637 0 obj +<> +endobj +728 0 obj +<> +endobj +710 0 obj +<> +endobj +693 0 obj +<> +endobj +769 0 obj +<> +endobj +767 0 obj +<> +endobj +700 0 obj +<> +endobj +699 0 obj +<> +endobj +772 0 obj +<> +endobj +868 0 obj +<> +endobj +820 0 obj +<> +endobj +792 0 obj +<> +endobj +783 0 obj +<> +endobj +758 0 obj +<> +endobj +882 0 obj +<> +endobj +850 0 obj +<> +endobj +817 0 obj +<> +endobj +804 0 obj +<> +endobj +914 0 obj +<> +endobj +869 0 obj +<> +endobj +835 0 obj +<> +endobj +806 0 obj +<> +endobj +923 0 obj +<> +endobj +921 0 obj +<> +endobj +915 0 obj +<> +endobj +909 0 obj +<> +endobj +886 0 obj +<> +endobj +884 0 obj +<> +endobj +866 0 obj +<> +endobj +864 0 obj +<> +endobj +853 0 obj +<> +endobj +837 0 obj +<> +endobj +836 0 obj +<> +endobj +819 0 obj +<> +endobj +957 0 obj +<> +endobj +949 0 obj +<> +endobj +910 0 obj +<> +endobj +711 0 obj +<> +endobj +775 0 obj +<> +endobj +746 0 obj +<> +endobj +851 0 obj +<> +endobj +865 0 obj +<> +endobj +948 0 obj +<> +endobj +642 0 obj +<> +endobj +626 0 obj +<> +endobj +759 0 obj +<> +endobj +623 0 obj +<> +endobj +668 0 obj +<> +endobj +663 0 obj +<> +endobj +660 0 obj +<> +endobj +632 0 obj +<> +endobj +588 0 obj +<> +endobj +752 0 obj +<> +endobj +958 0 obj +<> +endobj +579 0 obj +<> +endobj +578 0 obj +<> +endobj +566 0 obj +<> +endobj +563 0 obj +<> +endobj +951 0 obj +<> +endobj +650 0 obj +<> +endobj +883 0 obj +<> +endobj +881 0 obj +<> +endobj +782 0 obj +<> +endobj +855 0 obj +<> +endobj +950 0 obj +<> +endobj +771 0 obj +<> +endobj +729 0 obj +<> +endobj +825 0 obj +<> +endobj +795 0 obj +<> +endobj +911 0 obj +<> +endobj +854 0 obj +<> +endobj +600 0 obj +<> +endobj +562 0 obj +<> +endobj +808 0 obj +<> +endobj +773 0 obj +<> +endobj +735 0 obj +<> +endobj +839 0 obj +<> +endobj +799 0 obj +<> +endobj +912 0 obj +<> +endobj +874 0 obj +<> +endobj +827 0 obj +<> +endobj +943 0 obj +<> +endobj +894 0 obj +<> +endobj +712 0 obj +<> +endobj +670 0 obj +<> +endobj +689 0 obj +<> +endobj +770 0 obj +<> +endobj +768 0 obj +<> +endobj +674 0 obj +<> +endobj +747 0 obj +<> +endobj +697 0 obj +<> +endobj +816 0 obj +<> +endobj +925 0 obj +<> +endobj +617 0 obj +<> +endobj +641 0 obj +<> +endobj +727 0 obj +<> +endobj +794 0 obj +<> +endobj +791 0 obj +<> +endobj +748 0 obj +<> +endobj +730 0 obj +<> +endobj +690 0 obj +<> +endobj +713 0 obj +<> +endobj +880 0 obj +<> +endobj +622 0 obj +<> +endobj +669 0 obj +<> +endobj +722 0 obj +<> +endobj +762 0 obj +<> +endobj +809 0 obj +<> +endobj +590 0 obj +<> +endobj +636 0 obj +<> +endobj +639 0 obj +<> +endobj +830 0 obj +<> +endobj +764 0 obj +<> +endobj +763 0 obj +<> +endobj +742 0 obj +<> +endobj +740 0 obj +<> +endobj +861 0 obj +<> +endobj +780 0 obj +<> +endobj +862 0 obj +<> +endobj +896 0 obj +<> +endobj +888 0 obj +<> +endobj +942 0 obj +<> +endobj +970 0 obj +<> +endobj +903 0 obj +<> +endobj +944 0 obj +<> +endobj +659 0 obj +<> +endobj +831 0 obj +<> +endobj +876 0 obj +<> +endobj +857 0 obj +<> +endobj +856 0 obj +<> +endobj +845 0 obj +<> +endobj +832 0 obj +<> +endobj +863 0 obj +<> +endobj +900 0 obj +<> +endobj +629 0 obj +<> +endobj +907 0 obj +<> +endobj +781 0 obj +<> +endobj +922 0 obj +<> +endobj +665 0 obj +<> +endobj +961 0 obj +<> +endobj +852 0 obj +<> +endobj +887 0 obj +<> +endobj +xref +0 1000 +0000000000 65535 f +0000126371 00000 n +0000126564 00000 n +0000140056 00000 n +0000065217 00000 n +0000141107 00000 n +0000145240 00000 n +0000145129 00000 n +0000144771 00000 n +0000145022 00000 n +0000144913 00000 n +0000143837 00000 n +0000143988 00000 n +0000144147 00000 n +0000144650 00000 n +0000144389 00000 n +0000144546 00000 n +0000144265 00000 n +0000141162 00000 n +0000142473 00000 n +0000141309 00000 n +0000142349 00000 n +0000142050 00000 n +0000142227 00000 n +0000141905 00000 n +0000141760 00000 n +0000141619 00000 n +0000141482 00000 n +0000142603 00000 n +0000142732 00000 n +0000143541 00000 n +0000143695 00000 n +0000143407 00000 n +0000143257 00000 n +0000143135 00000 n +0000142987 00000 n +0000142868 00000 n +0000126923 00000 n +0000000015 00000 n +0000008888 00000 n +0000127465 00000 n +0000145333 00000 n +0000145368 00000 n +0000074632 00000 n +0000073198 00000 n +0000080530 00000 n +0000082498 00000 n +0000069194 00000 n +0000065490 00000 n +0000076189 00000 n +0000072323 00000 n +0000126238 00000 n +0000126135 00000 n +0000126026 00000 n +0000125909 00000 n +0000125789 00000 n +0000125671 00000 n +0000125550 00000 n +0000125442 00000 n +0000125330 00000 n +0000125205 00000 n +0000125077 00000 n +0000124960 00000 n +0000124839 00000 n +0000124722 00000 n +0000124601 00000 n +0000124477 00000 n +0000124350 00000 n +0000124244 00000 n +0000124134 00000 n +0000124014 00000 n +0000123891 00000 n +0000123774 00000 n +0000123654 00000 n +0000123534 00000 n +0000123411 00000 n +0000123304 00000 n +0000123193 00000 n +0000123077 00000 n +0000122958 00000 n +0000122840 00000 n +0000122719 00000 n +0000122596 00000 n +0000122470 00000 n +0000122358 00000 n +0000122243 00000 n +0000122118 00000 n +0000121990 00000 n +0000121877 00000 n +0000121761 00000 n +0000121655 00000 n +0000121519 00000 n +0000065967 00000 n +0000121410 00000 n +0000121279 00000 n +0000121156 00000 n +0000121039 00000 n +0000127781 00000 n +0000008909 00000 n +0000012003 00000 n +0000128145 00000 n +0000078569 00000 n +0000068606 00000 n +0000120921 00000 n +0000120759 00000 n +0000120640 00000 n +0000120513 00000 n +0000120387 00000 n +0000120277 00000 n +0000120151 00000 n +0000120017 00000 n +0000119862 00000 n +0000119610 00000 n +0000119463 00000 n +0000119310 00000 n +0000119145 00000 n +0000119035 00000 n +0000118903 00000 n +0000118779 00000 n +0000118661 00000 n +0000128464 00000 n +0000012024 00000 n +0000013687 00000 n +0000128822 00000 n +0000077808 00000 n +0000118505 00000 n +0000118358 00000 n +0000118229 00000 n +0000118099 00000 n +0000117973 00000 n +0000117838 00000 n +0000117703 00000 n +0000117572 00000 n +0000117359 00000 n +0000117207 00000 n +0000117058 00000 n +0000116906 00000 n +0000116796 00000 n +0000116664 00000 n +0000116540 00000 n +0000116422 00000 n +0000129118 00000 n +0000013709 00000 n +0000016519 00000 n +0000129492 00000 n +0000116304 00000 n +0000116184 00000 n +0000116063 00000 n +0000115941 00000 n +0000115820 00000 n +0000115693 00000 n +0000115572 00000 n +0000115445 00000 n +0000115320 00000 n +0000115194 00000 n +0000115068 00000 n +0000114931 00000 n +0000114792 00000 n +0000114665 00000 n +0000114555 00000 n +0000114423 00000 n +0000114299 00000 n +0000114181 00000 n +0000129799 00000 n +0000016541 00000 n +0000019492 00000 n +0000130109 00000 n +0000114054 00000 n +0000113927 00000 n +0000113799 00000 n +0000113640 00000 n +0000113481 00000 n +0000113339 00000 n +0000113229 00000 n +0000113097 00000 n +0000112973 00000 n +0000112855 00000 n +0000130404 00000 n +0000019514 00000 n +0000023495 00000 n +0000130746 00000 n +0000112736 00000 n +0000112611 00000 n +0000112484 00000 n +0000112347 00000 n +0000112208 00000 n +0000112081 00000 n +0000111954 00000 n +0000111827 00000 n +0000111700 00000 n +0000111575 00000 n +0000111465 00000 n +0000111333 00000 n +0000111209 00000 n +0000111091 00000 n +0000131041 00000 n +0000023517 00000 n +0000026417 00000 n +0000131375 00000 n +0000110952 00000 n +0000110813 00000 n +0000110674 00000 n +0000110547 00000 n +0000110420 00000 n +0000110293 00000 n +0000110166 00000 n +0000110041 00000 n +0000109916 00000 n +0000109806 00000 n +0000109674 00000 n +0000109550 00000 n +0000109432 00000 n +0000131659 00000 n +0000026439 00000 n +0000029786 00000 n +0000132001 00000 n +0000109305 00000 n +0000109178 00000 n +0000109053 00000 n +0000108928 00000 n +0000108801 00000 n +0000108674 00000 n +0000108547 00000 n +0000108420 00000 n +0000108293 00000 n +0000108166 00000 n +0000108056 00000 n +0000107924 00000 n +0000107800 00000 n +0000107682 00000 n +0000132274 00000 n +0000029808 00000 n +0000034102 00000 n +0000132592 00000 n +0000079766 00000 n +0000107555 00000 n +0000107428 00000 n +0000107303 00000 n +0000107178 00000 n +0000107055 00000 n +0000106928 00000 n +0000106800 00000 n +0000106690 00000 n +0000106558 00000 n +0000106434 00000 n +0000106316 00000 n +0000132889 00000 n +0000034124 00000 n +0000035456 00000 n +0000133223 00000 n +0000071109 00000 n +0000106193 00000 n +0000106057 00000 n +0000105921 00000 n +0000105760 00000 n +0000105595 00000 n +0000105430 00000 n +0000105263 00000 n +0000105155 00000 n +0000105034 00000 n +0000104924 00000 n +0000104792 00000 n +0000104668 00000 n +0000104550 00000 n +0000133531 00000 n +0000035478 00000 n +0000038673 00000 n +0000134065 00000 n +0000104423 00000 n +0000104285 00000 n +0000104149 00000 n +0000104011 00000 n +0000103873 00000 n +0000103737 00000 n +0000103599 00000 n +0000103461 00000 n +0000103323 00000 n +0000103185 00000 n +0000103049 00000 n +0000102910 00000 n +0000102771 00000 n +0000102634 00000 n +0000102495 00000 n +0000102356 00000 n +0000102217 00000 n +0000102078 00000 n +0000101941 00000 n +0000101802 00000 n +0000101663 00000 n +0000101524 00000 n +0000101385 00000 n +0000101248 00000 n +0000101109 00000 n +0000100970 00000 n +0000100831 00000 n +0000100713 00000 n +0000100592 00000 n +0000100465 00000 n +0000100340 00000 n +0000100217 00000 n +0000100092 00000 n +0000099969 00000 n +0000099859 00000 n +0000099727 00000 n +0000099603 00000 n +0000099485 00000 n +0000134373 00000 n +0000038695 00000 n +0000042147 00000 n +0000134723 00000 n +0000099361 00000 n +0000099234 00000 n +0000099107 00000 n +0000098982 00000 n +0000098855 00000 n +0000098728 00000 n +0000098601 00000 n +0000098476 00000 n +0000098349 00000 n +0000098222 00000 n +0000098095 00000 n +0000097985 00000 n +0000097853 00000 n +0000097729 00000 n +0000097611 00000 n +0000135031 00000 n +0000042169 00000 n +0000044853 00000 n +0000135413 00000 n +0000097488 00000 n +0000097363 00000 n +0000097236 00000 n +0000097101 00000 n +0000096979 00000 n +0000096747 00000 n +0000096620 00000 n +0000096382 00000 n +0000096255 00000 n +0000096019 00000 n +0000095898 00000 n +0000095664 00000 n +0000095543 00000 n +0000095410 00000 n +0000095175 00000 n +0000095065 00000 n +0000094933 00000 n +0000094809 00000 n +0000094691 00000 n +0000135721 00000 n +0000044875 00000 n +0000048169 00000 n +0000136175 00000 n +0000094452 00000 n +0000094218 00000 n +0000093978 00000 n +0000093743 00000 n +0000093500 00000 n +0000093364 00000 n +0000093208 00000 n +0000093082 00000 n +0000092956 00000 n +0000092830 00000 n +0000092704 00000 n +0000092580 00000 n +0000092454 00000 n +0000092328 00000 n +0000092202 00000 n +0000092076 00000 n +0000091952 00000 n +0000091826 00000 n +0000091700 00000 n +0000091574 00000 n +0000091448 00000 n +0000091324 00000 n +0000091198 00000 n +0000091070 00000 n +0000090960 00000 n +0000090828 00000 n +0000090704 00000 n +0000090586 00000 n +0000136483 00000 n +0000048191 00000 n +0000051045 00000 n +0000136921 00000 n +0000090414 00000 n +0000090243 00000 n +0000090071 00000 n +0000089950 00000 n +0000089841 00000 n +0000089724 00000 n +0000089580 00000 n +0000089461 00000 n +0000089250 00000 n +0000089040 00000 n +0000088876 00000 n +0000088755 00000 n +0000088630 00000 n +0000088507 00000 n +0000088370 00000 n +0000088243 00000 n +0000088116 00000 n +0000087979 00000 n +0000087852 00000 n +0000087725 00000 n +0000087598 00000 n +0000087473 00000 n +0000087363 00000 n +0000087231 00000 n +0000087107 00000 n +0000086989 00000 n +0000137229 00000 n +0000051067 00000 n +0000054087 00000 n +0000137515 00000 n +0000086821 00000 n +0000086697 00000 n +0000086504 00000 n +0000086394 00000 n +0000086262 00000 n +0000086138 00000 n +0000086020 00000 n +0000137810 00000 n +0000054109 00000 n +0000057578 00000 n +0000138072 00000 n +0000085910 00000 n +0000085778 00000 n +0000085654 00000 n +0000085536 00000 n +0000138367 00000 n +0000057600 00000 n +0000059999 00000 n +0000138629 00000 n +0000085426 00000 n +0000085294 00000 n +0000085170 00000 n +0000085052 00000 n +0000138924 00000 n +0000060021 00000 n +0000064565 00000 n +0000139218 00000 n +0000084939 00000 n +0000084813 00000 n +0000084699 00000 n +0000084568 00000 n +0000084458 00000 n +0000084326 00000 n +0000084202 00000 n +0000084084 00000 n +0000139513 00000 n +0000064587 00000 n +0000065196 00000 n +0000139783 00000 n +0000083913 00000 n +0000083803 00000 n +0000083671 00000 n +0000083547 00000 n +0000083429 00000 n +0000065853 00000 n +0000065874 00000 n +0000083380 00000 n +0000083288 00000 n +0000083334 00000 n +0000068504 00000 n +0000068526 00000 n +0000069080 00000 n +0000069101 00000 n +0000069713 00000 n +0000070251 00000 n +0000070441 00000 n +0000071088 00000 n +0000071486 00000 n +0000071669 00000 n +0000071870 00000 n +0000072302 00000 n +0000072548 00000 n +0000072636 00000 n +0000072836 00000 n +0000073177 00000 n +0000073633 00000 n +0000073909 00000 n +0000074103 00000 n +0000074611 00000 n +0000075100 00000 n +0000075401 00000 n +0000075606 00000 n +0000076168 00000 n +0000076658 00000 n +0000077014 00000 n +0000077214 00000 n +0000077787 00000 n +0000077977 00000 n +0000078035 00000 n +0000078235 00000 n +0000078548 00000 n +0000078962 00000 n +0000079137 00000 n +0000079338 00000 n +0000079745 00000 n +0000079937 00000 n +0000079995 00000 n +0000080196 00000 n +0000080509 00000 n +0000081139 00000 n +0000081636 00000 n +0000081832 00000 n +0000082477 00000 n +0000082675 00000 n +0000082745 00000 n +0000082941 00000 n +0000083267 00000 n +0000126631 00000 n +0000126776 00000 n +0000127640 00000 n +0000127761 00000 n +0000128323 00000 n +0000128444 00000 n +0000128977 00000 n +0000129098 00000 n +0000129658 00000 n +0000129779 00000 n +0000130263 00000 n +0000130384 00000 n +0000130900 00000 n +0000131021 00000 n +0000131518 00000 n +0000131639 00000 n +0000132133 00000 n +0000132254 00000 n +0000132748 00000 n +0000132869 00000 n +0000133390 00000 n +0000133511 00000 n +0000134232 00000 n +0000134353 00000 n +0000134890 00000 n +0000135011 00000 n +0000135580 00000 n +0000135701 00000 n +0000136342 00000 n +0000136463 00000 n +0000137088 00000 n +0000137209 00000 n +0000137669 00000 n +0000137790 00000 n +0000138226 00000 n +0000138347 00000 n +0000138783 00000 n +0000138904 00000 n +0000139372 00000 n +0000139493 00000 n +0000139915 00000 n +0000140036 00000 n +0000179393 00000 n +0000169175 00000 n +0000167743 00000 n +0000170978 00000 n +0000173310 00000 n +0000174232 00000 n +0000177343 00000 n +0000174432 00000 n +0000178579 00000 n +0000183172 00000 n +0000182412 00000 n +0000165524 00000 n +0000165576 00000 n +0000182360 00000 n +0000173922 00000 n +0000179342 00000 n +0000169124 00000 n +0000172446 00000 n +0000166864 00000 n +0000174130 00000 n +0000172902 00000 n +0000168207 00000 n +0000165990 00000 n +0000174938 00000 n +0000174886 00000 n +0000182308 00000 n +0000182256 00000 n +0000165472 00000 n +0000177083 00000 n +0000179140 00000 n +0000171078 00000 n +0000173616 00000 n +0000174078 00000 n +0000165626 00000 n +0000177497 00000 n +0000182104 00000 n +0000171734 00000 n +0000185004 00000 n +0000167537 00000 n +0000176001 00000 n +0000167950 00000 n +0000167898 00000 n +0000169736 00000 n +0000171378 00000 n +0000177135 00000 n +0000178939 00000 n +0000174482 00000 n +0000183120 00000 n +0000174834 00000 n +0000174782 00000 n +0000165782 00000 n +0000178268 00000 n +0000176417 00000 n +0000179291 00000 n +0000179240 00000 n +0000165730 00000 n +0000169324 00000 n +0000173512 00000 n +0000169273 00000 n +0000178475 00000 n +0000173460 00000 n +0000172394 00000 n +0000169477 00000 n +0000172852 00000 n +0000184244 00000 n +0000176827 00000 n +0000171028 00000 n +0000175040 00000 n +0000176723 00000 n +0000184756 00000 n +0000181850 00000 n +0000177705 00000 n +0000172244 00000 n +0000181750 00000 n +0000169684 00000 n +0000178889 00000 n +0000186318 00000 n +0000166346 00000 n +0000178372 00000 n +0000182054 00000 n +0000176467 00000 n +0000167485 00000 n +0000167588 00000 n +0000185054 00000 n +0000179495 00000 n +0000179189 00000 n +0000185104 00000 n +0000167433 00000 n +0000184294 00000 n +0000181700 00000 n +0000169632 00000 n +0000173974 00000 n +0000178991 00000 n +0000172548 00000 n +0000174026 00000 n +0000165834 00000 n +0000173004 00000 n +0000182514 00000 n +0000177549 00000 n +0000166091 00000 n +0000169944 00000 n +0000178837 00000 n +0000178527 00000 n +0000167691 00000 n +0000170152 00000 n +0000172800 00000 n +0000185860 00000 n +0000182002 00000 n +0000166656 00000 n +0000174532 00000 n +0000181950 00000 n +0000176879 00000 n +0000186514 00000 n +0000167330 00000 n +0000166450 00000 n +0000181900 00000 n +0000184804 00000 n +0000183784 00000 n +0000178785 00000 n +0000168309 00000 n +0000179444 00000 n +0000183988 00000 n +0000173718 00000 n +0000169892 00000 n +0000170776 00000 n +0000169580 00000 n +0000173158 00000 n +0000172496 00000 n +0000168257 00000 n +0000174732 00000 n +0000175486 00000 n +0000175744 00000 n +0000170100 00000 n +0000170724 00000 n +0000170672 00000 n +0000172954 00000 n +0000183834 00000 n +0000184606 00000 n +0000175692 00000 n +0000177031 00000 n +0000179646 00000 n +0000166294 00000 n +0000167278 00000 n +0000178113 00000 n +0000184092 00000 n +0000169840 00000 n +0000179848 00000 n +0000179797 00000 n +0000171128 00000 n +0000170620 00000 n +0000175949 00000 n +0000172650 00000 n +0000172296 00000 n +0000175640 00000 n +0000175588 00000 n +0000174990 00000 n +0000175090 00000 n +0000179597 00000 n +0000181400 00000 n +0000183732 00000 n +0000184656 00000 n +0000170568 00000 n +0000171178 00000 n +0000169528 00000 n +0000170048 00000 n +0000170516 00000 n +0000165886 00000 n +0000168617 00000 n +0000173106 00000 n +0000184854 00000 n +0000175538 00000 n +0000177447 00000 n +0000166502 00000 n +0000177239 00000 n +0000184346 00000 n +0000179546 00000 n +0000182868 00000 n +0000184554 00000 n +0000174282 00000 n +0000172192 00000 n +0000169788 00000 n +0000172140 00000 n +0000183324 00000 n +0000170464 00000 n +0000178631 00000 n +0000170412 00000 n +0000176775 00000 n +0000185358 00000 n +0000178011 00000 n +0000185306 00000 n +0000167846 00000 n +0000175188 00000 n +0000167381 00000 n +0000181500 00000 n +0000184040 00000 n +0000184502 00000 n +0000173260 00000 n +0000175138 00000 n +0000175336 00000 n +0000182156 00000 n +0000166193 00000 n +0000170360 00000 n +0000170926 00000 n +0000172598 00000 n +0000173056 00000 n +0000180158 00000 n +0000181800 00000 n +0000169996 00000 n +0000170308 00000 n +0000184904 00000 n +0000185254 00000 n +0000185202 00000 n +0000168667 00000 n +0000177291 00000 n +0000179746 00000 n +0000183936 00000 n +0000179695 00000 n +0000183884 00000 n +0000182818 00000 n +0000179899 00000 n +0000183274 00000 n +0000170256 00000 n +0000181450 00000 n +0000170204 00000 n +0000173770 00000 n +0000176931 00000 n +0000175845 00000 n +0000185460 00000 n +0000186416 00000 n +0000182668 00000 n +0000180106 00000 n +0000176365 00000 n +0000175238 00000 n +0000173208 00000 n +0000175386 00000 n +0000165938 00000 n +0000177859 00000 n +0000177653 00000 n +0000184450 00000 n +0000180054 00000 n +0000171228 00000 n +0000184398 00000 n +0000182970 00000 n +0000170876 00000 n +0000176209 00000 n +0000172344 00000 n +0000183426 00000 n +0000172042 00000 n +0000177395 00000 n +0000167795 00000 n +0000167070 00000 n +0000180366 00000 n +0000170828 00000 n +0000180574 00000 n +0000171784 00000 n +0000183222 00000 n +0000184954 00000 n +0000177601 00000 n +0000168002 00000 n +0000178733 00000 n +0000177187 00000 n +0000175288 00000 n +0000168971 00000 n +0000184142 00000 n +0000180314 00000 n +0000167639 00000 n +0000181198 00000 n +0000180002 00000 n +0000168103 00000 n +0000171990 00000 n +0000178681 00000 n +0000166812 00000 n +0000182918 00000 n +0000172750 00000 n +0000183580 00000 n +0000176518 00000 n +0000171938 00000 n +0000185154 00000 n +0000185910 00000 n +0000186170 00000 n +0000168920 00000 n +0000167174 00000 n +0000180522 00000 n +0000181146 00000 n +0000181094 00000 n +0000168053 00000 n +0000183376 00000 n +0000167226 00000 n +0000176053 00000 n +0000171886 00000 n +0000168155 00000 n +0000171834 00000 n +0000186118 00000 n +0000167020 00000 n +0000178424 00000 n +0000176620 00000 n +0000168718 00000 n +0000180262 00000 n +0000181550 00000 n +0000186612 00000 n +0000181042 00000 n +0000183070 00000 n +0000182720 00000 n +0000186066 00000 n +0000186014 00000 n +0000178061 00000 n +0000171682 00000 n +0000174582 00000 n +0000185410 00000 n +0000185510 00000 n +0000186222 00000 n +0000180990 00000 n +0000181600 00000 n +0000180938 00000 n +0000176569 00000 n +0000179950 00000 n +0000180470 00000 n +0000168515 00000 n +0000179041 00000 n +0000177911 00000 n +0000172698 00000 n +0000183528 00000 n +0000165678 00000 n +0000185962 00000 n +0000168869 00000 n +0000168818 00000 n +0000173820 00000 n +0000184706 00000 n +0000182616 00000 n +0000180210 00000 n +0000182564 00000 n +0000180886 00000 n +0000178217 00000 n +0000180834 00000 n +0000186659 00000 n +0000185610 00000 n +0000174332 00000 n +0000171428 00000 n +0000175897 00000 n +0000171328 00000 n +0000168465 00000 n +0000183682 00000 n +0000171632 00000 n +0000185560 00000 n +0000166916 00000 n +0000174632 00000 n +0000169073 00000 n +0000186271 00000 n +0000168767 00000 n +0000174682 00000 n +0000185760 00000 n +0000173870 00000 n +0000176157 00000 n +0000171278 00000 n +0000186367 00000 n +0000168567 00000 n +0000180782 00000 n +0000181348 00000 n +0000183018 00000 n +0000183478 00000 n +0000177961 00000 n +0000180418 00000 n +0000180730 00000 n +0000172092 00000 n +0000179091 00000 n +0000167122 00000 n +0000168413 00000 n +0000166244 00000 n +0000180678 00000 n +0000186465 00000 n +0000180626 00000 n +0000177807 00000 n +0000184194 00000 n +0000176313 00000 n +0000178165 00000 n +0000171580 00000 n +0000175436 00000 n +0000176105 00000 n +0000171528 00000 n +0000166606 00000 n +0000175796 00000 n +0000176981 00000 n +0000171478 00000 n +0000166760 00000 n +0000174382 00000 n +0000165369 00000 n +0000173360 00000 n +0000176261 00000 n +0000168361 00000 n +0000185660 00000 n +0000183630 00000 n +0000185810 00000 n +0000169022 00000 n +0000173564 00000 n +0000166142 00000 n +0000181650 00000 n +0000181298 00000 n +0000182770 00000 n +0000182464 00000 n +0000165420 00000 n +0000166398 00000 n +0000166554 00000 n +0000173410 00000 n +0000174182 00000 n +0000181250 00000 n +0000182206 00000 n +0000169224 00000 n +0000178320 00000 n +0000186563 00000 n +0000166040 00000 n +0000173668 00000 n +0000176671 00000 n +0000169426 00000 n +0000169375 00000 n +0000177757 00000 n +0000166708 00000 n +0000166968 00000 n +0000185710 00000 n +0000145414 00000 n +0000159333 00000 n +0000145686 00000 n +0000146720 00000 n +0000148390 00000 n +0000150078 00000 n +0000150830 00000 n +0000151217 00000 n +0000151604 00000 n +0000151991 00000 n +0000152378 00000 n +0000152765 00000 n +0000153152 00000 n +0000153539 00000 n +0000153926 00000 n +0000154432 00000 n +0000155629 00000 n +0000157941 00000 n +0000159547 00000 n +0000160186 00000 n +0000160717 00000 n +0000161248 00000 n +0000161779 00000 n +0000162310 00000 n +0000162841 00000 n +0000163372 00000 n +0000163903 00000 n +0000164434 00000 n +0000165146 00000 n +trailer +<<2357D6A1F18F8A6F7F95FEDDA6DEFD27>] +>> +startxref +186706 +%%EOF diff --git a/doc/ratio.qbk b/doc/ratio.qbk new file mode 100644 index 0000000..8c96d48 --- /dev/null +++ b/doc/ratio.qbk @@ -0,0 +1,1256 @@ +[/ + / Copyright (c) 2008 Howard Hinnant + / Copyright (c) 2006, 2008 Beman Dawes + / Copyright (c) 2009-20010 Vicente J. Botet Escriba + / + / 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) + /] + +[article Boost.Ratio + [quickbook 1.5] + [version 1.0.0] + [authors [Hinnant, Howard]] + [authors [Dawes, Beman]] + [authors [Botet Escriba, Vicente J.]] + [copyright 2008 Howard Hinnant] + [copyright 2006, 2008 Beman Dawes] + [copyright 2009-2010 Vicente J. Botet Escriba] + [license + 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]) + ] +] + +[/==================] +[def __Boost_Ratio__ [*Boost.Ratio]] + +[/===============================================] + +[def __time_point `time_point`] +[def __hours `hours`] + +[/===============================================] +[def __ratio [link boost_ratio.reference.ratio_hpp.ratio `ratio`]] + +[template ratio_conf[link_text] [link boost_ratio.reference.ratio_hpp.conf [link_text]]] + +[def __BOOST_RATIO_USES_STATIC_ASSERT [link boost_ratio.reference.ratio_hpp.conf `BOOST_RATIO_USES_STATIC_ASSERT`]] +[def __BOOST_RATIO_USES_MPL_ASSERT [link boost_ratio.reference.ratio_hpp.conf `BOOST_RATIO_USES_MPL_ASSERT`]] +[def __BOOST_RATIO_USES_ARRAY_ASSERT [link boost_ratio.reference.ratio_hpp.conf `BOOST_RATIO_USES_ARRAY_ASSERT`]] + +[template ratio_arithmetic[link_text] [link boost_ratio.reference.ratio_hpp.ratio_arithmetic [link_text]]] +[def __ratio_add [link boost_ratio.reference.ratio_hpp.ratio_arithmetic `ratio_add`]] +[def __ratio_subtract [link boost_ratio.reference.ratio_hpp.ratio_arithmetic `ratio_subtract`]] +[def __ratio_multiply [link boost_ratio.reference.ratio_hpp.ratio_arithmetic `ratio_multiply`]] +[def __ratio_divide [link boost_ratio.reference.ratio_hpp.ratio_arithmetic `ratio_divide`]] + + +[template ratio_comparison[link_text] [link boost_ratio.reference.ratio_hpp.ratio_comparison [link_text]]] +[def __ratio_equal [link boost_ratio.reference.ratio_hpp.ratio_comparison `ratio_equal`]] +[def __ratio_not_equal [link boost_ratio.reference.ratio_hpp.ratio_comparison `ratio_not_equal`]] +[def __ratio_less [link boost_ratio.reference.ratio_hpp.ratio_comparison `ratio_less`]] +[def __ratio_less_equal [link boost_ratio.reference.ratio_hpp.ratio_comparison `ratio_less_equal`]] +[def __ratio_greater [link boost_ratio.reference.ratio_hpp.ratio_comparison `ratio_greater`]] +[def __ratio_greater_equal [link boost_ratio.reference.ratio_hpp.ratio_comparison `ratio_greater_equal`]] + + +[template ratio_si_typedefs[link_text] [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs [link_text]]] +[def __atto [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `atto`]] +[def __femto [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `femto`]] +[def __pico [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `pico`]] +[def __nano [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `nano`]] +[def __micro [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `micro`]] +[def __milli [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `milli`]] +[def __centi [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `centi`]] +[def __deci [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `deci`]] +[def __deca [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `deca`]] +[def __hecto [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `hecto`]] +[def __kilo [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `kilo`]] +[def __mega [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `mega`]] +[def __giga [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `giga`]] +[def __tera [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `tera`]] +[def __peta [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `peta`]] +[def __exa [link boost_ratio.reference.ratio_hpp.ratio_si_typedefs `exa`]] + + +[warning Ratio is not part of the Boost libraries.] + +[/===============] +[section Overview] +[/===============] + + +[/====================================] +[heading How to Use This Documentation] +[/====================================] + +This documentation makes use of the following naming and formatting conventions. + +* Code is in `fixed width font` and is syntax-highlighted. +* Replaceable text that you will need to supply is in [~italics]. +* Free functions are rendered in the code font followed by `()`, as in `free_function()`. +* If a name refers to a class template, it is specified like this: `class_template<>`; that is, it is in code font and its name is followed by `<>` to indicate that it is a class template. +* If a name refers to a function-like macro, it is specified like this: `MACRO()`; + that is, it is uppercase in code font and its name is followed by `()` to indicate that it is a function-like macro. Object-like macros appear without the trailing `()`. +* Names that refer to /concepts/ in the generic programming sense are specified in CamelCase. + +[note In addition, notes such as this one specify non-essential information that provides additional background or rationale.] + +Finally, you can mentally add the following to any code fragments in this document: + + // Include all of Ratio files + #include + using namespace boost; + +[/=================] +[section Motivation] +[/=================] + +__Boost_Ratio__ aims to implement the compile time ratio facility in C++0x, as proposed in [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm [*N2661 - A Foundation to Sleep On]]. That document provides background and motivation for key design decisions and is the source of a good deal of information in this documentation. + +[endsect] + +[/==================] +[section Description] +[/==================] + +The __Boost_Ratio__ library provides: + +* A class template, __ratio, for specifying compile time rational constants such as 1/3 of a nanosecond or the number of inches per meter. __ratio represents a compile time ratio of compile time constants with support for compile time arithmetic with overflow and division by zero protection + +* It provides a textual representation of `boost::ratio` in the form of a `std::basic_string` which can be useful for I/O. + +[endsect] + +[endsect] + + +[/==============================] +[section:users_guide User's Guide] +[/==============================] + +[/======================================] +[section:getting_started Getting Started] +[/======================================] + +[/======================================] +[section:install Installing Ratio] +[/======================================] + +[/=================================] +[heading Getting Boost.Ratio ] +[/=================================] + +You can get the last stable release of __Boost_Ratio__ by downloading [^ratio.zip] from the +[@http://www.boostpro.com/vault/index.php?action=downloadfile&filename=ratio.zip&directory=Math%20-%20Numerics&PHPSESSID=2d7859f3e812c993f5a9e2d9900dfee8 Boost Vault]. + +You can also access the latest (unstable?) state from the [@https://svn.boost.org/svn/boost/sandbox/chrono Boost Sandbox] directories boost/ratio and libs/ratio. Just go to [@http://svn.boost.org/trac/boost/wiki/BoostSubversion here] and follow the instructions there for anonymous SVN access. + +[/==========================================] +[heading Where to install Boost.Ratio? ] +[/==========================================] + +The simple way is to decompress (or checkout from SVN) the file in your BOOST_ROOT directory. + +Othesewise, if you decompress in a different directory, you will need to comment some lines, and uncomment and change others in the build/Jamfile and test/Jamfile. Sorry for this, but I have not reached yet to write a Jamfile that is able to work in both environements and use the BOOST_ROOT variable. Any help is welcome. + +[/=================================] +[heading Building Boost.Ratio ] +[/=================================] + +__Boost_Ratio__ is a header only library, so no need to compile anything. + + +[/===================] +[heading Requirements] +[/===================] + +__Boost_Ratio__ depends on some Boost libraries. For these specific parts you must use either Boost version 1.39.0 or later (even if older versions should works also). + +In particular, __Boost_Ratio__ depends on: + +[variablelist +[ + [[@http://www.boost.org/libs/config [*Boost.Config]]] [for configuration purposes, ...] +] +[ + [[@http://www.boost.org/libs/integer [*Boost.Integer]]] [for cstdint conformance, and integer traits ...] +] +[ + [[@http://www.boost.org/libs/mpl [*Boost.MPL]]] [for MPL Assert and bool, logical ...] +] +[ + [[@http://www.boost.org/libs/static_assert [*Boost.StaticAssert]]] [for STATIC_ASSERT, ...] +] +[ + [[@http://www.boost.org/libs/type_traits [*Boost.TypeTraits]]] [for is_base, is_convertible ...] +] +[ + [[@http://www.boost.org/libs/utility [*Boost.Utility/EnableIf]]] [for enable_if, ...] +] +] + + +[/=========================================================] +[heading Building an executable that uses __Boost_Ratio__ ] +[/=========================================================] + +No link is needed. + + +[/=========================] +[heading Exception safety ] +[/=========================] + +All functions in the library are exception-neutral, providing the strong exception safety guarantee. + +[/=====================] +[heading Thread safety ] +[/=====================] + +All functions in the library are thread-unsafe except when noted explicitly. + +[/========================] +[heading Tested compilers ] +[/========================] + +__Boost_Ratio__ should work with an C++03 conforming compiler. The current version has been tested on: + +Windows with + +* MSVC 10.0 +* MSVC 9.0 Express +* MSVC 8.0 + +[/* Intel 11.0] + +Scientific Linux with + +* GCC 4.1.2 + +Cygwin with + +* GCC 3.4.4 +* GCC 4.3.2 + +MinGW with + +* GCC 4.4.0 +* GCC 4.5.0 + +Initial version was tested on: + +MacOS with GCC 4.2.4 + +Ubuntu Linux with GCC 4.2.4 + +[note Please let us know how this works on other platforms/compilers.] + +[note Please send any questions, comments and bug reports to boost lists boost org.] + +[endsect] +[/ +[/====================] +[section Hello World! ] +[/====================] + +If all you want to do is to time a program's execution, here is a complete program (stopclock_example.cpp): + + #include + + +[endsect] +] +[endsect] + + +[section Tutorial] + +[heading Ratio] + +__ratio is a general purpose utility inspired by Walter Brown allowing one to easily and safely compute rational values at compile time. The __ratio class catches all errors (such as divide by zero and overflow) at compile time. It is used in the duration and __time_point classes to efficiently create units of time. It can also be used in other "quantity" libraries or anywhere there is a rational constant which is known at compile time. The use of this utility can greatly reduce the chances of run time overflow because the __ratio (and any ratios resulting from __ratio arithmetic) are always reduced to lowest terms. + +__ratio is a template taking two intmax_ts, with the second defaulted to 1. In addition to copy constructors and assignment, it only has two public members, both of which are static const intmax_t. One is the numerator of the __ratio and the other is the denominator. The __ratio is always normalized such that it is expressed in lowest terms, and the denominator is always positive. When the numerator is 0, the denominator is always 1. + +[*Example:] + + typedef __ratio<5, 3> five_thirds; + // five_thirds::num == 5, five_thirds::den == 3 + + typedef __ratio<25, 15> also_five_thirds; + // also_five_thirds::num == 5, also_five_thirds::den == 3 + + typedef ratio_divide::type one; + // one::num == 1, one::den == 1 + +This facility also includes convenience typedefs for the SI prefixes __atto through __exa corresponding to their internationally recognized definitions (in terms of __ratio). This is a tremendous syntactic convenience. It will prevent errors in specifying constants as one no longer has to double count the number of zeros when trying to write millions or billions. + +[*Example:] + + typedef ratio_multiply<__ratio<5>, giga>::type _5giga; + // _5giga::num == 5000000000, _5giga::den == 1 + + typedef ratio_multiply<__ratio<5>, nano>::type _5nano; + // _5nano::num == 1, _5nano::den == 200000000 + +[heading Ratio I/O] + +For each `ratio` there exists a `ratio_string, CharT>` for which you can query two strings: `short_name` and `long_name`. For those `ratio`'s that correspond to an [@http://en.wikipedia.org/wiki/SI_prefix#List_of_SI_prefixes SI prefix] long_name corresponds to the internationally recognized prefix, stored as a `basic_string`. For example `ratio_string::long_name()` returns `string("mega")`. For those `ratio`'s that correspond to an [@http://en.wikipedia.org/wiki/SI_prefix#List_of_SI_prefixes SI prefix] `short_name` corresponds to the internationally recognized symbol, stored as a `basic_string`. For example `ratio_string::short_name()` returns `string("M")`. For all other `ratio`'s, both `long_name()` and `short_name()` return a `basic_string` containing "[`ratio::num/ratio::den`]". + +`ratio_string, CharT>` is only defined for four character types: + +* `char`: UTF-8 +* `char16_t`: UTF-16 +* `char32_t`: UTF-32 +* `wchar_t`: UTF-16 (if wchar_t is 16 bits) or UTF-32 + +When the character is char, UTF-8 will be used to encode the names. When the character is `char16_t`, UTF-16 will be used to encode the names. When the character is `char32_t`, UTF-32 will be used to encode the names. When the character is `wchar_t`, the encoding will be UTF-16 if `wchar_t` is 16 bits, and otherwise UTF-32. + +The `short_name` for micro is defined by [@http://www.unicode.org/charts/PDF/U0080.pdf Unicode] to be U+00B5. + +[*Examples:] + + #include + #include + + int main() + { + using namespace std; + using namespace boost; + + cout << "ratio_string::long_name() = " + << ratio_string::long_name() << '\n'; + cout << "ratio_string::short_name() = " + << ratio_string::short_name() << '\n'; + + cout << "ratio_string::long_name() = " + << ratio_string::long_name() << '\n'; + cout << "ratio_string::short_name() = " + << ratio_string::short_name() << '\n'; + + cout << "ratio_string, char>::long_name() = " + << ratio_string, char>::long_name() << '\n'; + cout << "ratio_string, char>::short_name() = " + << ratio_string, char>::short_name() << '\n'; + } + +The output will be + + ratio_string::long_name() = deca + ratio_string::short_name() = da + ratio_string::long_name() = giga + ratio_string::short_name() = G + ratio_string, char>::long_name() = [2/3] + ratio_string, char>::short_name() = [2/3] + +[endsect] +[/===============] +[section:Examples Example] +[/===============] + +[/===============] +[section SI units] +[/===============] + +This example illustrates the use of type-safe physics code interoperating with `boost::chrono::duration` types, taking advantage of the __Boost_Ratio__ infrastructure and design philosophy. + +Let's start by defining a `length` class template that mimics `boost::chrono::duration`, which represents a time duration in various units, but restricts the representation to `double` and uses __Boost_Ratio__ for length unit conversions: + + + template + class length { + private: + double len_; + public: + typedef Ratio ratio; + length() : len_(1) {} + length(const double& len) : len_(len) {} + + template + length(const length& d) + : len_(d.count() * boost::ratio_divide::type::den / + boost::ratio_divide::type::num) {} + + double count() const {return len_;} + + length& operator+=(const length& d) {len_ += d.count(); return *this;} + length& operator-=(const length& d) {len_ -= d.count(); return *this;} + + length operator+() const {return *this;} + length operator-() const {return length(-len_);} + + length& operator*=(double rhs) {len_ *= rhs; return *this;} + length& operator/=(double rhs) {len_ /= rhs; return *this;} + }; + + +Here's a small sampling of length units: + + typedef length > meter; // set meter as "unity" + typedef length centimeter; // 1/100 meter + typedef length kilometer; // 1000 meters + typedef length > inch; // 254/10000 meters + +Note that since `length`'s template parameter is actually a generic ratio type, so we can use boost::ratio allowing for more complex length units: + + typedef length, inch::__ratio>::type> foot; // 12 inchs + typedef length, foot::__ratio>::type> mile; // 5280 feet + +Now we need a floating point-based definition of seconds: + + typedef boost::chrono::duration seconds; // unity + +We can even support sub-nanosecond durations: + + typedef boost::chrono::duration picosecond; // 10^-12 seconds + typedef boost::chrono::duration femtosecond; // 10^-15 seconds + typedef boost::chrono::duration attosecond; // 10^-18 seconds + +Finally, we can write a proof-of-concept of an SI units library, hard-wired for meters and floating point seconds, though it will accept other units: + + template + class quantity + { + double q_; + public: + typedef R1 time_dim; + typedef R2 distance_dim; + quantity() : q_(1) {} + + double get() const {return q_;} + void set(double q) {q_ = q;} + }; + + template <> + class quantity, boost::__ratio<0> > + { + double q_; + public: + quantity() : q_(1) {} + quantity(seconds d) : q_(d.count()) {} // note: only User1::seconds needed here + + double get() const {return q_;} + void set(double q) {q_ = q;} + }; + + template <> + class quantity, boost::__ratio<1> > + { + double q_; + public: + quantity() : q_(1) {} + quantity(meter d) : q_(d.count()) {} // note: only User1::meter needed here + + double get() const {return q_;} + void set(double q) {q_ = q;} + }; + + template <> + class quantity, boost::__ratio<0> > + { + double q_; + public: + quantity() : q_(1) {} + quantity(double d) : q_(d) {} + + double get() const {return q_;} + void set(double q) {q_ = q;} + }; + +That allows us to create some useful SI-based unit types: + + typedef quantity, boost::__ratio<0> > Scalar; + typedef quantity, boost::__ratio<0> > Time; // second + typedef quantity, boost::__ratio<1> > Distance; // meter + typedef quantity, boost::__ratio<1> > Speed; // meter/second + typedef quantity, boost::__ratio<1> > Acceleration; // meter/second^2 + +To make quantity useful, we need to be able to do arithmetic: + + template + quantity::type, + typename boost::ratio_subtract::type> + operator/(const quantity& x, const quantity& y) + { + typedef quantity::type, + typename boost::ratio_subtract::type> R; + R r; + r.set(x.get() / y.get()); + return r; + } + + template + quantity::type, + typename boost::ratio_add::type> + operator*(const quantity& x, const quantity& y) + { + typedef quantity::type, + typename boost::ratio_add::type> R; + R r; + r.set(x.get() * y.get()); + return r; + } + + template + quantity + operator+(const quantity& x, const quantity& y) + { + typedef quantity R; + R r; + r.set(x.get() + y.get()); + return r; + } + + template + quantity + operator-(const quantity& x, const quantity& y) + { + typedef quantity R; + R r; + r.set(x.get() - y.get()); + return r; + } + +With all of the foregoing scaffolding, we can now write an exemplar of a type-safe physics function: + + Distance + compute_distance(Speed v0, Time t, Acceleration a) + { + return v0 * t + Scalar(.5) * a * t * t; // if a units mistake is made here it won't compile + } + + +Finally, we can exercise what we've created, even using custom time durations (`User1::seconds`) as well as Boost time durations (`boost::chrono::hours`). The input can be in arbitrary, though type-safe, units, the output is always in SI units. (A complete Units library would support other units, of course.) + + int main() + { + typedef boost::__ratio<8, BOOST_INTMAX_C(0x7FFFFFFFD)> R1; + typedef boost::__ratio<3, BOOST_INTMAX_C(0x7FFFFFFFD)> R2; + typedef User1::quantity, boost::__ratio<1> >::type, + boost::ratio_subtract, boost::__ratio<0> >::type > RR; + typedef boost::ratio_subtract::type RS; + std::cout << RS::num << '/' << RS::den << '\n'; + + + std::cout << "*************\n"; + std::cout << "* testUser1 *\n"; + std::cout << "*************\n"; + User1::Distance d( User1::mile(110) ); + User1::Time t( boost::chrono::__hours(2) ); + + RR r=d / t; + //r.set(d.get() / t.get()); + + User1::Speed rc= r; + + User1::Speed s = d / t; + std::cout << "Speed = " << s.get() << " meters/sec\n"; + User1::Acceleration a = User1::Distance( User1::foot(32.2) ) / User1::Time() / User1::Time(); + std::cout << "Acceleration = " << a.get() << " meters/sec^2\n"; + User1::Distance df = compute_distance(s, User1::Time( User1::seconds(0.5) ), a); + std::cout << "Distance = " << df.get() << " meters\n"; + std::cout << "There are " + << User1::mile::ratio::den << '/' << User1::mile::ratio::num << " miles/meter"; + User1::meter mt = 1; + User1::mile mi = mt; + std::cout << " which is approximately " << mi.count() << '\n'; + std::cout << "There are " + << User1::mile::ratio::num << '/' << User1::mile::ratio::den << " meters/mile"; + mi = 1; + mt = mi; + std::cout << " which is approximately " << mt.count() << '\n'; + User1::attosecond as(1); + User1::seconds sec = as; + std::cout << "1 attosecond is " << sec.count() << " seconds\n"; + std::cout << "sec = as; // compiles\n"; + sec = User1::seconds(1); + as = sec; + std::cout << "1 second is " << as.count() << " attoseconds\n"; + std::cout << "as = sec; // compiles\n"; + std::cout << "\n"; + return 0; + } + +['See the source file [@../../example/si_physics.cpp example/si_physics.cpp]] + +[endsect] + + +[endsect] + +[/================================] +[section:ext_references External Resources] +[/================================] + +[variablelist + +[ + [[@http://www.open-std.org/jtc1/sc22/wg21 [*C++ Standards Committee's current Working Paper]]] + [The most authoritative reference material for the library is the C++ Standards Committee's current Working Paper (WP). 20.6 Compile-time rational arithmetic "ratio"] +] + +[ + [[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm [*N2661 - A Foundation to Sleep On]]] + [From Howard E. Hinnant, Walter E. Brown, Jeff Garland and Marc Paterno. Is very informative and provides motivation for key design decisions] +] + + +[ + [[@http://home.roadrunner.com/~hinnant/issue_review/lwg-active.html#1281 [*LWG 1281. CopyConstruction and Assignment between ratios having the same normalized form]]] + [From Vicente Juan Botet Escriba.] +] + + +] + +[endsect] + +[endsect] + +[/=================] +[section:reference Reference ] +[/=================] + +[/===========================================] +[section:ratio_fwdhpp Header ``] +[/===========================================] + +This header provides forward declarations for the `` file. + + namespace boost { + + template class __ratio; + + // ratio arithmetic + template struct __ratio_add; + template struct __ratio_subtract; + template struct __ratio_multiply; + template struct __ratio_divide; + + // ratio comparison + template struct __ratio_equal; + template struct __ratio_not_equal; + template struct __ratio_less; + template struct __ratio_less_equal; + template struct __ratio_greater; + template struct __ratio_greater_equal; + + // convenience SI typedefs + typedef ratio<1LL, 1000000000000000000LL> __atto; + typedef ratio<1LL, 1000000000000000LL> __femto; + typedef ratio<1LL, 1000000000000LL> __pico; + typedef ratio<1LL, 1000000000LL> __nano; + typedef ratio<1LL, 1000000LL> __micro; + typedef ratio<1LL, 1000LL> __milli; + typedef ratio<1LL, 100LL> __centi; + typedef ratio<1LL, 10LL> __deci; + typedef ratio< 10LL, 1LL> __deca; + typedef ratio< 100LL, 1LL> __hecto; + typedef ratio< 1000LL, 1LL> __kilo; + typedef ratio< 1000000LL, 1LL> __mega; + typedef ratio< 1000000000LL, 1LL> __giga; + typedef ratio< 1000000000000LL, 1LL> __tera; + typedef ratio< 1000000000000000LL, 1LL> __peta; + typedef ratio<1000000000000000000LL, 1LL> __exa; + } + +[endsect] + +[/===========================================] +[section:ratio_hpp Header ``] +[/===========================================] + +__ratio is a facility which is useful in specifying compile time rational constants. Compile time rational arithmetic is supported with protection against overflow and divide by zero. Such a facility is very handy when needing to efficiently represent 1/3 of a nanosecond, or specifying an inch in terms of meters (for example 254/10000 meters - which __ratio will reduce to 127/5000 meters). + + // configuration macros + #define __BOOST_RATIO_USES_STATIC_ASSERT + #define __BOOST_RATIO_USES_MPL_ASSERT + #define __BOOST_RATIO_USES_ARRAY_ASSERT + + + +[section:conf Configuration Macros] + +When BOOST_NO_STATIC_ASSERT is defined, the user can select the way static assertions are reported. Define + +* BOOST_RATIO_USES_STATIC_ASSERT to use Boost.StaticAssert +* BOOST_RATIO_USES_MPL_ASSERT to use Boost.MPL static assertions +* BOOST_RATIO_USES_RATIO_ASSERT to use __Boost_Ratio__ static assertions + +The default behavior is as if BOOST_RATIO_USES_ARRAY_ASSERT is defined. + + +When BOOST_RATIO_USES_MPL_ASSERT is not defined the following symbols are defined as shown: + + #define BOOST_RATIO_OVERFLOW_IN_ADD "overflow in ratio add" + #define BOOST_RATIO_OVERFLOW_IN_SUB "overflow in ratio sub" + #define BOOST_RATIO_OVERFLOW_IN_MUL "overflow in ratio mul" + #define BOOST_RATIO_OVERFLOW_IN_DIV "overflow in ratio div" + #define BOOST_RATIO_NUMERATOR_IS_OUT_OF_RANGE "ratio numerator is out of range" + #define BOOST_RATIO_DIVIDE_BY_0 "ratio divide by 0" + #define BOOST_RATIO_DENOMINATOR_IS_OUT_OF_RANGE "ratio denominator is out of range" + +Depending upon the static assertion system used, a hint as to the failing assertion will appear in some form in the compiler diagnostic output. + +[endsect] + +[section:ratio Class Template `ratio<>`] + + template + class ratio { + public: + static const boost::intmax_t num; + static const boost::intmax_t den; + typedef ratio type; + + ratio() = default; + + template + ratio(const ratio<_N2, _D2>&); + + template + ratio& operator=(const ratio<_N2, _D2>&) {return *this;} + }; + +A diagnostic will be emitted if __ratio is instantiated with `D == 0`, or if the absolute value of `N` or `D` can not be represented. [*Note:] These rules ensure that infinite ratios are avoided and that for any negative input, there exists a representable value of its absolute value which is positive. In a two's complement representation, this excludes the most negative value. + +The members num and den will be normalized values of the template arguments N and D computed as follows. Let `gcd` denote the greatest common divisor of `N`'s absolute value and of `D`'s absolute value. Then: + +* `num` has the value `sign(N)*sign(D)*abs(N)/gcd`. + +* `den` has the value `abs(D)/gcd`. + +The nested typedef `type` denotes the normalized form of this __ratio type. It should be +used when the normalized form of the template arguments are required, since the arguments are not necessarily normalized. + +Two __ratio classes `__ratio` and `__ratio` have the same normalized form if `__ratio::type` is the same type as `__ratio::type` + +[section:ca Construction and Assignment] + + template + ratio(const __ratio& r); + +[*Effects:] Constructs a __ratio object. + +[*Remarks:] This constructor will not participate in overload resolution unless `r` has the same normalized form as `*this`. + + template + __ratio& operator=(const __ratio& r); + +[*Effects:] Assigns a __ratio object. + +[*Returns:] *this. + +[*Remarks:] This operator will not participate in overload resolution unless `r` has the same normalized form as `*this`. + +[endsect] + + +[endsect] + + +[section:ratio_arithmetic `ratio` Arithmetic] + +For each of the class templates in this section, each template parameter refers to a `ratio`. If the implementation is unable to form the indicated __ratio due to overflow, a diagnostic will be issued. + +[heading `ratio_add<>`] + + template struct ratio_add { + typedef [/see below] type; + }; + +The nested typedef `type` is a synonym for `__ratio::type`. + +[heading `ratio_subtract<>`] + + template struct ratio_subtract { + typedef [/see below] type; + }; + +The nested typedef `type` is a synonym for `__ratio::type`. + +[heading `ratio_multiply<>`] + + template struct ratio_multiply { + typedef [/see below] type; + }; + +The nested typedef `type` is a synonym for `__ratio::type`. + +[heading `ratio_divide<>`] + + template struct ratio_divide { + typedef [/see below] type; + }; + +The nested typedef `type` is a synonym for `__ratio::type`. + +[endsect] + +[section:ratio_comparison `ratio` Comparison] + +[heading `ratio_equal<>`] + + template struct ratio_equal + : public boost::integral_constant {}; + +If R1::num == R2::num && R1::den == R2::den, ratio_equal derives from true_type, else derives from false_type. + +[heading `ratio_not_equal<>`] + + template struct ratio_not_equal + : public boost::integral_constant::value> {}; + +[heading `ratio_less<>`] + + template + struct ratio_less + : public boost::integral_constant {}; + +If R1::num * R2::den < R2::num * R1::den, ratio_less derives from true_type, else derives from false_type. + +[heading `ratio_less_equal<>`] + + template struct ratio_less_equal + : public boost::integral_constant::value> {}; + +[heading `ratio_greater<>`] + + template struct ratio_greater + : public boost::integral_constant::value> {}; + +[heading `ratio_greater_equal<>`] + + template struct ratio_greater_equal + : public boost::integral_constant::value> {}; + + +[endsect] + +[section:ratio_si_typedefs SI typedefs] + +The [@http://en.wikipedia.org/wiki/SI_prefix#List_of_SI_prefixes International System of Units] specifies twenty SI prefixes. __Boost_Ratio__ defines all except `yocto`, `zepto`, `zetta`, and `yotta` + + // convenience SI typedefs + typedef __ratio<1LL, 1000000000000000000LL> atto; + typedef __ratio<1LL, 1000000000000000LL> femto; + typedef __ratio<1LL, 1000000000000LL> pico; + typedef __ratio<1LL, 1000000000LL> nano; + typedef __ratio<1LL, 1000000LL> micro; + typedef __ratio<1LL, 1000LL> milli; + typedef __ratio<1LL, 100LL> centi; + typedef __ratio<1LL, 10LL> deci; + typedef __ratio< 10LL, 1LL> deca; + typedef __ratio< 100LL, 1LL> hecto; + typedef __ratio< 1000LL, 1LL> kilo; + typedef __ratio< 1000000LL, 1LL> mega; + typedef __ratio< 1000000000LL, 1LL> giga; + typedef __ratio< 1000000000000LL, 1LL> tera; + typedef __ratio< 1000000000000000LL, 1LL> peta; + typedef __ratio<1000000000000000000LL, 1LL> exa; + +[endsect] + + +[section:limitations Limitations and Extensions] + +The following are limitations of Boost.Ratio relative to the specification in the C++0x draft standard: + +* Four of the SI units typedefs -- `yocto`, `zepto`, `zetta`, and `yotta` -- are to be conditionally supported, if the range of `intmax_t` allows, but are not supported by __Boost_Ratio__. +* Ratio values should be of type static `constexpr intmax_t` (see [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3135.html#1121 Ratio values should be constexpr]), but no compiler supports `constexpr` today, so __Boost_Ratio__ uses `static const intmax_t` instead. +* Rational arithmetic should use template aliases (see [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3134.html#921 Rational Arithmetic should use template aliases]), but those are not available in C++03, so inheritance is used instead. + +The current implementation extends the requirements of the C++0x draft standard by making the copy constructor and copy assignment operator have the same normalized form (see [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3133.html#1281 copy constructor and assignment between ratios having the same normalized form]). + +[endsect] + +[endsect] + +[/===========================================] +[section:ratio_io_hpp Header ``] +[/===========================================] + +This header provides `ratio_string<>` which can generate a textual representation of a `ratio<>` in the form of a `std::basic_string<>`. These strings can be useful for I/O." + + namespace boost { + + template + struct ratio_string + { + static std::basic_string short_name(); + static std::basic_string long_name(); + }; + + } + +[endsect] +[endsect] + + +[/=================] +[section Appendices] +[/=================] +[/==================================] +[section:history Appendix A: History] +[/==================================] + +[section [*Version 1.0.0, ?? ??, 2010] ] +[endsect] + +[/ +[section [*Version 0.2.1, September 27, 2010] ] + +[*Fixes:] + +* Removal of LLVM adapted files due to incompatible License issue. + +[endsect] + +[section [*Version 0.2.0, September 22, 2010] ] + +[*Featurs:] + +* Added ratio_string traits. + +[*Fixes:] + +* ratio_less overflow avoided following the algorithm from libc++. + +[*Test:] + +* A more complete test has been included adapted from the test of from libc++/ratio. + +[endsect] + +[section [*Version 0.1.0, September 10, 2010] ] + +[*Features:] + +* Ratio has been extracted from Boost.Chrono. + +[endsect] + +] + +[endsect] + +[/======================================] +[section:rationale Appendix B: Rationale] + +[heading Why ratio needs CopyConstruction and Assignment from ratios having the same normalized form] + +Current [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf [*N3000]] doesn't allows to copy-construct or assign ratio instances of ratio classes having the same normalized form. + +This simple example + + __ratio<1,3> r1; + __ratio<3,9> r2; + r1 = r2; // (1) + +fails to compile in (1). Other example + + __ratio<1,3> r1; + __ratio_subtract<__ratio<2,3>,__ratio<1,3> > r2=r1; // (2) + +The type of `__ratio_subtract<__ratio<2,3>,__ratio<1,3> >` could be `__ratio<3,9>` so the compilation could fail in (2). It could also be __ratio<1,3> and the compilation succeeds. + +[heading Why ratio needs the nested normalizer typedef type] + +The current resolution of issue LWG 1281 acknowledges the need for a nested type typedef, so Boost.Ratio is tracking the likely final version of std::ratio. + +[endsect] + +[/======================================================] +[section:implementation Appendix C: Implementation Notes] + +[heading How Boost.Ratio manage with compile-time rational arithmetic overflow?] + +When the result is representable, but a simple application of arithmetic rules would result in overflow, e.g. `ratio_multiply,ratio<2,INTMAX_MAX>>` can be reduced to `ratio<1,1>`, but the direct result of `ratio` would result in overflow. + +Boost.Ratio implementes some simplifications in order to reduce the possibility of overflow. The general ideas are: + +* The `num` and `den` `ratio<>` fields are normalized. +* Use the gcd of some of the possible products that can overflow, and simplify before doing the product. +* Use some equivalences relations that avoid addition or subtraction that can overflow or underflow. + +The following subsections cover each case in more detail. + +[*ratio_add] + +In + + (n1/d1)+(n2/d2)=(n1*d2+n2*d1)/(d1*d2) + +either n1*d2+n2*d1 or d1*d2 can overflow. + + ( (n1 * d2) + (n2 * d1) ) + -------------------------- + (d1 * d2) + +Dividing by gcd(d1,d2) on both num and den + + ( (n1 * (d2/gcd(d1,d2))) + (n2 * (d1/gcd(d1,d2))) ) + ---------------------------------------------------- + ((d1 * d2) / gcd(d1,d2)) + + +Multipliying and diving by gcd(n1,n2) in numerator + + ( ((gcd(n1,n2)*(n1/gcd(n1,n2))) * (d2/gcd(d1,d2))) + + ((gcd(n1,n2)*(n2/gcd(n1,n2))) * (d1/gcd(d1,d2))) + ) + -------------------------------------------------- + ( (d1 * d2) / gcd(d1,d2) ) + +Factorizing gcd(n1,n2) + + ( gcd(n1,n2) * + ( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) ) + ) + ------------------------------------------------------------------------------- + ( (d1 * d2) / gcd(d1,d2) ) + +Regrouping + + ( gcd(n1,n2) * + ( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) ) + ) + ------------------------------------------------------------------------------- + ( (d1 / gcd(d1,d2)) * d2 ) + +Dividing by (d1 / gcd(d1,d2)) + + ( ( gcd(n1,n2) / (d1 / gcd(d1,d2)) ) * + ( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) ) + ) + ------------------------------------------------------------------------------- + d2 + + +Dividing by d2 + + ( gcd(n1,n2) / (d1 / gcd(d1,d2)) ) * + ( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) / d2 ) + +This expression correspond to the multiply of two ratios that have less risk of overflow as the initial numerators and denomitators appear now in most of the cases divided by a gcd. + + +For ratio_subtract the reasoning is the same + +[*ratio_multiply] + +In + + (n1/d1)*(n2/d2)=((n1*n2)/(d1*d2)) + +either n1*n2 or d1*d2 can overflow. + +Dividing by gcc(n1,d2) numerator and denominator + + (((n1/gcc(n1,d2))*n2) + --------------------- + (d1*(d2/gcc(n1,d2)))) + +Dividing by gcc(n2,d1) + + ((n1/gcc(n1,d2))*(n2/gcc(n2,d1))) + --------------------------------- + ((d1/gcc(n2,d1))*(d2/gcc(n1,d2))) + +And now all the initial numerator and denominators have been reduced, avoiding the overflow. + +For ratio_divide the reasoning is similar. + +[*ratio_less] + +In order to evaluate + + (n1/d1)<(n2/d2) + +without moving to floating point numbers, two techniques are used: + +* First compare the sign of the numerators + +If sign(n1) < sign(n2) the result is true. + +If sign(n1) == sign(n2) the result depends on the following after making the numerators positive + +* When the sign is equal the technique used is to work with integer division and modulo when the signs are equal. + +Let call Qi the integer division of ni and di and Mi the modulo of ni and di. + + ni = Qi * di + Mi and Mi < di + +Form + + ((n1*d2)<(d1*n2)) + +we get + + (((Q1 * d1 + M1)*d2)<(d1*((Q2 * d2 + M2)))) + +Developing + + ((Q1 * d1 * d2)+ (M1*d2))<((d1 * Q2 * d2) + (d1*M2)) + +Dividing by d1*d2 + + Q1 + (M1/d1) < Q2 + (M2/d2) + +If Q1=Q2 the result depends on + + (M1/d1) < (M2/d2) + +If M1==0==M2 the result is false + +If M1=0 M2!=0 the result is true + +If M1!=0 M2==0 the result is false + +If M1!=0 M2!=0 the result depends on + + (d2/M2) < (d1/M1) + +If Q1!=Q2, the result of + + Q1 + (M1/d1) < Q2 + (M2/d2) + +depends only on Q1 and Q2 as Qi are integers and (Mi/di) <1 because MiQ2, Q1==Q2+k, k>=1 + + Q2+k + (M1/d1) < Q2 + (M2/d2) + k + (M1/d1) < (M2/d2) + k < (M2/d2) - (M1/d1) + +but the difference between two numbers between 0 and 1 can not be greater than 1, so the result is false. + +if Q2>Q1, Q2==Q1+k, k>=1 + + Q1 + (M1/d1) < Q1+k + (M2/d2) + (M1/d1) < k + (M2/d2) + (M1/d1) - (M2/d2) < k + +which is always true, so the result is true. + +The following table recapitulates this analisys + +[table + [[ratio][ratio] [Q1] [Q2] [M1] [M2] [Result]] + [[ratio][ratio] [Q1] [Q2] [!=0] [!=0] [Q1 < Q2]] + [[ratio][ratio] [Q] [Q] [0] [0] [false]] + [[ratio][ratio] [Q] [Q] [0] [!=0] [true]] + [[ratio][ratio] [Q] [Q] [!=0] [0] [false]] + [[ratio][ratio] [Q] [Q] [!=0] [!=0] [ratio_less, ratio>]] +] + + + +[endsect] + +[/======================================================] +[section:faq Appendix D: FAQ] + + +[endsect] + +[/====================================================] +[section:acknowledgements Appendix E: Acknowledgements] + +The library's code was derived from Howard Hinnant's time2_demo prototype. Many thanks to Howard for making his code available under the Boost license. The original code was modified by Beman Dawes to conform to Boost conventions. + +time2_demo contained this comment: + +Much thanks to Andrei Alexandrescu, Walter Brown, Peter Dimov, Jeff Garland, Terry Golubiewski, Daniel Krugler, Anthony Williams. + +The ratio.hpp source has been adapted from the experimental header `` from Howard Hinnant. + +Thanks to Adrew Chinnoff for his help polishing the documentation. + +[endsect] + +[/ +[/====================================================] +[section:tests Appendix F: Tests] + +In order to test you need to do. + + bjam libs/ratio/test + +You can also run a specific suite of test by doing + + cd libs/chrono/test + bjam ratio + + +[section `ratio`] +[table + [[Name] [kind] [Description] [Result] [Ticket]] + [[typedefs.pass] [run] [check the num/den are correct for the predefined typedefs] [Pass] [#]] + [[ratio.pass] [run] [check the num/den are correctly simplified] [Pass] [#]] + [[ratio1.fail] [compile-fails] [The template argument D shall not be zero] [Pass] [#]] + [[ratio2.fail] [compile-fails] [the absolute values of the template arguments N and D shall be representable by type intmax_t] [Pass] [#]] + [[ratio3.fail] [compile-fails] [the absolute values of the template arguments N and D shall be representable by type intmax_t] [Pass] [#]] +] +[endsect] + +[section `comparison`] +[table + [[Name] [kind] [Description] [Result] [Ticket]] + [[ratio_equal.pass] [run] [check ratio_equal metafunction class] [Pass] [#]] + [[ratio_not_equal.pass] [run] [check ratio_not_equal metafunction class] [Pass] [#]] + [[ratio_less.pass] [run] [check ratio_less metafunction class] [Pass] [#]] + [[ratio_less_equal.pass] [run] [check ratio_less_equal metafunction class] [Pass] [#]] + [[ratio_greater.pass] [run] [check ratio_greater metafunction class] [Pass] [#]] + [[ratio_greater_equal.pass] [run] [check ratio_greater_equal metafunction class] [Pass] [#]] +] +[endsect] + +[section `arithmetic`] +[table + [[Name] [kind] [Description] [Result] [Ticket]] + [[ratio_add.pass] [run] [check ratio_add metafunction class] [Pass] [#]] + [[ratio_subtract.pass] [run] [check ratio_subtract metafunction class] [Pass] [#]] + [[ratio_multiply.pass] [run] [check ratio_multiply metafunction class] [Pass] [#]] + [[ratio_divide.pass] [run] [check ratio_divide metafunction class] [Pass] [#]] + [[ratio_add.fail] [compile-fails] [check ratio_add overflow metafunction class] [Pass] [#]] + [[ratio_subtract.fail] [compile-fails] [check ratio_subtract underflow metafunction class] [Pass] [#]] + [[ratio_multiply.fail] [compile-fails] [check ratio_multiply overflow metafunction class] [Pass] [#]] + [[ratio_divide.fail] [compile-fails] [check ratio_divide overflow metafunction class] [Pass] [#]] +] +[endsect] + + +[endsect] +[/=====================================] +[section:tickets Appendix G: Tickets] + +[table + [[Ticket] [Description] [Resolution] [State]] + [[1] [result of metafunctions ratio_multiply and ratio_divide were not normalized ratios] [Use of the nested ratio typedef type on ratio arithmetic operations.] [Closed]] + [[2] [INTMAX_C is not always defined] [Replace INTMAX_C by BOOST_INTMAX_C until boost/cstdint.hpp ensures INTMAX_C is always defined.] [Closed]] + + [[3] [MSVC reports a warning instead of an error when there is an integral constant overflow] [manage with MSVC reporting a warning instead of an error when there is an integral constant overflow] [Closed]] + [[4] [ration_less overflow on cases where it can be avoided] [Change the algorithm as implemented in libc++] [Closed]] + [/[#] [XXXX] [XXXX] [Closed]] +] + + +[endsect] + +] +[/=====================================] +[section:todo Appendix F: Future Plans] +[/=====================================] + +[heading For later releases] + +* Use constexpr on compilers providing it +* Use template aliases on compiler providing it +* Implement [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3135.html#3135 multiple arguments] ratio arithmetic. + +[endsect] + +[endsect] diff --git a/example/config.hpp b/example/config.hpp new file mode 100644 index 0000000..395ee80 --- /dev/null +++ b/example/config.hpp @@ -0,0 +1,123 @@ +// boost/chrono/config.hpp -------------------------------------------------// + +// Copyright Beman Dawes 2003, 2006, 2008 +// Copyright 2009 Vicente J. Botet Escriba + +// 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) + +// See http://www.boost.org/libs/chrono for documentation. + +#ifndef BOOST_EX_CHRONO_CONFIG_HPP +#define BOOST_EX_CHRONO_CONFIG_HPP + +#include + +// BOOST_EX_CHRONO_POSIX_API, BOOST_EX_CHRONO_MAC_API, or BOOST_EX_CHRONO_WINDOWS_API +// can be defined by the user to specify which API should be used + +#if defined(BOOST_EX_CHRONO_WINDOWS_API) +# warning Boost.Chrono will use the Windows API +#elif defined(BOOST_EX_CHRONO_MAC_API) +# warning Boost.Chrono will use the Mac API +#elif defined(BOOST_EX_CHRONO_POSIX_API) +# warning Boost.Chrono will use the POSIX API +#endif + +# if defined( BOOST_EX_CHRONO_WINDOWS_API ) && defined( BOOST_EX_CHRONO_POSIX_API ) +# error both BOOST_EX_CHRONO_WINDOWS_API and BOOST_EX_CHRONO_POSIX_API are defined +# elif defined( BOOST_EX_CHRONO_WINDOWS_API ) && defined( BOOST_EX_CHRONO_MAC_API ) +# error both BOOST_EX_CHRONO_WINDOWS_API and BOOST_EX_CHRONO_MAC_API are defined +# elif defined( BOOST_EX_CHRONO_MAC_API ) && defined( BOOST_EX_CHRONO_POSIX_API ) +# error both BOOST_EX_CHRONO_MAC_API and BOOST_EX_CHRONO_POSIX_API are defined +# elif !defined( BOOST_EX_CHRONO_WINDOWS_API ) && !defined( BOOST_EX_CHRONO_MAC_API ) && !defined( BOOST_EX_CHRONO_POSIX_API ) +# if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) +# define BOOST_EX_CHRONO_WINDOWS_API +# define BOOST_EX_CHRONO_HAS_CLOCK_MONOTONIC +# define BOOST_EX_CHRONO_HAS_THREAD_CLOCK +# define BOOST_EX_CHRONO_THREAD_CLOCK_IS_MONOTONIC true +# elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +# define BOOST_EX_CHRONO_MAC_API +# define BOOST_EX_CHRONO_HAS_CLOCK_MONOTONIC +# define BOOST_EX_CHRONO_THREAD_CLOCK_IS_MONOTONIC true +# else +# define BOOST_EX_CHRONO_POSIX_API +# endif +# endif + +# if defined( BOOST_EX_CHRONO_POSIX_API ) +# include //to check for CLOCK_REALTIME and CLOCK_MONOTONIC and _POSIX_THREAD_CPUTIME +# if defined(CLOCK_REALTIME) +# if defined(CLOCK_MONOTONIC) +# define BOOST_EX_CHRONO_HAS_CLOCK_MONOTONIC +# endif +# else +# error does not supply CLOCK_REALTIME +# endif +# if defined(_POSIX_THREAD_CPUTIME) +# define BOOST_EX_CHRONO_HAS_THREAD_CLOCK +# define BOOST_EX_CHRONO_THREAD_CLOCK_IS_MONOTONIC true +# endif +# endif + + + +// enable dynamic linking on Windows ---------------------------------------// + +//# if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_EX_CHRONO_DYN_LINK)) && defined(__BORLANDC__) && defined(__WIN32__) +//# error Dynamic linking Boost.System does not work for Borland; use static linking instead +//# endif + +#ifdef BOOST_HAS_DECLSPEC // defined by boost.config +// 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_EX_CHRONO_DYN_LINK +// if they want just this one to be dynamically liked: +#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_EX_CHRONO_DYN_LINK) +// export if this is our own source, otherwise import: +#ifdef BOOST_EX_CHRONO_SOURCE +# define BOOST_EX_CHRONO_DECL __declspec(dllexport) +#else +# define BOOST_EX_CHRONO_DECL __declspec(dllimport) +#endif // BOOST_EX_CHRONO_SOURCE +#endif // DYN_LINK +#endif // BOOST_HAS_DECLSPEC +// +// if BOOST_EX_CHRONO_DECL isn't defined yet define it now: +#ifndef BOOST_EX_CHRONO_DECL +#define BOOST_EX_CHRONO_DECL +#endif + +// define constexpr related macros ------------------------------// + +//~ #include +#if defined(BOOST_NO_CONSTEXPR) +#define BOOST_EX_CHRONO_CONSTEXPR +#define BOOST_EX_CHRONO_CONST_REF const& +#else +#define BOOST_EX_CHRONO_CONSTEXPR constexpr +#define BOOST_EX_CHRONO_CONST_REF +#endif + +// enable automatic library variant selection ------------------------------// + +#if !defined(BOOST_EX_CHRONO_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_EX_CHRONO_NO_LIB) +// +// 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_chrono +// +// If we're importing code from a dll, then tell auto_link.hpp about it: +// +#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_EX_CHRONO_DYN_LINK) +# define BOOST_DYN_LINK +#endif +// +// And include the header that does the work: +// +#include +#endif // auto-linking disabled + +#endif // BOOST_EX_CHRONO_CONFIG_HPP + diff --git a/example/display_ex.cpp b/example/display_ex.cpp new file mode 100644 index 0000000..bd8313e --- /dev/null +++ b/example/display_ex.cpp @@ -0,0 +1,39 @@ +// io_ex2.cpp ----------------------------------------------------------// + +// Copyright 2010 Howard Hinnant +// Copyright 2010 Vicente J. Botet Escriba + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +/* +This code was adapted by Vicente J. Botet Escriba from Hinnant's html documentation. +Many thanks to Howard for making his code available under the Boost license. +*/ + +#include +#include + +int main() +{ + using namespace std; + using namespace boost; + + cout << "ratio_string::long_name() = " + << ratio_string::long_name() << '\n'; + cout << "ratio_string::short_name() = " + << ratio_string::short_name() << '\n'; + + cout << "ratio_string::long_name() = " + << ratio_string::long_name() << '\n'; + cout << "ratio_string::short_name() = " + << ratio_string::short_name() << '\n'; + + cout << "ratio_string, char>::long_name() = " + << ratio_string, char>::long_name() << '\n'; + cout << "ratio_string, char>::short_name() = " + << ratio_string, char>::short_name() << '\n'; + + return 0; +} + diff --git a/example/duration.hpp b/example/duration.hpp new file mode 100644 index 0000000..bff90ec --- /dev/null +++ b/example/duration.hpp @@ -0,0 +1,793 @@ +// duration.hpp --------------------------------------------------------------// + +// Copyright 2008 Howard Hinnant +// Copyright 2008 Beman Dawes +// Copyright 2009-2010 Vicente J. Botet Escriba + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +/* + +This code was derived by Beman Dawes from Howard Hinnant's time2_demo prototype. +Many thanks to Howard for making his code available under the Boost license. +The original code was modified to conform to Boost conventions and to section +20.9 Time utilities [time] of the C++ committee's working paper N2798. +See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf. + +time2_demo contained this comment: + + Much thanks to Andrei Alexandrescu, + Walter Brown, + Peter Dimov, + Jeff Garland, + Terry Golubiewski, + Daniel Krugler, + Anthony Williams. +*/ + + +#ifndef BOOST_EX_CHRONO_DURATION_HPP +#define BOOST_EX_CHRONO_DURATION_HPP + +#include "config.hpp" +#include "static_assert.hpp" + +//~ #include + +#include +#include + + +#include +#include +#include "type_traits/common_type.hpp" +#include +#include +#include + +#include +#include +#include +#include + +#if !defined(BOOST_NO_STATIC_ASSERT) || !defined(BOOST_EX_CHRONO_USES_MPL_ASSERT) +#define BOOST_EX_CHRONO_A_DURATION_REPRESENTATION_CAN_NOT_BE_A_DURATION "A duration representation can not be a duration" +#define BOOST_EX_CHRONO_SECOND_TEMPLATE_PARAMETER_OF_DURATION_MUST_BE_A_STD_RATIO "Second template parameter of duration must be a boost::ratio" +#define BOOST_EX_CHRONO_DURATION_PERIOD_MUST_BE_POSITIVE "duration period must be positive" +#define BOOST_EX_CHRONO_SECOND_TEMPLATE_PARAMETER_OF_TIME_POINT_MUST_BE_A_BOOST_EX_CHRONO_DURATION "Second template parameter of time_point must be a boost_ex::chrono::duration" +#endif + + +//----------------------------------------------------------------------------// +// // +// 20.9 Time utilities [time] // +// synopsis // +// // +//----------------------------------------------------------------------------// + +namespace boost_ex { + using boost::ratio; + +namespace chrono { + + template > + class duration; + + namespace detail + { + template + struct is_duration + : boost::false_type {}; + + template + struct is_duration > + : boost::true_type {}; + //template + // struct is_duration + // : is_duration::type> {}; + + template ::value> + struct duration_divide_result + { + }; + + template ::type>::value) + && (boost::is_convertible::type>::value) + ) + > + struct duration_divide_imp + { + }; + + template + struct duration_divide_imp, Rep2, true> + { + typedef duration::type, Period> type; + }; + + template + struct duration_divide_result, Rep2, false> + : duration_divide_imp, Rep2> + { + }; + +/// + template ::value> + struct duration_divide_result2 + { + }; + + template ::type>::value) + && (boost::is_convertible::type>::value) + ) + > + struct duration_divide_imp2 + { + }; + + template + struct duration_divide_imp2, true> + { + //typedef typename common_type::type type; + typedef double type; + }; + + template + struct duration_divide_result2, false> + : duration_divide_imp2 > + { + }; + +/// + template ::value> + struct duration_modulo_result + { + }; + + template ::type>::value + //&& + boost::is_convertible::type>::value + ) + > + struct duration_modulo_imp + { + }; + + template + struct duration_modulo_imp, Rep2, true> + { + typedef duration::type, Period> type; + }; + + template + struct duration_modulo_result, Rep2, false> + : duration_modulo_imp, Rep2> + { + }; + + } // namespace detail +} // namespace chrono + + +// common_type trait specializations + +template + struct common_type, + chrono::duration >; + + +namespace chrono { + + // customization traits + template struct treat_as_floating_point; + template struct duration_values; + + // duration arithmetic +// template +// typename common_type, duration >::type +// operator+(const duration& lhs, const duration& rhs); +// template +// typename common_type, duration >::type +// operator-(const duration& lhs, const duration& rhs); +// template +// typename boost::enable_if_c +// < +// boost::is_convertible::type>::value +// && boost::is_convertible::type>::value, +// duration::type, Period> +// >::type +// operator*(const duration& d, const Rep2& s); +// template +// typename boost::enable_if_c +// < +// boost::is_convertible::type>::value +// && boost::is_convertible::type>::value, +// duration::type, Period> +// >::type +// operator*(const Rep1& s, const duration& d); + +// template +// typename boost::disable_if , +// typename detail::duration_divide_result, Rep2>::type +// >::type +// operator/(const duration& d, const Rep2& s); + +// template +// typename common_type::type +// operator/(const duration& lhs, const duration& rhs); + + // duration comparisons +// template +// bool operator==(const duration& lhs, const duration& rhs); +// template +// bool operator!=(const duration& lhs, const duration& rhs); +// template +// bool operator< (const duration& lhs, const duration& rhs); +// template +// bool operator<=(const duration& lhs, const duration& rhs); +// template +// bool operator> (const duration& lhs, const duration& rhs); +// template +// bool operator>=(const duration& lhs, const duration& rhs); + + // duration_cast + + //template + // ToDuration duration_cast(const duration& d); + + // convenience typedefs + typedef duration nanoseconds; // at least 64 bits needed + typedef duration microseconds; // at least 55 bits needed + typedef duration milliseconds; // at least 45 bits needed + typedef duration seconds; // at least 35 bits needed + typedef duration > minutes; // at least 29 bits needed + typedef duration > hours; // at least 23 bits needed + +//----------------------------------------------------------------------------// +// duration helpers // +//----------------------------------------------------------------------------// + + namespace detail + { + + // duration_cast + + // duration_cast is the heart of this whole prototype. It can convert any + // duration to any other. It is also (implicitly) used in converting + // time_points. The conversion is always exact if possible. And it is + // always as efficient as hand written code. If different representations + // are involved, care is taken to never require implicit conversions. + // Instead static_cast is used explicitly for every required conversion. + // If there are a mixture of integral and floating point representations, + // the use of common_type ensures that the most logical "intermediate" + // representation is used. + template ::type, + bool = Period::num == 1, + bool = Period::den == 1> + struct duration_cast; + + // When the two periods are the same, all that is left to do is static_cast from + // the source representation to the target representation (which may be a no-op). + // This conversion is always exact as long as the static_cast from the source + // representation to the destination representation is exact. + template + struct duration_cast + { + ToDuration operator()(const FromDuration& fd) const + { + return ToDuration(static_cast(fd.count())); + } + }; + + // When the numerator of FromPeriod / ToPeriod is 1, then all we need to do is + // divide by the denominator of FromPeriod / ToPeriod. The common_type of + // the two representations is used for the intermediate computation before + // static_cast'ing to the destination. + // This conversion is generally not exact because of the division (but could be + // if you get lucky on the run time value of fd.count()). + template + struct duration_cast + { + ToDuration operator()(const FromDuration& fd) const + { + typedef typename common_type< + typename ToDuration::rep, + typename FromDuration::rep, + intmax_t>::type C; + return ToDuration(static_cast( + static_cast(fd.count()) / static_cast(Period::den))); + } + }; + + // When the denomenator of FromPeriod / ToPeriod is 1, then all we need to do is + // multiply by the numerator of FromPeriod / ToPeriod. The common_type of + // the two representations is used for the intermediate computation before + // static_cast'ing to the destination. + // This conversion is always exact as long as the static_cast's involved are exact. + template + struct duration_cast + { + ToDuration operator()(const FromDuration& fd) const + { + typedef typename common_type< + typename ToDuration::rep, + typename FromDuration::rep, + intmax_t>::type C; + return ToDuration(static_cast( + static_cast(fd.count()) * static_cast(Period::num))); + } + }; + + // When neither the numerator or denominator of FromPeriod / ToPeriod is 1, then we need to + // multiply by the numerator and divide by the denominator of FromPeriod / ToPeriod. The + // common_type of the two representations is used for the intermediate computation before + // static_cast'ing to the destination. + // This conversion is generally not exact because of the division (but could be + // if you get lucky on the run time value of fd.count()). + template + struct duration_cast + { + ToDuration operator()(const FromDuration& fd) const + { + typedef typename common_type< + typename ToDuration::rep, + typename FromDuration::rep, + intmax_t>::type C; + return ToDuration(static_cast( + static_cast(fd.count()) * static_cast(Period::num) + / static_cast(Period::den))); + } + }; + + } // namespace detail + +//----------------------------------------------------------------------------// +// // +// 20.9.2 Time-related traits [time.traits] // +// // +//----------------------------------------------------------------------------// +//----------------------------------------------------------------------------// +// 20.9.2.1 treat_as_floating_point [time.traits.is_fp] // +// Probably should have been treat_as_floating_point. Editor notifed. // +//----------------------------------------------------------------------------// + + // Support bidirectional (non-exact) conversions for floating point rep types + // (or user defined rep types which specialize treat_as_floating_point). + template + struct treat_as_floating_point : boost::is_floating_point {}; + +//----------------------------------------------------------------------------// +// 20.9.2.2 duration_values [time.traits.duration_values] // +//----------------------------------------------------------------------------// + + namespace detail { + template ::value> + struct chrono_numeric_limits { + static T lowest() throw() {return (std::numeric_limits::min) ();} + }; + + template + struct chrono_numeric_limits { + static T lowest() throw() {return (std::numeric_limits::min) ();} + }; + + template <> + struct chrono_numeric_limits { + static float lowest() throw() {return -(std::numeric_limits::max) ();} + }; + + template <> + struct chrono_numeric_limits { + static double lowest() throw() {return -(std::numeric_limits::max) ();} + }; + + template <> + struct chrono_numeric_limits { + static long double lowest() throw() {return -(std::numeric_limits::max)();} + }; + + template + struct numeric_limits : chrono_numeric_limits::type> {}; + + } + template + struct duration_values + { + static Rep zero() {return Rep(0);} + static Rep max BOOST_PREVENT_MACRO_SUBSTITUTION () {return (std::numeric_limits::max)();} + + static Rep min BOOST_PREVENT_MACRO_SUBSTITUTION () {return detail::numeric_limits::lowest();} + }; + +} // namespace chrono + +//----------------------------------------------------------------------------// +// 20.9.2.3 Specializations of common_type [time.traits.specializations] // +//----------------------------------------------------------------------------// + +template +struct common_type, + chrono::duration > +{ + typedef chrono::duration::type, + typename boost::ratio_gcd::type> type; +}; + + +//----------------------------------------------------------------------------// +// // +// 20.9.3 Class template duration [time.duration] // +// // +//----------------------------------------------------------------------------// + + +namespace chrono { + + template + class duration + { + BOOST_EX_CHRONO_STATIC_ASSERT(!boost_ex::chrono::detail::is_duration::value, BOOST_EX_CHRONO_A_DURATION_REPRESENTATION_CAN_NOT_BE_A_DURATION, ()); + BOOST_EX_CHRONO_STATIC_ASSERT(boost::ratio_detail::is_ratio::value, BOOST_EX_CHRONO_SECOND_TEMPLATE_PARAMETER_OF_DURATION_MUST_BE_A_STD_RATIO, ()); + BOOST_EX_CHRONO_STATIC_ASSERT(Period::num>0, BOOST_EX_CHRONO_DURATION_PERIOD_MUST_BE_POSITIVE, ()); + public: + typedef Rep rep; + typedef Period period; + private: + rep rep_; + public: + + duration() { } // = default; + template + explicit duration(const Rep2& r, + typename boost::enable_if < + boost::mpl::and_ < + boost::is_convertible, + boost::mpl::or_ < + treat_as_floating_point, + boost::mpl::and_ < + boost::mpl::not_ < treat_as_floating_point >, + boost::mpl::not_ < treat_as_floating_point > + > + > + > + >::type* = 0) + : rep_(r) { } + ~duration() {} //= default; + duration(const duration& rhs) : rep_(rhs.rep_) {} // = default; + duration& operator=(const duration& rhs) // = default; + { + if (&rhs != this) rep_= rhs.rep_; + return *this; + } + + // conversions + template + duration(const duration& d, + typename boost::enable_if < + boost::mpl::or_ < + treat_as_floating_point, + boost::mpl::and_ < + boost::mpl::bool_ < boost::ratio_divide::type::den == 1>, + boost::mpl::not_ < treat_as_floating_point > + > + > + >::type* = 0) +#ifdef __GNUC__ + // GCC 4.2.4 refused to accept a definition at this point, + // yet both VC++ 9.0 SP1 and Intel ia32 11.0 accepted the definition + // without complaint. VC++ 9.0 SP1 refused to accept a later definition, + // although that was fine with GCC 4.2.4 and Intel ia32 11.0. Thus we + // have to support both approaches. + ; +#else + : rep_(duration_cast(d).count()) {} +#endif + + // observer + + rep count() const {return rep_;} + + // arithmetic + + duration operator+() const {return *this;} + duration operator-() const {return duration(-rep_);} + duration& operator++() {++rep_; return *this;} + duration operator++(int) {return duration(rep_++);} + duration& operator--() {--rep_; return *this;} + duration operator--(int) {return duration(rep_--);} + + duration& operator+=(const duration& d) {rep_ += d.count(); return *this;} + duration& operator-=(const duration& d) {rep_ -= d.count(); return *this;} + + duration& operator*=(const rep& rhs) {rep_ *= rhs; return *this;} + duration& operator/=(const rep& rhs) {rep_ /= rhs; return *this;} + duration& operator%=(const rep& rhs) {rep_ %= rhs; return *this;} + duration& operator%=(const duration& rhs) {rep_ %= rhs.count(); return *this;}; + // 20.9.3.4 duration special values [time.duration.special] + + static duration zero() {return duration(duration_values::zero());} + static duration min BOOST_PREVENT_MACRO_SUBSTITUTION () {return duration((duration_values::min)());} + static duration max BOOST_PREVENT_MACRO_SUBSTITUTION () {return duration((duration_values::max)());} + }; + +//----------------------------------------------------------------------------// +// 20.9.3.5 duration non-member arithmetic [time.duration.nonmember] // +//----------------------------------------------------------------------------// + + // Duration + + + template + inline + typename common_type, duration >::type + operator+(const duration& lhs, const duration& rhs) + { + typename common_type, + duration >::type result = lhs; + result += rhs; + return result; + } + + // Duration - + + template + inline + typename common_type, duration >::type + operator-(const duration& lhs, const duration& rhs) + { + typename common_type, + duration >::type result = lhs; + result -= rhs; + return result; + } + + // Duration * + + template + inline + typename boost::enable_if < + boost::mpl::and_ < + boost::is_convertible::type>, + boost::is_convertible::type> + >, + duration::type, Period> + >::type + operator*(const duration& d, const Rep2& s) + { + typedef typename common_type::type CR; + duration r = d; + r *= static_cast(s); + return r; + } + + template + inline + typename boost::enable_if < + boost::mpl::and_ < + boost::is_convertible::type>, + boost::is_convertible::type> + >, + duration::type, Period> + >::type + operator*(const Rep1& s, const duration& d) + { + return d * s; + } + + // Duration / + + template + inline + typename boost::disable_if , + typename boost_ex::chrono::detail::duration_divide_result, Rep2>::type + >::type + operator/(const duration& d, const Rep2& s) + { + typedef typename common_type::type CR; + duration r = d; + r /= static_cast(s); + return r; + } + + template + inline + typename common_type::type + operator/(const duration& lhs, const duration& rhs) + { + typedef typename common_type, + duration >::type CD; + return CD(lhs).count() / CD(rhs).count(); + } + + template + inline + typename boost::disable_if , + typename boost_ex::chrono::detail::duration_divide_result2 >::type + >::type + operator/(const Rep1& s, const duration& d) + { + typedef typename common_type::type CR; + duration r = d; + //return static_cast(r.count()) / static_cast(s); + return static_cast(s)/r.count(); + } + + // Duration % + + template + typename boost::disable_if , + typename boost_ex::chrono::detail::duration_modulo_result, Rep2>::type + >::type + operator%(const duration& d, const Rep2& s) { + typedef typename common_type::type CR; + duration r = d; + r %= static_cast(s); + return r; + } + + template + typename common_type, duration >::type + operator%(const duration& lhs, const duration& rhs) { + typedef typename common_type, + duration >::type CD; + CD r(lhs); + r%=CD(rhs); + return r; + } + + +//----------------------------------------------------------------------------// +// 20.9.3.6 duration comparisons [time.duration.comparisons] // +//----------------------------------------------------------------------------// + + namespace detail + { + template + struct duration_eq + { + bool operator()(const LhsDuration& lhs, const RhsDuration& rhs) + { + typedef typename common_type::type CD; + return CD(lhs).count() == CD(rhs).count(); + } + }; + + template + struct duration_eq + { + bool operator()(const LhsDuration& lhs, const LhsDuration& rhs) + {return lhs.count() == rhs.count();} + }; + + template + struct duration_lt + { + bool operator()(const LhsDuration& lhs, const RhsDuration& rhs) + { + typedef typename common_type::type CD; + return CD(lhs).count() < CD(rhs).count(); + } + }; + + template + struct duration_lt + { + bool operator()(const LhsDuration& lhs, const LhsDuration& rhs) + {return lhs.count() < rhs.count();} + }; + + } // namespace detail + + // Duration == + + template + inline + bool + operator==(const duration& lhs, const duration& rhs) + { + return boost_ex::chrono::detail::duration_eq, duration >()(lhs, rhs); + } + + // Duration != + + template + inline + bool + operator!=(const duration& lhs, const duration& rhs) + { + return !(lhs == rhs); + } + + // Duration < + + template + inline + bool + operator< (const duration& lhs, const duration& rhs) + { + return boost_ex::chrono::detail::duration_lt, duration >()(lhs, rhs); + } + + // Duration > + + template + inline + bool + operator> (const duration& lhs, const duration& rhs) + { + return rhs < lhs; + } + + // Duration <= + + template + inline + bool + operator<=(const duration& lhs, const duration& rhs) + { + return !(rhs < lhs); + } + + // Duration >= + + template + inline + bool + operator>=(const duration& lhs, const duration& rhs) + { + return !(lhs < rhs); + } + +//----------------------------------------------------------------------------// +// 20.9.3.7 duration_cast [time.duration.cast] // +//----------------------------------------------------------------------------// + + // Compile-time select the most efficient algorithm for the conversion... + template + inline + typename boost::enable_if , ToDuration>::type + duration_cast(const duration& fd) + { + return boost_ex::chrono::detail::duration_cast, ToDuration>()(fd); + } + + +//----------------------------------------------------------------------------// +// duration constructor implementation // +// See comment in the class duration synopsis // +//----------------------------------------------------------------------------// + +#ifdef __GNUC__ + // see comment above in section 20.9.3 Class template duration [time.duration] + template + template + duration::duration(const duration& d, + typename boost::enable_if < + boost::mpl::or_ < + treat_as_floating_point, + boost::mpl::and_ < + boost::mpl::bool_ ::type::den == 1>, + boost::mpl::not_ > + > + > + >::type*) + : rep_(duration_cast(d).count()) {} +#endif + +} +} +#endif // BOOST_EX_CHRONO_DURATION_HPP diff --git a/example/si_physics.cpp b/example/si_physics.cpp new file mode 100644 index 0000000..b042757 --- /dev/null +++ b/example/si_physics.cpp @@ -0,0 +1,236 @@ +// ratio_test.cpp ----------------------------------------------------------// + +// Copyright 2008 Howard Hinnant +// Copyright 2008 Beman Dawes + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include "duration.hpp" + +namespace User1 +{ +// Example type-safe "physics" code interoperating with chrono::duration types +// and taking advantage of the std::ratio infrastructure and design philosophy. + +// length - mimics chrono::duration except restricts representation to double. +// Uses boost::ratio facilities for length units conversions. + +template +class length +{ +public: + typedef Ratio ratio; +private: + double len_; +public: + + length() : len_(1) {} + length(const double& len) : len_(len) {} + + // conversions + template + length(const length& d) + : len_(d.count() * boost::ratio_divide::type::den / + boost::ratio_divide::type::num) {} + + // observer + + double count() const {return len_;} + + // arithmetic + + length& operator+=(const length& d) {len_ += d.count(); return *this;} + length& operator-=(const length& d) {len_ -= d.count(); return *this;} + + length operator+() const {return *this;} + length operator-() const {return length(-len_);} + + length& operator*=(double rhs) {len_ *= rhs; return *this;} + length& operator/=(double rhs) {len_ /= rhs; return *this;} +}; + +// Sparse sampling of length units +typedef length > meter; // set meter as "unity" +typedef length centimeter; // 1/100 meter +typedef length kilometer; // 1000 meters +typedef length > inch; // 254/10000 meters +// length takes ratio instead of two integral types so that definitions can be made like so: +typedef length, inch::ratio>::type> foot; // 12 inchs +typedef length, foot::ratio>::type> mile; // 5280 feet + +// Need a floating point definition of seconds +typedef boost_ex::chrono::duration seconds; // unity +// Demo of (scientific) support for sub-nanosecond resolutions +typedef boost_ex::chrono::duration picosecond; // 10^-12 seconds +typedef boost_ex::chrono::duration femtosecond; // 10^-15 seconds +typedef boost_ex::chrono::duration attosecond; // 10^-18 seconds + +// A very brief proof-of-concept for SIUnits-like library +// Hard-wired to floating point seconds and meters, but accepts other units (shown in testUser1()) +template +class quantity +{ + double q_; +public: + typedef R1 time_dim; + typedef R2 distance_dim; + quantity() : q_(1) {} + + double get() const {return q_;} + void set(double q) {q_ = q;} +}; + +template <> +class quantity, boost::ratio<0> > +{ + double q_; +public: + quantity() : q_(1) {} + quantity(seconds d) : q_(d.count()) {} // note: only User1::seconds needed here + + double get() const {return q_;} + void set(double q) {q_ = q;} +}; + +template <> +class quantity, boost::ratio<1> > +{ + double q_; +public: + quantity() : q_(1) {} + quantity(meter d) : q_(d.count()) {} // note: only User1::meter needed here + + double get() const {return q_;} + void set(double q) {q_ = q;} +}; + +template <> +class quantity, boost::ratio<0> > +{ + double q_; +public: + quantity() : q_(1) {} + quantity(double d) : q_(d) {} + + double get() const {return q_;} + void set(double q) {q_ = q;} +}; + +// Example SI-Units +typedef quantity, boost::ratio<0> > Scalar; +typedef quantity, boost::ratio<0> > Time; // second +typedef quantity, boost::ratio<1> > Distance; // meter +typedef quantity, boost::ratio<1> > Speed; // meter/second +typedef quantity, boost::ratio<1> > Acceleration; // meter/second^2 + +template +quantity::type, typename boost::ratio_subtract::type> +operator/(const quantity& x, const quantity& y) +{ + typedef quantity::type, typename boost::ratio_subtract::type> R; + R r; + r.set(x.get() / y.get()); + return r; +} + +template +quantity::type, typename boost::ratio_add::type> +operator*(const quantity& x, const quantity& y) +{ + typedef quantity::type, typename boost::ratio_add::type> R; + R r; + r.set(x.get() * y.get()); + return r; +} + +template +quantity +operator+(const quantity& x, const quantity& y) +{ + typedef quantity R; + R r; + r.set(x.get() + y.get()); + return r; +} + +template +quantity +operator-(const quantity& x, const quantity& y) +{ + typedef quantity R; + R r; + r.set(x.get() - y.get()); + return r; +} + +// Example type-safe physics function +Distance +compute_distance(Speed v0, Time t, Acceleration a) +{ + return v0 * t + Scalar(.5) * a * t * t; // if a units mistake is made here it won't compile +} + +} // User1 + +// Exercise example type-safe physics function and show interoperation +// of custom time durations (User1::seconds) and standard time durations (std::hours). +// Though input can be arbitrary (but type-safe) units, output is always in SI-units +// (a limitation of the simplified Units lib demoed here). + + + +int main() +{ + //~ typedef boost::ratio<8, BOOST_INTMAX_C(0x7FFFFFFFD)> R1; + //~ typedef boost::ratio<3, BOOST_INTMAX_C(0x7FFFFFFFD)> R2; + typedef User1::quantity, boost::ratio<1> >::type, + boost::ratio_subtract, boost::ratio<0> >::type > RR; + //~ typedef boost::ratio_subtract::type RS; + //~ std::cout << RS::num << '/' << RS::den << '\n'; + + + std::cout << "*************\n"; + std::cout << "* testUser1 *\n"; + std::cout << "*************\n"; + User1::Distance d(( User1::mile(110) )); + boost_ex::chrono::hours h((2)); + User1::Time t(( h )); + //~ boost_ex::chrono::seconds sss=boost_ex::chrono::duration_cast(h); + //~ User1::seconds sss((120)); + //~ User1::Time t(( sss )); + + //typedef User1::quantity::type, + // boost::ratio_subtract::type > R; + RR r=d / t; + //r.set(d.get() / t.get()); + + User1::Speed rc= r; + + User1::Speed s = d / t; + std::cout << "Speed = " << s.get() << " meters/sec\n"; + User1::Acceleration a = User1::Distance( User1::foot(32.2) ) / User1::Time() / User1::Time(); + std::cout << "Acceleration = " << a.get() << " meters/sec^2\n"; + User1::Distance df = compute_distance(s, User1::Time( User1::seconds(0.5) ), a); + std::cout << "Distance = " << df.get() << " meters\n"; + std::cout << "There are " << User1::mile::ratio::den << '/' << User1::mile::ratio::num << " miles/meter"; + User1::meter mt = 1; + User1::mile mi = mt; + std::cout << " which is approximately " << mi.count() << '\n'; + std::cout << "There are " << User1::mile::ratio::num << '/' << User1::mile::ratio::den << " meters/mile"; + mi = 1; + mt = mi; + std::cout << " which is approximately " << mt.count() << '\n'; + User1::attosecond as(1); + User1::seconds sec = as; + std::cout << "1 attosecond is " << sec.count() << " seconds\n"; + std::cout << "sec = as; // compiles\n"; + sec = User1::seconds(1); + as = sec; + std::cout << "1 second is " << as.count() << " attoseconds\n"; + std::cout << "as = sec; // compiles\n"; + std::cout << "\n"; + return 0; +} diff --git a/example/static_assert.hpp b/example/static_assert.hpp new file mode 100644 index 0000000..6d257b3 --- /dev/null +++ b/example/static_assert.hpp @@ -0,0 +1,30 @@ +// static_assert.hpp --------------------------------------------------------------// + +// Copyright 2009-2010 Vicente J. Botet Escriba + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + + +#ifndef BOOST_EX_CHRONO_DETAIL_STATIC_ASSERT_HPP +#define BOOST_EX_CHRONO_DETAIL_STATIC_ASSERT_HPP + +#include "config.hpp" + +#ifndef BOOST_NO_STATIC_ASSERT +#define BOOST_EX_CHRONO_STATIC_ASSERT(CND, MSG, TYPES) static_assert(CND,MSG) +#elif defined(BOOST_CHRONO_USES_STATIC_ASSERT) +#include +#define BOOST_EX_CHRONO_STATIC_ASSERT(CND, MSG, TYPES) BOOST_STATIC_ASSERT(CND) +#elif defined(BOOST_CHRONO_USES_MPL_ASSERT) +#include +#include +#define BOOST_EX_CHRONO_STATIC_ASSERT(CND, MSG, TYPES) \ + BOOST_MPL_ASSERT_MSG(boost::mpl::bool_< (CND) >::type::value, MSG, TYPES) +#else +//~ #elif defined(BOOST_CHRONO_USES_ARRAY_ASSERT) +#define BOOST_EX_CHRONO_STATIC_ASSERT(CND, MSG, TYPES) static char BOOST_JOIN(boost_chrono_test_,__LINE__)[(CND)?1:-1] +//~ #define BOOST_EX_CHRONO_STATIC_ASSERT(CND, MSG, TYPES) +#endif + +#endif // BOOST_EX_CHRONO_DETAIL_STATIC_ASSERT_HPP diff --git a/example/type_traits/add_rvalue_reference.hpp b/example/type_traits/add_rvalue_reference.hpp new file mode 100644 index 0000000..32d778b --- /dev/null +++ b/example/type_traits/add_rvalue_reference.hpp @@ -0,0 +1,67 @@ +// add_rvalue_reference.hpp ---------------------------------------------------------// + +// Copyright 2010 Vicente J. Botet Escriba + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +#ifndef BOOST_EX_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP +#define BOOST_EX_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP + +#include + +//----------------------------------------------------------------------------// + +#include +#include + +// should be the last #include +#include + +//----------------------------------------------------------------------------// +// // +// C++03 implementation of // +// 20.7.6.2 Reference modifications [meta.trans.ref] // +// Written by Vicente J. Botet Escriba // +// // +// If T names an object or function type then the member typedef type +// shall name T&&; otherwise, type shall name T. [ Note: This rule reflects +// the semantics of reference collapsing. For example, when a type T names +// a type T1&, the type add_rvalue_reference::type is not an rvalue +// reference. -end note ] +//----------------------------------------------------------------------------// + +namespace boost_ex { + +namespace type_traits_detail { + + template + struct add_rvalue_reference_helper + { typedef T type; }; + + template + struct add_rvalue_reference_helper + { +#if !defined(BOOST_NO_RVALUE_REFERENCES) + typedef T&& type; +#else + typedef T type; +#endif + }; + + template + struct add_rvalue_reference_imp + { + typedef typename boost_ex::type_traits_detail::add_rvalue_reference_helper + ::value && !boost::is_reference::value) >::type type; + }; + +} + +BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_rvalue_reference,T,typename boost_ex::type_traits_detail::add_rvalue_reference_imp::type) + +} // namespace boost_ex + +#include + +#endif // BOOST_EX_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP diff --git a/example/type_traits/common_type.hpp b/example/type_traits/common_type.hpp new file mode 100644 index 0000000..8648d48 --- /dev/null +++ b/example/type_traits/common_type.hpp @@ -0,0 +1,151 @@ +// common_type.hpp ---------------------------------------------------------// + +// Copyright 2008 Howard Hinnant +// Copyright 2008 Beman Dawes + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +#ifndef BOOST_EX_TYPE_TRAITS_EXT_COMMON_TYPE_HPP +#define BOOST_EX_TYPE_TRAITS_EXT_COMMON_TYPE_HPP + +#include + +//----------------------------------------------------------------------------// +#if defined(BOOST_NO_VARIADIC_TEMPLATES) +#define BOOST_EX_COMMON_TYPE_ARITY 3 +#endif + +//----------------------------------------------------------------------------// +#if defined(BOOST_NO_DECLTYPE) && !defined(BOOST_EX_COMMON_TYPE_DONT_USE_TYPEOF) +#define BOOST_TYPEOF_SILENT +#include // boost wonders never cease! +#endif + +//----------------------------------------------------------------------------// +#ifndef BOOST_NO_STATIC_ASSERT +#define BOOST_EX_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) static_assert(CND,MSG) +#elif defined(BOOST_EX_COMMON_TYPE_USES_STATIC_ASSERT) +#include +#define BOOST_EX_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) BOOST_STATIC_ASSERT(CND) +#elif defined(BOOST_EX_COMMON_TYPE_USES_MPL_ASSERT) +#include +#include +#define BOOST_EX_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) \ + BOOST_MPL_ASSERT_MSG(boost::mpl::bool_< (CND) >::type::value, MSG, TYPES) +#else +//~ #elif defined(BOOST_EX_COMMON_TYPE_USES_ARRAY_ASSERT) +#define BOOST_EX_COMMON_TYPE_CONCAT(A,B) A##B +#define BOOST_EX_COMMON_TYPE_NAME(A,B) BOOST_EX_COMMON_TYPE_CONCAT(A,B) +#define BOOST_EX_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) static char BOOST_EX_COMMON_TYPE_NAME(__boost_common_type_test_,__LINE__)[(CND)?1:-1] +//~ #define BOOST_EX_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) +#endif + +#if !defined(BOOST_NO_STATIC_ASSERT) || !defined(BOOST_EX_COMMON_TYPE_USES_MPL_ASSERT) +#define BOOST_EX_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE "must be complete type" +#endif + +#if defined(BOOST_NO_DECLTYPE) && defined(BOOST_EX_COMMON_TYPE_DONT_USE_TYPEOF) +#include "detail/common_type.hpp" +#include +#endif +#include +#include "declval.hpp" + +//----------------------------------------------------------------------------// +// // +// C++03 implementation of // +// 20.6.7 Other transformations [meta.trans.other] // +// Written by Howard Hinnant // +// Adapted for Boost by Beman Dawes, Vicente Botet and Jeffrey Hellrung // +// // +//----------------------------------------------------------------------------// + +namespace boost_ex { + +// prototype +#if !defined(BOOST_NO_VARIADIC_TEMPLATES) + template + struct common_type; +#else // or no specialization + template + struct common_type + { + public: + typedef typename common_type::type, V>::type type; + }; +#endif + + +// 1 arg + template +#if !defined(BOOST_NO_VARIADIC_TEMPLATES) + struct common_type +#else + struct common_type + +#endif + { + BOOST_EX_COMMON_TYPE_STATIC_ASSERT(sizeof(T) > 0, BOOST_EX_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (T)); + public: + typedef T type; + }; + +// 2 args +namespace type_traits_detail { + + template + struct common_type_2 + { + private: + BOOST_EX_COMMON_TYPE_STATIC_ASSERT(sizeof(T) > 0, BOOST_EX_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (T)); + BOOST_EX_COMMON_TYPE_STATIC_ASSERT(sizeof(U) > 0, BOOST_EX_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (U)); + static bool declval_bool(); // workaround gcc bug; not required by std + static typename add_rvalue_reference::type declval_T(); // workaround gcc bug; not required by std + static typename add_rvalue_reference::type declval_U(); // workaround gcc bug; not required by std + +#if !defined(BOOST_NO_DECLTYPE) + public: + typedef decltype(declval() ? declval() : declval()) type; +#elif defined(BOOST_EX_COMMON_TYPE_DONT_USE_TYPEOF) + public: + typedef typename detail_type_traits_common_type::common_type_impl< + typename remove_cv::type, + typename remove_cv::type + >::type type; +#else + public: + //~ typedef BOOST_TYPEOF_TPL(declval_bool() ? declval_T() : declval_U()) type; + typedef BOOST_TYPEOF_TPL(declval() ? declval() : declval()) type; +#endif + }; + + template + struct common_type_2 + { + typedef T type; + }; + } + +#if !defined(BOOST_NO_VARIADIC_TEMPLATES) + template + struct common_type +#else + template + struct common_type +#endif + : type_traits_detail::common_type_2 + { }; + + +// 3 or more args +#if !defined(BOOST_NO_VARIADIC_TEMPLATES) + template + struct common_type { + public: + typedef typename common_type::type, V...>::type type; + }; +#endif +} // namespace boost_ex + +#endif // BOOST_TYPE_TRAITS_EXT_COMMON_TYPE_HPP diff --git a/example/type_traits/declval.hpp b/example/type_traits/declval.hpp new file mode 100644 index 0000000..437e345 --- /dev/null +++ b/example/type_traits/declval.hpp @@ -0,0 +1,44 @@ +// common_type.hpp ---------------------------------------------------------// + +// Copyright 2010 Vicente J. Botet Escriba + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +#ifndef BOOST_EX_TYPE_TRAITS_EXT_DECLVAL__HPP +#define BOOST_EX_TYPE_TRAITS_EXT_DECLVAL__HPP + +#include + +//----------------------------------------------------------------------------// + +#include "add_rvalue_reference.hpp" + +//----------------------------------------------------------------------------// +// // +// C++03 implementation of // +// Written by Vicente J. Botet Escriba // +//~ 20.3.4 Function template declval [declval] +//~ 1 The library provides the function template declval to simplify the definition of expressions which occur as +//~ unevaluated operands. +//~ 2 Remarks: If this function is used, the program is ill-formed. +//~ 3 Remarks: The template parameter T of declval may be an incomplete type. +//~ [ Example: + +//~ template +//~ decltype(static_cast(declval())) convert(From&&); + +//~ declares a function template convert which only participats in overloading if the type From can be +//~ explicitly converted to type To. For another example see class template common_type (20.7.6.6). -end +//~ example ] +// // +//----------------------------------------------------------------------------// + +namespace boost_ex { + + template + typename add_rvalue_reference::type declval(); //noexcept; // as unevaluated operand + +} // namespace boost + +#endif // BOOST_EX_TYPE_TRAITS_EXT_DECLVAL__HPP diff --git a/example/type_traits/detail/common_type.hpp b/example/type_traits/detail/common_type.hpp new file mode 100644 index 0000000..ca7555d --- /dev/null +++ b/example/type_traits/detail/common_type.hpp @@ -0,0 +1,316 @@ +/******************************************************************************* + * boost/type_traits/detail/common_type.hpp + * + * Copyright 2010, Jeffrey Hellrung. + * 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) + * + * struct boost::common_type + * + * common_type::type is the type of the expression + * b() ? x() : y() + * where b() returns a bool, x() has return type T, and y() has return type U. + * See + * http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm#common_type + * + * Note that this evaluates to void if one or both of T and U is void. + ******************************************************************************/ + +#ifndef BOOST_EX_TYPE_TRAITS_EXT_DETAIL_COMMON_TYPE_HPP +#define BOOST_EX_TYPE_TRAITS_EXT_DETAIL_COMMON_TYPE_HPP + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost_ex +{ + +namespace detail_type_traits_common_type +{ + +/******************************************************************************* + * struct propagate_cv< From, To > + * + * This metafunction propagates cv-qualifiers on type From to type To. + ******************************************************************************/ + +template< class From, class To > +struct propagate_cv +{ typedef To type; }; +template< class From, class To > +struct propagate_cv< const From, To > +{ typedef To const type; }; +template< class From, class To > +struct propagate_cv< volatile From, To > +{ typedef To volatile type; }; +template< class From, class To > +struct propagate_cv< const volatile From, To > +{ typedef To const volatile type; }; + +/******************************************************************************* + * struct is_signable_integral + * + * This metafunction determines if T is an integral type which can be made + * signed or unsigned. + ******************************************************************************/ + +template< class T > +struct is_signable_integral + : mpl::or_< is_integral, is_enum > +{ }; +template<> +struct is_signable_integral< bool > + : false_type +{ }; + +/******************************************************************************* + * struct sizeof_t + * typedef ... yes_type + * typedef ... no_type + * + * These types are integral players in the use of the "sizeof trick", i.e., we + * can distinguish overload selection by inspecting the size of the return type + * of the overload. + ******************************************************************************/ + +template< std::size_t N > struct sizeof_t { char _dummy[N]; }; +typedef sizeof_t<1> yes_type; +typedef sizeof_t<2> no_type; +BOOST_MPL_ASSERT_RELATION( sizeof( yes_type ), ==, 1 ); +BOOST_MPL_ASSERT_RELATION( sizeof( no_type ), ==, 2 ); + +/******************************************************************************* + * rvalue_test(T&) -> no_type + * rvalue_test(...) -> yes_type + * + * These overloads are used to determine the rvalue-ness of an expression. + ******************************************************************************/ + +template< class T > no_type rvalue_test(T&); +yes_type rvalue_test(...); + +/******************************************************************************* + * struct conversion_test_overloads< Sequence > + * + * This struct has multiple overloads of the static member function apply, each + * one taking a single parameter of a type within the Boost.MPL sequence + * Sequence. Each such apply overload has a return type with sizeof equal to + * one plus the index of the parameter type within Sequence. Thus, we can + * deduce the type T of an expression as long as we can generate a finite set of + * candidate types containing T via these apply overloads and the "sizeof + * trick". + ******************************************************************************/ + +template< class First, class Last, std::size_t Index > +struct conversion_test_overloads_iterate + : conversion_test_overloads_iterate< + typename mpl::next< First >::type, Last, Index + 1 + > +{ + using conversion_test_overloads_iterate< + typename mpl::next< First >::type, Last, Index + 1 + >::apply; + static sizeof_t< Index + 1 > + apply(typename mpl::deref< First >::type); +}; + +template< class Last, std::size_t Index > +struct conversion_test_overloads_iterate< Last, Last, Index > +{ static sizeof_t< Index + 1 > apply(...); }; + +template< class Sequence > +struct conversion_test_overloads + : conversion_test_overloads_iterate< + typename mpl::begin< Sequence >::type, + typename mpl::end< Sequence >::type, + 0 + > +{ }; + +/******************************************************************************* + * struct select< Sequence, Index > + * + * select is synonymous with mpl::at_c unless Index equals the size of the + * Boost.MPL Sequence, in which case this evaluates to void. + ******************************************************************************/ + +template< + class Sequence, int Index, + int N = mpl::size< Sequence >::value +> +struct select + : mpl::at_c< Sequence, Index > +{ }; +template< class Sequence, int N > +struct select< Sequence, N, N > +{ typedef void type; }; + +/******************************************************************************* + * class deduce_common_type< T, U, NominalCandidates > + * struct nominal_candidates + * struct common_type_dispatch_on_rvalueness + * struct common_type_impl + * + * These classes and structs implement the logic behind common_type, which goes + * roughly as follows. Let C be the type of the conditional expression + * declval< bool >() ? declval() : declval() + * if C is an rvalue, then: + * let T' and U' be T and U stripped of reference- and cv-qualifiers + * if T' and U' are pointer types, say, T' = V* and U' = W*, then: + * define the set of NominalCandidates to be + * { V*, W*, V'*, W'* } + * where V' is V with whatever cv-qualifiers are on W, and W' is W + * with whatever cv-qualifiers are on V + * else T' and U' are both "signable integral types" (integral and enum + * types excepting bool), then: + * define the set of NominalCandidates to be + * { unsigned(T'), unsigned(U'), signed(T'), signed(U') } + * where unsigned(X) is make_unsigned::type and signed(X) is + * make_signed::type + * else + * define the set of NominalCandidates to be + * { T', U' } + * else + * let V and W be T and U stripped of reference-qualifiers + * define the set of NominalCandidates to be + * { V&, W&, V'&, W'& } + * where V' is V with whatever cv-qualifiers are on W, and W' is W with + * whatever cv-qualifiers are on V + * define the set of Candidates to be equal to the set of NominalCandidates with + * duplicates removed, and use this set of Candidates to determine C using the + * conversion_test_overloads struct + ******************************************************************************/ + +template< class T, class U, class NominalCandidates > +class deduce_common_type +{ + typedef typename mpl::copy< + NominalCandidates, + mpl::inserter< + mpl::vector0<>, + mpl::if_< + mpl::contains< mpl::_1, mpl::_2 >, + mpl::_1, + mpl::push_back< mpl::_1, mpl::_2 > + > + > + >::type candidate_types; + static const int best_candidate_index = + sizeof( conversion_test_overloads< candidate_types >::apply( + declval< bool >() ? declval() : declval() + ) ) - 1; +public: + typedef typename select< candidate_types, best_candidate_index >::type type; +}; + +template< + class T, class U, + class V = typename remove_cv< typename remove_reference::type >::type, + class W = typename remove_cv< typename remove_reference::type >::type, + bool = is_signable_integral::value && is_signable_integral::value +> +struct nominal_candidates; + +template< class T, class U, class V, class W > +struct nominal_candidates< T, U, V, W, false > +{ typedef mpl::vector2 type; }; + +template< class T, class U, class V, class W > +struct nominal_candidates< T, U, V, W, true > +{ + typedef mpl::vector4< + typename make_unsigned::type, + typename make_unsigned::type, + typename make_signed::type, + typename make_signed::type + > type; +}; + +template< class T, class U, class V, class W > +struct nominal_candidates< T, U, V*, W*, false > +{ + typedef mpl::vector4< + V*, W*, + typename propagate_cv::type *, + typename propagate_cv::type * + > type; +}; + +template< + class T, class U, + bool = sizeof( ::boost::detail_type_traits_common_type::rvalue_test( + declval< bool >() ? declval() : declval() + ) ) == sizeof( yes_type ) +> +struct common_type_dispatch_on_rvalueness; + +template< class T, class U > +struct common_type_dispatch_on_rvalueness< T, U, true > + : deduce_common_type< T, U, typename nominal_candidates::type > +{ }; + +template< class T, class U > +struct common_type_dispatch_on_rvalueness< T, U, false > +{ +private: + typedef typename remove_reference::type unrefed_T_type; + typedef typename remove_reference::type unrefed_U_type; +public: + typedef typename deduce_common_type< + T, U, + mpl::vector4< + unrefed_T_type &, + unrefed_U_type &, + typename propagate_cv< unrefed_U_type, unrefed_T_type >::type &, + typename propagate_cv< unrefed_T_type, unrefed_U_type >::type & + > + >::type type; +}; + +template< class T, class U > +struct common_type_impl + : common_type_dispatch_on_rvalueness +{ }; + +template< class T > struct common_type_impl< T, void > { typedef void type; }; +template< class T > struct common_type_impl< void, T > { typedef void type; }; +template<> struct common_type_impl< void, void > { typedef void type; }; +template< > struct common_type_impl< char, short> { typedef int type; }; +template< > struct common_type_impl< short, char> { typedef int type; }; +template< > struct common_type_impl< unsigned char, short> { typedef int type; }; +template< > struct common_type_impl< short, unsigned char> { typedef int type; }; +template< > struct common_type_impl< unsigned char, unsigned short> { typedef int type; }; +template< > struct common_type_impl< unsigned short, unsigned char> { typedef int type; }; +template< > struct common_type_impl< char, unsigned short> { typedef int type; }; +template< > struct common_type_impl< unsigned short, char> { typedef int type; }; + +} // namespace detail_type_traits_common_type + + +} // namespace boost_ex + +#endif // BOOST_EX_TYPE_TRAITS_EXT_DETAIL_COMMON_TYPE_HPP