From b883cfd963e83782b98762d3dabd29f0ba70d1d8 Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 23 Jan 2023 22:47:00 +0100 Subject: [PATCH 01/24] fix(readme) typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 21b5daf..10c399c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ Clutchlog — versatile (de)clutchable spatial logging ==================================================== -***Clutchlog is a *spatial* logging system that targets versatile debugging.*** -***It allows to (de)clutch messages for a given: log level, source code location or call stack depth.*** +**Clutchlog is a *spatial* logging system that targets versatile *debugging*.** +**It allows to (de)clutch messages for a given: log level, source code location or call stack depth.** - [Project page on Github](https://github.com/nojhan/clutchlog) - [Documentation](https://nojhan.github.io/clutchlog/) From cb5e28add816130eeccf6bbcb25c3811d69f8201 Mon Sep 17 00:00:00 2001 From: nojhan Date: Wed, 25 Jan 2023 09:48:31 +0100 Subject: [PATCH 02/24] update the extravagant demo to make a social banner --- banner.png | Bin 0 -> 501867 bytes banner.xcf | Bin 0 -> 1073922 bytes tests/t-demo-extravagant.cpp | 41 ++++++++++++++++++++++++++--------- 3 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 banner.png create mode 100644 banner.xcf diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..f06355e04cb071ecc08af417276e70f4c0c9af99 GIT binary patch literal 501867 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⪙T!XntLgyrHk{!V? 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%0ArC{k*%z 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%0A(rRF3mHqhu#I8=L7F$pVsmZtb%UuYrOw#D? zixFUq)L8ivS4m!7>9ywi`!3b0o4A2GcWb<}Ofu|j?bYt~-jE^y&Fn8G+c>)SL~20$ z(}Rv_H9OKpiaR{MojQB@r0`GWkG92QCSj`Guu6tJOh`oJFK8*9?4$;65Bs)P;G8{q zq8?>krFT`{IrEw{A7PxAC~1c`QKq}FSnJfO0r>pEIqoJtBpCGbY|8{t0bBaX%C#GK zPSF|=GNx3j$d3^`7T2|jL}rZb1j`vCH!Af`BXXwFo80th`-hs@@vcfv#)np1{wg=G z$u@C#$I|um)z1dZm!%__N7%1XFi99OY$Wq8lxc2H-;#IWiK6Cd0os>azl!Av?aez# z)-|>vef`Fp-x0jOr^enZ-v6_IJ8jBK!w2hYPS;jSmPQ_zL|B&5q?hecf55vVNPmq{ zcD1WenOXe&1F)zYlSoV*3mh_Wy*dr+Wj0st(EsT3*w*x`FKx#*wfEE+-Roy4EcMiOt3OvQ&*|LyQi)j|!MKZj>}~pIA5XUbJn82v)^;cB)K;w+vF+O^ zFLFzWfZcv-7xlJpdxK4PGi=q1(Rie3;Bbjs@(lM)VYlWX#tM;rdTMN9&B32C|K2LP z_h*4$YgcyBAUiL!Mr^|@<6u!wgj~k)^wO*3XVqEMzqSwE$(W50D|shJ7SP%t5_OS5 zSE8_h)A-pVqt{F1A{W|De~#+k|F`tXyTMm{tvR`;YQ+!h0a$;QNp|s3QDkhG_24NP zMlA!zjJ@ZSmA2H{xcW-yQ}t2gj(y~g_*tg?)iNwrG~3s5i?W(7P9@5R)$y#i@`U*K zcmv=$z#wqcN#JWL{oBk$JD=Ique%@VuK(02dLz~TW^8+btnomq=1;rQ`C-LO*?qB3 zlYIQ1WU`OWRPlafvku(KKZhL`+EkXq#>dAf-hy}k)o(n5%tU={ekr>k1Xci8#quNO`&q=rB75TKK%iLlhH8{QLD(!JmP+6@T~s(kf{ zD)1Ew%V&3>J11sE46tzSmic&5Y3^4TPwKL`0-j{v;V@SftE^9tXMRcYH!`Iv3M&jJ zE_Pp{%SSUm+UmJFnzJxvV`2nR9p12=iJJL38AA6??TV0^l2V!0nUQ;M3vCtnYt-@fO7Uvp;5`1)+$!f98AC9#vTE#hSSg> z>Ri&1tDoX6z{f+sJmonoOAMSyaD4&iw#vogLYSC|e6=rfr$wUmy+Z5xZ}~7^oa7SB3%rlCJRNpI$c! zU837F>ZU46H85^sL*i-mx|W&`H%;gS&`mgezj%OwTI|{v0jyr#CQFB%xes$qDpGw^ zz2c-Qc=^#)uMZId(JfY)1qEl8*ye%gs;I)P66%A@OjVzHwL=Rwp`2x9WrRByMJ-?sSoQRh--VQzc@Xmb{WzNYe(wm-iU2O;&Zt zyX>3XaG;gpeHNpZW=d)6v_Jb6X{(i#Uk1a+!va<}`82l8pGoo`zqHSAR_xB3wuFbL znjZ$WeN(z}iN)|nLEh!u!l=*RzO~-28`EJ58XFgw^7K#9Qh%*5D{^GhQ-0|4o#?$! zpKfh>b3y4r$ko597dQh}L$nhDi{I_)PI@*{Hm=37IqBv;X&iXH$w6%8XUzn!m^I`6 z@W_Jl18u*8zy6ePyhObeTXUXFJc@O%B+XuCr8JJB9GY_>e@`oKCl3`U6}xl0Hd%u5 zz5ms%`<`u)Nn~^{V_bcwr(co#GQH22k^EdNMO|!g+Yi5|nY){h+`abX#D&jaB$rOL zJ>!!)cl3UQwu;y8J$)OD>5o;o*81w+3`?H#m|eCo^4^jCSzz?{nh+;xi_e{{kMd5n z^(rXnDQaYxZ)Iq34fTBRCa6e78(|*nXJ|`ub$GN=#Bt(AM{ACEu+!q~*x%4o| zc+hL_;xE?IDM`l91{e?Txqf|P@Tzfp==O@#4TWv@#oFiPA}%yh51mmhl3x38{p!)6 z0y=l6Y?Zf6b%T75AK#T|Uw`SRBvi&wXS!`)fX`1Z``Z_)6|OZObGkymEW3R;&Qx}m zJH7d-T5QjTm#sra$>5nCch(aJZw2d;>-LTcoqgOdaDw_igLvjs#Ru%GS|1mioSTi6 z`h7O&jsI%ueHAMDD*V;%!hYwX3gpWOv(TXD_z;0ig5113A^-vq(tJ=}B-n3wTNZS` zL3h-1W9jW+;17EOjt79Chd`Iq_JPJYG(Lpe`-RHchn!=vkh;MS)x{fKiPX8@roy`p zaYPdDCu;s(CDZo?p(q2u69Jo>{W1*8h>nd_#kNQxRj1V>M<^_XCLdjasBxOxDhL{l zmhWwgvE@f38zopA?t}5@hwzFZ@AyX5#vOT2iC_I0g@sYr>A!UBe{U9e09XMbu*T15 z?R?_4I^yBz%lmJ9yhDCm!srE-N=vlk6BC{COaoniPY7t6m~f+w%|RO;+nD9C85x%; zyjhBwT!~jKg!$X!^AbnC4$qC=c~fUzGqu#w-HnWj^!)tmx_xMWuoeU71CWS@fYNJE zdsVG>7$DF>LN?6)`g3u{F2J2=_m5uv#0)Y3zEyL)<}&OV_ls21<#Td#L(p$yO^N;J zJJv_7!vjFGh&D`0?Xzupy$ve`Qoym`L%)tMl7J@!UIU@R{_E$yykzl$%BJpZnJ}CYho!c5~*u?v9Lh;5Lh%oHUaO= zPaOEUbZmENKb8k(}!K^5u*2JGE|o3|O!}7RTq`c6SSLe*)Qd1fDo`DigA8 zEMHrPKMc?HMjz&kBw=5H#TX%HKW6_uZMa9@;2}0M6)7sVwqs&mX@P%iE&6bxVMK6# zKZX7s)Nad**_oM`%+7iJ>dH52fb5$P&pRGAo!BGpGHDEv!*yo$c6nDx2S;g>7v<%0 zV4dN|13}aXT-7glQ0@yWCx;-O;LkI;rtV9|tJSt2uwiFDD=o%P^YH@Q@ zr$Y)!LBrw*s0D35;rA~ns43W0KNbr!8+@xomH{!F;T*+?@uvF*KN3|4NL7q29uyYP zldh0fyNK*1kP62)5`g}pfvxFxG%db_G3lK#hqRP4KWrRf8BOF^+*ML4jDO~ZG4v<~ z3z$I@a1ULu>IGw%6%XSsV#5q3;X*kF$5ul_!;jcF9uN`&j;j(?dcoi!#*Ik)Mf`T; z6yzXcsjRnPNr!WI*(hY0)HS>LFfMMuSq3V_t}8Z)PQZyd94Z!A@Os&^Tnc5p^W^5H zk)r8OszL;RZHc+-w_zk*v?|VWMcO|tFTnVKMB&DfcE@Ntw~lx>CmyYU=C2Rpw^=UmEblM4$71_x_Qm1?uhfT$+okBapTFy*< z>ofgc{BW_#m6jAy8ZSdiJaLIdrG$QM)c<#k7-?1T`%$O2i_Lw!wC6fclYUEP(UR@49oRalvE^Fg&ocNyJKna%vT~#Ym@p(;pJ=cUHi{EvnQpe{V zG9A+{@FoeyUrIXhV}(+Sw4iuxz5f(>a-&+ut7@yv{{BM#o;h-M(h8ZjtVx}LC+BIG zLe2Oxa!E<1rBJVUlU3Psy!*9kv%Hs73>fq*ReiqS;+pv`OFF!2)qAhBh^2dI*oc2koB=NX!IhCq*X{^cyjh-8B0r#>u8J_<~FCnj-4pGl^e*HQ+@&4VLei{nC z=PsPFn%I|k;ktm^7?-V_Nv$Ed+V;)|YM*}ie?43p^{tQ;VDln)fA~XMt!-a7#fbv)y zXnAjNCuB8&=EaZL?V)@R4{&Q=&cFHZAz4!$)47%_%CjGQ!uE32z9a3_KA`_m&db;C z)MUd0`Q25UN4>=Uj|p$U;L$`L%WE=gJj+i`P}^nR-|oHv^?6z;(1ruS-e* zYs1A&RgW1c$4R8>iv2k;eyiL%g5}`Tz{G3U9+aDi5@KO2toaqJ1;~ywv+gJ~aP9mU zg>!?jrD$&c`az($s9j~|_0hL1<~eRNvo z(EI|XgvB*s$44~X6wIK-G-7W6KPBL?Ou$2egRgaD6DSsvNCd0j!mtVzW?%*pMp)mxJ6aDo2Yw~>f1PfwO_XE`eM-}9SYBzz zJ|Czy0oMZzKn5w66a=h8ux;?ABe@7LmLGSb?Xe^z?U^H9Pdh~}fdFL!vd>!*f0kPv z$&|S%_2BDa{21Iqz#YOY;b&^|0l$E+F=BS_Qeq+Ctyo+l7&rOB&*I|Zjv`G(+44DJ zop4~o=EeRPCwCMT0z{Fd!+O}57Xn<6>cOfbZuc5C^l-))OUsa%VNho*>}tY!3HuQA zwO5UGlwrRMxClg{I;&Si>=GOoD}NDYf2fY&Q4)}TclRl5XDV}oXL%DV6wbwgvhg`p zu@#gPO1H9m%bOu}gjooYDGL4w%x>wv>;wKm*qwlC5%c(QGr@8Mp9v_LOpT2g+q@)l zbg-vDJ3_W3Mo1q0AC52_~g43n2{yX7HW|iBMhi z5mOY9E}%hJrC^E-!Hx-Zh!04I1zE@pybNSr0TzNI{BDu_d}`nSXCr-h2(1XX)Udq zi93KgF?zONzFuJ>3Rccni>3yT1Zzvn5gN2&cxqLhoL(v*r{W3dlpsT}A4T{LgEP34Nmpn)m_h_Rnn<;57#=?hS-zR=_oko@{bW?7+L-huDqw(NT>|ELWO?q=0r zGBz@)emQW}(V8D#!e?)CdkAZsbzv)VeS9E#*eUh0l909}j%( zxci$UwWh_Md!NF;d+zz}?jiQLCn|kNZiq&(D41V>g6uf`RQ2Xul{#I6FSmAz*6~CR zF|NMI+}!Wa>FkH2_%G}syR}QDEx0{a^X#poLriN7vg6gJ+}39;vwqzW&Y?GpdU`yu zp#Rq_U$#q%y4WSH{|S|r$T%+Uq6-u=5@wI`6sU!?N-U6?@T#!cH(M;m2ArqnDGgddD0|(j-+iD~+6j{dnNbGCW2%1>uvkj-bRaHd@>XHjDJ`u~1x0*9fB^`z+3Z1Tk5>HPUeH>g_U#r?rTBOFpXMlBIF1PUWcxW>E&1mI{gTml{y{Xtp-Hks>>2C@oVp?vLSR6^1w=Kb2eI$XnTj8CUZwQhmnhnJe*FAYI zk_CJmkucQNxSTXImzpK1j-%ju6u5V%86Da+obHk3u z=Z#(9*$nawMuywFZkH=abJ3w*QjNyo($SFhJHlc4)cNy1-cATsL@EqGgDXvVHh?C1 z7+uOgpB#?K=l%QljL#T{hla)iPuxOe$>GB=PNe;F6F&)^0xUH2eM&+za);k?<(`~#6>QlBh$1RvIVsy#q<<-VVSI@rOwf$_ffSSO5hP%|{_XoDb%XMt5S%`_y z9uaC(PV}Jryf>%pUEU3Y-n_MZ&X=#i4Z-Ay$3M}=;8|x(N(%B}KuC>EO)ac9>jWb4 z^Od1+p8aDk(c6dD1tt23m_35Y@FeuVNbndCcxm@ph@n2Fe~N)Y4ywz!h-X<@YJV>Z zY1U)<1%8Nc<3)4tOW|kZgLq@|cH7vb3=I!sp6YyY6XtbTt##h&us?F=`MbR&7i;5LT>j z!+rVqm*r}*xMPLq$P1aSZd<3W_hnRK&=U~RzW0=6nm@qUolK!^#BXZL%kvF}-;QYS ze0YLi>YCepu+4QXOYdPC>Y!Y=VgIgy^ujWa^S)>3$WMI!SS_vad3j_c!(r^G(=B!m zw(7r*!aG7}$hTPnQ|jvQZ}@vj!ZjZ1R2>(oO7?AOt=IPPY6)a#f9dKyZF-Mf%t2f) z;O;oXmYDrLUOjYdqk-SgwXys8Cf#B)wovYqRJ9kYPvNCZm8Ps7-*IN=sk3724OvCj z05>z*qn8V=L$JDGLe2vjk zF-)Uy@~KL-6l2wSG9e*9=5-g-_Z2!{_*}V!+-b;9e=N5%tWD}1hK)mDG0)WuFvpJ6P=$A1g!QwP z`Ov_Ty+=n?ZY7UfMG!fm`oTm0RrhT8wGPjBgP!mHn9tXhI{)}#{#YdIbgade z#ib>J+!hx0r$wr75W5)ySymFeHH8&&XjD`xh6NQdzq*Kt{AL=^%^?gRaQMglFK_Jj zaV?AgsPea_yGGT@DDGBEX5jAwC7;3r-|bdyldM8m9BNQdaIo7@g0<^(4V8hI%ig)s zi9d?r3E|jFWaQcjkf(8jRfal7@LoF)dcJX>r=^|#z_TeP%(?JYcWXL> zd+c~BSL|74b(u>>If7eD9||zeJxrKb(Y|YG{V8qf4xKj5idXs+t_q)FC1qi8F|Sb` z?wLP|?JgL;Xsq*e$#$_$T;JFrtP!cpdMn>9^ZJEkByksNBv@8tHB(rfNG##q)xzBW z@8*%0?y{Y!Yy17S9k|dMyAWH*KQc_E>1iTLR#8!6X|^P&8oN^LF@4=;22lJs^z-@f6@!dJ0buO+eq z4Y%#^b06g(|MI?xT=a_dmXG^4vPW8Kybk@V2%QU3*m3m>MM}XKHO0h*zIWBh^OYlW zxxA@I4zPcFeeBv$)RlZ2=Z@AO{YsBRaHHpr3MQ?jlKSUTNpc7RA&_A`>s6z6QI^@M zMrJ1uubgfH>TRuZbF}aRgHguKsfwja{=Vd?-ss|P*(V(pOzv?&l@_}le7a@&RBjiz zWb}qVwJy4jV8CI>qNxB|`$L$OCo_T(`dr#{GIv$UhnyeYQTOgy0km-7>~<{?yI=Ro z-(?rQo8VBpY$W~Zhk5{eLEjDv3KHXp1g3tu_@}qvbhJxZ)h#cN$~O&lbu-BFoIzUI z(=C(6DG9MP)z@0HFKy8n(TUxkSrNk^J)FIu_G2gXGBXSuloo`5~7)ciYrsr5=f zep{iZ!=qPIS?MM+$E;psa}1t#Ga^o>!I)^Yts9>CeMOD(iSET)=a{+U?93jy>eC-$ zp}7%90rTHS-CX~>4xE*nF9w}t*x5PWA7{K`Q)DT|Hq`uHt~I?s|5Vr0+cYX| zk<0Q*u=c{1!wCYQrQKUbssd?7s4JF6Ten(4Lx z5mPyOxZwMDL&&Zh5I;Z~6yD+x_*!O9cCJtlO-Reqo$41$MnC@hF8@2PgZY&i*j{zB z@8LF?|M8iF$-l-XLhL5DLW1^w%!DLU)~Wx_b$tCImOi#OZe$~U=DL?=#ET;;NAE-8 z0pG@bad-y#d0Bx1Vh{)eh!*esC zI-Y*DwY4Fg`v3deBRW9@JH&OGcVJ+^VO)0V(*fR>W|dNO%0)#*o+GL}Kq1R%inxcU zou9U!A@}pP9{*}vTq`Kp>ao1>>Se9|1DD4-W)}0_VKXy#Tvs&vJ8GBJ{=87bGlT0K zk|B*a3kd&SpYv8+IvDnzKT1x;*to}!iJ_d;BE98np>BD;qIJyG75XD4J`vw7=OSAN zkE#Dzswf#U3i!n%fp}tMRo?9y_v-%T@yBx73|Yc)O$%=nzQZnv_%ASTd3E&#FEtGQ z5UAV7I(Z*FN__HboWa6PaQ2?9CZosVn)TnU!jIl^bxAXI`~8KfEb46}-d^av`}}B{ zq5a#g-cXO;8$E|gexLrd?TX{CQ2t(Hx8LE$>&;z^R6l>swCLq@+>cKT6Vf`m}ir;jgov_evg)INF3usfmMxpU^bMO5HE+ap-rSX=As>M9}F5SIKE z@QtnD$WBV#2d1=2pbfFn$}RQW!oPWiTu{l;S{0UuLSbV;Y3(+Ma5Iabxq5v2^_P3o z4hZ1=J3U@Yy#${*Jw4rxJYm~mS*c_HOussbKHHqRp%$5Ncde@V z@5>hZcP9QZM)gm1JVU=eqTKfRX8peVyW%4a+QR@E)Z4!Nv54 z+^;oK>>w5${kYlGK@{7fpL}tBK?a>7eT&rF!h}V8 zHk*fQl8OR2qdfOqKP4~Sx))o9SPJwM+;{^;G92br@< zY&<*cUd5#Bxa2immM_xLa8!!^0mVo1LeBJ8vgP(B+(NvsO&W||`@In*ImFOiF!kuS z7V?crqInt7)qF=+H-jp>i_a#Ibp2I_gb(|>O6 z7@>{5bDrn@^l7oWjQ9*zxeJfWxU(Sn5_y14GDdlOM zN9~-E%B@sdm!?ZKrq}$|-ev{PaJRAPnSVk4?`Lnn4(^^R@~s-($_}dcTDIybO}}H* zkf~OreB^9-ii`SB)|3b1zstY(P^$8sbUqR$RIy;6#pIdE@bIqv%ZlQh#v^}R6_3AD zK9X*zudA)+kSrp1hJ0-&wQKc*0Ir9xe{bj(b`fM~Oz^{UiY8@uBEf?O8yu;47~}E4 z7@q&sXuZ_9+CFHl??a#5C79Z3eMt5pA=ZEeha1|=b{mNf=Lai4B^G+%BZHR#KF``@ zlp-vr3|D^ql#Q*FN-B^ta2ZE@EEegW^O-#AIUOyz!`hpRo*Uaog;6=6z*tOP`E-Vo zgfxk%nduMoXpuXQwPab_N^lUtu2@F1CGBneW!dX+Y|p%=;wmGgfX|Ie=&Jg7z7-_6 zio1F4AMc4>sKqXm5X&Qjh_NT$_=dR5$e;^A4Z>3->DYC1h*u6)P7lWF5Na5x1+x2T zZgtAuK6CmoG8Z7o{{!C=uH%lTm$ExcKb^TTho~JLg%yF+&H0@6@de=HeN)3!ipyIG zApv$JV{F3AO7t^L=0&;jAB^X&AM{bZo@AFIN*SG$|L>f=`4~x(V<%u`h-<=hyvFp^ zG&Py1$+L^K9$j5nOFz~sNWb6cdC=I-tp&FpChMeVr|9T6cpd)nmSNpG-9qtUYr3=; zC(E%oduH|fpzf!5EnXy7)~)KlQ-&U!Ra{*BL`>GbPRRHJKJ@c~A^<18Vs1z;&p-PM zIp=jp``zI4#6fc5?(R;Q)B{t=%@z7qa2cq20#h42c5$<@5c7X`(_Z*e{;_|_Kor`3 z{)7{O8I%QB4?#ZwqyULwaB7DD^$+xiNRI#yAwVb$SO(1RN2aD4ERX1&J*#4F{-@l3 zFZDKDFCdVPt}e}U=a>OeA$tq36K*kl&#>M?Oc7w9tpF^_#v%3I z;Mw`~u5oB6P!7zBFR^oRK`%iC+j6+{1NSD#I(>aQ2&cdmL(rVoXQV8<@$k~9C|hHIXEux*dwz3eerXz87*givbS3=J4i_@ zZctuo5V9!gRqtI~Gt~Ftw%bVf4aSn=KvJ-yut=TzqQO}c5=EFs)NgKU`#PD`snxwN z&**$jh?~h0-8VXY)P|~z)%iQkUEiY6P};@C&4gdJ)YM@S_2bI3Zq}Y3O8;^jdnlab z6``sT588}WH6)FXN0*QnNF80AzTh~u%n&9?Su`ip-nvQMQcUyqj^~5>!6e4GA3GER ze`QKBl;3zB?0s*BwNE9qC86SC=4IDo|E$-4weC96s?Nq)Z9`*UEYBU4WxT9CFK3?M+@Ya{w#m&<82Vk%rC5;og*oAbkO;Itd7-W*tb)q z@ANvwv$jgNh!F?59nz)EqwhGU2U?BmzhCeUQLJLCk-k?sM*huVLvkxwM7c9X)V>{D zrlKa{!>)pfr-nl}a-uS7uZnF>OU>AS59LaY_}&#dT9+fXFa{H&AXbrQoDUB&u$ zuY_wUE{2}Yb|DG2Eqi6HFI9=XxGL(;^WA@DAj(`}o-It|P{xV|(PFl(v9IehJG;x@ z3=Iu`rJ!fobE;{?Xl1KFAx%S=)9V3#0r{oN+VT@Zm*f#dUq+fcA;aXIe6MKtUz^}H zEw6PSix>3fqJ~YsH>di;Uz(M=-wp7OO5aW{%01)ZILO>lGEAytjq`(7SS{-&XNM`h zUss^~GvB*aD|B~r4V#N|PIxa^Q=fcs+56SQl(ni5yK4tx>>lU-j1^el6coy4Q;Uk- zl8(muYVzFY&n@8{f{1bhX-*Cf1idhU zHi4z(|E!RCurL8N9!8E3;Gkj<|1U>m5S9pdb^J6kiMJQ_-Ixb~R^gn0R|{rYV);I| zLSVWtUN|Ny?ElZe#RBb&n!5T{U44E3uJL^!28xL(fn{02j;?Y&9JJ5n=I{%g$49ZUIFKbRcAzV)rN{ER0{MZg5ZZN@WBNR9s9( z1|JYN+wHgDnT8OCi!Uv;3@_t~!DuYD$L<%+$+kqYb#|7Y`%X{|h znu7z8e2x{6g&4VL)WjWG5cDx(z*CUeB1=nOq-6m@CXmL1jkO?#<8F9lZ0R&Vn^I0Fn>F~eG38% zVf6|rRj@Lr_2bQbsrTqA9y_ou&MCiyB)2t`By8E554vDk8K*J>0m~zTehXox7^(50 zt&IVz7JLNk;0$_fFpg2Xw`b?%5USe+zjS1#5Qf00VPd-HFc%;k1Kka(80;K~R4-kO zI6$~@*P-6Yotwp?39n2j>`8x@Q1Ie0gb{xdR;L(xz%ZbPhWK1yy)jb-I*bb@Zh=UZ z2Bk~`Br&!OBRCJ??-0iWkR^gC@aR$6J{>$g9FfE)g@_Mv^n?U-Y@!+hkK63dmD_R9wI=Ywc3$}3iAh>eK0fA5$loGCO@|_X(w(C*G0MMZ-Rf`4xGOBUL~L|+F&0VnLY4+;w9>rZHKS0;6h_Pvcw zDI~=!-Plep_g(+U$Q2LS&u<0lwXIea<}W^8+NAKS@Gz-op*<~Wl1v|s>)WoEIa2SKt$X!d|J4Yt#&vR&EyG5@ zF`wf}nY`hfLNZb(O&hy$$t0DcPFEKxDgC*pr&JQVp$kfE8J6t~Zd94nC*4b5*_F>jqAIs~Hl{4bk)$?}-79uP>04`6}Z+AeR06K3*A7icld%Wfi5YBqL>HCy`M$ zWn|B64Le22$R;vFvI?0|LK3n<2wB*8rj;? zDCNl4!zaX;<1$&;(PCamc$FH5~t{;L&NJva{kMC5a zN1HH;PmHnqjr)on!H3n+(V5|yaKZ)h;rWcFClF*|BtV^OI{b6M#%6X;>nH0PeN5HP?ZM2T>w#_m(;`gw&b2Q*4hwlV-qJQ3S^Z zcrReMf~Q>+mKI?#F&B83Ipt{4eL?{87-KvNU%Ty|kR~`Ms9!z=7YOuNuy`O018$aF z!W{=H98!?r^CaxGDTCi00NuvB{w$e4P)YBY#M5Fs(w=jwaGr zYXsbH80UcoADDz!z|2U1i7>i*9vR7i6?bE-bDtbke~r7b(}N8b5r}2+Bg+7vuhJtRSAyLIc9f08ioCO=EOp2vbZEN}>% z5&t0%GUGrTVb6fTIZy-f4{BnDr6{aE;1)$V{(w!0`#qzyjYY)aj?4=WG{CqA z@87?VG6){}tESeLp0+yz81Tu?z77z(NvBPEwBQEVU8O#cNT(IWXA-FwVN=1vq5`@^ z5?8)O$7#p`Q_F9lKZ2RYr^a2{sc4$j(Ahxqh*F7d7FAiVGFmj84&&L+8jO=*dIn`w zC^`nTMD04h04LnV`-AE9!r0I(;S&;jPmoQ(Zain*mx4Cp&!0O;g6S&vxBy!pU=FZx z5MNm2eoMLA*BdIR>`jhvz|8mx#wXz}C9O*T#k3$=P?3g|c>Ek41)<(WM~cgh%K^xM zUsUwV%*+{dNN5K!!@xL6Cc*^v8n_z(BA})7`#fyu;u1+vISaMBD!e2lHfKZItLtIQ zp>B@@?m8a$62$GmLExkcn$%F;+%yw+@^ClU_4Brc#1BT^-hyB8NnK7G0m z5t<^mnQ5fI8J2WOjl{?@a`k-*8)dmnL3;7!J)NW8%$0xaSnJt*`}gjU3f&vNQQds; z($TLkFGV}|sC=6U9TJ z*pmDfMNz{(=rKfdu3|%>how_t9_3Q+>n`IDPt)ltI7eoz<(8W(NN>^KS@^>n$3B@l z%CLOvRP{TTYZZ3XcS5*04h5bySN^=6{p{h;Q`;>j8EN-!Fej!RPEFf)^ui%8okP`b z5|2`opMO`$eRTGYL|1c*>=t=<#RhNBh3RURn2S^W9`t4jhn8}v+hzm&W^?;|zuzSD z^)4SJ7~syr3f9SM-2L@x@3+s*seEMaD+p`|0uHF#_NjJ!6je3rk(+K1)A@J|~*)1H?8oV6?oIuyTg$bG_@wf7E1 z;a*i$ngb$U`^hRAsA#X~o+D|#Vc<66M&-W9@??zCidSFtM#=O1>B7zTvL+2T>EoZhor$b!6F==+t?bk;mlCHjNa7j& zf_~^kukYeI_eUqQx4)eV!(En7NQL+;FW$3x+_Khkj>byhiR*7I(s)1jppeEr7p^FN zmG16PmhIyBCqw>eedQcYmYh`k&TVA1T?$(yUJ93n_wi+@Bwf+wdn_v3-Wz{>XyNu% zserQu4^t9770)qMPFHJqP<7FV{IVUCZ;;%z?4Nml@2flim`;=4iX3Id`GrTcs`6FW z^f{A0m!Ul{%u^P?GcZmM*(BL4188~d7G5)rKO^kETe5?@L3q14Ec$~Ij<{_dH zVY`L%29by(XnnZ?s}O~$2{W(%^zQ_i>VifAGoX6pn(n82a=9ITW9Df8GoCA>yyD!) zBMDH@kCh@LsT^!v&xK4qj5=ARkH#17sZ&P>5HfZRpG4Fd^?FJlE(r9WJh=##GmZ*0 zBHJv5Vj3r){{e%pUFgxOJq7^GZRv}$VQd(cL1P7gfZBU_V3?e3sO4%vCy=MiGcR-oU91Q=K($0+8X49CAyxJ zqZNrg{YBUW6Ci+9Fs}AV+eWinq;EptLM)}I$nXC=9jlzSLoHEAg?#-s(@={`EQGA6 z!}-Pyw5U!PjRLhhV3UJc8l73D%mtW&`!ZRd=HPgQ0TYfrGEiv)DBWg-x`MJ#c<2>= z7jqn^$LEV}i`7N>gAbBf{_mxVEinv*XbG`TCj6ZM>;hH@5B2zKw^a?uA0c9VG>axlcWe|2a5s$3*UNs zl`JiJ+S}U+TU&rFg-wYfC}rcOIb6H2B@kWsu0{Ynd77y5n919jgpoQ1;2Yn{fd^Y( z-g%-T7Q?g>33KUzln*ZsU5zZlKxb%Z=pPV3nAl+Q&YUDgbM}F->-}WyZub+$!C|)uLaULTeu&efd&UzLb zVP>FeNbgFpG6!e?`rY%RNnDRsJ_jYG`??+V`ul{@8OdS)asEFNySvWLP62%@^s-mN zke!6dhzBW(@tfuJk;>`q{N}t=?u-S zEB^euEitB3GoWEA)K0tmt0*iAyS=*ldi9B_^XH1ZS)4DCAC{i*w|{(A*XcrCPDB^= zjU9AyR8sVkHQ1uPyLm<`v7+mN+mO|a(*VEhzTt&qF0n|Se>p^vV@qRoYFokIr6Jo7 z)szC8e^L_eEKqGOR2cB~`~F%uMz)^dZAp2|WMq`3y3~|^gJtcQ2a6|z#pT1Z&0D0C zsrCuc&s4Zr&ob^VP^M!~*)8jz+5LHDyh$LtO_CN&aE_WU-W8`Si^-Om|nto$qfvHL2Nt!P9jIMTh*K_zfWiuk}fN zJv+MtPBza>t|oZ7GQJz)H56HJTkes#sK2RSdnBH^mWs_k)Pl9eeSJg>}PSS!vpXWUWbZCFilw^*`IXctVQmWH&XytYY6R;G6}|6~dO=sjaK zFPkZSq4{Uo^G%*RlTF`PLf8yi%xzsoKXwmFXMK1$KYA;i-P>qSr*7+THxK>TVV9;%OjC5qk1x}i~(MAf->hOhnjLXN#O=>w$WR2 z*zJhz-h=wF%CZ&~+!z5hvwvtc*J4(I4;F?!;K>aFyYsHT6w!)6NKD4_uE&>PE9iOdR2If--1G zi#bPfA%zzg*KN6QisF8n+;}%@vhDu5yOeuXsv+1RANnGIGq>F@uJRtHC zLz0jX;&c&ft+qy&zZb9?X66U&od3l_6c-CG6g`m);`wYIe_2CWCV3x(yW>Gv@&WeO zbr~QlR0?0{dg9rRm_a1&HJtfn?&87_)AXp;kkX5!DSJR^7Sj^+D$Fdd`~o zhRNs?W%gI};w`&O_@ZzeN@@+-p#^UR-IzIkT%P+gVVppK^}5p^ucA_^k?~*`ryfj@ z<&k2DdH@`45N>wWP{@GYje*#-z*YB+IHXaSiinDzl$?x)-xRi`8B@%5dD9@t!A<2> z%lZowLZPLG)@OucYH1C;_wqJGk;`Gmry%60HuKG#cZ+VULuoJ2bV z=Odbb7Yz;$LTt*3#Ux17aNYq--SPbl>J=(_nZ+**}n#s_mH70F~@Q$v|P6jYr(Za0f@)DFfce88yjmdOL9B<1xhkhO*4($xr#b&Sg)Yhu^;=! zu70GMVw>{bGhCnf&`!AjKF$)AcMb8Q$efB~ocT>ZBoez9+;}uA-y`i3mtZmcUU9F| zddrBgkkBjg_MRf^{@@+hYGCBMjEjO?rQBVs4@nKUKAB@l0b)HYoo?K?q4}lkVPB8p zo@f9SyDO2SiM#)1g=Z|}PY-;Ob#rfo>~#56xm{41n9vbMneqA`@Z|sM56kHn3cWor z!7LSKmm54+v9br-UczY@FpTF?S-;W+|F32n1>Sq)X-KhxAgm(G%RT#wNw&LPxKX|; ztT3MGpDX^cc7uAK;~39sjFR7l9*Oh&WYfal%UBAF$ zT)U%6aHb9yfnRK z{pM(+)O~t(O(B|#e^_>ZRjSw*!n`iF(Z6+|=_(894pIm0xA!+b@&#VfZy*;{2--J! z|4*(u@27kW0yei<#5>@666EOO6+dTib3t;JeVx6dEne+&r%sz3u!fv6wqI z=6U@11dC^xHBQ?75PK3@LSTl;tl<;c|d2e5^RtT$EUM@CQqRT%L6M8Ao5N8*BOx1d| z$Rw{mSBEt;!8#{MztYY}?_n|%W`6wU_x{94ry|1=p{^an?Kkv>k)(4J%P@d-&J}CD zX4?iWe1E(rI z1oQgnLJdk^-5xv!_^Pe5Q}`6Q=BIC;hV5P(@oQPf?rK!pJH?XWcJfM5i=b7WCfw08 z#KpQ@zUrxs6;-X6$A*I@r%v_)1`d%}Wygi3dmjiTG$s~5_OZy_ zGZ+W4y9EI`0?-jxQVv#O?DIrd+xbxXPEKQfaL0tYPu10| z2EyAFb#{l3_xRcKG0fWOf7R%vn>HZ(N`bG*NIn!f6AKxl2c=b??>xGGLSO_O*^F9a zE^@;wj~}ek{UiZg541LFzZCU=1frH-WoMuIa<3cvOziY--ei{87*kO{LgKGRrv1s! z#g2pSgRaC-JSzpZzu$U#vZCMoz{W598kW)6jA5!La>wwwS6A<0(i58I;0ip3>DGLv z`KnzACaC=%^L$~{D zZt6&yd!1`yS*J*}H5d?#_v^`&_GBSB)QCvu7+GwFuV9cCaq- z%bN2$YI>s7;vhq?f@zA4*pZ_bC+?QD+FKa2Fjbwc4V-U&Y|Ln_ynQ3IqNWu=qOV=C(ypc1G)N2~Vw(9`{-~rFpF}yVQk*i;{7E z>laxa%d*A#ty5f{ya@^ZhBIZp{-$h^ubl-fD6920&(%3^k}Zo~5m#wZ=pANDc>bn; z!z|KHqpkQBYt@wo?Y~}YxxzyI_dDC}57@E0cyvl^?0;G0K~vvXp}*Yf^>Dw%eQ(Fg zpbCfMv3kp#kEV28s4g13*{v{X_P!yC%5%YwN_3u@LY$?pf0N=G?LqhZf(zDtw+lo^ zC!cx5+`V^h^|;h3-Iz*>gcrT8lySr0Pl0L1+b)rLuBW?imw()I@jCN4i8niWb;%or zl7j-JyIqdD$4CF9`mn$H;V$xsY{PV$!$;&2EP9>z4i8<~_-HR9bNO%w--|PE)(qZ@ zUs(LRpDMSUM9%2wV#vWe8^82gwxW0kl(ic^9gZIwIk>f(jZ(`xX^UiOuu;=zw#UBZ z`u&8q`~4xm<_z_8mA7&#q}yy6drMwC+0Q5$*PkJq+mU%dApH58hQKAP1qd&ynXOqtgaXo6g0|Q@g%Ga>-Wbj5?|3_F&;XU3=d?iBK8YR{rLly z$SE$NF5~cUe_~@F1cki6)sEP~5SkbqkC&f8cwF)jB)}~HaK9Sxdcj$bzVmMGgb}jaxd^JVh4gqPu7zs&FdCm!qC3?VCLbIwJ``} z(FE356~XkN5=S}CgOg{-KHek?m+WhpD1h4#89d_?&nLB;2LuJ}=H{l@aryFP2WRI@ zO8(n1%||U+*$%SFMelQa!X~$;e}9!Qn)vpbIA2zX)#Z_*1Xl`B`-3srWMpKF6kd!` ziU0{9{cg-_rNrQ0=$ZK&!=8{$qZe&J-ULK7pfqNdFmOyuCbCI~yPjon{h*7DKRzm& z(%0u{e03DPvC0BudEWJ3$}U>vkq@w)uoUuZpp~Tg)ZCng*gNcl06>9z8lCS!2JZoA zUE!ev6AP_p%rSciryo!)W|CPp{1+D&&4%dc=m_^FoVp+aAx$IqA4noVGCzU-0Ui(0 zMS~Hsf7@RSJh&GD589xwCsdhT#b8tbG8I<(>Lz*wzxV{x^z$C8Z=+`%^Bu>*e1yk? z8r@+fU5RVT8b2hgd*6k?+8K^)Smh8#KR4#LfCfJA2&pk5ieMxp~stx6j}q6~UwB+is3Y_#qG|!eB^Nb|+w8 z-6yGWy1ATUVz*8m3S6P#bM^Swz==SY%yHifLPA6m88Mtj0T8Z)X$X;y5iQMayx9Xo z3-E?0DJc!!0s|v}LEwF|&{fC9w!;{R|pn^?;j2g+NZ6uNs^MslPUg5Ye+aJC$ ztli}xau{fAe$`R8{(_Sil2O)C$n8dQ(8XnEr=553{#+6@5;74=>|5k9`V z{0Qe#a1ekpY5Lg1N5?)(bz2s{R9;u>DLi0TKtp#Z$jJR=N~w4!7V0p#&3GBO&+X|+wP*-By+InGLg(5t=l0 z_$)r-Cg;9stC%ZFDQ712!IjzT*`Bp=>R(*iK`NwkuWy`*^W1aGUQqi*c;2u{@N?_x z=TCg!4WIlGULni;*LbGS@2M2!#O|#S-m)io7ZwdH-v^J)?A9-6I{WL_O^wExSJZr^ z8@lTk^UXeHYJ4 z)BR6QL*s36EGAXCqB8TE^v4%r)h?Ez+jIRa;@3qMQ>b?B74s=f6k)ibLeI#h9V&Ud z(r$Bqi;||SJX7$wL#^DqZY+63zaxp4wP0aga+bJs?%P4C?r&}K&ptP_$5OW}CRP{- zxSgL>-~Xq+KJV?V+FuN*o0YfC%BB_O_h;4pY?pDc5DR2Iqq(~MwAY{AZzX1yI>Y(2 zW;#W0__^`P;LAbvFaJAQsccL2hB^OqU0c7sz~mqgwb@^inZ9EI-@7Hj(s9SXuxic|$yRJU|? z`Zt*#$9Z>H2UH69{hN};U83BNe?V*^ux~avnhMLK^XH>FblpP0xOfiW3Ht*ObOl73qlZR%GqQs1n`d;I;QAO3l4PTTjC zT!!}>z8q|Eu-xbbTaj3MWM&58H?Xh479Byu`PTj7#0Cx}?SW!BcrE4S|E=se%YhsI zFk(1@`Udwcf_pUa5h_`HpJ)oeTaq_xpKvN$8DiP`1mp_77q$&v*BG~}YiJPm(Bdn< z>5R2ZK`g}p3d=>*3fv7dUAN_RiC| zQ%exD;TCzB0Hy($ziI6aAQr#?P%exkiyi8ko6zV02gE4s-EN)=x(mt9y-%W|UYGr_ z&~Pqunlyx|#{VhS66jvz`58d=S8R(AYA#5IL7<_G4e?&MpyMo9q{#zmgU#CFT_SMI zkGsu(qoxr285($=f?0+3jPU5wKZCeuEU)0Dh3q!Cb-?Kf%?z7Wkxp{~(nV7b-Drvv zJLC<95%xj=6uyMs>QzO5!OYaxnb zh7cY8?s-r3@(vZ2>YMk$;XL>f0(Olo4SCQ11czXTgnly2Q_HrBemy6#E-!E zDG|A97*(+!KH`>-*&EbOg1kCmoXkpLv|j%RYJ9J)AiX~vZF!t~qPeH9D_aW`eAgrw zdS_s$B5i1Nu_ju|oFhBWcEM0n`2Uec@l+*0Z@AAshkXt1i zzZlc<+FlcP;CmJ=+?W5p-^Rgxg)yB`{CbR<1qJCAt1q*pwDinULg}swMe(y!RVNqU z`ZCv4Ope~v*&=n^8qR%ECHX3B@$Q?7_{}M+8a7VTK%Q{DYrbB_51tBebkPZy+<6w( zD8G8|9tGQ($ua64lg5mUKjVK`pB>YS5_8L<8$k1`Wu~e6P7l0@Dxj9@$hZ8-g4$S zxb(Qbv56(L84N0opclwtu$3vcS^~s9xh2|j4S?-K(ps~u)}2+hAgf0 zoF3aCcbcSq4+c*AQ~7iWzLQ`MZRLKjVKkiNGi!Ig)GasR6UA{c8Ya@#;PFP;LdE8c zyMRRiGED>mCi-6hPa4}f+6AAQ<~+9v&0EJbrZHMLSBLcGaz?aIb+@%8mwh@PR{Y8$ z(8%(AWsOK}=^T68P9j_pEIF6;+4`aK(DvtH9*?uFv!(>K2ww@O>Aogpy~SQ@j#Ok( z_Eq0Zx>5TN**`ZO`B8y#}^0kE`q48M>gJuX*<`XU@)m zyU!WYtn&+{*0P?)gzJx0UUtbDlFM7Mhd0LqNwMuDzK*;l~sqp723mezRV@_t;m5$y5 zaEK!eMy~T?ZD6SdfBEtyWm2fiLrsj6@#u-qe1OY{te|@uF((Q?Gz5>wUNPk==PmF! z@lfGfm|#Y4b{j(mzqoxkPoRV7D({neoi6jreIw=?tuOAT+&cIm;GYX!T~nX zCmPbGetsID{nRynwU2d+ig+w84o*}_sodr~@9Qmg+-MgWX;l(syP~nW71LxFE zy7crgGQl!|g+8hL;1AZ}y8Oxa0=)w|)PqO_%XnPRw>}vEO7hRNM;UDoG6Rf+VhFn7 znGwD+gX%}mB9sDfEH=NMPwt!+h-J0)ip$9AvNQ$n;6$%e+O@RnY)aT}Vjv|R2-zd9 z#^3B3#M4Tbj7_k40-_ryP*QCya!th0lb*E<^MiwDz}!&N(2#*J z2cWV@UPMmpx9kx9!|N_~y^Fw{$%UtI<#8<_p==1D<4b>2$3Hg0n(tj~uPOZTdtI)ZdoaHF#r!Qp{J4`Rzf~VdDZ8Pi z6?J6Go@4Ix>)mgB{M;(*qk}RtRxidoE=}Dcf)_XDE|Z=2Jrk$8H=I#DKjjp><^B}g z-_)}9L>T22_5ig0)Ot^=M4@;#;j#w*Q+q|h`&*%ep*pae*el~d0B66&J z%z()D(kw7l(&mn^&df3RE4_#9aggBU!>)yUQhvzdQ$=AXd|87p}H>GpT&39Xie!V2}<$DcNo#CYWVUz#=ntz*| z{Au0e!n(68CyPfkyypArtE0D^lrMLj(GT8DLLNLT{CxH6Z|##kp-V+~sE(5~kQ;#w zg}}|NAH_-9cZEdHpKlXs68hg~Vpx86^6Jt=^MHe=#U}}^h$v*uf@<_ff_p*&ADQ9I zj19c&?GR-Ku-!>zsbrc|-}1*nlKz`O@bIJ%>Z_>=x8e-eN2`(n?x}nwFk8EAlG>Zl z7j!5miHl$1kHP<4J-pN&-wZC{UaR*dC2gJOC@ET1AI$txd`tD<6U`-Ke>a7$2xeRz zlg|-(7*$Rj_O^&pt+)%@0pHUv{+3xMSzu*dls`&QAdg-iug$MoClxVP!f2jqhmhc+^d z4Ys4gj?Vg$Qp_Tc&wLA}v6Oz2tZ(NlJYswL!dyw&x~!%#nOVvZcVT0}PfMei_pPld zLHQY6#w+d=zGo)G^`up2hKG-S=CczJkuD*9FmtA=$*IO?I|IYEA`&Tn)?>QXhu6Nw z>^@1+p|g*iob~e@>tZ=^UH`lOYCq?S#g2&TPQRrfJIYs8StXI2JASsOsA8MJc&RVV zRGQnc-kF>06ge@nmBt~xl}Go+k}7PcXuDAgoiGuoM(p)1g*bb+EZ72_CXoq>NYeaQ zHpS}+tQ40TSHE88EOwkY07F!S7Ebi{me~6d>;g^A<>!C&m&(L&1frL}sNQ~ptVczI z^U8Go!4R1e%y?Kr4WrwIC_wp${haup1YcI9ugXCq1)4XV<0187SVIx<5^zU@po>M* zF2?v~)yA)b9Bq2j><(%fH5UL(^2ig2{^;FGmfR=zmkjk=4lMtG&IxEW@W_-q3Yq5n@- z6=oT%K zBA;rfKh)cNJk~p?l4oplswnWzqZfJa%k(Bm8^3(58(Mg!xOKOn>zi?d!d`XNH(isF zY-WwuD1DrK)h$ZaJ~x-lmRX5xReM&&?RcQiqFVC&UB}L`m2Q6jQ#Y>W6t!$-YFKTk zQSXb{W%sG&;{W@m^-dsH{CSj|hLcd0gCn^l8}lC8tFKs$R4S#;FtMhS?xTGfc|GRE zoP=1@9Vaqhz7Hfl$l-?kPP5GE)PW#&lQ)aNeF+yqY}4>%fETKw(%fOLx___V%Eq*p zinaB$N2V+)(VaV7%8Qs5p*QbEI(8;LptN-c`yxj?i1s zQ?=k(jLm7xyMxc!f?sjx{m%8d+z0>g&qBCK6go-}gw72)(MmtXIM&kM zz7X=Rn3<7r;KNcM%u{~rZ0WjbuCUWDu##(AYcUloF_b1I zT0|HzLANCG1*MJ|-Bi3u`vkjMKtJ=5N7N3#Y2c~nD2qEiB=^_e$cw+1@>xdKqKBcF zA-~?j{5%a6dHB0phx}r;h!}aXYYj0|ef%E|1W3UtK$g+jL+Sl#Ia+8bj?z#7BYFMS zG|l&0Q2#Ld(BSD^F-tA{7Kh>`Hm9`;m!>}zJ2GG2ubTWx@kd^`Hv7NSi7b7lg19yz znrVaNCVgZp`^)tPsSr{mZx4L@7%=J1B2=g5dyFopOMXqkOM$Iuhgo_| zWzU`mTkDRyHoNW52wyx?9nwA}v;Cgu%K2*7{q&owCOjm)>5Dfn?>_s#Q`*I~rG=*+7!Ymr|02ooSXkYg)m_={6$8C6`s$h_B&B)<9J4Xb<+mEq`&47um4 z4)6G#O}^?E8Ywgdw#G| zYrXX<`M!BPI$y#sdSy(-i>X5yR&B(2l(Ac-$XZ>!JpdXD6o;R4vh>nOPrsj$L4V-D z_`NqtT)+(wfO7jwKzfEqqO#fm$CQa!WQK0^;~4+LG5I`g5XkU+J~8T%Roio2_~mt@ zd#~I-Ik-eNG^P%Dng0CR*0gzOO|j`;F7UP~k4&yzSeW2>>bp0Qof6>%PC`*PZoJ)u zHZ@yg!!>MI&j+^`#6bjcg;j59EjB;cA`|u>Mcra25-~-oR!YJ^msQ zZHgxXF)s0eVBY^`O$ieQM=Tawx^aOE};O_be!c z(xl$>lsX1o_S-wKv<50PF+coYj`;NZxxK(32?-hcS!8y~fRh27F$I;7Se0~i)Dz*m z9;*VtT|kZ|k7<&Di8}(iu)KoZ`Jagie7gGtU>G3P3FQecJpxp*uE2{RL9+#}J&?dP zg8i$Aa36@S;VJ<&tWJ^DFy7o>L;+u9y~swJ2w2dH-wq*P(7^h!$pKj+{>SNWrzF^3 z+1c5D`zu(qBGBA|eKvlY3N(BoriK8ZAhLtV8m8hg+_~>}1eaJ<;4DLmdUB|^ zJXFd(0q}Dr5F~a6Do_PPA5tFGr`$U*{yunOWM^dl(l=4--3r!64wc3056a&aYZa8J z4V7;n-k@jM^4eE@U%+aO-Qf0K1t)Q8^9KsN9{%5)V_nxakLTCc_L@kHX!n}_%?SLk zA-d5u%(FGW_3=lCh>5cyR%4A{WuBU>CnxJQ@73P3Pivm^>ENz^TQdrLUUMA|TQN7r zbe1k3mgTm@tIB@CF#W|Li>*DU)H56ITC-`s^VLs?XZPFO zuG1lXHEEgqoQ-3X%Ac<%tK1g&BRpp$k~`-ry`o-8NGP=ovYO|$&41r|$Q6A;bd{Pu z&g)?Nv!5HVjUqI4_*QJodc(D8Lmoed_)iH)+dkP+Lcfe}3AeKJ-MiUw7gZumkfuwl zf3Zm=^!mv4fW1Nq1j-d#8`HC5iH-k{3-EtVvPAmO-@nEf!3aD0t6Vi$Kbcut))@1_ zc)T7Nx`WR|C25cm$b7*m_@J(fB&YZ0jGsgctlkm80%Q-nSrCHGv&lhb^)*iHGd656 zkB8kPS`x<_{qSnH_FB^ccnYWRVc6}ol2#extU#6(GUM}<_9;0l!r263pc(GJWEREut{&)KF_VGq6n4AAkK3B;W|ns2=E z0KxplA&4Jpc;d&O8^&oy#F11DoPl<_bRo!Tn%LU`T-}D1z#$>amVk`Tvv9@RjwPl) zSKz1oV6H&GjdQq9_wDtA1sSg7+^6HAiXxl>6Xp0Y*w9f_!d(7g^#GCONCXrjYJ?vy z0#A?23gc*n3I>>jQBk+5`g4G*knK?gYw-{+{lF^!EcN3Fh0Oukuh(gD^5e8GDYPO8 zx!4O{J!EPT@du&j)YVb%hr?CGKjL?gMGv~;1*g9W#l@POtJl@Bv42PeAFvID96Hxo z=FE#V2zLI2IW3WBfIbtw8f0qXYk&EF{`?7GC^Ddog9&8g5d!4SxnzUb%afuud{|7NizW`sW;qoE*V zFGSuiE-WZUm~JtVAf3z*cTsvqBg_dDAOXa0_}U&BCkStPTN7R(Y;rJ1z->(Kaf*=b zqbvH}@gCD*Jfyt<=dlnG6C#dp!Fm(kOY%sH3NVIP$4L5ATynfY5Ln+_5yPO zT$P(EE4RUJ2-gnR6?YrNs({HqruZH7Wn~RK);D{G8HY3-Mf+&HR~(^76kY5zvh4|B z+XiLj`ueCuhn@_+I_4lFq0M8@*iH<~Bp~(_%nE{w4PhmulZFm2uYv#v<0?|vRDkYx z3zrJ!;REPSks(5l{tpI-RVYhDp0W-lILB7O%K3UVz!)K5^&FJnb6 zze8S?9-bOq7%T845dv_OsCpK!;QAp#_K1cu3~b*}FnG_1iV`tTcup@yn1GT65aF!X z){<8SY0~1q~VIE?h5zSCFI(Ibin4bGA8G+1!Vqt7* zO03(U42PHuHS&K(f*0N;=4&EB;<$J`wKwrK;4Qxa)dn{&;Ud|;^3@r*$d7}ULnxhu znc-}D7;6nSS_7buFxx1w8Mp*;pM%3Q*ni-=F2U_a>|BbA8E^>dt=Hr@xOC&`P0BclyF^)K$F3b2Tt0;dCVFL7NAGU0<5`i3J%8OX^xE?3Zc@7g zcBY^8hNen=(`E(P&hKcQak>$O`27nqGlf3r57;doY36qUMF64gTuIhZY`9m6Ro?jRUz4%hTM^t6J<=ERL+V%PSdI4DZ&@74Fk;-PyXo!fwQT?L zoP^Xu)}^zz6*CxasH^8WPH13+T@6?OCC(n75O>Pj{c+f(wYHQ02FiF!(XK8Rl(hMCOeo?X7o=Y4xcvMjkx_>=~}YsR=2{uo|%Z`8ELK521aVNXYxQch4SMu#@6k zM;JHCQ1Lt$3*u+H`!^%-RAO!>-ry@@mR{jAF(LEnXI#b9<(-?vdGLmgNkprkEh z1Dc>?vIDzW!Wa;-cmzl3M#buW07&Teuidy&kG76DeX*2nZ?6RrVBS_+Qxjs6obFe_a02yCfbuui{=RrP-r`S6qqjatK2Q^v-LX$~!lb&;jpdEglnF+-X zA3T(I^S<|P9yLNwLp*b6723XkuK@shO*W5mjeu3$iho2?(x)y!63rxFl1i(l_efnlopfbN(h}1DU zA+pvx&(M=jr0Jf1u^R`XcJ}bsJ@8j>lDxUodJLf0q>~yf zr39F25gxAb2uueX;jATRuqxxD#vgETa_)?8J}1q6@vc)OO;s{$S3Si=NhylGgCA^n z*{O*PNEmi;DO-FC1?;h>7_s@v({k*ee=#+GId&kh z$z1xe4CQA#cP;f=^E}pFm#(?Oa?Lc4=CRZhwNJ;l`CPq|B%0)3YZ-U*h&nrcfZ~&S z9=XWd$EfuMW6o0U*vyqYqOMNK5ngXx#UqDc_3!^a@eQzftR?*3C%rGTOOcCNCQ32x zL7oV^E6)LAX}Oc3LK>XmoU|ddN_JNa4>{*Wy%Ws{^ym?g=;{f7#oDYm8rN&CbfVeV ze%e4+0ln7Kop}-I%H9FQY{LuC5@} zFN*=cQ{|2&r|ln|G)kXJ6(*l*F>`*rp-k3pe7WKE<)^e^2h(@S|KOmHIY_#XJ(;Gq z$n)5qao>EW{j;3&icWbyJIQ$k3DZn5Y?)^A*7MuwT6QEe~-Tumq z(`{Qi$hjEq4bfR`EA7L?;~4e|j3UgC;7#~T9RsIJ%30w8j#u=LDVsgOWuQel`?2?$ zS^~VeK$S&EPJP=UxN?Gf0!K~MbcppzzhW~q|K{TBuwTeYzjo`^o{JFWp)j)`2s)_sH|`!NL8-X%GSs)JR@FR z4M^(R)vMlYa%eioR}+Cp00BWEp@iYcty{5iU#{BE5+Eny)!-@*hY%dwgk|)-W8P@Z z0jzcAn*@~~z&Zlnh0qdmo`KpgDk_RU`e2^@byfPR0h^b~uf`Iz6-xl_!2Ax$CZ)rn zBc$z6i=I8c0)A3Ss8G=!*!H2uC)7t!b!cWYF&Q zLpQL>Z%9p8EJ6iHK!!-t!ErEX=w@zDd`<$hvYjsJoMj1+ns?(4tiqZUXn{O);>pi^ zpeaLOF~(*N0Upc^Q6D~d;7o&s(=QAFBC1Y^DBWy-L(ii36%3}mXVYpuWL>H zIPGXCNL_wEm33fzshlQ0#V+?Pqyv_3KoIW5n@^46MPd01kE2fPj0vtH4MmMs&bXhM zDL=lASLn+0&s>4o1&j`M5Zxdy6}l_=b2V-LU#@bc(7nAT;#)K3z~{BOp0cCt=INx? z^eMHheYc{U-H_5VY)7z{U^1ghFD>C3#Zztm_k-ckKP{XeTCns(tMxZU!yG!xoSf4b zVw-S_40ZN(@(2O>#BU|F{&`!#Pw7kJ9G385{cZT$J%@wodmAAVXJ8qt2C*B1JP zzD$vKDu_wa)`eAAz|-`Ue&C~vdy{u@TyK4lBBjc{JKccPBaiN{oX&We^-x(`38zVei{Q&Im&_p?t!yNl%__SN}0*Xi%nV%d!E@tBfm znVsK~9ILn$5PhS;xOEq{Um69jhDrL87wJiPhFG|yvG*OXGN3H!~a%FXS6 zOhYmlIpGE@dumvn3^tX5oDX5o{^O|0s3@)9vSfDjUog5U{kr zzI!<_yxuZS|7b=-@{S*%vP`gqoBd_84=ay-Dw-txT6DzWAKSCoFwvpuh^WTna^E`F zPIRry9S>y>7!GcHaiF*1_dd?2w=?XU`AA$j4rfxYXde^zFL{w;9a8vv;+DdI6zOL?eVMJnjs0j1 z9vJtPf6v$w*yM=D6Mf*HBcgd8iDNhmYE0PL4F%Zi7~?HfGD<$1ZST8{?fZlXpb`Iq z2#Y&+^ntRMp1m}9er{zN8H$!Ojmd4(vgnu{K;mI?F|j6yUslG|YofGtr39A{ccb1Ik z5!$EM@Vrl~!hr#(&Y_^%OOle3H{Bjp8z41I`J3V^y;S~)$j7<|5Y6d(>g!vqEll zLc%t`>a$04Udp_)V0-rNz@585`?0e^H&tNXesZIT_`&e&v?W!~-^3|mxF&mim3FPh zv;Y$${vL|jtD6cy&H;~MTEw##(q##w9;PN=!H94`g+Rq_a5lhN72=6fQ7i`_Ou(hA zN81kNOUYb0XEMR|Saf3ayB}r&Hhr$6hYz54!)h3X7+lj{3behEHxH9Pa~QUU3Xu%bv>OoNBD^x5^QI7r$kesm&3vL z$JczsUwbE_9c5%?7amGaq&VDH=>A1yQ7qiUd%_HfDLJ{GGtzR1>Fax6VN0U!!$opaE3u`nLj(pKn z@++URk_rz9wzYU^c3GX~dR=(g2}Lm^5AqeyuGJi&y}!$jUY$v08{fkZypFcK@7o0?xL8AFfxV76WK3G6rfuSNQ5RZxDL=nQWU@GC5#AW+l>Gmn$@2wrQ z2-yY7*eFD}Ri~wK4r>#88iKXl)$CbEtod;K;vLY93^-6&os#NN@%%^EyUkKx|Ke75 z5*M+}Al8(a8G-3Ia-R!%sfS?^?*b3TA*rY)Q?$Z&tgW$e(@@!w{B#fp6y60=3qygG z051lW!Yte5^)idJDn7>VP_OmlDx$LwteDgO%V>O1ZE(-c4d@QtNUG_>^g=T?w+rZ1 z+Se+QlP~{&O}z&^m;L@fjuN4g6=fweDl2oREsR;uI;!a)$uFDa@gJ{2|dHFgkWf#ieOask{ z{Rh|}EiA0HYi;lA9%7b6CnQ)`}nR!ZqnYw>RG+XEx++#I`n$Mw@za>frP z)i?GYvwwTMpm+@lBHsK$`( zX7Zd=8w?z_6#I>Awcc4SPqU>1Hj;GwwErh}vSePVsGz4LKd;SjE1!EZ|9Jc6o~;Ue zTiKJB#)7zb0w;CcGii8scV;n$6mVx!+kQ!=rWmYL%QMwuy!c}`)7G_!P4=}a6L*ed z`p2TL+wJUq=-7WI@6~)s?*@glWs7g&+fNuL0k;CM~m zLpFVs&sCPdLevb;dH~^2+{hSp$Pv2rHP9lW_&H+0A#cVJ{H5;`q`>Pdf03R7^(aOP zO$p_HW?xBOpvf#KfR+mE2$5_F`aBH;7!cDszTu?Ew8*3Xd?;i-n%(o`V&|7H>L9rR z+b3D=$X`Euz*X|5u>ljt2bcv@qd%!cv;_iOygc=_4rSufoC}yD%#yM9?$seoo*?XT z%M%M#D^~j;E|ftKEf9XNf5#t2yHz2tRtxhYkU98&B8i{^Dk?u5l@LCmkh_@=_&UYvorXS z2h(DCd=3cfV@A=JE6J;~f%(LMoo&KfZXBE#{6TuEDOh<8D-=AjP#N6N;3YmMv^Sqx zoSHmiWBgLglro~gX-!-r^{Stl-4&ks)N@#!(1~v3UVJwQsv3;I6jkB;`pem` z=UyYilz>V54(c+gDIRl~JeT=|c=e8mX2W#^;Q0KxksiOz^K;0CM@M{qEX&6H&GVA{ z@%0pEm%`v~yEQ#g))9P!p0=999Y`Fl1D{+6OXwvYcT_Ps@&Mvym%?f)$W3ZZdjnB~ zG13!zsxa*REjepq(uiwM0QZ2*ub4w#NbnUJK|#tf8aH4z0~AjT5H=f*grm<$w`(x=%e`SGidlV9xGu>-lg8tUqy zftg5=@}4Vx{Mh-Q>5n0dWsezN*M zyE=Uv^%s}4M_0T3i>`5tpDs@sZ2l~Bf?WK-?zQTR81bj3lf@|X!=gX?&>nS^df2=7 z#=F$+Rrf4DvZD;sc&=~{{mi;17*5>!0w-ckO%V-_41($mAAsX1ny3YUlh8ilrourE z6ztKnXNHUY*iGSw55-QA1to1b-#!go|!6mNXPU4*_AAO~0q)L%AM z)(4>LF`>c5hrJ#Uivt9Ozp}z@5PR#llCLh#f zhN0`*DA2ROMd#h89YHD@=i-by8Ksy1S#u%|hl{EKFP?_P7BvHd7+o1BvH7EOnNOeU z>&b}*Z3MtHNQlPKMuPw1X%RjoG zhMhp%@c6v+gP0#u9(&AaL@z$CAIqyKdp%RIHA6WAwWn{(EF4GnXyD)+%vE55#GeP9 z(7-?x7DdJWb;Dzi&kgce{36hfxL)Ib4`T7Qxip_9;p|6e1w01_-Tbom-D72Y5s(Ij zkzzv7(7D(mU3AnCoZXF476S(E=4fXJSwikW%fH#(7>HI(zN`d+iO1!fy!^Vo?mtOo zfVLT5CPR&aW*wyfc!Gw{Ow^%Nu&UsQ!7Q!pjsNEmB4Vz5!-xa26#p0Zrearcy(5%0 zkhiHKJC@kJP-RhgcH+i!gW(jLroN^nF3ngIj12e*p3e8wf3E~6VQASfeeLe$RmQpZ zokLj(D&M-*v6gF!xb})p&gl1htF9_>5d=%6uYrIF;uQxyh_^aD4kR5HDv&LKck~GK zd<4!eDbx7-J9o|h*$zi5OBkIC9DaOlW0a;UVHEOI`6nl)B(Qt${Jxf_0xLRtpZlyz z<@l5iEG*|Y3pB?S9Bz`LZkkRl3@Ctv{zF$+uDc*WY=k!)1UXp9DInIv6Wv{2(xEx| zt=qpgr3>-lv%q3W{r#MKtR!_N4%}Ehb|-T8#Y|?Si;<3hDGiyA?TmD7w%hD>=anv4 z`jLN^en+IaL{CGnf~rJ8Q@Bm3=&vVl1INhtH~HL@Hk3}C75Xu=Nf{z!duqhe=Ooo2 zZ}4++CR6@5Sz9;ZhudDlL^^g?T`0dWt2p=8+n9i&Hl%<7Gh=|SR^Y`5nvZh{ah`SiV_BrRYkL|ouM;<>poUw(T?XDgt&sT%C_N3L5`{n3PZ581(>{PJ#d#36~D2kMoiBZYT zZCiaTPgZknQeGJ^=?Lt2s#O9#fr=%Cmj?iTxPi09KpYoaoN{>g<9S|xM8&9;eIix9 zf^URIS#*^(*w!<##&B?!+B712&PjyEPe8R zQ&G0uL(R1Kb8^_8J?#`7M0T)%&$;y8g-H6XqI^+Cd8Za;3*Uu_q-OM2xS9pcDO;a5 z3V5+MZ{v^h{@dfWoazU5UwK_|o3|-)kDg^aJB9W@wu$5;hqEdUv6n^IeNM7PdFE9J zzg_=v=|8g0x7UJ;_n!Mb-!AXdc;v8psR=)?Y4X#@yAN5lXkFEb3~NaEKKLMI()LzO zT)!nngroZ0f5USL+b)CyD3h2J;%`l!=`=k()e$$Y81_cTNJ?7T_yuca#wCWW!N6$< z)Cy!3O#cm8KXT3uc)$6(9N=5kuQ}YUW89Hk;C8Q|u+J^ZtE+lIZlLOC_!+h{q~$)t zYIk>cN1&Y*d}G5=%0&|o;DWpBwRqp{e4F8s`*(Hs(ZX(z&XrWJleTl*r+D}f^Dgnv zG651lR2`ak_eS~2#)&<&pIC<;8KY;ti&PnWcrse;>k-K_eAWz zr%ccDTK_$WawHOB2r#tb(zM~B-;9bf0w!d8ePte+uGH;JqT2pupaZkNs+ZTiA{ABj zOlo^0_3}S`wK5B9#~&5b}x{9)b_+~!nIUYk_>wcY=A?Obk9CkJd#iOAlUs2|BquTEsdAZ z@8j6wtSHxSYnMrk%I9Ve6BU<9y6kn3x`tI#X2JUFl+<3v2c&;pV}!`}Jh@Tb;Kl6T z;jL?dW&_+cA`D@O#V*a_JPh#zRvjVSVAFKB^|o=x?-O5+?SLuk$(gv%()U)qaY*Lo zI@YY7ji`b+q7f9lqnW^UGRbJ~VK@)#GSwnpUR_-{;YcpSn8dgJHAz#DUPJ3cA8oK> zbkP4=HTQ4TAEq$oT_IgD2w)^oc6dq%D41=i{%MHBzn%h1zGoly0;n1#R!gLegQV?s zTU4Bt*hYSVTL`*VC_%=c@UXd%(j>~Mp2WM|-R*Fn&&=NGSN}KNpMkIf?k;gf&h>d| zwo;KYC>}6PU9xZa&vjUmd&p-4ou-wA zwt8(%C|hT<`2pFZYo3h(LAz~49+&=CFKt!-RF>UtHNbM*LO=Q@Rl-;y#!p-o+p=su zPH9t$X!q--$*onBsfTBbje?#$scv34wOCpFNO!Z>`q}f~RrT$HG!SV104}hrclD#8 z!P$iwDTM{(Mq{wiH~M>@^DCrv#PEbhEGJoZVKAjN_$^XqTs?wxs7w?7{`nB*RMY1s zjdK^{@a{Y6x#b`7xxd*n6^Bg58i+F)YN}DwQU_GgX7g&AOkG|>09Vg122yQ{I3*t+ zb*6?4Q_5GJHg03Vyk(jKJ&x7+YxG<9i)85vi=4P%l=NkDoj=5=Hn48t4x2=Qsao|OU0;L!7q>x;fgFK*HPpDX|NkHw#Z4(MA$LW<+p;-)80%uIOjie-8(m`yiL2xa=hVTduWU^q=BqXc>E91G4VLi2a z7ebYDi;99A?oa#sVG5+q2FhbEbC>sosq#m@@Q{fVX<5t~i@JMvZrA4TU7!JmJY=d% z(i+yk2UW`!Kc|v7JHw2Yq`SKjP&PlWEErq>ZidiU(2V~rHxWVeh)3pTpPK;t&Iy88 z<`EXAjcU05ZAzU<4N@1ppeBgJPGUtOdE*C#ANfJqcI?Vr@XO8N9Lj7)*EjV zyKa2=q!$ivkHd?&Gy2yAHHAni5_j%InQ@cm*7rSIdz|`gtxo6MMlSyM=eCUs?&G35 zmB%P=hX~SAr&H8iBHz!d$3Vj|JYczpKGf!Gp5vsv`2v}3#sM)`1yPIX`ptpulHI;_hg*tas}FrI-|0-=Q(3&>u`YGxOy3Mfere~3pKwDIcP*O zS2Q>OoPWw}%A}Ozyk~QXNXu!B@GRc*EVVjJa>14v1e;6xwf|F?8rPecATY9u9$7Z^v9)*w|zb zY{vP~i+rFs^zWbb)T6O)&u3X6OrgQz?7(%q>rjyZEmi*_=Cq zNvO{4MMuS`L+UrkzR>d@9&L7eL4?yF%SPyF#Ig+?Y05LPHB1>8tT9SM~p^pBxfzwy9nFD?t1QV^(q zNN^+m+XJ%$2G;kIbfP+jUcYLy01aXV<>`E;SzmUvL2x&Zsy<^@vxfKsL=zkyiyQ)S zcxsVlh(Zb_1MoEZsD@V_gA_SV3}LD$ZZ-fCK?Xn}dYFD3x+f?<@Dbv$FgSNkPJr4z z{X1-k#0vOtQx2GE5#eXWx(#yj`iZ|EySu4XkWxDCoq}9MZ1p&Xz{OB&BEA%>4B)PD zfW#Qh_%U1DF7pPQ*W*Pegq4TbVzX6K$1r+x0KX50dD~I zVjR3@12_;Q6Y8*PbrrA*3~v{8FGIGj%@cz}#{?Dbw{S{e#6}2J2&@l)Q*eeD8-u++ z6l#s;;g#p`Hb^fqs6)>WcMVkON#1g8gtkM0Q-C3ih)iWtvj&`vCO;zTfi)}O(s}SX zzp*hXR)g1JPdtNQPRJoU+s{#Ft$pbN&IfqAPSbfGt>=}g)?0yo-(9Q5xe@Aa(UzQe0fbE4nRKZXGhzems0dA+L*Bdv%Roa7$d+%uUh0ZS5r8 z$tkI)Ckps=)^;(nGH*M*?Nh`-%GJK4Z2lPKJF$n`_2(jZZlAc~82Y`PUhSm9g+#;F zNX?}Q192U;k=r+>vUYR{=(f^$UAAf^tI`%&`OCV(z#(+l`t?8WFLj4mOHi*bQVTiK z4ADE?j$Y-;yPSF1diNL^<-2F{|JUX0sXD&X9wV$G>l;s)+M_65gBtS13Le z-^X-~BX;$)YFC3t^$hp&o7}fsyBZF=BpN;qP8Q$3`Hollw06x#*p4nw0f+1`Su2L+ zIKlC3woexJ3?}9eD9`=(&+BcQA{?3q@qS#l_r|`fJ;0dNCYfAHH$CrW(_)in%{*gz z%x8k z``FK#`VW6 z$E2m*C>8OV_;QFRrZH>QA*FWMll(TmJJV?|z7+wXHmuv=^(2wrBi0SgC}5L^B;oMm zaB9HY2tbk8?F;$6Xm2T&r^vxsiQ5$(=G#RR_)&N~l9H0%iqZj{Gl3>0JoCYX9L8^W zd1`C7Rum!OQ$?tI(cnB>V`G(zkRl*&IJ(J>*zXOs0>z(_Ne#`|3y{xX z&JM}IV}qY9N_RaoGn2ho8p1OqVFGz?EY-%50rbjeC$UoDuz7_lYyg;YSwr8UYv6Y&M^hKu1R>3DkTlpEM;NwIp={dl z4{R;GQ8WRl5TTrC1?ea9A&MXcEnOv{6>_ZlA=;gBO@e~`h5?kLXL+(x~>3$+ZX3vypq_!iPn51C2;>Ja zJh;GnOZwq`hXZ|V!g5nCmKSC^L@zTzxS5pGgz|&TI%01#Q=37ZS%N*dSa{<2(siMY zIZU>XB#8t(%sjV$72+bJv%|?kVE8N%XyNlA${w5Fp4vMkkRg)1YcxhTcfOgyc}g~2 z7d`HEYgUTf|9E+#z-PCGZvw%?-Ie16src>pgAZQ4Vly&&1;Q30^vNEWoq)TRm_))m zRTj8@rNj-iKcHU3d~7@YD2l_RP12*ffjm!CB`XnNw5iKv4`8{{#Ok`4bB z(tJ-O*aHzIEWVHmUh@PS4mwkmwN{jl2=0L3zR^znLJAN}Dyp6AFSlrak=%i}KbR_D zO=9t{U$IzT4}?bYcE=dd^mr^kCN3Zm0|BZDGS98ok7<)e9^T@#fzuO!vMohvt=+p@ zR9pe{#a&vso6ncKSmV6%8f`%DoY5iB%iPl33^|tFU6q+%zlM-QO6=9dREq_T0ME%D zKudzw2_x_G=gevbOOSwdUgCH!3gORpB=(}?Cwy?=EjurG>&7d^Xb?vYWB}0Fa-c%M zl%SG!mRJZ$cnNWeLva9>^J&r=a9U2^@8lR`!FYnKJ%qzJY*)B7D_(V3&}N`E$qsTC z;N;@TbV#s8`>l^{pD^qp*cet7%J-s}2q1Jl74My3pA4*R`v*5b!dQ|8@LWh(_z~DS z>S(-laFF;k;Hx7dm7$(FX!ewfifa4Kx-2g+(`Dpv#!872Dh~x0B@Z0cxJ)% z?!R{mF(UAP+M??~Q$YAs@HwH5w7uR9DM$|t0_G2Ygcm#*-#e`&eIdHUK3Y30GGWl+ zug+nGK=Ou5RQ+WZtzk`Z$t5dd6` zvO6GV-(TquN7sw0s?rYc;j@^z`kG8jYkE67}=GZcbQ_S-RQ)=jtFpS(|fD4ew{e5L}fjql&l?dx7a>S+hE(7;Kq-F z!_3Ecy%=ietA-qZ&Kev)eWT(#5JMMn1vAS+iMc0Yq0&)e4?|h|2W=YH9lM2D7yk{xhf zTau=vmaCzg`6IS*hkGtswSuS3%mH*T`n|1{vL{_3eNeV5Vg_Woqrhi_<~sr={9{K-vimz`7*%`FBq z;sGCO?ObMA#m-0iineDr9C^6v?Iu!ntX_V5{8kpq#;p=em-fWW<^J3_C++Fa-V`q? zxn;)a2y;5K*=0+9(=?_5&l6%VODAdG|9u~SIWdz?@Q+fD*2nv4MvD@3NG~`@I9W6` znX)8vnCtlV8)Q8~TM#{hB=Hb&T942^z(mdDOD$&&&){Bgwba&`6cpjphRY#9UsVkISf zNsk1>$*e_w&#W&F3$1g1y&a!s^KmSdNfb5fRoVYK-d8)ktie(L&PLBOX@(^q?t>)kWvp-eXU7r z^%DU__6{gokrNK@49wa{<-#BWa&K1GGyw_F)FAF(Z&|B=Bp=rnYh>BXyP(a$!%mpO z;q%5pMeK8hLSyjz{NODvgqIvg$;3}X`jSR>HMBn?pl=BOFM_Et2iC6Q6YnW^O(lDe z4X`O&7%)V5Ag31gP?&NU$Y#Ai%%hbe-b+YGh~~GBaXY9(h&O>IU&{3>uvH1S7yj)} z7h$HD30#!NjDwG>-P9dz)bgA?5qAww1gzlfN&!h|{IQA@sjN7+d18ocRWgX`!(UB7 zeoq?8AI3a!k@3vnHR36#Jb0Dplm)@OiyMNfo2a%svvD59Xir}Yvp8&vvfaH;R)HX%s@ z8^dl&^{z`8wM5y_hD>(^z)#X}l~ z3D2I*nLx~{L-%(nuSEkW)lKuQvk`;okFYye6cMSpgPL79F8*V~!dOVWkYC1cnsLUX z^ZX9OIWt#f5B)5xtdJQZ7nC4JD4e)BIdfo>!A*F1y0-}*ofzHq;;U26FlA_ym~t_H z6Sgy71)s_mQ92j{-$GCV#jaWe3pxG*ni+aqw2c{87m`&LQ&UoqdV(HWLQE_e?+m>! zIu=ZqwN7C-8L**=m?0H7!LQy(w79Z8ssX-jF~U1|)8jn6@91EdawUkn9vvw@XA|md zG%>V;E`GDj=+#Y31beM$u?T$Y)$`}h!3ac<_VZgP_%wP>FO{!wZ(B&>IFrKk)aiVR zk?UiVPi54+9>eN8TY8tS?-Qx6Ncy$#4{Rke>YF)%=N4W>_ong2HS3cMt}_^4$VmpK zG~kuz7~F8(ja57HPG82y$)S0A6Q{2;UP5i*VG|*71#gbnE}d865w`squ_N9yF7{Df zJjY?RBOf%K+1%C}tZPzv;@6&0pMSAUcz-F6y1}z(5BsfM*BF-*v~wii*OrUgk7)@m z>(wO*#od2V#CU~Y``tG;!K7?uw>S-Zx`w>;@aq;M4;0u!%RZ?}*&htDP%qtIcgN_( zY`;kT`~a=kV{PqJ&413M{A`x_>~1u)Q56@axL;3BhAy(=<`3B7kfFl^q`mZjU^YioL@2#+n59c^iGeWILd~Hkz zf1XX6^7an^+=gpGq*Lg`;WzaU#w6?J%3_l`VSp+XiBRzQcmHUxHLL7;dIZ4xSzm$$ zf-Dn=Yb9t`o4d-$O5?ox#{l{iueU33m8*46;HU%43d0BHG1yuGRLJ7xLg=@0ZGDY*k+rtk); zAdxeJkL*H9!j@R&xyAz-sqYT&L2^a4N95OMPK=mu3AzZ`N;Cgj08txRj##8!H~3kh zYiykO+o1{wB77zcAWeXR{5B5yYaFM`U(t>;9cJfz)_I(O(B0Q<#Pf#19>2ZE7fadk z#&KIgR2S~iH|~6?NbxE<0wkXMO_nt1GpSW}oQo?cnEQTx7sXQy)crx5S8+Aemj0mc z!N{Hq>I?z|bSm|Dr*Dwu<5*Z?_187WEI+|aGy61wpPGoM12IX-33J?>58CL!j1JwE z#v)*kG6&1&4CxyyU2m#~k@rP}9-sjQUZUFYMD;pL_t^aM5-4JXcy!zS%zl5&$mkxc zsIU*LN5_5926lSpl7#wAF`O%G8-PhAcVKWD+-ITF8I&q;n|Ve z_Vb(xK3Zol{Qbk&yw*?@eOSY5Xdpu+hS}`co?V=Q9t=#WU!5x+4zn$eP}n=&-qVmT zcmC*hy_WB+p5LAS1n+b*P8sqpX%rg1Eypih-T$a8(V8`jF)YaR&UuR5j-3n_cJDZm zyp^P(veYSB%|WiO^2MI+vx<-2G{?7GDfW(T>f(r@SLakR<vk+%HHe5Z~u4-c?BSloOSJXIdL*vdn5_q9qBh3u0ImYszv z&FLY6-B+dbA9%cN%X=SXQAn$zE5`KcFeRdzA3oTV^Fd5Cn04%se4|y=1*_xrMUT4n zatFWhq}V*qXu76Sv0q31vjLUSGtYaG<_$l5=!H+UI&Zw6m8t);>zdPP(R%`da*88; zk|p0M`jOnF3WWNYZj`-B z(Pv=TFeH$y8<&#vHYq3U+n`E9R?o5~f9Jd)?@isYk?mfbfi4B%<|K!)lUlT&@f_mc_R$9nu( zl*^{7*p>~L*rmP|uCZ3=O72pgkKxPL4z;VU8uNJ2Jh$htmI#_ThMfEBiLrc(eES?@ z_#|fMZ#KprIVYvt6q~%1td;O`j!b#T?>+ZDZJX4OVl(H`#rSx=#CH|nxDk6gT8Hh# z{Yl5C`x`%hHjbgS=QZUqkFM9h^J zW7t+?%h=)|kSz~!N&&twGIFK4+`y*9lA;iji=XCevFQ$x+jKYirTAz~v_QjVtN z-t^9G$Y+YYbH@|d&hB)F7vF%dv}nc;baoy?soS|^mx7&E2PjM`2MmwRX9IKLiAnMl z;l)jLdFSoBx$*BrXnW;oQ_t}``+B6t3Wu)3y(N1vg)~xaO?rmoqob^?$#zF(4%pxvo2nJ@G zDtMA2s*=+e^^A-RjhOv;IimoD39gu8kDm-XKMEUECQ#yEYB)!<`2Ya1j_OAvgAS?o zKH79<;j;+lWCJ?`NULh1QM$M*;{9MFxz(9`CSt7u^gB3WfGqtobh|piJqTIHeugmW z+$}5JR}L<&J^SC1>}{o{J*7=fN-a68yCRYW z05Eo`a!d?Jwqe+IC=1iKbyg}pQKy9r2vr_{so(!zxk)u#6@Byz5>AK+zYt^RjP>tS z$`3GJK&dqM>5Sei=pWtb`GCmt>7sO7P|GvcnleVN=0kIdD0P8>Yd@whY~PJ_k;c_? z%tWiQjjXn|O^TdF-~O+VRQ3o93(MRc_kiKMV^7+okkNrV#&5Q6PhDn-($|V2+84HJ z27nkaqm}y34*6w}nXETe4=_k#q9(GcAS1=?O04Q@&({-SfeP3Qquj!DpK$NdAOw~H zog<7%h{Ge~2!zgh^Cf^MZPEh-L`V$su!aH!n9dtbo!MMwS#wdyJuQT; zPEBOhtT~0HvwPvatJRi6+13@U9ePgL`Nz3P27+uO&$R1fl0`NiULO>XCdFO5SJ;v@ zlHW|v&pKy!bI`v}GPp!6Gp2FI5 zxNJgrup#$5k&4LpSi$8Mp59$AHQaR>O&INdKR)p3u1LLK=iPjr;Fk6wDSk&mD53pSsw z%~3|M=7NIJ&qButS{jGS(aSOplZ>JhWjD)aB`B*~{}ej11b&iT5=zO|YmR?+<>c$Q z8vDzEY3-)VLicS0TYHw87>A_3^#<-S=uzfatMbnBOjJaXEbZ+Ni5bpJQs_ECXk zZDd(&%}eRn_PqYx)aCifvJTidxLx!~l69|#W@Wg7*2Db|_d6i#Vr-8>n8?`(60yPU5t z9uVLHLUV&1_FCu0iwIW)xPmy{fLMB?=uXuUmT6dsEJiGXsEf#xPbwP9eu za3Z#ELt=eqIs6mh%7LL8&v!(_@H?PUa2t7o_j>!|BE;B4bS20Mj4eoYgR`19PIJE& z5hHQ(B=(4$z3D(Z|Fqr=(ixM6A{2#v%Uxm zq0K|+^zlik0rLXX1?(5tB#5kZ~Nx>;l=Tf+3cSn3?Vdpc;km_ z0-sDY*~OxY;uZmB2L^0Zq(YVF9VSG4y}Z0UP0c1<1^Wo0JXf85yBsUh!b5)Hvi;C_ zE*A#atg5Q3f%Y}Izu9#@>buaWKa7!9eVZ%c!HSEPO9MP{Z{O@<=%FXyZj(B+b)$oO zJXF$d+Gv~Wckn^-xYpr?XmOjU@h8C^-pg2xTGgtx3vk6MF#gP zKDCO&Cx&8p^Ie5Ts%0Z~hRJPXYk$&@e#oG=F zjk+$s7i9Q>N6L0 zr14-u8c7mQi`QG7$Lqcdx*{x$mlNysfVx8~bby|kknwm9hk9H~jri}$btdX?>qDdH z+U8dY#T^*BZ&$g<2T8TQpSmmof<=Vo1nC+3Emj>8*yu-sqR8SIhk5{w(0pks@Yk2V zvo?1{hzLOD`KL9H0GGtraubamSA8r`DU%m?M=#qRVp1gpLqLF+Zw7njtaUlFCwxFC5R+M8h5v+0z z2c1m`E4~hjG`#$f_65j}0PB+wGXc^Ik_0rYM0lt{+9m#1ZcjE{I>r%mIfv*qc=_0X zs$)*6v3*riVlW~vA|yn><&C8ZrY=(QTe|^TyZ5)s&s4rg#_LrA7Xdcr_~bUmOBk); z3r--ktvJeNXP?oxKqBUW`;$od0}%@cjsgPSYWhA`beu}~$FCy4pc!)cb|R7&kw_3( zpr>tn8B>;z78mH<9I_a(gA~vo-bks}m@eKGWU8BQ!Sjk#ZV(^~u?HPF);#(oXx-xn z)<&g4WkGV%h@X3SZaDk2kQm#SZs;N4?1itJlh}xaL@2}RCZ#(C*jxvzJ0Ka@8NrI1 zcliy42@r%b(t?;YP0Hqli3Ms1In@j3rKO=!wL~nB8WNE-a8O`)zyUT}0x-=)BthcV zmzU>(F{uJ|3tIFEy5*Fj0DTs*kkCb4c;-D~`9`TW#Kw~oPoH_!?@GG%CM&jbIK^5z z&;7B$X!vXsS5Qcprnw#mbD}Uf&c&nB!l%x9ER>X8hz)(w718GOTA0r$mY2W2Vf)>v zp#9BHOzlKVo#=8D79QR4%#0W|94M^4{8{SptxO@kgSGWcPaOsM^Z0XIY@!Mb*B&Lt zm&qq{;T>L~n5THq;d)qn!i6RKqbKxMSpBT%wDlX9 zD|59T*zF8G9W8Zc=>?^zPqKz**vDbMmvU*D1tkpng3H|}th{djmd=zp+>aValMuNwyxTrYHve-{s8LIl_ac_Ai_YiMiF_vGA=V%88d_+<)f| z%m0b6Rx)BlW_E8jHri?YG!*<&slvl|M@a9=YTaiU)(4N}a$I6}%inpSjE z=u+&yy3ll++?>adeQ0R&V$8D?{-S!PV%L*bbTfab(B8jxD~X|HmPK1A-_LK?!Em0~ zUvChoky-F0d%yy-?FGq$$GLO&SROLL)Om?lA;5aBW0D`JJRr zxl2zCgotCz+Y+_;y{04TY--}{@B|X8H?bCyIkDv)<41?t1lN6PJi7;jp_kDxHa4~Z zXY2rvCJ`Nm4G~*Nk|^VY098+PT_UpK1(_JuFlm|kniv@y!(6g0aAQ6rqH?rH>L;*& z0o6GRBhC$vI zVdjihoXQSA$%o7VN+)8ljj&t`!Em3kxtxJW>2CZ>gpmTIn_7bX{VTtO$d3~-vQUcz z&czYt`Rk-{ChH<7R=`p~Yni|{UyG15LY0bgd1Gn-zyg9iaGXgJznqA}PRZ$n;0(cY zzav+Hsoog-=GCE?7*~9z>k>ZB_XJIk!w{z@2N8D-&SY_w*n${pjnL|WrFv=Amm5ga z=iuO2>&aL*wP<}y6EOu5zx&3hJLo+$gVF+@6u7V+y4-!By*Ti%Fha_HKX?{yOw<%? zqYQrqy&e&mZZj>itEka%B>AQQ84>+VaK+dGxa#P2|zuwRSQZ)7*b zV8l*?R4G@6SG-`vTL7?VZT!*OWKuI2tqm#+ks#UYBcT<4HQb=QA(oO;f;=}Dsq=Ro z-4TF56}( znKppLBtTumcclC2r;bWX)9STr@bcK1O2K^p8|go@@2I#S0K>F@oD(z+Fm^1xiT$k~ zfOuNU_Th`KRCg1(tB@%~$KCQqe0%^Pf>C%L1URE;3;E)jo?<;G?0Hd{g2;<1acJ9% z9k2gd?!nogLcb0#qzK`M)NmqhMu;2Hm=JRWlxmoXh+uJQZSvHQw(>qHo8xcR_6*)n zgST!VF5Shr(WQ$N&{by6`h>Uii~o~dY71pO>&Y!wr7|4PS35pwlj}2*A2=yA;6Gn? zYhcP`WZ3>nQ0|-eSEM+j<`grnsH1oE3R|&=`!HK^WQiuZsieA`2)9>szQ&Zk=2XEyV0%zy zHxHdLjkdYZmYqtAp^^fRZMHulBcoi=R6S<+PQmGv&r#QF=^gV+Z3T7Ll!0Vvm!AQR=!=RoH+sIsQMfHvuV)cu zYJzz7FHL;;L6%w8qeYsEpDallH$^NNfJEeZq3LK%Qg$m>8fbgI-2DKG)h}P_F`4-x zG}cikO0w$IoXeuNrNHuJ>FS_Q#k%a(R>uiafXhEEspDwhK$k*LqJb3#U2isyS}r#m zJN#8of6}omdhJzFpYv>M5cKHbF`zjkw()<2HJ<*C8UQ^#*k9QGY z=xSZJ;w*d8*@K7dTSd`)SI~MF;hN)-43Mhi&2Xtqt&(P3kVq9FNI1yih`;lRd{{K` zZ{YQx4<{hY)qa**JVls4;qx(g-hD-htI?gqMaR9N`Ka^FImf7od)F@_msegQzAqwT z$y?AHsvJam81+BBL62Z?64wvh+6O|vC#`k8mKnI8?;DSw!KwCIa@_Qqw! z^4qSZ9`)=@JGZfAkgqXT4on@7o8EHa^jnek{?Aq{_F9d-`bp&SA3kYZZ1ey;E}I1(sBGaJVq*FUKw3nO-@SUW{EHWo#r)Q zHZ|(sVYZlaS_qg_esOWebKhE*h0Z>+)Q&a4zp(v-mV7Ck>Q=qj`Wef_e3TY?`@TMh zb~a3P3BVB&LIs#;JQ1{1ji~YP^82`d(`pX+d>ivm?(%n)PS-6XGLw&3DC92oDhrIp zxEJ^CQ1^JTz9MeL=@U_BqKw38$U(CZLW3-35CuXa=(=!ab9q>V(-=Rc0trbF4ToZ>gr? zE5#K6^f!wp5cle2;dHOMaIM!pqcFOTa-Y}1%!8bcHa5p^nC{u5cV&+Z``xq}sm;Ah zO+}wxt8A`lbX~$I4Xr4Y0(gLB9uK!CTDSRC^{1VB+cN^u&6TQ5(Wyw*8&0RO5K>b! ztkH2rue0kz?beS)C%KMddBm!_pD@#*4~fp6Z9hUc)T*8F5;N8(9kWQ|M+S0QG&Fh! z-_6TV>hi_W;Wf%edB!nQIvg9{^V4Dvi^lu72N|Z;{o|R5NtJG2+NTsN{wsKd>~T}U zjxW5pFn{^px8$r2T;=7-?(Pxw4KbmT~szt}GLjE6Z CqLnBB literal 0 HcmV?d00001 diff --git a/banner.xcf b/banner.xcf new file mode 100644 index 0000000000000000000000000000000000000000..a20329d06fbfb234ec0f968a9d2ae8493f119623 GIT binary patch literal 1073922 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

t0L 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

$H}IG7$e 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 w8Wh3dx~CIMTW0J?mz@s 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

C;gMYSMpPu#WeE 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 literal 0 HcmV?d00001 diff --git a/tests/t-demo-extravagant.cpp b/tests/t-demo-extravagant.cpp index 029b23b..3637924 100644 --- a/tests/t-demo-extravagant.cpp +++ b/tests/t-demo-extravagant.cpp @@ -2,35 +2,56 @@ #include "../clutchlog/clutchlog.h" -void i() +void dump_data() +{ + CLUTCHLOG(progress, "Dump parsed data..."); + CLUTCHLOG(debug, "Write in `data_dump.csv`"); + CLUTCHLOG(debug, "Data frame size: " << 0 << "x" << "150"); + CLUTCHLOG(xdebug, "Resolution: " << 0); +} + +void reset() { CLUTCHLOG(progress, "Reset data structures..."); CLUTCHLOG(debug, "OK"); CLUTCHLOG(info, "Reset functors..."); CLUTCHLOG(critical, "Impossible to reset, I cannot recover."); + dump_data(); } -void h() +void process() { CLUTCHLOG(note, "Filling up data of size: " << 0); CLUTCHLOG(error, "Cannot parse input, I will reset stuff."); - i(); + reset(); CLUTCHLOG(xdebug, "Last seen state: " << 0); } -void g() +void init_data() { - CLUTCHLOG(warning, "Input size < " << 1); - h(); + CLUTCHLOG(debug, "Data frame size: " << 2 << "x" << "150"); + CLUTCHLOG(xdebug, "Resolution: " << 0.001); + CLUTCHLOG(warning, "Input height < " << 3); } -void f() +void init_func() +{ + CLUTCHLOG(progress, "Allocate memory..."); + CLUTCHLOG(warning, "Dimension: " << 12); + CLUTCHLOG(debug, "OK"); +} + +void init() { CLUTCHLOG(progress, "Initialize data structures..."); + init_data(); CLUTCHLOG(debug, "OK"); CLUTCHLOG(progress, "Initialize functors..."); + init_func(); + CLUTCHLOG(debug, "OK"); + CLUTCHLOG(progress, "Process..."); + process(); CLUTCHLOG(debug, "OK"); - g(); } int main(const int argc, char* argv[]) @@ -97,8 +118,8 @@ int main(const int argc, char* argv[]) } } - CLUTCHLOG(progress,"Start something"); - f(); + CLUTCHLOG(progress,"Start analysis"); + init(); CLUTCHLOG(progress,"I have stopped"); } From c45080fc8e2565eaa2318f8ccc6f3a9794bdf152 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 28 Jan 2023 15:21:06 +0100 Subject: [PATCH 03/24] adds value-dependant template tags Implements #4 #5 #7 --- README.md | 52 ++++++++++++++++++++++++--- clutchlog/clutchlog.h | 79 ++++++++++++++++++++++++++++++++++++------ tests/t-hash-color.cpp | 49 ++++++++++++++++++++++++++ 3 files changed, 165 insertions(+), 15 deletions(-) create mode 100644 tests/t-hash-color.cpp diff --git a/README.md b/README.md index 10c399c..d8a866d 100644 --- a/README.md +++ b/README.md @@ -200,12 +200,15 @@ Available tags are: - `{file}`: the current file (absolute path), - `{func}`: the current function, - `{line}`: the current line number, -- `{level_fmt}`: the format of the current level (i.e. configured with `clutchlog::style`). +- `{level_fmt}`: the style of the current level (i.e. configured with `clutchlog::style`), +- `{filehash_fmt}`: a style for file names, which is value-dependant (see `clutchlog::filehash_styles`), +- `{funchash_fmt}`: a style for function names, which is value-dependant (see `clutchlog::funchash_styles`). Some tags are only available on POSIX operating systems as of now: - `{name}`: the name of the current binary, - `{depth}`: the current depth of the call stack, - `{depth_marks}`: as many chevrons `>` as there is calls in the stack, +- `{depth_fmt}`: a style depending on the current depth value (see `clutchlog::depth_styles`), - `{hfill}`: Inserts a sequence of characters that will stretch to fill the space available in the current terminal, between the rightmost and leftmost part of the log message. @@ -220,10 +223,12 @@ clutchlog will not put the location-related tags in the message formats (i.e. `{name}`, `{func}`, and `{line}`) when not in Debug builds. -Output style ------------- +Output Styling +-------------- -Output lines can be colored differently depending on the log level. +Output lines can be styled differently depending on their content. + +For example, output lines can be colored differently depending on the log level. ```cpp // Print error messages in bold red: log.style(level::error, // First, the log level. @@ -251,7 +256,8 @@ depending on the types of arguments passed to styling functions: - `clutchlog::fg::none` and `clutchlog::bg::none` can be passed in all modes. For example, all the following lines encode -a bright red foreground for the critical level: +a bright red foreground for the critical level +(see the "Colors" section below): ```cpp log.style(level:critical, fmt::fg::red); // 16-colors mode. @@ -371,6 +377,42 @@ log.style(level::info, fg::none, 100,0,0, typo::bold); // No color over bold dar ``` +### Value-dependant Format Tags + +Some tags can be used to change the style of (part of) the output line, + +*depending on its content*. +The `{filehash_fmt}` and `{funchash_fmt}` will introduce a styling sequence +which depends on the current file name, and function name respectively. +The chosen style is chosen at random among the candidate ones, +but will always be the same for each value. + +The set of candidate styles can be configured with `clutchlog::filehash_styles` +and `clutchlog::funchash_styles`, which both take a vector of `clutchlog::fmt` +objects as argument: +```cpp +// Either one or the other color for filenames: +log.filehash_styles( { fmt(fg::red), fmt(fg::yellow) } ); +// This would fix the function name style to a single one: +log.funchash_styles( { fmt(typo::bold) } ); +// Works with any `fmt` constructor +// (here, shades of blues in 256-colors mode): +log.funchash_styles( { fmt(33), fmt(27), fmt(39), fmt(45) } ); +``` + +The same idea applies to `{depth_fmt}`. +However, if `clutchlog::depth_styles` is configured, +then the styles are chosen *in order*. +That is, a depth of 1 would lead to the first style being chosen. +If the current depth of the stack is larger than the number of configured +styles, then the last one is used. +For example: +```cpp +// Increasingly darker depth level colors (using the 256-colors mode). +log.depth_styles({ fmt(255), fmt(250), fmt(245), fmt(240), fmt(235) }); +``` + + Advanced Usage ============== diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index cf98ad0..c79e0e9 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -810,6 +810,16 @@ class clutchlog this->print_on(os); return os.str(); } + + static fmt hash( const std::string& str, const std::vector domain = {}) + { + size_t h = std::hash{}(str); + if(domain.size() == 0) { + return fmt(static_cast(h % 256)); + } else { + return fmt(domain[h % domain.size()]); + } + } }; // fmt class /** @} */ @@ -872,6 +882,10 @@ class clutchlog _in_file(".*"), _in_func(".*"), _in_line(".*") + // Empty vectors by default: + // _filehash_fmts + // _funchash_fmts + // _depth_fmts { // Reverse the level->word map into a word->level map. for(auto& lw : _level_word) { @@ -926,9 +940,16 @@ class clutchlog /** Current line location filter. */ std::regex _in_line; + /** List of candidate format objects for value-dependant file name styling. */ + std::vector _filehash_fmts; + /** List of candidate format objects for value-dependant function name styling. */ + std::vector _funchash_fmts; + #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 /** Maximum buffer size for backtrace message. */ static const size_t _max_buffer = 4096; + /** Ordered list of format objects for value-dependant depth styling. */ + std::vector _depth_fmts; #endif #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL @@ -974,11 +995,11 @@ class clutchlog size_t strip_calls() const {return _strip_calls;} #endif #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1 - //! Set the character for the stretching hfill marker. + //! Set the character for the stretching `{hfill}` template tag marker. void hfill_mark(const char mark) {_hfill_char = mark;} - //! Get the character for the stretching hfill marker. + //! Get the character for the stretching `{hfill}` template tag marker. char hfill_mark() const {return _hfill_char;} - //! Set the style for the stretching hfill marker, with a `fmt` object. + //! Set the style for the stretching `{hfill}` template tag marker, with a `fmt` object. void hfill_style(fmt style) {_hfill_fmt = style;} /** Set the style for the stretching hfill marker. * @@ -986,17 +1007,42 @@ class clutchlog */ template void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); } - //! Get the character for the stretching hfill marker. + //! Get the character for the stretching `{hfill}` template tag marker. fmt hfill_style() const {return _hfill_fmt;} - //! Set the maximum width for which to hfill. */ + //! Set the maximum width for which to `{hfill}`. void hfill_max(const size_t nmax) {_hfill_max = nmax;} - //! Get the maximum width for which to hfill. */ + //! Get the maximum width for which to `{hfill}`. size_t hfill_max() {return _hfill_max;} - //! Set the minimum width at which to hfill. */ + //! Set the minimum width at which to `{hfill}`. void hfill_min(const size_t nmin) {_hfill_min = nmin;} - //! Get the minimum width at which to hfill. */ + //! Get the minimum width at which to `{hfill}`. size_t hfill_min() {return _hfill_min;} #endif + /** Set the candidate styles for value-dependant file name formatting. + * + * Style will be chosen based on the hash value of the filename + * among the candidate ones. + * + * See the `{filehash_fmt}` template tag. + */ + void filehash_styles(std::vector styles) {_filehash_fmts = styles;} + /** Set the candidate styles for value-dependant function name formatting. + * + * Style will be chosen based on the hash value of the filename + * among the candidate ones. + * + * See the `{funchash_fmt}` template tag. + */ + void funchash_styles(std::vector styles) {_funchash_fmts = styles;} + /** Set the styles for value-dependant depth formatting. + * + * The given list should be ordered, styles will be applied + * for the corresponding depth level. If the actual depth is + * larger than the number of styles, the last one is used. + * + * See the `{depth_fmt}` template tag. + */ + void depth_styles(std::vector styles) {_depth_fmts = styles;} //! Set the log level (below which logs are not printed) with an identifier. void threshold(level l) {_stage = l;} @@ -1238,17 +1284,26 @@ class clutchlog row = replace(row, "\\{level_short\\}", _level_short.at(stage)); #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 + size_t actual_depth = depth - _strip_calls; row = replace(row, "\\{name\\}", name); - row = replace(row, "\\{depth\\}", depth - _strip_calls); + row = replace(row, "\\{depth\\}", actual_depth); std::ostringstream chevrons; for(size_t i = _strip_calls; i < depth; ++i) { chevrons << _depth_mark; } row = replace(row, "\\{depth_marks\\}", chevrons.str()); -#endif + if(_depth_fmts.size() == 0) { + row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() ); + } else { + row = replace(row, "\\{depth_fmt\\}", + _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() ); + } +#endif row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str()); + row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() ); + row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() ); #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL // hfill is replaced last to allow for correct line width estimation. @@ -1490,6 +1545,7 @@ class clutchlog friend std::ostream& operator<<(std::ostream&, const fmt&) {} std::string operator()( const std::string&) const {} std::string str() const {} + static fmt hash( const std::string&, const std::vector) {} }; public: clutchlog(clutchlog const&) = delete; @@ -1534,6 +1590,9 @@ class clutchlog void hfill_max(const size_t) {} size_t hfill_max() {} #endif + void filehash_styles(std::vector ) {} + void funchash_styles(std::vector ) {} + void depth_styles(std::vector) {} void threshold(level) {} void threshold(const std::string&) {} diff --git a/tests/t-hash-color.cpp b/tests/t-hash-color.cpp new file mode 100644 index 0000000..1c6882f --- /dev/null +++ b/tests/t-hash-color.cpp @@ -0,0 +1,49 @@ +#include +#include + +#include "../clutchlog/clutchlog.h" + +void deepcall() +{ + CLUTCHLOG(warning,"at depth 4"); +} + +void subsubsubcall() +{ + CLUTCHLOG(warning,"at depth 3"); + deepcall(); +} + +void subsubcall() +{ + CLUTCHLOG(warning,"at depth 2"); + subsubsubcall(); +} + +void subcall() +{ + CLUTCHLOG(warning,"at depth 1"); + subsubcall(); +} + +int main(/*const int argc, char* argv[]*/) +{ + auto& log = clutchlog::logger(); + using fmt = clutchlog::fmt; + using typo = clutchlog::fmt::typo; + + fmt reset(typo::reset); + std::ostringstream tpl; + tpl << "{level_fmt}Having a {level} {filehash_fmt}within {file} {funchash_fmt}calling {func} {depth_fmt}at level {depth}" + << reset << " : {msg}\n"; + log.format(tpl.str()); + log.threshold(clutchlog::level::xdebug); + + log.filehash_styles( {fmt(fmt::fg::red), fmt(fmt::fg::yellow)} ); + log.funchash_styles( {fmt(fmt::fg::green), fmt(fmt::fg::blue), + fmt(fmt::fg::bright_green), fmt(fmt::fg::bright_blue), fmt(fmt::fg::magenta)} ); + log.depth_styles( {fmt(255),fmt(250),fmt(245),fmt(240)} ); + + CLUTCHLOG(warning,"in main"); + subcall(); +} From 286ab85aaab24d465ebc053c0386fff1ea52120d Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 28 Jan 2023 15:22:21 +0100 Subject: [PATCH 04/24] bump to v0.15 --- CMakeLists.txt | 2 +- docs/annotated.html | 2 +- docs/classclutchlog-members.html | 69 +- docs/classclutchlog.html | 137 +- docs/classclutchlog.js | 5 + docs/classclutchlog_1_1fmt-members.html | 21 +- docs/classclutchlog_1_1fmt.html | 9 +- docs/classes.html | 2 +- docs/clutchlog_8h.html | 2 +- docs/clutchlog_8h__dep__incl.map | 7 +- docs/clutchlog_8h__dep__incl.md5 | 2 +- docs/clutchlog_8h__dep__incl.svg | 75 +- docs/clutchlog_8h__dep__incl_org.svg | 77 +- docs/clutchlog_8h_source.html | 1532 +++++++++-------- docs/dir_000001_000000.html | 4 +- .../dir_59425e443f801f1f2fd8bbe4959a3ccf.html | 2 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.map | 2 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 | 2 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg | 4 +- .../dir_c318bd5cf14aaa5601e6029e0b5b4048.html | 2 +- docs/files.html | 7 +- docs/files_dup.js | 1 + docs/functions.html | 19 +- docs/functions_enum.html | 2 +- docs/functions_func.html | 13 +- docs/functions_rela.html | 2 +- docs/functions_vars.html | 8 +- docs/globals.html | 2 +- docs/globals_defs.html | 2 +- docs/graph_legend.html | 2 +- docs/group___default_config.html | 2 +- docs/group___formating.html | 2 +- docs/group___formating.js | 1 + docs/group___main.html | 2 +- docs/group___main.js | 5 + docs/group___use_macros.html | 2 +- docs/group__colors16.html | 2 +- docs/group__colors256__16_m.html | 2 +- docs/hierarchy.html | 2 +- docs/index.html | 13 +- docs/inherits.html | 2 +- docs/modules.html | 2 +- docs/navtreedata.js | 2 +- docs/navtreeindex0.js | 232 +-- docs/navtreeindex1.js | 11 +- docs/search/all_0.js | 26 +- docs/search/all_1.js | 2 +- docs/search/all_10.js | 2 +- docs/search/all_2.js | 12 +- docs/search/all_3.js | 48 +- docs/search/all_4.js | 21 +- docs/search/all_5.js | 26 +- docs/search/all_6.js | 2 +- docs/search/all_7.js | 2 +- docs/search/all_8.js | 6 +- docs/search/all_9.js | 16 +- docs/search/all_a.js | 6 +- docs/search/all_b.js | 6 +- docs/search/all_c.js | 2 +- docs/search/all_d.js | 4 +- docs/search/all_e.js | 8 +- docs/search/all_f.js | 8 +- docs/search/classes_0.js | 4 +- docs/search/classes_1.js | 8 +- docs/search/classes_2.js | 6 +- docs/search/classes_3.js | 2 +- docs/search/defines_0.js | 6 +- docs/search/defines_1.js | 2 +- docs/search/enums_0.js | 2 +- docs/search/enums_1.js | 2 +- docs/search/enums_2.js | 2 +- docs/search/enums_3.js | 2 +- docs/search/enums_4.js | 2 +- docs/search/enums_5.js | 2 +- docs/search/enumvalues_0.js | 6 +- docs/search/files_0.js | 2 +- docs/search/functions_0.js | 4 +- docs/search/functions_1.js | 6 +- docs/search/functions_2.js | 3 +- docs/search/functions_3.js | 16 +- docs/search/functions_4.js | 2 +- docs/search/functions_5.js | 14 +- docs/search/functions_6.js | 4 +- docs/search/functions_7.js | 2 +- docs/search/functions_8.js | 2 +- docs/search/functions_9.js | 6 +- docs/search/functions_a.js | 2 +- docs/search/groups_0.js | 2 +- docs/search/groups_1.js | 2 +- docs/search/groups_2.js | 2 +- docs/search/groups_3.js | 2 +- docs/search/groups_4.js | 2 +- docs/search/groups_5.js | 2 +- docs/search/pages_0.js | 2 +- docs/search/related_0.js | 2 +- docs/search/variables_0.js | 26 +- docs/search/variables_1.js | 6 +- docs/search/variables_2.js | 16 +- docs/search/variables_3.js | 6 +- docs/search/variables_4.js | 2 +- docs/search/variables_5.js | 4 +- docs/search/variables_6.js | 2 +- docs/search/variables_7.js | 4 +- docs/search/variables_8.js | 4 +- ...tclutchlog_1_1fmt_1_1bg__16_m-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1bg__16_m.html | 2 +- ...ctclutchlog_1_1fmt_1_1bg__256-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1bg__256.html | 2 +- ...ructclutchlog_1_1fmt_1_1color-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1color.html | 2 +- ...utchlog_1_1fmt_1_1color__16_m-members.html | 2 +- ...structclutchlog_1_1fmt_1_1color__16_m.html | 2 +- ...lutchlog_1_1fmt_1_1color__256-members.html | 2 +- .../structclutchlog_1_1fmt_1_1color__256.html | 2 +- ...tclutchlog_1_1fmt_1_1fg__16_m-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1fg__16_m.html | 2 +- ...ctclutchlog_1_1fmt_1_1fg__256-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1fg__256.html | 2 +- docs/structclutchlog_1_1scope__t-members.html | 2 +- docs/structclutchlog_1_1scope__t.html | 4 +- docs/t-assert_8cpp_source.html | 2 +- docs/t-color16_m_8cpp_source.html | 2 +- docs/t-color256_8cpp_source.html | 2 +- docs/t-color_8cpp_source.html | 2 +- docs/t-demo-extravagant_8cpp_source.html | 207 ++- docs/t-demo_8cpp_source.html | 2 +- docs/t-dump_8cpp_source.html | 2 +- docs/t-fmt-constructors_8cpp_source.html | 2 +- docs/t-hash-color_8cpp_source.html | 156 ++ docs/t-log_8cpp_source.html | 2 +- docs/t-one-line-if_8cpp_source.html | 2 +- 131 files changed, 1773 insertions(+), 1332 deletions(-) create mode 100644 docs/t-hash-color_8cpp_source.html diff --git a/CMakeLists.txt b/CMakeLists.txt index 97d9fd7..507a7f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.10 FATAL_ERROR) project("clutchlog" - VERSION 0.14 + VERSION 0.15 DESCRIPTION "A logging system which targets versatile debugging") enable_language(CXX) # C++ diff --git a/docs/annotated.html b/docs/annotated.html index 02b8c9e..c9f4a52 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -28,7 +28,7 @@ Logo

diff --git a/docs/classclutchlog-members.html b/docs/classclutchlog-members.html index b3230cf..fe7c2cb 100644 --- a/docs/classclutchlog-members.html +++ b/docs/classclutchlog-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
@@ -91,8 +91,10 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl

This is the complete list of members for clutchlog, including all inherited members.

- - + + + + @@ -113,41 +115,44 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
_format_dumpclutchlogprotected
_format_logclutchlogprotected
_filehash_fmtsclutchlogprotected
_format_dumpclutchlogprotected
_format_logclutchlogprotected
_funchash_fmtsclutchlogprotected
_in_fileclutchlogprotected
_in_funcclutchlogprotected
_in_lineclutchlogprotected
default_hfill_maxclutchloginlineprotectedstatic
default_hfill_minclutchloginlineprotectedstatic
default_strip_callsclutchloginlineprotectedstatic
dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) constclutchloginline
dump_default_formatclutchloginlineprotectedstatic
dump_default_sepclutchloginlineprotectedstatic
error enum value (defined in clutchlog)clutchlog
file(std::string file)clutchloginline
depth_styles(std::vector< fmt > styles)clutchloginline
dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) constclutchloginline
dump_default_formatclutchloginlineprotectedstatic
dump_default_sepclutchloginlineprotectedstatic
error enum value (defined in clutchlog)clutchlog
file(std::string file)clutchloginline
filehash_styles(std::vector< fmt > styles)clutchloginline
format(const std::string &format)clutchloginline
format() constclutchloginline
format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline
format_comment(const std::string &format)clutchloginline
format_comment() constclutchloginline
func(std::string func)clutchloginline
info enum value (defined in clutchlog)clutchlog
level enum nameclutchlog
level_of(const std::string name)clutchloginline
levels() constclutchloginline
line(std::string line)clutchloginline
locate(const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline
location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")clutchloginline
log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) constclutchloginline
logger()clutchloginlinestatic
note enum value (defined in clutchlog)clutchlog
operator=(clutchlog const &)=delete (defined in clutchlog)clutchlog
out(std::ostream &out)clutchloginline
out()clutchloginline
progress enum value (defined in clutchlog)clutchlog
replace(const std::string &form, const std::string &mark, const std::string &tag) constclutchloginline
replace(const std::string &form, const std::string &mark, const size_t tag) constclutchloginline
style(level stage, FMT... styles)clutchloginline
style(level stage, fmt style)clutchloginline
style(level stage) constclutchloginline
threshold(level l)clutchloginline
threshold(const std::string &l)clutchloginline
threshold() constclutchloginline
warning enum value (defined in clutchlog)clutchlog
xdebug enum value (defined in clutchlog)clutchlog
funchash_styles(std::vector< fmt > styles)clutchloginline
info enum value (defined in clutchlog)clutchlog
level enum nameclutchlog
level_of(const std::string name)clutchloginline
levels() constclutchloginline
line(std::string line)clutchloginline
locate(const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline
location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")clutchloginline
log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) constclutchloginline
logger()clutchloginlinestatic
note enum value (defined in clutchlog)clutchlog
operator=(clutchlog const &)=delete (defined in clutchlog)clutchlog
out(std::ostream &out)clutchloginline
out()clutchloginline
progress enum value (defined in clutchlog)clutchlog
replace(const std::string &form, const std::string &mark, const std::string &tag) constclutchloginline
replace(const std::string &form, const std::string &mark, const size_t tag) constclutchloginline
style(level stage, FMT... styles)clutchloginline
style(level stage, fmt style)clutchloginline
style(level stage) constclutchloginline
threshold(level l)clutchloginline
threshold(const std::string &l)clutchloginline
threshold() constclutchloginline
warning enum value (defined in clutchlog)clutchlog
xdebug enum value (defined in clutchlog)clutchlog
diff --git a/docs/classclutchlog.html b/docs/classclutchlog.html index a487fcc..299f623 100644 --- a/docs/classclutchlog.html +++ b/docs/classclutchlog.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
@@ -129,6 +129,15 @@ void out ()  Get the output stream on which to print.
  +void filehash_styles (std::vector< fmt > styles) + Set the candidate styles for value-dependant file name formatting. More...
+  +void funchash_styles (std::vector< fmt > styles) + Set the candidate styles for value-dependant function name formatting. More...
+  +void depth_styles (std::vector< fmt > styles) + Set the styles for value-dependant depth formatting. More...
void threshold (level l)  Set the log level (below which logs are not printed) with an identifier.
@@ -317,6 +326,14 @@ std::regex _in_line  Current line location filter.
  + +std::vector< fmt_filehash_fmts + List of candidate format objects for value-dependant file name styling.
+  + +std::vector< fmt_funchash_fmts + List of candidate format objects for value-dependant function name styling.
 clutchlog (clutchlog const &)=delete   @@ -356,6 +373,106 @@ void operator= (

Definition at line 296 of file clutchlog.h.

+ + + +

◆ filehash_styles()

+ +
+
+ + + + + +
+ + + + + + + + +
void clutchlog::filehash_styles (std::vector< fmtstyles)
+
+inline
+
+ +

Set the candidate styles for value-dependant file name formatting.

+

Style will be chosen based on the hash value of the filename among the candidate ones.

+

See the {filehash_fmt} template tag.

+ +

Definition at line 1028 of file clutchlog.h.

+ +

References _filehash_fmts.

+ +
+
+ +

◆ funchash_styles()

+ +
+
+ + + + + +
+ + + + + + + + +
void clutchlog::funchash_styles (std::vector< fmtstyles)
+
+inline
+
+ +

Set the candidate styles for value-dependant function name formatting.

+

Style will be chosen based on the hash value of the filename among the candidate ones.

+

See the {funchash_fmt} template tag.

+ +

Definition at line 1036 of file clutchlog.h.

+ +

References _funchash_fmts.

+ +
+
+ +

◆ depth_styles()

+ +
+
+ + + + + +
+ + + + + + + + +
void clutchlog::depth_styles (std::vector< fmtstyles)
+
+inline
+
+ +

Set the styles for value-dependant depth formatting.

+

The given list should be ordered, styles will be applied for the corresponding depth level. If the actual depth is larger than the number of styles, the last one is used.

+

See the {depth_fmt} template tag.

+ +

Definition at line 1045 of file clutchlog.h.

+
@@ -385,11 +502,11 @@ void operator= (Return the log level tag corresponding to the given pre-configured name.

Note
This is case sensitive, see the pre-configured _level_word.
-

Definition at line 1014 of file clutchlog.h.

+

Definition at line 1060 of file clutchlog.h.

-

References _word_level.

+

References _word_level.

-

Referenced by threshold().

+

Referenced by threshold().

@@ -432,11 +549,11 @@ template<class ... FMT>

Set the style (color and typo) of the given log level.

This version accept style arguments as if they were passed to clutchlog::fmt.

-

Definition at line 1048 of file clutchlog.h.

+

Definition at line 1094 of file clutchlog.h.

-

References style().

+

References style().

-

Referenced by style().

+

Referenced by style().

@@ -484,9 +601,9 @@ template<class ... FMT>
log.replace("{greet} {world}", "\\{greet\\}", "hello");
// returns "hello {world}"
-

Definition at line 1137 of file clutchlog.h.

+

Definition at line 1183 of file clutchlog.h.

-

Referenced by dump(), format(), and replace().

+

Referenced by dump(), format(), and replace().

@@ -495,7 +612,7 @@ template<class ... FMT> -
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1301
+
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1356
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:296
diff --git a/docs/classclutchlog_1_1fmt.html b/docs/classclutchlog_1_1fmt.html index 11c15d1..b1bb17c 100644 --- a/docs/classclutchlog_1_1fmt.html +++ b/docs/classclutchlog_1_1fmt.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
@@ -86,6 +86,7 @@ $(document).ready(function(){initNavTree('classclutchlog_1_1fmt.html',''); initR
Public Member Functions | +Static Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | @@ -223,6 +224,12 @@ std::string fmt (const std::string &f, typo s=typo::none)   + + + +

+Static Public Member Functions

+static fmt hash (const std::string &str, const std::vector< fmt > domain={})
 
diff --git a/docs/clutchlog_8h.html b/docs/clutchlog_8h.html index 832e062..afb9e50 100644 --- a/docs/clutchlog_8h.html +++ b/docs/clutchlog_8h.html @@ -28,7 +28,7 @@ diff --git a/docs/clutchlog_8h__dep__incl.map b/docs/clutchlog_8h__dep__incl.map index 8867224..20f2720 100644 --- a/docs/clutchlog_8h__dep__incl.map +++ b/docs/clutchlog_8h__dep__incl.map @@ -1,5 +1,5 @@ - + @@ -8,6 +8,7 @@ - - + + + diff --git a/docs/clutchlog_8h__dep__incl.md5 b/docs/clutchlog_8h__dep__incl.md5 index 2ebb922..d28cb8a 100644 --- a/docs/clutchlog_8h__dep__incl.md5 +++ b/docs/clutchlog_8h__dep__incl.md5 @@ -1 +1 @@ -2272091813648aca5bb139f5c62184ae \ No newline at end of file +f0599479963670ec59fcd0540b0432ef \ No newline at end of file diff --git a/docs/clutchlog_8h__dep__incl.svg b/docs/clutchlog_8h__dep__incl.svg index c8557a0..9fe6b9c 100644 --- a/docs/clutchlog_8h__dep__incl.svg +++ b/docs/clutchlog_8h__dep__incl.svg @@ -46,7 +46,7 @@ if (edges && edges.length) { @@ -54,13 +54,13 @@ var sectionId = 'dynsection-1'; clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -76,8 +76,8 @@ var sectionId = 'dynsection-1'; Node1->Node2 - - + + @@ -91,8 +91,8 @@ var sectionId = 'dynsection-1'; Node1->Node3 - - + + @@ -106,8 +106,8 @@ var sectionId = 'dynsection-1'; Node1->Node4 - - + + @@ -121,8 +121,8 @@ var sectionId = 'dynsection-1'; Node1->Node5 - - + + @@ -136,8 +136,8 @@ var sectionId = 'dynsection-1'; Node1->Node6 - - + + @@ -151,8 +151,8 @@ var sectionId = 'dynsection-1'; Node1->Node7 - - + + @@ -166,8 +166,8 @@ var sectionId = 'dynsection-1'; Node1->Node8 - - + + @@ -181,38 +181,53 @@ var sectionId = 'dynsection-1'; Node1->Node9 - - + + Node10 - - -t-log.cpp + + +t-hash-color.cpp Node1->Node10 - - + + Node11 - - -t-one-line-if.cpp + + +t-log.cpp Node1->Node11 - - + + + + + +Node12 + + +t-one-line-if.cpp + + + + + +Node1->Node12 + + diff --git a/docs/clutchlog_8h__dep__incl_org.svg b/docs/clutchlog_8h__dep__incl_org.svg index d7492c1..df19fdd 100644 --- a/docs/clutchlog_8h__dep__incl_org.svg +++ b/docs/clutchlog_8h__dep__incl_org.svg @@ -4,17 +4,17 @@ - + clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -30,8 +30,8 @@ Node1->Node2 - - + + @@ -45,8 +45,8 @@ Node1->Node3 - - + + @@ -60,8 +60,8 @@ Node1->Node4 - - + + @@ -75,8 +75,8 @@ Node1->Node5 - - + + @@ -90,8 +90,8 @@ Node1->Node6 - - + + @@ -105,8 +105,8 @@ Node1->Node7 - - + + @@ -120,8 +120,8 @@ Node1->Node8 - - + + @@ -135,38 +135,53 @@ Node1->Node9 - - + + Node10 - - -t-log.cpp + + +t-hash-color.cpp Node1->Node10 - - + + Node11 - - -t-one-line-if.cpp + + +t-log.cpp Node1->Node11 - - + + + + + +Node12 + + +t-one-line-if.cpp + + + + + +Node1->Node12 + + diff --git a/docs/clutchlog_8h_source.html b/docs/clutchlog_8h_source.html index e3c31b4..fa6a0cb 100644 --- a/docs/clutchlog_8h_source.html +++ b/docs/clutchlog_8h_source.html @@ -28,7 +28,7 @@ Logo @@ -615,7 +615,7 @@ $(document).ready(function(){initNavTree('clutchlog_8h_source.html',''); initRes
798  this->print_on(os);
799  fmt reset(fmt::typo::reset);
800  os << msg;
-
801  reset.print_on(os);
+
801  reset.print_on(os);
802  return os.str();
803  }
804 
@@ -625,831 +625,871 @@ $(document).ready(function(){initNavTree('clutchlog_8h_source.html',''); initRes
810  this->print_on(os);
811  return os.str();
812  }
-
813  }; // fmt class
-
814 
-
820  public:
-
821  clutchlog(clutchlog const&) = delete;
-
822  void operator=(clutchlog const&) = delete;
-
823 
-
824  private:
-
825  clutchlog() :
-
826  // system, main, log
- -
828  _level_word({
-
829  {level::critical,"Critical"},
-
830  {level::error ,"Error"},
-
831  {level::warning ,"Warning"},
-
832  {level::progress,"Progress"},
-
833  {level::note ,"Note"},
-
834  {level::info ,"Info"},
-
835  {level::debug ,"Debug"},
-
836  {level::xdebug ,"XDebug"}
-
837  }),
-
838  _level_short({
-
839  {level::critical, "Crit"},
-
840  {level::error , "Erro"},
-
841  {level::warning , "Warn"},
-
842  {level::progress, "Prog"},
-
843  {level::note , "Note"},
-
844  {level::info , "Info"},
-
845  {level::debug , "Dbug"},
-
846  {level::xdebug , "XDbg"}
+
813 
+
814  static fmt hash( const std::string& str, const std::vector<fmt> domain = {})
+
815  {
+
816  size_t h = std::hash<std::string>{}(str);
+
817  if(domain.size() == 0) {
+
818  return fmt(static_cast<short>(h % 256));
+
819  } else {
+
820  return fmt(domain[h % domain.size()]);
+
821  }
+
822  }
+
823  }; // fmt class
+
824 
+
830  public:
+
831  clutchlog(clutchlog const&) = delete;
+
832  void operator=(clutchlog const&) = delete;
+
833 
+
834  private:
+
835  clutchlog() :
+
836  // system, main, log
+ +
838  _level_word({
+
839  {level::critical,"Critical"},
+
840  {level::error ,"Error"},
+
841  {level::warning ,"Warning"},
+
842  {level::progress,"Progress"},
+
843  {level::note ,"Note"},
+
844  {level::info ,"Info"},
+
845  {level::debug ,"Debug"},
+
846  {level::xdebug ,"XDebug"}
847  }),
-
848  _level_fmt({
-
849  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
-
850  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
-
851  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
-
852  {level::progress,fmt()},
-
853  {level::note ,fmt()},
-
854  {level::info ,fmt()},
-
855  {level::debug ,fmt()},
-
856  {level::xdebug ,fmt()}
+
848  _level_short({
+
849  {level::critical, "Crit"},
+
850  {level::error , "Erro"},
+
851  {level::warning , "Warn"},
+
852  {level::progress, "Prog"},
+
853  {level::note , "Note"},
+
854  {level::info , "Info"},
+
855  {level::debug , "Dbug"},
+
856  {level::xdebug , "XDbg"}
857  }),
- - -
860  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
861  _hfill_char(clutchlog::default_hfill_char),
-
862  _hfill_fmt(fmt::fg::none),
-
863  _hfill_max(clutchlog::default_hfill_max),
-
864  _hfill_min(clutchlog::default_hfill_min),
-
865  #endif
-
866  _out(&std::clog),
-
867  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
868  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
-
869  _depth_mark(clutchlog::default_depth_mark),
-
870  #endif
-
871  _stage(level::error),
-
872  _in_file(".*"),
-
873  _in_func(".*"),
-
874  _in_line(".*")
-
875  {
-
876  // Reverse the level->word map into a word->level map.
-
877  for(auto& lw : _level_word) {
-
878  _word_level[lw.second] = lw.first;
-
879  }
-
880 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
881  struct winsize w;
-
882  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
-
883  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
-
884 #endif
-
885  }
-
886 
-
887  protected:
-
889  size_t _strip_calls;
-
891  const std::map<level,std::string> _level_word;
-
893  std::map<std::string,level> _word_level;
-
895  std::map<level,std::string> _level_short;
-
897  std::map<level,fmt> _level_fmt;
-
899  std::string _format_log;
-
901  std::string _format_dump;
-
902  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
903 
-
904  char _hfill_char;
-
906  fmt _hfill_fmt;
-
908  size_t _hfill_max;
-
910  size_t _hfill_min;
-
911  #endif
-
912 
-
913  std::ostream* _out;
-
914  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
915 
-
916  size_t _depth;
-
918  std::string _depth_mark;
-
919  #endif
-
920 
- -
923  std::regex _in_file;
-
925  std::regex _in_func;
-
927  std::regex _in_line;
-
928 
-
929 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
930 
-
931  static const size_t _max_buffer = 4096;
-
932 #endif
-
933 
-
934 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
935 
-
936  size_t _nb_columns;
-
937 #endif
-
938 
-
940  public:
-
941 
-
945  void format(const std::string& format) {_format_log = format;}
-
948  std::string format() const {return _format_log;}
+
858  _level_fmt({
+
859  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
+
860  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
+
861  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
+
862  {level::progress,fmt()},
+
863  {level::note ,fmt()},
+
864  {level::info ,fmt()},
+
865  {level::debug ,fmt()},
+
866  {level::xdebug ,fmt()}
+
867  }),
+ + +
870  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
871  _hfill_char(clutchlog::default_hfill_char),
+
872  _hfill_fmt(fmt::fg::none),
+
873  _hfill_max(clutchlog::default_hfill_max),
+
874  _hfill_min(clutchlog::default_hfill_min),
+
875  #endif
+
876  _out(&std::clog),
+
877  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
878  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
+
879  _depth_mark(clutchlog::default_depth_mark),
+
880  #endif
+
881  _stage(level::error),
+
882  _in_file(".*"),
+
883  _in_func(".*"),
+
884  _in_line(".*")
+
885  // Empty vectors by default:
+
886  // _filehash_fmts
+
887  // _funchash_fmts
+
888  // _depth_fmts
+
889  {
+
890  // Reverse the level->word map into a word->level map.
+
891  for(auto& lw : _level_word) {
+
892  _word_level[lw.second] = lw.first;
+
893  }
+
894 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
895  struct winsize w;
+
896  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
+
897  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
+
898 #endif
+
899  }
+
900 
+
901  protected:
+
903  size_t _strip_calls;
+
905  const std::map<level,std::string> _level_word;
+
907  std::map<std::string,level> _word_level;
+
909  std::map<level,std::string> _level_short;
+
911  std::map<level,fmt> _level_fmt;
+
913  std::string _format_log;
+
915  std::string _format_dump;
+
916  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
917 
+
918  char _hfill_char;
+
920  fmt _hfill_fmt;
+
922  size_t _hfill_max;
+
924  size_t _hfill_min;
+
925  #endif
+
926 
+
927  std::ostream* _out;
+
928  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
929 
+
930  size_t _depth;
+
932  std::string _depth_mark;
+
933  #endif
+
934 
+ +
937  std::regex _in_file;
+
939  std::regex _in_func;
+
941  std::regex _in_line;
+
942 
+
944  std::vector<fmt> _filehash_fmts;
+
946  std::vector<fmt> _funchash_fmts;
+
947 
+
948 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
949 
-
951  void format_comment(const std::string& format) {_format_dump = format;}
-
953  std::string format_comment() const {return _format_dump;}
+
950  static const size_t _max_buffer = 4096;
+
952  std::vector<fmt> _depth_fmts;
+
953 #endif
954 
-
956  void out(std::ostream& out) {_out = &out;}
-
958  std::ostream& out() {return *_out;}
+
955 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
956 
+
957  size_t _nb_columns;
+
958 #endif
959 
-
960 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
961  void depth(size_t d) {_depth = d;}
-
964  size_t depth() const {return _depth;}
-
965 
-
967  void depth_mark(const std::string mark) {_depth_mark = mark;}
-
969  std::string depth_mark() const {return _depth_mark;}
+
961  public:
+
962 
+
966  void format(const std::string& format) {_format_log = format;}
+
969  std::string format() const {return _format_log;}
970 
-
972  void strip_calls(const size_t n) {_strip_calls = n;}
-
974  size_t strip_calls() const {return _strip_calls;}
-
975 #endif
-
976 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
977  void hfill_mark(const char mark) {_hfill_char = mark;}
-
980  char hfill_mark() const {return _hfill_char;}
-
982  void hfill_style(fmt style) {_hfill_fmt = style;}
-
987  template<class ... FMT>
-
988  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
-
990  fmt hfill_style() const {return _hfill_fmt;}
-
992  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
-
994  size_t hfill_max() {return _hfill_max;}
-
996  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
-
998  size_t hfill_min() {return _hfill_min;}
-
999 #endif
-
1000 
-
1002  void threshold(level l) {_stage = l;}
-
1004  void threshold(const std::string& l) {_stage = this->level_of(l);}
-
1006  level threshold() const {return _stage;}
-
1008  const std::map<std::string,level>& levels() const { return _word_level;}
-
1009 
-
1014  level level_of(const std::string name)
-
1015  {
-
1016  const auto ilevel = _word_level.find(name);
-
1017  if( ilevel != std::end(_word_level)) {
-
1018  return ilevel->second;
-
1019  } else {
-
1020  throw std::out_of_range("'" + name + "' is not a valid log level name");
-
1021  }
-
1022  }
-
1023 
-
1025  void file(std::string file) {_in_file = file;}
-
1027  void func(std::string func) {_in_func = func;}
-
1029  void line(std::string line) {_in_line = line;}
-
1030 
-
1032  void location(
-
1033  const std::string& in_file,
-
1034  const std::string& in_function=".*",
-
1035  const std::string& in_line=".*"
-
1036  )
-
1037  {
-
1038  file(in_file);
-
1039  func(in_function);
-
1040  line(in_line);
-
1041  }
-
1042 
-
1047  template<class ... FMT>
-
1048  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
-
1050  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
-
1052  fmt style(level stage) const { return _level_fmt.at(stage); }
-
1053 
-
1056  public:
-
1057 
-
1061  struct scope_t {
-
1064  bool matches;
- -
1067 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1068 
-
1069  size_t depth;
-
1070 #endif
-
1071 
-
1072  bool there;
- -
1075  matches(false),
-
1076  stage(level::xdebug),
- -
1078  depth(0),
-
1079 #endif
-
1080  there(false)
-
1081  {}
-
1082  }; // scope_t
-
1083 
-
1084 
- -
1087  const level& stage,
-
1088  const std::string& file,
-
1089  const std::string& func,
-
1090  const size_t line
-
1091  ) const
-
1092  {
-
1093  scope_t scope; // False scope by default.
-
1094 
-
1095  /***** Log level stage *****/
-
1096  // Test stage first, because it's fastest.
-
1097  scope.stage = stage;
-
1098  if(not (scope.stage <= _stage)) {
-
1099  // Bypass useless computations if no match
-
1100  // because of the stage.
-
1101  return scope;
-
1102  }
-
1103 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1104  /***** Stack depth *****/
-
1105  // Backtrace in second, quite fast.
-
1106  size_t stack_depth;
-
1107  void *buffer[_max_buffer];
-
1108  stack_depth = backtrace(buffer, _max_buffer);
-
1109  scope.depth = stack_depth;
-
1110  if(not (scope.depth <= _depth + _strip_calls)) {
-
1111  // Bypass if no match.
-
1112  return scope;
-
1113  }
-
1114 #endif
-
1115 
-
1116  /***** Location *****/
-
1117  // Location last, slowest.
-
1118  std::ostringstream sline; sline << line;
-
1119  scope.there =
-
1120  std::regex_search(file, _in_file)
-
1121  and std::regex_search(func, _in_func)
-
1122  and std::regex_search(sline.str(), _in_line);
-
1123 
-
1124  // No need to retest stage and depth, which are true here.
-
1125  scope.matches = scope.there;
-
1126 
-
1127  return scope;
-
1128  } // locate
+
972  void format_comment(const std::string& format) {_format_dump = format;}
+
974  std::string format_comment() const {return _format_dump;}
+
975 
+
977  void out(std::ostream& out) {_out = &out;}
+
979  std::ostream& out() {return *_out;}
+
980 
+
981 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
982  void depth(size_t d) {_depth = d;}
+
985  size_t depth() const {return _depth;}
+
986 
+
988  void depth_mark(const std::string mark) {_depth_mark = mark;}
+
990  std::string depth_mark() const {return _depth_mark;}
+
991 
+
993  void strip_calls(const size_t n) {_strip_calls = n;}
+
995  size_t strip_calls() const {return _strip_calls;}
+
996 #endif
+
997 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
998  void hfill_mark(const char mark) {_hfill_char = mark;}
+
1001  char hfill_mark() const {return _hfill_char;}
+
1003  void hfill_style(fmt style) {_hfill_fmt = style;}
+
1008  template<class ... FMT>
+
1009  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
+
1011  fmt hfill_style() const {return _hfill_fmt;}
+
1013  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
+
1015  size_t hfill_max() {return _hfill_max;}
+
1017  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
+
1019  size_t hfill_min() {return _hfill_min;}
+
1020 #endif
+
1021 
+
1028  void filehash_styles(std::vector<fmt> styles) {_filehash_fmts = styles;}
+
1036  void funchash_styles(std::vector<fmt> styles) {_funchash_fmts = styles;}
+
1045  void depth_styles(std::vector<fmt> styles) {_depth_fmts = styles;}
+
1046 
+
1048  void threshold(level l) {_stage = l;}
+
1050  void threshold(const std::string& l) {_stage = this->level_of(l);}
+
1052  level threshold() const {return _stage;}
+
1054  const std::map<std::string,level>& levels() const { return _word_level;}
+
1055 
+
1060  level level_of(const std::string name)
+
1061  {
+
1062  const auto ilevel = _word_level.find(name);
+
1063  if( ilevel != std::end(_word_level)) {
+
1064  return ilevel->second;
+
1065  } else {
+
1066  throw std::out_of_range("'" + name + "' is not a valid log level name");
+
1067  }
+
1068  }
+
1069 
+
1071  void file(std::string file) {_in_file = file;}
+
1073  void func(std::string func) {_in_func = func;}
+
1075  void line(std::string line) {_in_line = line;}
+
1076 
+
1078  void location(
+
1079  const std::string& in_file,
+
1080  const std::string& in_function=".*",
+
1081  const std::string& in_line=".*"
+
1082  )
+
1083  {
+
1084  file(in_file);
+
1085  func(in_function);
+
1086  line(in_line);
+
1087  }
+
1088 
+
1093  template<class ... FMT>
+
1094  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
+
1096  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
+
1098  fmt style(level stage) const { return _level_fmt.at(stage); }
+
1099 
+
1102  public:
+
1103 
+
1107  struct scope_t {
+
1110  bool matches;
+ +
1113 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1114 
+
1115  size_t depth;
+
1116 #endif
+
1117 
+
1118  bool there;
+ +
1121  matches(false),
+
1122  stage(level::xdebug),
+ +
1124  depth(0),
+
1125 #endif
+
1126  there(false)
+
1127  {}
+
1128  }; // scope_t
1129 
-
1137  std::string replace(
-
1138  const std::string& form,
-
1139  const std::string& mark,
-
1140  const std::string& tag
-
1141  ) const
-
1142  {
-
1143  // Useless debug code, unless something fancy would be done with name tags.
-
1144  // std::regex re;
-
1145  // try {
-
1146  // re = std::regex(mark);
-
1147  //
-
1148  // } catch(const std::regex_error& e) {
-
1149  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
-
1150  // switch(e.code()) {
-
1151  // case std::regex_constants::error_collate:
-
1152  // std::cerr << "the expression contains an invalid collating element name";
-
1153  // break;
-
1154  // case std::regex_constants::error_ctype:
-
1155  // std::cerr << "the expression contains an invalid character class name";
-
1156  // break;
-
1157  // case std::regex_constants::error_escape:
-
1158  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
-
1159  // break;
-
1160  // case std::regex_constants::error_backref:
-
1161  // std::cerr << "the expression contains an invalid back reference";
-
1162  // break;
-
1163  // case std::regex_constants::error_brack:
-
1164  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
-
1165  // break;
-
1166  // case std::regex_constants::error_paren:
-
1167  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
-
1168  // break;
-
1169  // case std::regex_constants::error_brace:
-
1170  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
-
1171  // break;
-
1172  // case std::regex_constants::error_badbrace:
-
1173  // std::cerr << "the expression contains an invalid range in a {} expression";
-
1174  // break;
-
1175  // case std::regex_constants::error_range:
-
1176  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
-
1177  // break;
-
1178  // case std::regex_constants::error_space:
-
1179  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
-
1180  // break;
-
1181  // case std::regex_constants::error_badrepeat:
-
1182  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
-
1183  // break;
-
1184  // case std::regex_constants::error_complexity:
-
1185  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
-
1186  // break;
-
1187  // case std::regex_constants::error_stack:
-
1188  // std::cerr << "there was not enough memory to perform a match";
-
1189  // break;
-
1190  // default:
-
1191  // std::cerr << "unknown error";
-
1192  // }
-
1193  // std::cerr << std::endl;
-
1194  // throw;
-
1195  // } // catch
-
1196 
-
1197  const std::regex re(mark);
-
1198  return std::regex_replace(form, re, tag);
-
1199  }
-
1200 
-
1202  std::string replace(
-
1203  const std::string& form,
-
1204  const std::string& mark,
-
1205  const size_t tag
-
1206  ) const
-
1207  {
-
1208  std::ostringstream stag; stag << tag;
-
1209  return replace(form, mark, stag.str());
-
1210  }
-
1211 
-
1213  std::string format(
-
1214  std::string row,
-
1215  const std::string& what,
- -
1217  const std::string& name,
-
1218 #endif
-
1219  const level& stage,
-
1220  const std::string& file,
-
1221  const std::string& func,
-
1222  const size_t line
- -
1224  ,
-
1225  const size_t depth
-
1226 #endif
-
1227  ) const
-
1228  {
-
1229  row = replace(row, "\\{msg\\}", what);
-
1230  row = replace(row, "\\{file\\}", file);
-
1231  row = replace(row, "\\{func\\}", func);
-
1232  row = replace(row, "\\{line\\}", line);
-
1233 
-
1234  row = replace(row, "\\{level\\}", _level_word.at(stage));
-
1235  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
-
1236  row = replace(row, "\\{level_letter\\}", letter);
-
1237 
-
1238  row = replace(row, "\\{level_short\\}", _level_short.at(stage));
-
1239 
-
1240 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1241  row = replace(row, "\\{name\\}", name);
-
1242  row = replace(row, "\\{depth\\}", depth - _strip_calls);
-
1243 
-
1244  std::ostringstream chevrons;
-
1245  for(size_t i = _strip_calls; i < depth; ++i) {
-
1246  chevrons << _depth_mark;
-
1247  }
-
1248  row = replace(row, "\\{depth_marks\\}", chevrons.str());
-
1249 #endif
-
1250 
-
1251  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
-
1252 
-
1253 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
1254  // hfill is replaced last to allow for correct line width estimation.
-
1255  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
-
1256  const std::string hfill_tag = "{hfill}";
-
1257  const size_t hfill_pos = row.find(hfill_tag);
-
1258  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
-
1259  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
-
1260  if(hfill_pos != std::string::npos) {
-
1261  assert(raw_hfill_pos != std::string::npos);
-
1262  if(nb_columns > 0) {
-
1263  const size_t left_len = raw_hfill_pos;
-
1264  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
-
1265  if(right_len+left_len > nb_columns) {
-
1266  // The right part would go over the terminal width: add a new row.
-
1267  if(right_len < nb_columns) {
-
1268  // There is room for the right part on a new line.
-
1269  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
-
1270  const std::string hfill_styled = _hfill_fmt(hfill);
-
1271  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
-
1272  } else {
-
1273  // Right part still goes over columns: let it go.
-
1274  const std::string hfill(1, _hfill_char);
-
1275  const std::string hfill_styled = _hfill_fmt(hfill);
-
1276  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
-
1277  }
-
1278  } else {
-
1279  // There is some space in between left and right parts.
-
1280  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
-
1281  const std::string hfill_styled = _hfill_fmt(hfill);
-
1282  row = replace(row, "\\{hfill\\}", hfill_styled);
-
1283  }
-
1284  } else {
-
1285  // We don't know the terminal width.
-
1286  const std::string hfill(1, _hfill_char);
-
1287  const std::string hfill_styled = _hfill_fmt(hfill);
-
1288  row = replace(row, "\\{hfill\\}", hfill_styled);
-
1289  }
-
1290  }
-
1291 #else
-
1292  // We cannot know the terminal width.
-
1293  const std::string hfill(1, _hfill_char);
-
1294  const std::string hfill_styled = _hfill_fmt(hfill);
-
1295  row = replace(row, "\\{hfill\\}", hfill_styled);
-
1296 #endif
-
1297  return _level_fmt.at(stage)(row);
-
1298  }
-
1299 
-
1301  void log(
-
1302  const level& stage,
-
1303  const std::string& what,
-
1304  const std::string& file, const std::string& func, size_t line
-
1305  ) const
-
1306  {
-
1307  scope_t scope = locate(stage, file, func, line);
-
1308 
-
1309  if(scope.matches) {
-
1310 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1311  *_out << format(_format_log, what, basename(getenv("_")),
-
1312  stage, file, func,
-
1313  line, scope.depth );
-
1314 #else
-
1315  *_out << format(_format_log, what,
-
1316  stage, file, func,
-
1317  line );
-
1318 
-
1319 #endif
-
1320  _out->flush();
-
1321  } // if scopes.matches
-
1322  }
-
1323 
-
1325  template<class In>
-
1326  void dump(
-
1327  const level& stage,
-
1328  const In container_begin, const In container_end,
-
1329  const std::string& file, const std::string& func, size_t line,
-
1330  const std::string& filename_template = "dump_{n}.dat",
-
1331  const std::string sep = dump_default_sep
-
1332  ) const
-
1333  {
-
1334  scope_t scope = locate(stage, file, func, line);
-
1335 
-
1336  if(scope.matches) {
-
1337  const std::string tag = "\\{n\\}";
-
1338  const std::regex re(tag);
-
1339  std::string outfile = "";
-
1340 
-
1341  // If the file name template has the {n} tag.
-
1342  if(std::regex_search(filename_template, re)) {
-
1343  // Increment n until a free one is found.
-
1344  size_t n = 0;
-
1345  do {
-
1346  outfile = replace(filename_template, tag, n);
-
1347  n++;
-
1348  } while( fs::exists( outfile ) );
-
1349 
-
1350  } else {
-
1351  // Use the parameter as is.
-
1352  outfile = filename_template;
-
1353  }
+
1130 
+ +
1133  const level& stage,
+
1134  const std::string& file,
+
1135  const std::string& func,
+
1136  const size_t line
+
1137  ) const
+
1138  {
+
1139  scope_t scope; // False scope by default.
+
1140 
+
1141  /***** Log level stage *****/
+
1142  // Test stage first, because it's fastest.
+
1143  scope.stage = stage;
+
1144  if(not (scope.stage <= _stage)) {
+
1145  // Bypass useless computations if no match
+
1146  // because of the stage.
+
1147  return scope;
+
1148  }
+
1149 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1150  /***** Stack depth *****/
+
1151  // Backtrace in second, quite fast.
+
1152  size_t stack_depth;
+
1153  void *buffer[_max_buffer];
+
1154  stack_depth = backtrace(buffer, _max_buffer);
+
1155  scope.depth = stack_depth;
+
1156  if(not (scope.depth <= _depth + _strip_calls)) {
+
1157  // Bypass if no match.
+
1158  return scope;
+
1159  }
+
1160 #endif
+
1161 
+
1162  /***** Location *****/
+
1163  // Location last, slowest.
+
1164  std::ostringstream sline; sline << line;
+
1165  scope.there =
+
1166  std::regex_search(file, _in_file)
+
1167  and std::regex_search(func, _in_func)
+
1168  and std::regex_search(sline.str(), _in_line);
+
1169 
+
1170  // No need to retest stage and depth, which are true here.
+
1171  scope.matches = scope.there;
+
1172 
+
1173  return scope;
+
1174  } // locate
+
1175 
+
1183  std::string replace(
+
1184  const std::string& form,
+
1185  const std::string& mark,
+
1186  const std::string& tag
+
1187  ) const
+
1188  {
+
1189  // Useless debug code, unless something fancy would be done with name tags.
+
1190  // std::regex re;
+
1191  // try {
+
1192  // re = std::regex(mark);
+
1193  //
+
1194  // } catch(const std::regex_error& e) {
+
1195  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
+
1196  // switch(e.code()) {
+
1197  // case std::regex_constants::error_collate:
+
1198  // std::cerr << "the expression contains an invalid collating element name";
+
1199  // break;
+
1200  // case std::regex_constants::error_ctype:
+
1201  // std::cerr << "the expression contains an invalid character class name";
+
1202  // break;
+
1203  // case std::regex_constants::error_escape:
+
1204  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
+
1205  // break;
+
1206  // case std::regex_constants::error_backref:
+
1207  // std::cerr << "the expression contains an invalid back reference";
+
1208  // break;
+
1209  // case std::regex_constants::error_brack:
+
1210  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
+
1211  // break;
+
1212  // case std::regex_constants::error_paren:
+
1213  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
+
1214  // break;
+
1215  // case std::regex_constants::error_brace:
+
1216  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
+
1217  // break;
+
1218  // case std::regex_constants::error_badbrace:
+
1219  // std::cerr << "the expression contains an invalid range in a {} expression";
+
1220  // break;
+
1221  // case std::regex_constants::error_range:
+
1222  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
+
1223  // break;
+
1224  // case std::regex_constants::error_space:
+
1225  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
+
1226  // break;
+
1227  // case std::regex_constants::error_badrepeat:
+
1228  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
+
1229  // break;
+
1230  // case std::regex_constants::error_complexity:
+
1231  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
+
1232  // break;
+
1233  // case std::regex_constants::error_stack:
+
1234  // std::cerr << "there was not enough memory to perform a match";
+
1235  // break;
+
1236  // default:
+
1237  // std::cerr << "unknown error";
+
1238  // }
+
1239  // std::cerr << std::endl;
+
1240  // throw;
+
1241  // } // catch
+
1242 
+
1243  const std::regex re(mark);
+
1244  return std::regex_replace(form, re, tag);
+
1245  }
+
1246 
+
1248  std::string replace(
+
1249  const std::string& form,
+
1250  const std::string& mark,
+
1251  const size_t tag
+
1252  ) const
+
1253  {
+
1254  std::ostringstream stag; stag << tag;
+
1255  return replace(form, mark, stag.str());
+
1256  }
+
1257 
+
1259  std::string format(
+
1260  std::string row,
+
1261  const std::string& what,
+ +
1263  const std::string& name,
+
1264 #endif
+
1265  const level& stage,
+
1266  const std::string& file,
+
1267  const std::string& func,
+
1268  const size_t line
+ +
1270  ,
+
1271  const size_t depth
+
1272 #endif
+
1273  ) const
+
1274  {
+
1275  row = replace(row, "\\{msg\\}", what);
+
1276  row = replace(row, "\\{file\\}", file);
+
1277  row = replace(row, "\\{func\\}", func);
+
1278  row = replace(row, "\\{line\\}", line);
+
1279 
+
1280  row = replace(row, "\\{level\\}", _level_word.at(stage));
+
1281  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
+
1282  row = replace(row, "\\{level_letter\\}", letter);
+
1283 
+
1284  row = replace(row, "\\{level_short\\}", _level_short.at(stage));
+
1285 
+
1286 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1287  size_t actual_depth = depth - _strip_calls;
+
1288  row = replace(row, "\\{name\\}", name);
+
1289  row = replace(row, "\\{depth\\}", actual_depth);
+
1290 
+
1291  std::ostringstream chevrons;
+
1292  for(size_t i = _strip_calls; i < depth; ++i) {
+
1293  chevrons << _depth_mark;
+
1294  }
+
1295  row = replace(row, "\\{depth_marks\\}", chevrons.str());
+
1296 
+
1297  if(_depth_fmts.size() == 0) {
+
1298  row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() );
+
1299  } else {
+
1300  row = replace(row, "\\{depth_fmt\\}",
+
1301  _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() );
+
1302  }
+
1303 #endif
+
1304  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
+
1305  row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() );
+
1306  row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() );
+
1307 
+
1308 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
1309  // hfill is replaced last to allow for correct line width estimation.
+
1310  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
+
1311  const std::string hfill_tag = "{hfill}";
+
1312  const size_t hfill_pos = row.find(hfill_tag);
+
1313  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
+
1314  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
+
1315  if(hfill_pos != std::string::npos) {
+
1316  assert(raw_hfill_pos != std::string::npos);
+
1317  if(nb_columns > 0) {
+
1318  const size_t left_len = raw_hfill_pos;
+
1319  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
+
1320  if(right_len+left_len > nb_columns) {
+
1321  // The right part would go over the terminal width: add a new row.
+
1322  if(right_len < nb_columns) {
+
1323  // There is room for the right part on a new line.
+
1324  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
+
1325  const std::string hfill_styled = _hfill_fmt(hfill);
+
1326  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
+
1327  } else {
+
1328  // Right part still goes over columns: let it go.
+
1329  const std::string hfill(1, _hfill_char);
+
1330  const std::string hfill_styled = _hfill_fmt(hfill);
+
1331  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
+
1332  }
+
1333  } else {
+
1334  // There is some space in between left and right parts.
+
1335  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
+
1336  const std::string hfill_styled = _hfill_fmt(hfill);
+
1337  row = replace(row, "\\{hfill\\}", hfill_styled);
+
1338  }
+
1339  } else {
+
1340  // We don't know the terminal width.
+
1341  const std::string hfill(1, _hfill_char);
+
1342  const std::string hfill_styled = _hfill_fmt(hfill);
+
1343  row = replace(row, "\\{hfill\\}", hfill_styled);
+
1344  }
+
1345  }
+
1346 #else
+
1347  // We cannot know the terminal width.
+
1348  const std::string hfill(1, _hfill_char);
+
1349  const std::string hfill_styled = _hfill_fmt(hfill);
+
1350  row = replace(row, "\\{hfill\\}", hfill_styled);
+
1351 #endif
+
1352  return _level_fmt.at(stage)(row);
+
1353  }
1354 
-
1355  std::ofstream fd(outfile);
-
1356 
-
1357  if(_format_dump.size() > 0) {
-
1358 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1359  fd << format(_format_dump, "", basename(getenv("_")),
-
1360  stage, file, func,
-
1361  line, scope.depth );
-
1362 #else
-
1363  fd << format(_format_dump, "",
-
1364  stage, file, func,
-
1365  line );
-
1366 #endif
-
1367  fd << sep; // sep after comment line.
-
1368  }
-
1369 
-
1370  std::copy(container_begin, container_end,
-
1371  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
-
1372 
-
1373  fd.close();
-
1374  } // if scopes.matches
-
1375  }
-
1376 
-
1378 };
-
1379 
-
1382 #else // not WITH_CLUTCHLOG
-
1383 
-
1384 
-
1385 /**********************************************************************
-
1386  * Fake implementation
-
1387  **********************************************************************/
-
1388 
-
1389 // Equivalent class with empty methods, will be optimized out
-
1390 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
-
1391 #pragma GCC diagnostic push
-
1392 #pragma GCC diagnostic ignored "-Wreturn-type"
-
1393 class clutchlog
-
1394 {
-
1395  public:
-
1396  static clutchlog& logger() {}
-
1397  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
-
1398  class fmt {
-
1399  public:
-
1400  enum class ansi { colors_16, colors_256, colors_16M} mode;
-
1401  enum class typo { reset, bold, underline, inverse, none} style;
-
1402  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
-
1403  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
-
1404  protected:
-
1405  friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
-
1406  friend std::ostream& operator<<(std::ostream&, const typo&) {}
-
1407  protected:
-
1408  struct color {
-
1409  ansi mode;
-
1410  enum class ground { fore, back } type;
-
1411  color(ansi a, ground g) : mode(a), type(g) {}
-
1412  virtual bool is_set() const = 0;
-
1413  virtual std::ostream& print_on( std::ostream&) const = 0;
-
1414  friend std::ostream& operator<<(std::ostream&, const color&) {}
-
1415  };
-
1416  struct color_256 : public color {
-
1417  short index;
-
1418  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
-
1419  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
-
1420  bool is_set() const {}
-
1421  std::ostream& print_on( std::ostream&) const {}
-
1422  };
-
1423  struct fg_256 : public color_256 {
-
1424  fg_256() : color_256(ground::fore) {}
-
1425  fg_256(const short f) : color_256(ground::fore, f) {}
-
1426  fg_256(const fg&) : color_256(ground::fore, -1) {}
-
1427  } fore_256;
-
1428  struct bg_256 : public color_256 {
-
1429  bg_256() : color_256(ground::back) {}
-
1430  bg_256(const short b) : color_256(ground::back, b) {}
-
1431  bg_256(const bg&) : color_256(ground::back, -1) {}
-
1432  } back_256;
-
1433  struct color_16M : public color {
-
1434  short red, green, blue;
-
1435  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
-
1436  color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
-
1437  color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
-
1438  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
-
1439  std::ostream& print_on( std::ostream&) const {}
-
1440  };
-
1441  struct fg_16M : public color_16M {
-
1442  fg_16M() : color_16M(ground::fore) {}
-
1443  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
-
1444  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
-
1445  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
-
1446  } fore_16M;
-
1447  struct bg_16M : public color_16M {
-
1448  bg_16M() : color_16M(ground::back) {}
-
1449  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
-
1450  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
-
1451  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
-
1452  } back_16M;
-
1453  public:
-
1454  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
-
1455  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1456  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1457  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1458  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1459  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1460  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1461  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
-
1462  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
-
1463  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
-
1464  fmt(const short fr, const short fg, const short fb,
-
1465  const short gr, const short gg, const short gb,
-
1466  typo s = typo::none)
-
1467  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
-
1468  fmt(fg,
-
1469  const short gr, const short gg, const short gb,
-
1470  typo s = typo::none)
-
1471  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
-
1472  fmt(const short fr, const short fg, const short fb,
-
1473  bg, typo s = typo::none)
-
1474  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
-
1475  fmt(const short fr, const short fg, const short fb,
-
1476  typo s = typo::none)
-
1477  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
-
1478 
-
1479  fmt(const std::string& f, const std::string& b, typo s = typo::none)
-
1480  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
-
1481  fmt(fg, const std::string& b, typo s = typo::none)
-
1482  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
-
1483  fmt(const std::string& f, bg, typo s = typo::none)
-
1484  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
-
1485  fmt(const std::string& f, typo s = typo::none)
-
1486  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
-
1487  protected:
-
1488  std::ostream& print_on( std::ostream&) const {}
-
1489  public:
-
1490  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
-
1491  std::string operator()( const std::string&) const {}
-
1492  std::string str() const {}
-
1493  };
-
1494  public:
-
1495  clutchlog(clutchlog const&) = delete;
-
1496  void operator=(clutchlog const&) = delete;
-
1497  private:
-
1498  clutchlog() {}
-
1499  protected:
-
1500  struct scope_t {};
-
1501  scope_t locate(
-
1502  const level&,
-
1503  const std::string&,
-
1504  const std::string&,
-
1505  const size_t
-
1506  ) const
-
1507  {}
-
1508  public:
-
1509  void format(const std::string&) {}
-
1510  std::string format() const {}
-
1511 
-
1512  void format_comment(const std::string&) {}
-
1513  std::string format_comment() const {}
-
1514 
-
1515  void out(std::ostream&) {}
-
1516  std::ostream& out() {}
-
1517 
-
1518 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1519  void depth(size_t) {}
-
1520  size_t depth() const {}
-
1521 
-
1522  void depth_mark(const std::string) {}
-
1523  std::string depth_mark() const {}
-
1524  void strip_calls(const size_t) {}
-
1525  size_t strip_calls() const {}
-
1526 #endif
-
1527 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
1528  void hfill_mark(const char) {}
-
1529  char hfill_mark() const {}
-
1530  void hfill_fmt(fmt) {}
-
1531  fmt hfill_fmt() const {}
-
1532  void hfill_min(const size_t) {}
-
1533  size_t hfill_min() {}
-
1534  void hfill_max(const size_t) {}
-
1535  size_t hfill_max() {}
-
1536 #endif
-
1537 
-
1538  void threshold(level) {}
-
1539  void threshold(const std::string&) {}
-
1540  level threshold() const {}
-
1541  const std::map<std::string,level> levels() const {}
-
1542  level level_of(const std::string) {}
-
1543 
-
1544  void file(std::string) {}
-
1545  void func(std::string) {}
-
1546  void line(std::string) {}
-
1547 
-
1548 #pragma GCC diagnostic push
-
1549 #pragma GCC diagnostic ignored "-Wunused-parameter"
-
1550  void location(
-
1551  const std::string&,
-
1552  const std::string& in_function=".*",
-
1553  const std::string& in_line=".*"
-
1554  )
-
1555  {}
-
1556 #pragma GCC diagnostic pop
-
1557  template<class ... FMT>
-
1558  void style(level, FMT...) {}
-
1559  void style(level, fmt) {}
-
1560  fmt style(level) const {}
-
1561  public:
-
1562  std::string replace(
-
1563  const std::string&,
-
1564  const std::string&,
-
1565  const std::string&
-
1566  ) const
-
1567  {}
-
1568 
-
1569  std::string replace(
-
1570  const std::string&,
-
1571  const std::string&,
-
1572  const size_t
-
1573  ) const
-
1574  {}
-
1575 
-
1576  std::string format(
-
1577  std::string,
-
1578  const std::string&,
- -
1580  const std::string&,
-
1581 #endif
-
1582  const level&,
-
1583  const std::string&,
-
1584  const std::string&,
-
1585  const size_t
- -
1587  ,
-
1588  const size_t
-
1589 #endif
-
1590  ) const
-
1591  {}
-
1592 
-
1593  void log(
-
1594  const level&,
-
1595  const std::string&,
-
1596  const std::string&, const std::string&, size_t
-
1597  ) const
-
1598  {}
-
1599 
-
1600  template<class In>
-
1601  void dump(
-
1602  const level&,
-
1603  const In, const In,
-
1604  const std::string&, const std::string&, size_t,
-
1605  const std::string&,
-
1606  const std::string
-
1607  ) const
-
1608  {}
-
1609 };
-
1610 #pragma GCC diagnostic pop
-
1611 #endif // WITH_CLUTCHLOG
-
1612 
-
1613 #endif // CLUTCHLOG_H
+
1356  void log(
+
1357  const level& stage,
+
1358  const std::string& what,
+
1359  const std::string& file, const std::string& func, size_t line
+
1360  ) const
+
1361  {
+
1362  scope_t scope = locate(stage, file, func, line);
+
1363 
+
1364  if(scope.matches) {
+
1365 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1366  *_out << format(_format_log, what, basename(getenv("_")),
+
1367  stage, file, func,
+
1368  line, scope.depth );
+
1369 #else
+
1370  *_out << format(_format_log, what,
+
1371  stage, file, func,
+
1372  line );
+
1373 
+
1374 #endif
+
1375  _out->flush();
+
1376  } // if scopes.matches
+
1377  }
+
1378 
+
1380  template<class In>
+
1381  void dump(
+
1382  const level& stage,
+
1383  const In container_begin, const In container_end,
+
1384  const std::string& file, const std::string& func, size_t line,
+
1385  const std::string& filename_template = "dump_{n}.dat",
+
1386  const std::string sep = dump_default_sep
+
1387  ) const
+
1388  {
+
1389  scope_t scope = locate(stage, file, func, line);
+
1390 
+
1391  if(scope.matches) {
+
1392  const std::string tag = "\\{n\\}";
+
1393  const std::regex re(tag);
+
1394  std::string outfile = "";
+
1395 
+
1396  // If the file name template has the {n} tag.
+
1397  if(std::regex_search(filename_template, re)) {
+
1398  // Increment n until a free one is found.
+
1399  size_t n = 0;
+
1400  do {
+
1401  outfile = replace(filename_template, tag, n);
+
1402  n++;
+
1403  } while( fs::exists( outfile ) );
+
1404 
+
1405  } else {
+
1406  // Use the parameter as is.
+
1407  outfile = filename_template;
+
1408  }
+
1409 
+
1410  std::ofstream fd(outfile);
+
1411 
+
1412  if(_format_dump.size() > 0) {
+
1413 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1414  fd << format(_format_dump, "", basename(getenv("_")),
+
1415  stage, file, func,
+
1416  line, scope.depth );
+
1417 #else
+
1418  fd << format(_format_dump, "",
+
1419  stage, file, func,
+
1420  line );
+
1421 #endif
+
1422  fd << sep; // sep after comment line.
+
1423  }
+
1424 
+
1425  std::copy(container_begin, container_end,
+
1426  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
+
1427 
+
1428  fd.close();
+
1429  } // if scopes.matches
+
1430  }
+
1431 
+
1433 };
+
1434 
+
1437 #else // not WITH_CLUTCHLOG
+
1438 
+
1439 
+
1440 /**********************************************************************
+
1441  * Fake implementation
+
1442  **********************************************************************/
+
1443 
+
1444 // Equivalent class with empty methods, will be optimized out
+
1445 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
+
1446 #pragma GCC diagnostic push
+
1447 #pragma GCC diagnostic ignored "-Wreturn-type"
+
1448 class clutchlog
+
1449 {
+
1450  public:
+
1451  static clutchlog& logger() {}
+
1452  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
+
1453  class fmt {
+
1454  public:
+
1455  enum class ansi { colors_16, colors_256, colors_16M} mode;
+
1456  enum class typo { reset, bold, underline, inverse, none} style;
+
1457  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
+
1458  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
+
1459  protected:
+
1460  friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
+
1461  friend std::ostream& operator<<(std::ostream&, const typo&) {}
+
1462  protected:
+
1463  struct color {
+
1464  ansi mode;
+
1465  enum class ground { fore, back } type;
+
1466  color(ansi a, ground g) : mode(a), type(g) {}
+
1467  virtual bool is_set() const = 0;
+
1468  virtual std::ostream& print_on( std::ostream&) const = 0;
+
1469  friend std::ostream& operator<<(std::ostream&, const color&) {}
+
1470  };
+
1471  struct color_256 : public color {
+
1472  short index;
+
1473  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
+
1474  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
+
1475  bool is_set() const {}
+
1476  std::ostream& print_on( std::ostream&) const {}
+
1477  };
+
1478  struct fg_256 : public color_256 {
+
1479  fg_256() : color_256(ground::fore) {}
+
1480  fg_256(const short f) : color_256(ground::fore, f) {}
+
1481  fg_256(const fg&) : color_256(ground::fore, -1) {}
+
1482  } fore_256;
+
1483  struct bg_256 : public color_256 {
+
1484  bg_256() : color_256(ground::back) {}
+
1485  bg_256(const short b) : color_256(ground::back, b) {}
+
1486  bg_256(const bg&) : color_256(ground::back, -1) {}
+
1487  } back_256;
+
1488  struct color_16M : public color {
+
1489  short red, green, blue;
+
1490  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
+
1491  color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
+
1492  color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
+
1493  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
+
1494  std::ostream& print_on( std::ostream&) const {}
+
1495  };
+
1496  struct fg_16M : public color_16M {
+
1497  fg_16M() : color_16M(ground::fore) {}
+
1498  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
+
1499  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
+
1500  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
+
1501  } fore_16M;
+
1502  struct bg_16M : public color_16M {
+
1503  bg_16M() : color_16M(ground::back) {}
+
1504  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
+
1505  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
+
1506  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
+
1507  } back_16M;
+
1508  public:
+
1509  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
+
1510  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1511  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1512  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1513  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1514  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1515  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1516  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
+
1517  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
+
1518  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
+
1519  fmt(const short fr, const short fg, const short fb,
+
1520  const short gr, const short gg, const short gb,
+
1521  typo s = typo::none)
+
1522  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
+
1523  fmt(fg,
+
1524  const short gr, const short gg, const short gb,
+
1525  typo s = typo::none)
+
1526  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
+
1527  fmt(const short fr, const short fg, const short fb,
+
1528  bg, typo s = typo::none)
+
1529  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
+
1530  fmt(const short fr, const short fg, const short fb,
+
1531  typo s = typo::none)
+
1532  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
+
1533 
+
1534  fmt(const std::string& f, const std::string& b, typo s = typo::none)
+
1535  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
+
1536  fmt(fg, const std::string& b, typo s = typo::none)
+
1537  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
+
1538  fmt(const std::string& f, bg, typo s = typo::none)
+
1539  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
+
1540  fmt(const std::string& f, typo s = typo::none)
+
1541  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
+
1542  protected:
+
1543  std::ostream& print_on( std::ostream&) const {}
+
1544  public:
+
1545  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
+
1546  std::string operator()( const std::string&) const {}
+
1547  std::string str() const {}
+
1548  static fmt hash( const std::string&, const std::vector<fmt>) {}
+
1549  };
+
1550  public:
+
1551  clutchlog(clutchlog const&) = delete;
+
1552  void operator=(clutchlog const&) = delete;
+
1553  private:
+
1554  clutchlog() {}
+
1555  protected:
+
1556  struct scope_t {};
+
1557  scope_t locate(
+
1558  const level&,
+
1559  const std::string&,
+
1560  const std::string&,
+
1561  const size_t
+
1562  ) const
+
1563  {}
+
1564  public:
+
1565  void format(const std::string&) {}
+
1566  std::string format() const {}
+
1567 
+
1568  void format_comment(const std::string&) {}
+
1569  std::string format_comment() const {}
+
1570 
+
1571  void out(std::ostream&) {}
+
1572  std::ostream& out() {}
+
1573 
+
1574 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1575  void depth(size_t) {}
+
1576  size_t depth() const {}
+
1577 
+
1578  void depth_mark(const std::string) {}
+
1579  std::string depth_mark() const {}
+
1580  void strip_calls(const size_t) {}
+
1581  size_t strip_calls() const {}
+
1582 #endif
+
1583 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
1584  void hfill_mark(const char) {}
+
1585  char hfill_mark() const {}
+
1586  void hfill_fmt(fmt) {}
+
1587  fmt hfill_fmt() const {}
+
1588  void hfill_min(const size_t) {}
+
1589  size_t hfill_min() {}
+
1590  void hfill_max(const size_t) {}
+
1591  size_t hfill_max() {}
+
1592 #endif
+
1593  void filehash_styles(std::vector<fmt> ) {}
+
1594  void funchash_styles(std::vector<fmt> ) {}
+
1595  void depth_styles(std::vector<fmt>) {}
+
1596 
+
1597  void threshold(level) {}
+
1598  void threshold(const std::string&) {}
+
1599  level threshold() const {}
+
1600  const std::map<std::string,level> levels() const {}
+
1601  level level_of(const std::string) {}
+
1602 
+
1603  void file(std::string) {}
+
1604  void func(std::string) {}
+
1605  void line(std::string) {}
+
1606 
+
1607 #pragma GCC diagnostic push
+
1608 #pragma GCC diagnostic ignored "-Wunused-parameter"
+
1609  void location(
+
1610  const std::string&,
+
1611  const std::string& in_function=".*",
+
1612  const std::string& in_line=".*"
+
1613  )
+
1614  {}
+
1615 #pragma GCC diagnostic pop
+
1616  template<class ... FMT>
+
1617  void style(level, FMT...) {}
+
1618  void style(level, fmt) {}
+
1619  fmt style(level) const {}
+
1620  public:
+
1621  std::string replace(
+
1622  const std::string&,
+
1623  const std::string&,
+
1624  const std::string&
+
1625  ) const
+
1626  {}
+
1627 
+
1628  std::string replace(
+
1629  const std::string&,
+
1630  const std::string&,
+
1631  const size_t
+
1632  ) const
+
1633  {}
+
1634 
+
1635  std::string format(
+
1636  std::string,
+
1637  const std::string&,
+ +
1639  const std::string&,
+
1640 #endif
+
1641  const level&,
+
1642  const std::string&,
+
1643  const std::string&,
+
1644  const size_t
+ +
1646  ,
+
1647  const size_t
+
1648 #endif
+
1649  ) const
+
1650  {}
+
1651 
+
1652  void log(
+
1653  const level&,
+
1654  const std::string&,
+
1655  const std::string&, const std::string&, size_t
+
1656  ) const
+
1657  {}
+
1658 
+
1659  template<class In>
+
1660  void dump(
+
1661  const level&,
+
1662  const In, const In,
+
1663  const std::string&, const std::string&, size_t,
+
1664  const std::string&,
+
1665  const std::string
+
1666  ) const
+
1667  {}
+
1668 };
+
1669 #pragma GCC diagnostic pop
+
1670 #endif // WITH_CLUTCHLOG
+
1671 
+
1672 #endif // CLUTCHLOG_H
friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
Output stream operator for a 3-tuple of 16-colors mode tags.
Definition: clutchlog.h:433
static std::string default_depth_mark
Default mark for stack depth.
Definition: clutchlog.h:249
-
std::string _format_log
Current format of the standard output.
Definition: clutchlog.h:899
+
std::string _format_log
Current format of the standard output.
Definition: clutchlog.h:913
color_16M(ground t, const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:601
-
std::map< level, fmt > _level_fmt
Dictionary of level identifier to their format.
Definition: clutchlog.h:897
-
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1301
+
void depth_styles(std::vector< fmt > styles)
Set the styles for value-dependant depth formatting.
Definition: clutchlog.h:1045
+
std::map< level, fmt > _level_fmt
Dictionary of level identifier to their format.
Definition: clutchlog.h:911
+
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1356
enum clutchlog::fmt::bg back
Background color.
+
std::vector< fmt > _funchash_fmts
List of candidate format objects for value-dependant function name styling.
Definition: clutchlog.h:946
std::string str() const
Return the formatting code as a string.
Definition: clutchlog.h:807
Foreground in 256-colors mode.
Definition: clutchlog.h:539
-
void line(std::string line)
Set the regular expression filtering the line location.
Definition: clutchlog.h:1029
+
void line(std::string line)
Set the regular expression filtering the line location.
Definition: clutchlog.h:1075
friend std::ostream & operator<<(std::ostream &os, const color &c)
Print the actually encoded escaped color sequence on the given stream.
Definition: clutchlog.h:493
friend std::ostream & operator<<(std::ostream &os, const typo &s)
Output stream operator for a typo tag alone, in 16-colors mode.
Definition: clutchlog.h:455
static std::string dump_default_format
Default format of the comment line in file dump.
Definition: clutchlog.h:235
-
void out(std::ostream &out)
Set the output stream on which to print.
Definition: clutchlog.h:956
+
void out(std::ostream &out)
Set the output stream on which to print.
Definition: clutchlog.h:977
bool is_set() const
Returns true if the underying representation encodes an existing color.
Definition: clutchlog.h:623
fg_16M(const fg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:659
static std::string dump_default_sep
Default item separator for dump.
Definition: clutchlog.h:242
-
std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
Substitute all tags in the format string with the corresponding information and apply the style corre...
Definition: clutchlog.h:1213
+
std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
Substitute all tags in the format string with the corresponding information and apply the style corre...
Definition: clutchlog.h:1259
Background in 256-colors mode.
Definition: clutchlog.h:556
#define CLUTCHLOG_DEFAULT_DEPTH_MARK
Compile-time default mark for stack depth.
Definition: clutchlog.h:246
static unsigned int default_strip_calls
Number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:256
static size_t default_hfill_min
Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
Definition: clutchlog.h:277
-
std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
Replace mark by tag in form.
Definition: clutchlog.h:1137
+
std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
Replace mark by tag in form.
Definition: clutchlog.h:1183
color_256(ground t)
Constructor.
Definition: clutchlog.h:518
clutchlog::fmt::bg_16M back_16M
Current background in 16M-colors mode.
Interface class for colors representation.
Definition: clutchlog.h:470
@ colors_16
16 colors mode.
background in 256-colors mode.
Definition: clutchlog.h:664
static char default_hfill_char
Default character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:263
-
bool matches
Everything is compatible.
Definition: clutchlog.h:1064
+
bool matches
Everything is compatible.
Definition: clutchlog.h:1110
enum clutchlog::fmt::typo style
Typographic style.
Abstract base class for 16M colors objects (24-bits ANSI).
Definition: clutchlog.h:573
fg_256(const fg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:551
-
void format_comment(const std::string &format)
Set the template string for dumps.
Definition: clutchlog.h:951
+
void format_comment(const std::string &format)
Set the template string for dumps.
Definition: clutchlog.h:972
bg_16M(const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:684
-
void file(std::string file)
Set the regular expression filtering the file location.
Definition: clutchlog.h:1025
-
scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
Gather information on the current location of the call.
Definition: clutchlog.h:1086
+
void file(std::string file)
Set the regular expression filtering the file location.
Definition: clutchlog.h:1071
+
scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
Gather information on the current location of the call.
Definition: clutchlog.h:1132
clutchlog::fmt::fg_16M fore_16M
Current foreground in 16M-colors mode.
Abstract base class for 256 colors objects (8-bits ANSI).
Definition: clutchlog.h:509
fmt()
Empty constructor, only useful for a no-op formatter.
Definition: clutchlog.h:697
-
void style(level stage, fmt style)
Set the style (color and typo) of the given log level, passing a fmt instance.
Definition: clutchlog.h:1050
-
void threshold(level l)
Set the log level (below which logs are not printed) with an identifier.
Definition: clutchlog.h:1002
-
level threshold() const
Get the log level below which logs are not printed.
Definition: clutchlog.h:1006
+
void style(level stage, fmt style)
Set the style (color and typo) of the given log level, passing a fmt instance.
Definition: clutchlog.h:1096
+
void threshold(level l)
Set the log level (below which logs are not printed) with an identifier.
Definition: clutchlog.h:1048
+
level threshold() const
Get the log level below which logs are not printed.
Definition: clutchlog.h:1052
virtual bool is_set() const =0
Should return true if the underying representation encodes an existing color.
-
std::map< level, std::string > _level_short
dictionary of level identifier to their 4-letters representation.
Definition: clutchlog.h:895
+
std::map< level, std::string > _level_short
dictionary of level identifier to their 4-letters representation.
Definition: clutchlog.h:909
level
Available log levels.
Definition: clutchlog.h:303
color_256(ground t, const short i)
Constructor.
Definition: clutchlog.h:525
std::ostream & print_on(std::ostream &os) const
Print the color index on the given stream.
Definition: clutchlog.h:531
color_16M(ground t)
Constructor.
Definition: clutchlog.h:582
static size_t default_hfill_max
Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
Definition: clutchlog.h:275
-
scope_t()
Constructor.
Definition: clutchlog.h:1074
-
std::regex _in_func
Current function location filter.
Definition: clutchlog.h:925
+
void funchash_styles(std::vector< fmt > styles)
Set the candidate styles for value-dependant function name formatting.
Definition: clutchlog.h:1036
+
scope_t()
Constructor.
Definition: clutchlog.h:1120
+
std::regex _in_func
Current function location filter.
Definition: clutchlog.h:939
static std::string default_format
Default format of the messages.
Definition: clutchlog.h:213
bg_16M(short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:676
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:296
Foreground in 256-colors mode.
Definition: clutchlog.h:634
-
void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
Dump a serializable container after a comment line with log information.
Definition: clutchlog.h:1326
+
void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
Dump a serializable container after a comment line with log information.
Definition: clutchlog.h:1381
clutchlog::fmt::fg_256 fore_256
Current foreground in 256-colors mode.
enum clutchlog::fmt::fg fore
Foreground color.
+
void filehash_styles(std::vector< fmt > styles)
Set the candidate styles for value-dependant file name formatting.
Definition: clutchlog.h:1028
enum clutchlog::fmt::color::ground type
Type of color (foreground or background).
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:366
short index
The encoded color index in 4-bits ANSI.
Definition: clutchlog.h:513
bg_256()
Empty constructor: no color.
Definition: clutchlog.h:558
-
void func(std::string func)
Set the regular expression filtering the function location.
Definition: clutchlog.h:1027
-
std::string format() const
Get the template string.
Definition: clutchlog.h:948
-
std::regex _in_file
Current file location filter.
Definition: clutchlog.h:923
-
void style(level stage, FMT... styles)
Set the style (color and typo) of the given log level.
Definition: clutchlog.h:1048
+
void func(std::string func)
Set the regular expression filtering the function location.
Definition: clutchlog.h:1073
+
std::string format() const
Get the template string.
Definition: clutchlog.h:969
+
std::regex _in_file
Current file location filter.
Definition: clutchlog.h:937
+
void style(level stage, FMT... styles)
Set the style (color and typo) of the given log level.
Definition: clutchlog.h:1094
bg_256(const bg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:568
fg_16M()
Empty constructor: no color.
Definition: clutchlog.h:636
-
level level_of(const std::string name)
Return the log level tag corresponding to the given pre-configured name.
Definition: clutchlog.h:1014
-
const std::map< level, std::string > _level_word
Dictionary of level identifier to their string representation.
Definition: clutchlog.h:891
+
level level_of(const std::string name)
Return the log level tag corresponding to the given pre-configured name.
Definition: clutchlog.h:1060
+
const std::map< level, std::string > _level_word
Dictionary of level identifier to their string representation.
Definition: clutchlog.h:905
std::string operator()(const std::string &msg) const
Format the given string with the currently encoded format.
Definition: clutchlog.h:795
color_16M(ground t, short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:591
std::ostream & print_on(std::ostream &os) const
Print the color RGB triplet on the given stream.
Definition: clutchlog.h:626
bg
Background color codes.
Definition: clutchlog.h:411
#define CLUTCHLOG_DEFAULT_FORMAT
Compile-time default format of the messages (debug mode: with absolute location).
Definition: clutchlog.h:198
-
std::regex _in_line
Current line location filter.
Definition: clutchlog.h:927
+
std::regex _in_line
Current line location filter.
Definition: clutchlog.h:941
fg_256(const short f)
Constructor.
Definition: clutchlog.h:546
@ colors_256
256 colors mode.
enum clutchlog::fmt::ansi mode
Current ANSI color mode.
-
std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
Replace mark by tag in form, converting tag to its string representation first.
Definition: clutchlog.h:1202
-
std::string format_comment() const
Get the template string for dumps.
Definition: clutchlog.h:953
+
std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
Replace mark by tag in form, converting tag to its string representation first.
Definition: clutchlog.h:1248
+
std::string format_comment() const
Get the template string for dumps.
Definition: clutchlog.h:974
fg_256()
Empty constructor: no color.
Definition: clutchlog.h:541
@ colors_16M
16 millions ("true") colors mode.
-
std::string _format_dump
Current format of the file output.
Definition: clutchlog.h:901
+
std::string _format_dump
Current format of the file output.
Definition: clutchlog.h:915
#define CLUTCHDUMP_DEFAULT_SEP
Compile-time default item separator for dump.
Definition: clutchlog.h:239
bg_256(const short b)
Constructor.
Definition: clutchlog.h:563
ground
Codes for representing foreground or background.
Definition: clutchlog.h:474
-
Structure holding a location matching.
Definition: clutchlog.h:1062
+
Structure holding a location matching.
Definition: clutchlog.h:1108
#define CLUTCHLOG_DEFAULT_HFILL_MARK
Character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:260
std::ostream & print_on(std::ostream &os) const
Print the currently encoded format escape code on the given output stream.
Definition: clutchlog.h:746
bool is_set() const
Returns true if the underying representation encodes an existing color.
Definition: clutchlog.h:528
-
std::ostream * _out
Standard output.
Definition: clutchlog.h:913
-
std::ostream & out()
Get the output stream on which to print.
Definition: clutchlog.h:958
-
void threshold(const std::string &l)
Set the log level (below which logs are not printed) with a string.
Definition: clutchlog.h:1004
+
std::ostream * _out
Standard output.
Definition: clutchlog.h:927
+
std::ostream & out()
Get the output stream on which to print.
Definition: clutchlog.h:979
+
void threshold(const std::string &l)
Set the log level (below which logs are not printed) with a string.
Definition: clutchlog.h:1050
virtual std::ostream & print_on(std::ostream &os) const =0
Should print the underlying representation on the given stream.
-
const std::map< std::string, level > & levels() const
Get the map of available log levels string representations toward their identifier....
Definition: clutchlog.h:1008
-
size_t _strip_calls
Current number of call stack levels to remove from depth display.
Definition: clutchlog.h:889
-
level stage
Current log level.
Definition: clutchlog.h:1066
-
bool there
Location is compatible.
Definition: clutchlog.h:1072
+
const std::map< std::string, level > & levels() const
Get the map of available log levels string representations toward their identifier....
Definition: clutchlog.h:1054
+
size_t _strip_calls
Current number of call stack levels to remove from depth display.
Definition: clutchlog.h:903
+
level stage
Current log level.
Definition: clutchlog.h:1112
+
bool there
Location is compatible.
Definition: clutchlog.h:1118
fg_16M(const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:654
#define CLUTCHLOG_STRIP_CALLS
Compile-time number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:253
friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
Output stream overload.
Definition: clutchlog.h:780
bg_16M(const bg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:689
bg_16M()
Empty constructor: no color.
Definition: clutchlog.h:666
-
std::map< std::string, level > _word_level
Dictionary of level string to their identifier.
Definition: clutchlog.h:893
-
level _stage
Current log level.
Definition: clutchlog.h:921
-
fmt style(level stage) const
Get the configured fmt instance of the given log level.
Definition: clutchlog.h:1052
+
std::map< std::string, level > _word_level
Dictionary of level string to their identifier.
Definition: clutchlog.h:907
+
level _stage
Current log level.
Definition: clutchlog.h:935
+
fmt style(level stage) const
Get the configured fmt instance of the given log level.
Definition: clutchlog.h:1098
typo
Typographic style codes.
Definition: clutchlog.h:379
-
void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
Set the regular expressions filtering the location.
Definition: clutchlog.h:1032
+
void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
Set the regular expressions filtering the location.
Definition: clutchlog.h:1078
#define CLUTCHLOG_HAVE_UNIX_SYSINFO
True if POSIX headers necessary for stack depth management are available.
Definition: clutchlog.h:33
+
std::vector< fmt > _filehash_fmts
List of candidate format objects for value-dependant file name styling.
Definition: clutchlog.h:944
The single class which holds everything.
Definition: clutchlog.h:177
ansi
ANSI code configuring the available number of colors.
Definition: clutchlog.h:369
fg_16M(short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:646
diff --git a/docs/dir_000001_000000.html b/docs/dir_000001_000000.html index ab77e39..36c505f 100644 --- a/docs/dir_000001_000000.html +++ b/docs/dir_000001_000000.html @@ -28,7 +28,7 @@ @@ -84,7 +84,7 @@ $(document).ready(function(){initNavTree('dir_59425e443f801f1f2fd8bbe4959a3ccf.h
-

tests → clutchlog Relation

Public Attributes

diff --git a/docs/classes.html b/docs/classes.html index 481e2b2..551abe0 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -28,7 +28,7 @@
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
File in testsIncludes file in clutchlog
t-assert.cppclutchlog.h
t-color.cppclutchlog.h
t-color16M.cppclutchlog.h
t-color256.cppclutchlog.h
t-demo-extravagant.cppclutchlog.h
t-demo.cppclutchlog.h
t-dump.cppclutchlog.h
t-fmt-constructors.cppclutchlog.h
t-log.cppclutchlog.h
t-one-line-if.cppclutchlog.h
+

tests → clutchlog Relation

File in testsIncludes file in clutchlog
t-assert.cppclutchlog.h
t-color.cppclutchlog.h
t-color16M.cppclutchlog.h
t-color256.cppclutchlog.h
t-demo-extravagant.cppclutchlog.h
t-demo.cppclutchlog.h
t-dump.cppclutchlog.h
t-fmt-constructors.cppclutchlog.h
t-hash-color.cppclutchlog.h
t-log.cppclutchlog.h
t-one-line-if.cppclutchlog.h
diff --git a/docs/files_dup.js b/docs/files_dup.js index 3108fba..bda5401 100644 --- a/docs/files_dup.js +++ b/docs/files_dup.js @@ -9,6 +9,7 @@ var files_dup = [ "t-demo.cpp", "t-demo_8cpp_source.html", null ], [ "t-dump.cpp", "t-dump_8cpp_source.html", null ], [ "t-fmt-constructors.cpp", "t-fmt-constructors_8cpp_source.html", null ], + [ "t-hash-color.cpp", "t-hash-color_8cpp_source.html", null ], [ "t-log.cpp", "t-log_8cpp_source.html", null ], [ "t-one-line-if.cpp", "t-one-line-if_8cpp_source.html", null ] ]; \ No newline at end of file diff --git a/docs/functions.html b/docs/functions.html index 00430ab..b3457b8 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
@@ -87,12 +87,18 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
Here is a list of all documented class members with links to the class documentation for each member:

- _ -

    +
  • _filehash_fmts +: clutchlog +
  • _format_dump : clutchlog
  • _format_log : clutchlog
  • +
  • _funchash_fmts +: clutchlog +
  • _in_file : clutchlog
  • @@ -187,6 +193,9 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
  • default_strip_calls : clutchlog
  • +
  • depth_styles() +: clutchlog +
  • dump() : clutchlog
  • @@ -212,6 +221,9 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
  • file() : clutchlog
  • +
  • filehash_styles() +: clutchlog +
  • fmt() : clutchlog::fmt
  • @@ -225,7 +237,7 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable(); : clutchlog::fmt
  • format() -: clutchlog +: clutchlog
  • format_comment() : clutchlog @@ -233,6 +245,9 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
  • func() : clutchlog
  • +
  • funchash_styles() +: clutchlog +
diff --git a/docs/functions_enum.html b/docs/functions_enum.html index 4eb658e..c268733 100644 --- a/docs/functions_enum.html +++ b/docs/functions_enum.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/functions_func.html b/docs/functions_func.html index b634613..955935c 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
@@ -110,6 +110,9 @@ $(document).ready(function(){initNavTree('functions_func.html',''); initResizabl

- d -

diff --git a/docs/functions_rela.html b/docs/functions_rela.html index 60eb878..42d1030 100644 --- a/docs/functions_rela.html +++ b/docs/functions_rela.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/functions_vars.html b/docs/functions_vars.html index 189a389..c5212bc 100644 --- a/docs/functions_vars.html +++ b/docs/functions_vars.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
@@ -87,12 +87,18 @@ $(document).ready(function(){initNavTree('functions_vars.html',''); initResizabl  

- _ -

    +
  • _filehash_fmts +: clutchlog +
  • _format_dump : clutchlog
  • _format_log : clutchlog
  • +
  • _funchash_fmts +: clutchlog +
  • _in_file : clutchlog
  • diff --git a/docs/globals.html b/docs/globals.html index 7576651..30cf2a9 100644 --- a/docs/globals.html +++ b/docs/globals.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/globals_defs.html b/docs/globals_defs.html index 3e24701..222ec62 100644 --- a/docs/globals_defs.html +++ b/docs/globals_defs.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/graph_legend.html b/docs/graph_legend.html index 065a508..8e89892 100644 --- a/docs/graph_legend.html +++ b/docs/graph_legend.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/group___default_config.html b/docs/group___default_config.html index fef6468..3453ca4 100644 --- a/docs/group___default_config.html +++ b/docs/group___default_config.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/group___formating.html b/docs/group___formating.html index 22053f3..f29caec 100644 --- a/docs/group___formating.html +++ b/docs/group___formating.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/group___formating.js b/docs/group___formating.js index 2d68224..36c42da 100644 --- a/docs/group___formating.js +++ b/docs/group___formating.js @@ -22,6 +22,7 @@ var group___formating = [ "print_on", "classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0", null ], [ "operator()", "classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c", null ], [ "str", "classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b", null ], + [ "hash", "classclutchlog_1_1fmt.html#a822ded10ae1b0c82f7330481aa4bb64f", null ], [ "operator<<", "group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7", null ], [ "operator<<", "group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33", null ], [ "operator<<", "classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da", null ], diff --git a/docs/group___main.html b/docs/group___main.html index 2dd2192..f62f38f 100644 --- a/docs/group___main.html +++ b/docs/group___main.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/group___main.js b/docs/group___main.js index f4cc55e..9920517 100644 --- a/docs/group___main.js +++ b/docs/group___main.js @@ -22,6 +22,9 @@ var group___main = [ "format_comment", "classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5", null ], [ "out", "classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d", null ], [ "out", "classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266", null ], + [ "filehash_styles", "classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf", null ], + [ "funchash_styles", "classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416", null ], + [ "depth_styles", "classclutchlog.html#a08310b92e86687349e70f56f9ac1d656", null ], [ "threshold", "classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4", null ], [ "threshold", "classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9", null ], [ "threshold", "classclutchlog.html#ab45287cc9c14217904a13aff49573732", null ], @@ -60,6 +63,8 @@ var group___main = [ "_in_file", "classclutchlog.html#aded03528f34d9000f618419c482c5042", null ], [ "_in_func", "classclutchlog.html#a130c4f12eacbd2028102838fe16b734e", null ], [ "_in_line", "classclutchlog.html#a41757198b29862832a14472a9e5e24c6", null ], + [ "_filehash_fmts", "classclutchlog.html#a2a334e009533744b52f01ef240a59e9d", null ], + [ "_funchash_fmts", "classclutchlog.html#a095e1545a2085ac623e4af19364fea7f", null ], [ "level", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928", [ [ "critical", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701", null ], [ "error", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9", null ], diff --git a/docs/group___use_macros.html b/docs/group___use_macros.html index 95323b7..359c78e 100644 --- a/docs/group___use_macros.html +++ b/docs/group___use_macros.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/group__colors16.html b/docs/group__colors16.html index 1a580c2..770439e 100644 --- a/docs/group__colors16.html +++ b/docs/group__colors16.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/group__colors256__16_m.html b/docs/group__colors256__16_m.html index 0005ba1..6c5f0aa 100644 --- a/docs/group__colors256__16_m.html +++ b/docs/group__colors256__16_m.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/hierarchy.html b/docs/hierarchy.html index b8983a2..28aabb3 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    diff --git a/docs/index.html b/docs/index.html index 78e4023..52675d3 100644 --- a/docs/index.html +++ b/docs/index.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.13 +  0.14
    @@ -128,7 +128,7 @@ $(document).ready(function(){initNavTree('index.html',''); initResizable(); });
  • Build and tests
-

Clutchlog is a spatial logging system that targets versatile debugging. It allows to (de)clutch messages for a given: log level, source code location or call stack depth.

+

Clutchlog is a spatial logging system that targets versatile debugging. It allows to (de)clutch messages for a given: log level, source code location or call stack depth.

  • Project page on Github
  • Documentation
  • @@ -159,8 +159,10 @@ Example
    log.threshold("Info"); // Log only "info", "warning", "error" or "critical" messages.
    log.file("algebra/.*"); // Will match any file in the "algebra" directory.
    log.func("(mul|add|sub|div)"); // Will match "multiply", for instance.
    -

Example of a real-life log session (as seen in the frictionlesser software): A log screen capture with full details, showing colored messages and location.

-

Demo showing fancy styling: A log screen capture showing fancy coloring of text lines.

+

Example of a real-life log session (as seen in the frictionlesser software):

+

A log screen capture with full details, showing colored messages and location.

+

Demo showing fancy styling:

+

A log screen capture showing fancy coloring of text lines.

For more detailled examples, see the "Usage" sections below and the tests directory.

Rationale

@@ -468,7 +470,8 @@ System-dependent horizontal fill

Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSIOCTL to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

#if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
log.hfill_mark( '_' );
#endif
-

+

If you use unicode characters in your template, the horizontal width will not be computed properly, resulting in incorrectly right-aligned lines. Solving this would require the use of third-party libraries, making portability more difficult.

+

Dependencies

Some colors/styles may not be supported by some exotic terminal emulators.

Clutchlog needs C++-17 with the filesystem feature. You may need to indicate -std=c++17 -lstdc++fs to some compilers.

diff --git a/docs/inherits.html b/docs/inherits.html index bc1964f..e1e575e 100644 --- a/docs/inherits.html +++ b/docs/inherits.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/modules.html b/docs/modules.html index 644e787..dbe00cd 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/navtreedata.js b/docs/navtreedata.js index 098ec9a..46bc971 100644 --- a/docs/navtreedata.js +++ b/docs/navtreedata.js @@ -81,7 +81,7 @@ var NAVTREE = var NAVTREEINDEX = [ "annotated.html", -"structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c" +"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/docs/navtreeindex0.js b/docs/navtreeindex0.js index 7f3b999..0226a22 100644 --- a/docs/navtreeindex0.js +++ b/docs/navtreeindex0.js @@ -3,91 +3,97 @@ var NAVTREEINDEX0 = "annotated.html":[2,0], "classclutchlog.html":[1,2,0], "classclutchlog.html#a03b145e36f15435a640bb5a885d9f642":[1,2,0,7], -"classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae":[1,2,0,45], +"classclutchlog.html#a08310b92e86687349e70f56f9ac1d656":[1,2,0,18], +"classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae":[1,2,0,48], "classclutchlog.html#a0906d74275cedcd403da94879764815e":[1,2,0,6], -"classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc":[1,2,0,34], -"classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c":[1,2,0,21], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928":[1,2,0,54], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9":[1,2,0,54,1], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a6efd7b28f876c0473c6dfeae82fc8e05":[1,2,0,54,3], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a911f5ef324f37061f68a239577e0d0bd":[1,2,0,54,6], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aa1ea607f2bfe5db06f1cf2bd991f7dc1":[1,2,0,54,5], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aab4ce1a501f9cbe27666659d3b19534c":[1,2,0,54,2], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928abba74b810831c7753777e6dcc0c0f4e2":[1,2,0,54,7], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701":[1,2,0,54,0], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af89a12aab2a73ea31e19b04ecadbdc0d":[1,2,0,54,4], -"classclutchlog.html#a130c4f12eacbd2028102838fe16b734e":[1,2,0,52], -"classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167":[1,2,0,49], -"classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468":[1,2,0,38], +"classclutchlog.html#a095e1545a2085ac623e4af19364fea7f":[1,2,0,58], +"classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc":[1,2,0,37], +"classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c":[1,2,0,24], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928":[1,2,0,59], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9":[1,2,0,59,1], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a6efd7b28f876c0473c6dfeae82fc8e05":[1,2,0,59,3], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a911f5ef324f37061f68a239577e0d0bd":[1,2,0,59,6], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aa1ea607f2bfe5db06f1cf2bd991f7dc1":[1,2,0,59,5], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aab4ce1a501f9cbe27666659d3b19534c":[1,2,0,59,2], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928abba74b810831c7753777e6dcc0c0f4e2":[1,2,0,59,7], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701":[1,2,0,59,0], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af89a12aab2a73ea31e19b04ecadbdc0d":[1,2,0,59,4], +"classclutchlog.html#a130c4f12eacbd2028102838fe16b734e":[1,2,0,55], +"classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167":[1,2,0,52], +"classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468":[1,2,0,41], "classclutchlog.html#a2144abe4ec6f630126b6490908b5f924":[1,2,0,12], -"classclutchlog.html#a229fd61519f1245282440120f2d45fb5":[1,2,0,37], -"classclutchlog.html#a23dbb98f0d3c5cc21c232cde16cf317a":[1,2,0,32], -"classclutchlog.html#a356df86455409193792b6ed550dfd09e":[1,2,0,42], -"classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4":[1,2,0,16], -"classclutchlog.html#a41757198b29862832a14472a9e5e24c6":[1,2,0,53], -"classclutchlog.html#a4831f44fd5ade102e57320632095934d":[1,2,0,27], -"classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96":[1,2,0,28], -"classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7":[1,2,0,41], -"classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5":[1,2,0,48], -"classclutchlog.html#a63308e8deae3cfec6801318203494143":[1,2,0,33], +"classclutchlog.html#a229fd61519f1245282440120f2d45fb5":[1,2,0,40], +"classclutchlog.html#a23dbb98f0d3c5cc21c232cde16cf317a":[1,2,0,35], +"classclutchlog.html#a2a334e009533744b52f01ef240a59e9d":[1,2,0,57], +"classclutchlog.html#a356df86455409193792b6ed550dfd09e":[1,2,0,45], +"classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4":[1,2,0,19], +"classclutchlog.html#a41757198b29862832a14472a9e5e24c6":[1,2,0,56], +"classclutchlog.html#a4831f44fd5ade102e57320632095934d":[1,2,0,30], +"classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96":[1,2,0,31], +"classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7":[1,2,0,44], +"classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5":[1,2,0,51], +"classclutchlog.html#a63308e8deae3cfec6801318203494143":[1,2,0,36], "classclutchlog.html#a656c277e074b64728cca871f2b484d1c":[1,2,0,10], -"classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3":[1,2,0,24], +"classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3":[1,2,0,27], "classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266":[1,2,0,15], -"classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6":[1,2,0,39], -"classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9":[1,2,0,17], -"classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e":[1,2,0,47], +"classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6":[1,2,0,42], +"classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9":[1,2,0,20], +"classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e":[1,2,0,50], "classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d":[1,2,0,14], -"classclutchlog.html#a972f895c70edc335f3018a2c8971d59e":[1,2,0,29], -"classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9":[1,2,0,23], +"classclutchlog.html#a972f895c70edc335f3018a2c8971d59e":[1,2,0,32], +"classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9":[1,2,0,26], "classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5":[1,2,0,13], -"classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f":[1,2,0,43], -"classclutchlog.html#ab45287cc9c14217904a13aff49573732":[1,2,0,18], -"classclutchlog.html#ab805ac5c33885459f9f752518a4aa735":[1,2,0,46], -"classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888":[1,2,0,44], -"classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761":[1,2,0,31], -"classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591":[1,2,0,25], -"classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1":[1,2,0,40], -"classclutchlog.html#ace879554298e6e6e36dafef330c27be8":[1,2,0,35], -"classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd":[1,2,0,20], +"classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f":[1,2,0,46], +"classclutchlog.html#ab45287cc9c14217904a13aff49573732":[1,2,0,21], +"classclutchlog.html#ab805ac5c33885459f9f752518a4aa735":[1,2,0,49], +"classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888":[1,2,0,47], +"classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761":[1,2,0,34], +"classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591":[1,2,0,28], +"classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1":[1,2,0,43], +"classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416":[1,2,0,17], +"classclutchlog.html#ace879554298e6e6e36dafef330c27be8":[1,2,0,38], +"classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd":[1,2,0,23], "classclutchlog.html#acfaceb77da01503b432644a3efaee4fa":[1,2,0,8], -"classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6":[1,2,0,26], -"classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447":[1,2,0,22], -"classclutchlog.html#aded03528f34d9000f618419c482c5042":[1,2,0,51], -"classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2":[1,2,0,30], -"classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993":[1,2,0,50], +"classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6":[1,2,0,29], +"classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447":[1,2,0,25], +"classclutchlog.html#aded03528f34d9000f618419c482c5042":[1,2,0,54], +"classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf":[1,2,0,16], +"classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2":[1,2,0,33], +"classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993":[1,2,0,53], "classclutchlog.html#aef653a9744a72a889ca8163269bb781e":[1,2,0,9], -"classclutchlog.html#af898bffe23b125245e338d7495c76d45":[1,2,0,36], +"classclutchlog.html#af898bffe23b125245e338d7495c76d45":[1,2,0,39], "classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80":[1,2,0,11], -"classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a":[1,2,0,19], +"classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a":[1,2,0,22], "classclutchlog_1_1fmt.html":[1,3,0], "classclutchlog_1_1fmt.html#a00feba2b1539529df70e39d615a05941":[1,3,0,10], "classclutchlog_1_1fmt.html#a04f3ba5f6fe81955dca4492a6d259f1c":[1,3,0,7], "classclutchlog_1_1fmt.html#a0923d7d400f6753d4dae124b71eb5023":[1,3,0,15], -"classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205":[1,3,0,24], +"classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205":[1,3,0,25], "classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0":[1,3,0,18], "classclutchlog_1_1fmt.html#a13453c0b5dbc19d9b510dcdc0352b443":[1,3,0,3], "classclutchlog_1_1fmt.html#a194201eb8a400ef13df3e833b8788cdc":[1,3,0,9], -"classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b":[1,3,0,25], +"classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b":[1,3,0,26], "classclutchlog_1_1fmt.html#a2df8f77f58dc9272c94982c4d2275581":[1,3,0,12], "classclutchlog_1_1fmt.html#a357c93593867f67d9fef562ca07c7dcc":[1,3,0,11], "classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959":[1,3,0,0], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502":[1,3,0,32], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa":[1,3,0,32,2], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e":[1,3,0,32,0], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749":[1,3,0,32,1], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502":[1,3,0,33], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa":[1,3,0,33,2], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e":[1,3,0,33,0], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749":[1,3,0,33,1], "classclutchlog_1_1fmt.html#a506718883842dbce3659f42cdf79e52c":[1,3,0,16], "classclutchlog_1_1fmt.html#a63b29eb5862a30a194b0256f2ee554a6":[1,3,0,13], "classclutchlog_1_1fmt.html#a65856874070ec0865b3a5b9aeb0e4f3d":[1,3,0,4], "classclutchlog_1_1fmt.html#a6cc6126d113fc0647ed3acbf29cdc425":[1,3,0,1], "classclutchlog_1_1fmt.html#a6d1cc4abe822a569a2624b0829de5dd0":[1,3,0,17], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89":[1,3,0,33], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,33,4], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a69dcab4a73aeec2113f69b61e6263da8":[1,3,0,33,1], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a6dc7b4483f8c2c701a48e42db552806d":[1,3,0,33,2], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a86266ee937d97f812a8e57d22b62ee29":[1,3,0,33,0], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89aa91c78e040f7b9d158f381e197f8beb4":[1,3,0,33,3], +"classclutchlog_1_1fmt.html#a822ded10ae1b0c82f7330481aa4bb64f":[1,3,0,21], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89":[1,3,0,34], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,34,4], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a69dcab4a73aeec2113f69b61e6263da8":[1,3,0,34,1], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a6dc7b4483f8c2c701a48e42db552806d":[1,3,0,34,2], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a86266ee937d97f812a8e57d22b62ee29":[1,3,0,34,0], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89aa91c78e040f7b9d158f381e197f8beb4":[1,3,0,34,3], "classclutchlog_1_1fmt.html#a9458703ab8a3c9fbc6b801011b43f16d":[1,3,0,14], -"classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da":[1,3,0,23], +"classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da":[1,3,0,24], "classclutchlog_1_1fmt.html#a99b3a05ddf6fa341cee6cb1e5dffc159":[1,3,0,5], "classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b":[1,3,0,20], "classclutchlog_1_1fmt.html#ac49c883e3dd17832749cc092b74a9f56":[1,3,0,8], @@ -112,14 +118,14 @@ var NAVTREEINDEX0 = "group___default_config.html":[1,0], "group___default_config.html#ga27b613c6727857a7cbcd0165d862034e":[3,0,0,12], "group___default_config.html#ga27b613c6727857a7cbcd0165d862034e":[1,0,2], -"group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9":[1,0,4], "group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9":[3,0,0,14], +"group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9":[1,0,4], "group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805":[3,0,0,16], "group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805":[1,0,6], "group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa":[1,0,1], "group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa":[3,0,0,11], -"group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[1,0,3], "group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[3,0,0,13], +"group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[1,0,3], "group___default_config.html#ga8564be479b948ee3052b61783c66d415":[3,0,0,5], "group___default_config.html#ga8564be479b948ee3052b61783c66d415":[1,0,0], "group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf":[3,0,0,15], @@ -127,10 +133,10 @@ var NAVTREEINDEX0 = "group___formating.html":[1,3], "group___main.html":[1,2], "group___use_macros.html":[1,1], -"group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2":[1,1,2], "group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2":[3,0,0,8], -"group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d":[3,0,0,7], +"group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2":[1,1,2], "group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d":[1,1,1], +"group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d":[3,0,0,7], "group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae":[1,1,3], "group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae":[3,0,0,9], "group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73":[1,1,4], @@ -138,64 +144,64 @@ var NAVTREEINDEX0 = "group___use_macros.html#gae8911119d726a43b77f5781cb5a72813":[1,1,0], "group___use_macros.html#gae8911119d726a43b77f5781cb5a72813":[3,0,0,6], "group__colors16.html":[1,4], -"group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e":[1,3,0,35], +"group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e":[1,3,0,36], "group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e":[1,4,1], +"group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33":[1,3,0,23], "group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33":[1,4,5], -"group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33":[1,3,0,22], -"group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0":[1,3,0,34], "group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0":[1,4,0], -"group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,3,0,21], +"group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0":[1,3,0,35], +"group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,3,0,22], "group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,4,4], -"group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,3,0,26], +"group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,3,0,27], "group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,4,2], -"group__colors16.html#ga86696b20e5b31c96ba592926efb324f3":[1,3,0,27], "group__colors16.html#ga86696b20e5b31c96ba592926efb324f3":[1,4,3], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea1ffd9e753c8054cc61456ac7fac1ac89":[1,3,0,35,0], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,35,16], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea37553b57ad1d7f61b0c51f5a535f72bf":[1,3,0,35,13], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea48d6215903dff56238e52e8891380c8f":[1,3,0,35,4], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea4c2a4a7078da0ac6733464eacfd00f86":[1,3,0,35,5], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea6411532ba4971f378391776a9db629d3":[1,3,0,35,6], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea74474ae20bf3ef3bce6fd679194ce383":[1,3,0,35,8], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea75dd76d162b9554ec8b63736bc22d93e":[1,3,0,35,11], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea8b84c6e788e91a3a45b9dabedb160590":[1,3,0,35,9], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea9f27410725ab8cc8854a2769c7a516b8":[1,3,0,35,2], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eabd5b4652dffd84bab66529361d0c4974":[1,3,0,35,10], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eabda9643ac6601722a28f238714274da4":[1,3,0,35,1], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eac5b47880b4b2ec37179078d63a85def3":[1,3,0,35,12], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eacc69f9955c2bf916bb9a83f38141432f":[1,3,0,35,14], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ead487dd0b55dfcacdd920ccbdaeafa351":[1,3,0,35,3], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ead508fe45cecaf653904a0e774084bb5c":[1,3,0,35,7], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eada7527acf78cb4e7b582e8163a1f642a":[1,3,0,35,15], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a1ffd9e753c8054cc61456ac7fac1ac89":[1,3,0,34,0], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,34,16], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a37553b57ad1d7f61b0c51f5a535f72bf":[1,3,0,34,13], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a48d6215903dff56238e52e8891380c8f":[1,3,0,34,4], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a4c2a4a7078da0ac6733464eacfd00f86":[1,3,0,34,5], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a6411532ba4971f378391776a9db629d3":[1,3,0,34,6], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a74474ae20bf3ef3bce6fd679194ce383":[1,3,0,34,8], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a75dd76d162b9554ec8b63736bc22d93e":[1,3,0,34,11], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a8b84c6e788e91a3a45b9dabedb160590":[1,3,0,34,9], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a9f27410725ab8cc8854a2769c7a516b8":[1,3,0,34,2], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0abd5b4652dffd84bab66529361d0c4974":[1,3,0,34,10], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0abda9643ac6601722a28f238714274da4":[1,3,0,34,1], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ac5b47880b4b2ec37179078d63a85def3":[1,3,0,34,12], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0acc69f9955c2bf916bb9a83f38141432f":[1,3,0,34,14], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ad487dd0b55dfcacdd920ccbdaeafa351":[1,3,0,34,3], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ad508fe45cecaf653904a0e774084bb5c":[1,3,0,34,7], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ada7527acf78cb4e7b582e8163a1f642a":[1,3,0,34,15], +"group__colors16.html#ga86696b20e5b31c96ba592926efb324f3":[1,3,0,28], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea1ffd9e753c8054cc61456ac7fac1ac89":[1,3,0,36,0], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,36,16], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea37553b57ad1d7f61b0c51f5a535f72bf":[1,3,0,36,13], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea48d6215903dff56238e52e8891380c8f":[1,3,0,36,4], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea4c2a4a7078da0ac6733464eacfd00f86":[1,3,0,36,5], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea6411532ba4971f378391776a9db629d3":[1,3,0,36,6], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea74474ae20bf3ef3bce6fd679194ce383":[1,3,0,36,8], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea75dd76d162b9554ec8b63736bc22d93e":[1,3,0,36,11], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea8b84c6e788e91a3a45b9dabedb160590":[1,3,0,36,9], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea9f27410725ab8cc8854a2769c7a516b8":[1,3,0,36,2], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eabd5b4652dffd84bab66529361d0c4974":[1,3,0,36,10], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eabda9643ac6601722a28f238714274da4":[1,3,0,36,1], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eac5b47880b4b2ec37179078d63a85def3":[1,3,0,36,12], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eacc69f9955c2bf916bb9a83f38141432f":[1,3,0,36,14], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ead487dd0b55dfcacdd920ccbdaeafa351":[1,3,0,36,3], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ead508fe45cecaf653904a0e774084bb5c":[1,3,0,36,7], +"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eada7527acf78cb4e7b582e8163a1f642a":[1,3,0,36,15], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a1ffd9e753c8054cc61456ac7fac1ac89":[1,3,0,35,0], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,35,16], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a37553b57ad1d7f61b0c51f5a535f72bf":[1,3,0,35,13], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a48d6215903dff56238e52e8891380c8f":[1,3,0,35,4], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a4c2a4a7078da0ac6733464eacfd00f86":[1,3,0,35,5], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a6411532ba4971f378391776a9db629d3":[1,3,0,35,6], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a74474ae20bf3ef3bce6fd679194ce383":[1,3,0,35,8], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a75dd76d162b9554ec8b63736bc22d93e":[1,3,0,35,11], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a8b84c6e788e91a3a45b9dabedb160590":[1,3,0,35,9], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a9f27410725ab8cc8854a2769c7a516b8":[1,3,0,35,2], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0abd5b4652dffd84bab66529361d0c4974":[1,3,0,35,10], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0abda9643ac6601722a28f238714274da4":[1,3,0,35,1], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ac5b47880b4b2ec37179078d63a85def3":[1,3,0,35,12], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0acc69f9955c2bf916bb9a83f38141432f":[1,3,0,35,14], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ad487dd0b55dfcacdd920ccbdaeafa351":[1,3,0,35,3], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ad508fe45cecaf653904a0e774084bb5c":[1,3,0,35,7], +"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ada7527acf78cb4e7b582e8163a1f642a":[1,3,0,35,15], "group__colors256__16_m.html":[1,5], -"group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,3,0,29], +"group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,3,0,30], "group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,5,8], "group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de":[1,5,9], -"group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de":[1,3,0,30], -"group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0":[1,3,0,31], +"group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de":[1,3,0,31], "group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0":[1,5,10], -"group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,3,0,28], +"group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0":[1,3,0,32], "group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,5,7], +"group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,3,0,29], "hierarchy.html":[2,2], -"index.html":[0], "index.html":[], +"index.html":[0], "index.html#autotoc_md0":[0,0], "index.html#autotoc_md1":[0,1], "index.html#autotoc_md10":[0,3,4,0], @@ -243,11 +249,5 @@ var NAVTREEINDEX0 = "structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6":[1,5,0,3], "structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603":[1,5,0,1], "structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f":[1,5,0,2], -"structclutchlog_1_1fmt_1_1color.html#aacbc3cd9447fdb7d51e02b29b5028a6b":[1,5,0,4], -"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0":[1,5,0,6], -"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0a469bba0a564235dfceede42db14f17b0":[1,5,0,6,1], -"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0ae64e4c4fee28f9ca7301e4c7ff598e67":[1,5,0,6,0], -"structclutchlog_1_1fmt_1_1color__16_m.html":[1,5,4], -"structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61":[1,5,4,5], -"structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3":[1,5,4,1] +"structclutchlog_1_1fmt_1_1color.html#aacbc3cd9447fdb7d51e02b29b5028a6b":[1,5,0,4] }; diff --git a/docs/navtreeindex1.js b/docs/navtreeindex1.js index d5cfa15..5fec777 100644 --- a/docs/navtreeindex1.js +++ b/docs/navtreeindex1.js @@ -1,5 +1,11 @@ var NAVTREEINDEX1 = { +"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0":[1,5,0,6], +"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0a469bba0a564235dfceede42db14f17b0":[1,5,0,6,1], +"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0ae64e4c4fee28f9ca7301e4c7ff598e67":[1,5,0,6,0], +"structclutchlog_1_1fmt_1_1color__16_m.html":[1,5,4], +"structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61":[1,5,4,5], +"structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3":[1,5,4,1], "structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c":[1,5,4,2], "structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e":[1,5,4,4], "structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d":[1,5,4,3], @@ -34,6 +40,7 @@ var NAVTREEINDEX1 = "t-demo_8cpp_source.html":[3,0,6], "t-dump_8cpp_source.html":[3,0,7], "t-fmt-constructors_8cpp_source.html":[3,0,8], -"t-log_8cpp_source.html":[3,0,9], -"t-one-line-if_8cpp_source.html":[3,0,10] +"t-hash-color_8cpp_source.html":[3,0,9], +"t-log_8cpp_source.html":[3,0,10], +"t-one-line-if_8cpp_source.html":[3,0,11] }; diff --git a/docs/search/all_0.js b/docs/search/all_0.js index ce60da2..e6209f7 100644 --- a/docs/search/all_0.js +++ b/docs/search/all_0.js @@ -1,15 +1,17 @@ var searchData= [ - ['_5fformat_5fdump_0',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], - ['_5fformat_5flog_1',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], - ['_5fin_5ffile_2',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], - ['_5fin_5ffunc_3',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], - ['_5fin_5fline_4',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], - ['_5flevel_5ffmt_5',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], - ['_5flevel_5fshort_6',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], - ['_5flevel_5fword_7',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], - ['_5fout_8',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], - ['_5fstage_9',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], - ['_5fstrip_5fcalls_10',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], - ['_5fword_5flevel_11',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] + ['_5ffilehash_5ffmts_0',['_filehash_fmts',['../classclutchlog.html#a2a334e009533744b52f01ef240a59e9d',1,'clutchlog']]], + ['_5fformat_5fdump_1',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], + ['_5fformat_5flog_2',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], + ['_5ffunchash_5ffmts_3',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], + ['_5fin_5ffile_4',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], + ['_5fin_5ffunc_5',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], + ['_5fin_5fline_6',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], + ['_5flevel_5ffmt_7',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], + ['_5flevel_5fshort_8',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], + ['_5flevel_5fword_9',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], + ['_5fout_10',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], + ['_5fstage_11',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], + ['_5fstrip_5fcalls_12',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], + ['_5fword_5flevel_13',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] ]; diff --git a/docs/search/all_1.js b/docs/search/all_1.js index 0204185..eafa84d 100644 --- a/docs/search/all_1.js +++ b/docs/search/all_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['ansi_12',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] + ['ansi_14',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/all_10.js b/docs/search/all_10.js index 5b59010..d9e996a 100644 --- a/docs/search/all_10.js +++ b/docs/search/all_10.js @@ -1,4 +1,4 @@ var searchData= [ - ['with_5fclutchlog_95',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] + ['with_5fclutchlog_100',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] ]; diff --git a/docs/search/all_2.js b/docs/search/all_2.js index 957e26b..86a1b84 100644 --- a/docs/search/all_2.js +++ b/docs/search/all_2.js @@ -1,9 +1,9 @@ var searchData= [ - ['back_13',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], - ['back_5f16m_14',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], - ['back_5f256_15',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]], - ['bg_16',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]], - ['bg_5f16m_17',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt::bg_16M'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], - ['bg_5f256_18',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt::bg_256'],['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] + ['back_15',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], + ['back_5f16m_16',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], + ['back_5f256_17',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]], + ['bg_18',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]], + ['bg_5f16m_19',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt::bg_16M'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], + ['bg_5f256_20',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt::bg_256'],['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] ]; diff --git a/docs/search/all_3.js b/docs/search/all_3.js index 120e246..bb78083 100644 --- a/docs/search/all_3.js +++ b/docs/search/all_3.js @@ -1,27 +1,27 @@ var searchData= [ - ['clutchcode_19',['CLUTCHCODE',['../group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73',1,'clutchlog.h']]], - ['clutchdump_20',['CLUTCHDUMP',['../group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2',1,'clutchlog.h']]], - ['clutchdump_5fdefault_5fformat_21',['CLUTCHDUMP_DEFAULT_FORMAT',['../group___default_config.html#ga27b613c6727857a7cbcd0165d862034e',1,'clutchlog.h']]], - ['clutchdump_5fdefault_5fsep_22',['CLUTCHDUMP_DEFAULT_SEP',['../group___default_config.html#ga54d29e956575e1c731eab5406135c5df',1,'clutchlog.h']]], - ['clutchfunc_23',['CLUTCHFUNC',['../group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae',1,'clutchlog.h']]], - ['clutchloc_24',['CLUTCHLOC',['../group___use_macros.html#gae8911119d726a43b77f5781cb5a72813',1,'clutchlog.h']]], - ['clutchlog_25',['clutchlog',['../classclutchlog.html',1,'clutchlog'],['../group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d',1,'CLUTCHLOG(): clutchlog.h']]], - ['clutchlog_2eh_26',['clutchlog.h',['../clutchlog_8h.html',1,'']]], - ['clutchlog_5fdefault_5fdepth_5fbuilt_5fnodebug_27',['CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG',['../group___default_config.html#ga8564be479b948ee3052b61783c66d415',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fdepth_5fmark_28',['CLUTCHLOG_DEFAULT_DEPTH_MARK',['../group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fformat_29',['CLUTCHLOG_DEFAULT_FORMAT',['../group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fhfill_5fmark_30',['CLUTCHLOG_DEFAULT_HFILL_MARK',['../group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805',1,'clutchlog.h']]], - ['clutchlog_5fh_31',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysinfo_32',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysioctl_33',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]], - ['clutchlog_5fstrip_5fcalls_34',['CLUTCHLOG_STRIP_CALLS',['../group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf',1,'clutchlog.h']]], - ['color_35',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt::color'],['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color::color()']]], - ['color_5f16m_36',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt::color_16M'],['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], - ['color_5f256_37',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt::color_256'],['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]], - ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_38',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]], - ['colors_5f16_39',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], - ['colors_5f16m_40',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], - ['colors_5f256_41',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]], - ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_42',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] + ['clutchcode_21',['CLUTCHCODE',['../group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73',1,'clutchlog.h']]], + ['clutchdump_22',['CLUTCHDUMP',['../group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2',1,'clutchlog.h']]], + ['clutchdump_5fdefault_5fformat_23',['CLUTCHDUMP_DEFAULT_FORMAT',['../group___default_config.html#ga27b613c6727857a7cbcd0165d862034e',1,'clutchlog.h']]], + ['clutchdump_5fdefault_5fsep_24',['CLUTCHDUMP_DEFAULT_SEP',['../group___default_config.html#ga54d29e956575e1c731eab5406135c5df',1,'clutchlog.h']]], + ['clutchfunc_25',['CLUTCHFUNC',['../group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae',1,'clutchlog.h']]], + ['clutchloc_26',['CLUTCHLOC',['../group___use_macros.html#gae8911119d726a43b77f5781cb5a72813',1,'clutchlog.h']]], + ['clutchlog_27',['clutchlog',['../classclutchlog.html',1,'clutchlog'],['../group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d',1,'CLUTCHLOG(): clutchlog.h']]], + ['clutchlog_2eh_28',['clutchlog.h',['../clutchlog_8h.html',1,'']]], + ['clutchlog_5fdefault_5fdepth_5fbuilt_5fnodebug_29',['CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG',['../group___default_config.html#ga8564be479b948ee3052b61783c66d415',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fdepth_5fmark_30',['CLUTCHLOG_DEFAULT_DEPTH_MARK',['../group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fformat_31',['CLUTCHLOG_DEFAULT_FORMAT',['../group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fhfill_5fmark_32',['CLUTCHLOG_DEFAULT_HFILL_MARK',['../group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805',1,'clutchlog.h']]], + ['clutchlog_5fh_33',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysinfo_34',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysioctl_35',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]], + ['clutchlog_5fstrip_5fcalls_36',['CLUTCHLOG_STRIP_CALLS',['../group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf',1,'clutchlog.h']]], + ['color_37',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt::color'],['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color::color()']]], + ['color_5f16m_38',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt::color_16M'],['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], + ['color_5f256_39',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt::color_256'],['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]], + ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_40',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]], + ['colors_5f16_41',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], + ['colors_5f16m_42',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], + ['colors_5f256_43',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]], + ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_44',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] ]; diff --git a/docs/search/all_4.js b/docs/search/all_4.js index 97fd13b..51ca6cc 100644 --- a/docs/search/all_4.js +++ b/docs/search/all_4.js @@ -1,13 +1,14 @@ var searchData= [ - ['default_5fdepth_5fmark_43',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], - ['default_5fformat_44',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], - ['default_5fhfill_5fchar_45',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], - ['default_5fhfill_5fmax_46',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], - ['default_5fhfill_5fmin_47',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], - ['default_5fstrip_5fcalls_48',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], - ['default_20configuration_20management_49',['Default configuration management',['../group___default_config.html',1,'']]], - ['dump_50',['dump',['../classclutchlog.html#a63308e8deae3cfec6801318203494143',1,'clutchlog']]], - ['dump_5fdefault_5fformat_51',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], - ['dump_5fdefault_5fsep_52',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] + ['default_5fdepth_5fmark_45',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], + ['default_5fformat_46',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], + ['default_5fhfill_5fchar_47',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], + ['default_5fhfill_5fmax_48',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], + ['default_5fhfill_5fmin_49',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], + ['default_5fstrip_5fcalls_50',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], + ['default_20configuration_20management_51',['Default configuration management',['../group___default_config.html',1,'']]], + ['depth_5fstyles_52',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], + ['dump_53',['dump',['../classclutchlog.html#a63308e8deae3cfec6801318203494143',1,'clutchlog']]], + ['dump_5fdefault_5fformat_54',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], + ['dump_5fdefault_5fsep_55',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] ]; diff --git a/docs/search/all_5.js b/docs/search/all_5.js index e6a875f..d08d592 100644 --- a/docs/search/all_5.js +++ b/docs/search/all_5.js @@ -1,15 +1,17 @@ var searchData= [ - ['fg_53',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], - ['fg_5f16m_54',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt::fg_16M'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], - ['fg_5f256_55',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt::fg_256'],['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], - ['file_56',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], - ['fmt_57',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog::fmt'],['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt::fmt()']]], - ['fore_58',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], - ['fore_5f16m_59',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], - ['fore_5f256_60',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]], - ['format_61',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], - ['format_5fcomment_62',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], - ['formating_20tools_63',['Formating tools',['../group___formating.html',1,'']]], - ['func_64',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]] + ['fg_56',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], + ['fg_5f16m_57',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt::fg_16M'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], + ['fg_5f256_58',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt::fg_256'],['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], + ['file_59',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], + ['filehash_5fstyles_60',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], + ['fmt_61',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog::fmt'],['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt::fmt()']]], + ['fore_62',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], + ['fore_5f16m_63',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], + ['fore_5f256_64',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]], + ['format_65',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], + ['format_5fcomment_66',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], + ['formating_20tools_67',['Formating tools',['../group___formating.html',1,'']]], + ['func_68',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], + ['funchash_5fstyles_69',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] ]; diff --git a/docs/search/all_6.js b/docs/search/all_6.js index a238d73..f7c449d 100644 --- a/docs/search/all_6.js +++ b/docs/search/all_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['ground_65',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] + ['ground_70',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/search/all_7.js b/docs/search/all_7.js index ceeff9e..f1e68ac 100644 --- a/docs/search/all_7.js +++ b/docs/search/all_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['high_2dlevel_20api_20macros_66',['High-level API macros',['../group___use_macros.html',1,'']]] + ['high_2dlevel_20api_20macros_71',['High-level API macros',['../group___use_macros.html',1,'']]] ]; diff --git a/docs/search/all_8.js b/docs/search/all_8.js index 563b231..712f996 100644 --- a/docs/search/all_8.js +++ b/docs/search/all_8.js @@ -1,6 +1,6 @@ var searchData= [ - ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_67',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]], - ['index_68',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]], - ['is_5fset_69',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] + ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_72',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]], + ['index_73',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]], + ['is_5fset_74',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] ]; diff --git a/docs/search/all_9.js b/docs/search/all_9.js index 76f9563..70b8e53 100644 --- a/docs/search/all_9.js +++ b/docs/search/all_9.js @@ -1,11 +1,11 @@ var searchData= [ - ['level_70',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]], - ['level_5fof_71',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], - ['levels_72',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], - ['line_73',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], - ['locate_74',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], - ['location_75',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], - ['log_76',['log',['../classclutchlog.html#a23dbb98f0d3c5cc21c232cde16cf317a',1,'clutchlog']]], - ['logger_77',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] + ['level_75',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]], + ['level_5fof_76',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], + ['levels_77',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], + ['line_78',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], + ['locate_79',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], + ['location_80',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], + ['log_81',['log',['../classclutchlog.html#a23dbb98f0d3c5cc21c232cde16cf317a',1,'clutchlog']]], + ['logger_82',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] ]; diff --git a/docs/search/all_a.js b/docs/search/all_a.js index b24fc28..3082510 100644 --- a/docs/search/all_a.js +++ b/docs/search/all_a.js @@ -1,6 +1,6 @@ var searchData= [ - ['main_20class_78',['Main class',['../group___main.html',1,'']]], - ['matches_79',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], - ['mode_80',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] + ['main_20class_83',['Main class',['../group___main.html',1,'']]], + ['matches_84',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], + ['mode_85',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/all_b.js b/docs/search/all_b.js index 30b2dfd..667af17 100644 --- a/docs/search/all_b.js +++ b/docs/search/all_b.js @@ -1,6 +1,6 @@ var searchData= [ - ['operator_28_29_81',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], - ['operator_3c_3c_82',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]], - ['out_83',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] + ['operator_28_29_86',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], + ['operator_3c_3c_87',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]], + ['out_88',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] ]; diff --git a/docs/search/all_c.js b/docs/search/all_c.js index 4b99bc7..da570fa 100644 --- a/docs/search/all_c.js +++ b/docs/search/all_c.js @@ -1,4 +1,4 @@ var searchData= [ - ['print_5fon_84',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] + ['print_5fon_89',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] ]; diff --git a/docs/search/all_d.js b/docs/search/all_d.js index e5ba0dc..c7b0b35 100644 --- a/docs/search/all_d.js +++ b/docs/search/all_d.js @@ -1,5 +1,5 @@ var searchData= [ - ['red_85',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]], - ['replace_86',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] + ['red_90',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]], + ['replace_91',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] ]; diff --git a/docs/search/all_e.js b/docs/search/all_e.js index aaaf2c0..b96f683 100644 --- a/docs/search/all_e.js +++ b/docs/search/all_e.js @@ -1,7 +1,7 @@ var searchData= [ - ['scope_5ft_87',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog::scope_t'],['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t::scope_t()']]], - ['stage_88',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], - ['str_89',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], - ['style_90',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt::style()'],['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] + ['scope_5ft_92',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog::scope_t'],['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t::scope_t()']]], + ['stage_93',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], + ['str_94',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], + ['style_95',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt::style()'],['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] ]; diff --git a/docs/search/all_f.js b/docs/search/all_f.js index bb7bbea..ae6697e 100644 --- a/docs/search/all_f.js +++ b/docs/search/all_f.js @@ -1,7 +1,7 @@ var searchData= [ - ['there_91',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], - ['threshold_92',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]], - ['type_93',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]], - ['typo_94',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] + ['there_96',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], + ['threshold_97',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]], + ['type_98',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]], + ['typo_99',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_0.js b/docs/search/classes_0.js index 480303d..cd91c5b 100644 --- a/docs/search/classes_0.js +++ b/docs/search/classes_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['bg_5f16m_96',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt']]], - ['bg_5f256_97',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt']]] + ['bg_5f16m_101',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt']]], + ['bg_5f256_102',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_1.js b/docs/search/classes_1.js index 6f68109..632a921 100644 --- a/docs/search/classes_1.js +++ b/docs/search/classes_1.js @@ -1,7 +1,7 @@ var searchData= [ - ['clutchlog_98',['clutchlog',['../classclutchlog.html',1,'']]], - ['color_99',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt']]], - ['color_5f16m_100',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt']]], - ['color_5f256_101',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt']]] + ['clutchlog_103',['clutchlog',['../classclutchlog.html',1,'']]], + ['color_104',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt']]], + ['color_5f16m_105',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt']]], + ['color_5f256_106',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_2.js b/docs/search/classes_2.js index c39128f..59ac266 100644 --- a/docs/search/classes_2.js +++ b/docs/search/classes_2.js @@ -1,6 +1,6 @@ var searchData= [ - ['fg_5f16m_102',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt']]], - ['fg_5f256_103',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt']]], - ['fmt_104',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog']]] + ['fg_5f16m_107',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt']]], + ['fg_5f256_108',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt']]], + ['fmt_109',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog']]] ]; diff --git a/docs/search/classes_3.js b/docs/search/classes_3.js index 5bb3aaf..f92addc 100644 --- a/docs/search/classes_3.js +++ b/docs/search/classes_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['scope_5ft_105',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog']]] + ['scope_5ft_110',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog']]] ]; diff --git a/docs/search/defines_0.js b/docs/search/defines_0.js index 8658828..ae54f4d 100644 --- a/docs/search/defines_0.js +++ b/docs/search/defines_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['clutchlog_5fh_180',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysinfo_181',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysioctl_182',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]] + ['clutchlog_5fh_190',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysinfo_191',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysioctl_192',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]] ]; diff --git a/docs/search/defines_1.js b/docs/search/defines_1.js index db6d2b7..4c766f8 100644 --- a/docs/search/defines_1.js +++ b/docs/search/defines_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['with_5fclutchlog_183',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] + ['with_5fclutchlog_193',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] ]; diff --git a/docs/search/enums_0.js b/docs/search/enums_0.js index 9dad809..f843e33 100644 --- a/docs/search/enums_0.js +++ b/docs/search/enums_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['ansi_170',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] + ['ansi_180',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enums_1.js b/docs/search/enums_1.js index 467b08a..c28e05d 100644 --- a/docs/search/enums_1.js +++ b/docs/search/enums_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['bg_171',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]] + ['bg_181',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enums_2.js b/docs/search/enums_2.js index 9245b03..12d1dbb 100644 --- a/docs/search/enums_2.js +++ b/docs/search/enums_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['fg_172',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]] + ['fg_182',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enums_3.js b/docs/search/enums_3.js index 05bf7a1..02d48dc 100644 --- a/docs/search/enums_3.js +++ b/docs/search/enums_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['ground_173',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] + ['ground_183',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/search/enums_4.js b/docs/search/enums_4.js index 9d331b3..4787f9b 100644 --- a/docs/search/enums_4.js +++ b/docs/search/enums_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['level_174',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]] + ['level_184',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]] ]; diff --git a/docs/search/enums_5.js b/docs/search/enums_5.js index 8f895c4..77c6720 100644 --- a/docs/search/enums_5.js +++ b/docs/search/enums_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['typo_175',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] + ['typo_185',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enumvalues_0.js b/docs/search/enumvalues_0.js index dfac3fb..13b0957 100644 --- a/docs/search/enumvalues_0.js +++ b/docs/search/enumvalues_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['colors_5f16_176',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], - ['colors_5f16m_177',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], - ['colors_5f256_178',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]] + ['colors_5f16_186',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], + ['colors_5f16m_187',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], + ['colors_5f256_188',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/files_0.js b/docs/search/files_0.js index 205c570..0cbf095 100644 --- a/docs/search/files_0.js +++ b/docs/search/files_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['clutchlog_2eh_106',['clutchlog.h',['../clutchlog_8h.html',1,'']]] + ['clutchlog_2eh_111',['clutchlog.h',['../clutchlog_8h.html',1,'']]] ]; diff --git a/docs/search/functions_0.js b/docs/search/functions_0.js index 70f82e8..8bee63c 100644 --- a/docs/search/functions_0.js +++ b/docs/search/functions_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['bg_5f16m_107',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], - ['bg_5f256_108',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] + ['bg_5f16m_112',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], + ['bg_5f256_113',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] ]; diff --git a/docs/search/functions_1.js b/docs/search/functions_1.js index e566df4..f0262cc 100644 --- a/docs/search/functions_1.js +++ b/docs/search/functions_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['color_109',['color',['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color']]], - ['color_5f16m_110',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], - ['color_5f256_111',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]] + ['color_114',['color',['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color']]], + ['color_5f16m_115',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], + ['color_5f256_116',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]] ]; diff --git a/docs/search/functions_2.js b/docs/search/functions_2.js index 0acd491..8c3f036 100644 --- a/docs/search/functions_2.js +++ b/docs/search/functions_2.js @@ -1,4 +1,5 @@ var searchData= [ - ['dump_112',['dump',['../classclutchlog.html#a63308e8deae3cfec6801318203494143',1,'clutchlog']]] + ['depth_5fstyles_117',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], + ['dump_118',['dump',['../classclutchlog.html#a63308e8deae3cfec6801318203494143',1,'clutchlog']]] ]; diff --git a/docs/search/functions_3.js b/docs/search/functions_3.js index 52f6969..16fa0f4 100644 --- a/docs/search/functions_3.js +++ b/docs/search/functions_3.js @@ -1,10 +1,12 @@ var searchData= [ - ['fg_5f16m_113',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], - ['fg_5f256_114',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], - ['file_115',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], - ['fmt_116',['fmt',['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt']]], - ['format_117',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], - ['format_5fcomment_118',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], - ['func_119',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]] + ['fg_5f16m_119',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], + ['fg_5f256_120',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], + ['file_121',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], + ['filehash_5fstyles_122',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], + ['fmt_123',['fmt',['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt']]], + ['format_124',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], + ['format_5fcomment_125',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], + ['func_126',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], + ['funchash_5fstyles_127',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] ]; diff --git a/docs/search/functions_4.js b/docs/search/functions_4.js index 194301d..6631256 100644 --- a/docs/search/functions_4.js +++ b/docs/search/functions_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['is_5fset_120',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] + ['is_5fset_128',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] ]; diff --git a/docs/search/functions_5.js b/docs/search/functions_5.js index 6c591f7..d8f13e9 100644 --- a/docs/search/functions_5.js +++ b/docs/search/functions_5.js @@ -1,10 +1,10 @@ var searchData= [ - ['level_5fof_121',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], - ['levels_122',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], - ['line_123',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], - ['locate_124',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], - ['location_125',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], - ['log_126',['log',['../classclutchlog.html#a23dbb98f0d3c5cc21c232cde16cf317a',1,'clutchlog']]], - ['logger_127',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] + ['level_5fof_129',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], + ['levels_130',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], + ['line_131',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], + ['locate_132',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], + ['location_133',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], + ['log_134',['log',['../classclutchlog.html#a23dbb98f0d3c5cc21c232cde16cf317a',1,'clutchlog']]], + ['logger_135',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] ]; diff --git a/docs/search/functions_6.js b/docs/search/functions_6.js index 7d8a25b..c179760 100644 --- a/docs/search/functions_6.js +++ b/docs/search/functions_6.js @@ -1,5 +1,5 @@ var searchData= [ - ['operator_28_29_128',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], - ['out_129',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] + ['operator_28_29_136',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], + ['out_137',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] ]; diff --git a/docs/search/functions_7.js b/docs/search/functions_7.js index e11b2b1..9e035c0 100644 --- a/docs/search/functions_7.js +++ b/docs/search/functions_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['print_5fon_130',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] + ['print_5fon_138',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] ]; diff --git a/docs/search/functions_8.js b/docs/search/functions_8.js index 751d9ae..08359ce 100644 --- a/docs/search/functions_8.js +++ b/docs/search/functions_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['replace_131',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] + ['replace_139',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] ]; diff --git a/docs/search/functions_9.js b/docs/search/functions_9.js index 475908d..228be9c 100644 --- a/docs/search/functions_9.js +++ b/docs/search/functions_9.js @@ -1,6 +1,6 @@ var searchData= [ - ['scope_5ft_132',['scope_t',['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t']]], - ['str_133',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], - ['style_134',['style',['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] + ['scope_5ft_140',['scope_t',['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t']]], + ['str_141',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], + ['style_142',['style',['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] ]; diff --git a/docs/search/functions_a.js b/docs/search/functions_a.js index c4eb686..fc2e4b4 100644 --- a/docs/search/functions_a.js +++ b/docs/search/functions_a.js @@ -1,4 +1,4 @@ var searchData= [ - ['threshold_135',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]] + ['threshold_143',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]] ]; diff --git a/docs/search/groups_0.js b/docs/search/groups_0.js index 3333c66..b025ec3 100644 --- a/docs/search/groups_0.js +++ b/docs/search/groups_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_184',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]] + ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_194',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]] ]; diff --git a/docs/search/groups_1.js b/docs/search/groups_1.js index 521455e..e5cc9dd 100644 --- a/docs/search/groups_1.js +++ b/docs/search/groups_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['default_20configuration_20management_185',['Default configuration management',['../group___default_config.html',1,'']]] + ['default_20configuration_20management_195',['Default configuration management',['../group___default_config.html',1,'']]] ]; diff --git a/docs/search/groups_2.js b/docs/search/groups_2.js index 5481d50..acce32b 100644 --- a/docs/search/groups_2.js +++ b/docs/search/groups_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['formating_20tools_186',['Formating tools',['../group___formating.html',1,'']]] + ['formating_20tools_196',['Formating tools',['../group___formating.html',1,'']]] ]; diff --git a/docs/search/groups_3.js b/docs/search/groups_3.js index 52a5805..0d0e639 100644 --- a/docs/search/groups_3.js +++ b/docs/search/groups_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['high_2dlevel_20api_20macros_187',['High-level API macros',['../group___use_macros.html',1,'']]] + ['high_2dlevel_20api_20macros_197',['High-level API macros',['../group___use_macros.html',1,'']]] ]; diff --git a/docs/search/groups_4.js b/docs/search/groups_4.js index 311b56a..cf87922 100644 --- a/docs/search/groups_4.js +++ b/docs/search/groups_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_188',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]] + ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_198',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]] ]; diff --git a/docs/search/groups_5.js b/docs/search/groups_5.js index 52b3e99..988ea36 100644 --- a/docs/search/groups_5.js +++ b/docs/search/groups_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['main_20class_189',['Main class',['../group___main.html',1,'']]] + ['main_20class_199',['Main class',['../group___main.html',1,'']]] ]; diff --git a/docs/search/pages_0.js b/docs/search/pages_0.js index 27ca0fa..29e08ae 100644 --- a/docs/search/pages_0.js +++ b/docs/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_190',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] + ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_200',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] ]; diff --git a/docs/search/related_0.js b/docs/search/related_0.js index a5e9afa..76c0205 100644 --- a/docs/search/related_0.js +++ b/docs/search/related_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['operator_3c_3c_179',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]] + ['operator_3c_3c_189',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]] ]; diff --git a/docs/search/variables_0.js b/docs/search/variables_0.js index 27dd7d9..6f6ad7c 100644 --- a/docs/search/variables_0.js +++ b/docs/search/variables_0.js @@ -1,15 +1,17 @@ var searchData= [ - ['_5fformat_5fdump_136',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], - ['_5fformat_5flog_137',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], - ['_5fin_5ffile_138',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], - ['_5fin_5ffunc_139',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], - ['_5fin_5fline_140',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], - ['_5flevel_5ffmt_141',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], - ['_5flevel_5fshort_142',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], - ['_5flevel_5fword_143',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], - ['_5fout_144',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], - ['_5fstage_145',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], - ['_5fstrip_5fcalls_146',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], - ['_5fword_5flevel_147',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] + ['_5ffilehash_5ffmts_144',['_filehash_fmts',['../classclutchlog.html#a2a334e009533744b52f01ef240a59e9d',1,'clutchlog']]], + ['_5fformat_5fdump_145',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], + ['_5fformat_5flog_146',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], + ['_5ffunchash_5ffmts_147',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], + ['_5fin_5ffile_148',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], + ['_5fin_5ffunc_149',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], + ['_5fin_5fline_150',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], + ['_5flevel_5ffmt_151',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], + ['_5flevel_5fshort_152',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], + ['_5flevel_5fword_153',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], + ['_5fout_154',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], + ['_5fstage_155',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], + ['_5fstrip_5fcalls_156',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], + ['_5fword_5flevel_157',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] ]; diff --git a/docs/search/variables_1.js b/docs/search/variables_1.js index 24ccd13..0806588 100644 --- a/docs/search/variables_1.js +++ b/docs/search/variables_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['back_148',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], - ['back_5f16m_149',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], - ['back_5f256_150',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]] + ['back_158',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], + ['back_5f16m_159',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], + ['back_5f256_160',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_2.js b/docs/search/variables_2.js index c56b083..eb6ab1c 100644 --- a/docs/search/variables_2.js +++ b/docs/search/variables_2.js @@ -1,11 +1,11 @@ var searchData= [ - ['default_5fdepth_5fmark_151',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], - ['default_5fformat_152',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], - ['default_5fhfill_5fchar_153',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], - ['default_5fhfill_5fmax_154',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], - ['default_5fhfill_5fmin_155',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], - ['default_5fstrip_5fcalls_156',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], - ['dump_5fdefault_5fformat_157',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], - ['dump_5fdefault_5fsep_158',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] + ['default_5fdepth_5fmark_161',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], + ['default_5fformat_162',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], + ['default_5fhfill_5fchar_163',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], + ['default_5fhfill_5fmax_164',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], + ['default_5fhfill_5fmin_165',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], + ['default_5fstrip_5fcalls_166',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], + ['dump_5fdefault_5fformat_167',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], + ['dump_5fdefault_5fsep_168',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] ]; diff --git a/docs/search/variables_3.js b/docs/search/variables_3.js index b1dba74..4d5adb2 100644 --- a/docs/search/variables_3.js +++ b/docs/search/variables_3.js @@ -1,6 +1,6 @@ var searchData= [ - ['fore_159',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], - ['fore_5f16m_160',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], - ['fore_5f256_161',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]] + ['fore_169',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], + ['fore_5f16m_170',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], + ['fore_5f256_171',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_4.js b/docs/search/variables_4.js index 6b699e3..d0d1d16 100644 --- a/docs/search/variables_4.js +++ b/docs/search/variables_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['index_162',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]] + ['index_172',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]] ]; diff --git a/docs/search/variables_5.js b/docs/search/variables_5.js index 7c3b904..b4ea7bf 100644 --- a/docs/search/variables_5.js +++ b/docs/search/variables_5.js @@ -1,5 +1,5 @@ var searchData= [ - ['matches_163',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], - ['mode_164',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] + ['matches_173',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], + ['mode_174',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_6.js b/docs/search/variables_6.js index 65a2424..6272c0e 100644 --- a/docs/search/variables_6.js +++ b/docs/search/variables_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['red_165',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]] + ['red_175',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]] ]; diff --git a/docs/search/variables_7.js b/docs/search/variables_7.js index b7f1331..344faaf 100644 --- a/docs/search/variables_7.js +++ b/docs/search/variables_7.js @@ -1,5 +1,5 @@ var searchData= [ - ['stage_166',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], - ['style_167',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt']]] + ['stage_176',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], + ['style_177',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_8.js b/docs/search/variables_8.js index 3fe92fe..cbbacf9 100644 --- a/docs/search/variables_8.js +++ b/docs/search/variables_8.js @@ -1,5 +1,5 @@ var searchData= [ - ['there_168',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], - ['type_169',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]] + ['there_178',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], + ['type_179',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html index 2067aa2..49f9f1f 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1bg__16_m.html b/docs/structclutchlog_1_1fmt_1_1bg__16_m.html index 55fcdc1..e57e1c4 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__16_m.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1bg__256-members.html b/docs/structclutchlog_1_1fmt_1_1bg__256-members.html index 94afbc8..10b2cb0 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__256-members.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__256-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1bg__256.html b/docs/structclutchlog_1_1fmt_1_1bg__256.html index 8932b67..336b59e 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__256.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__256.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1color-members.html b/docs/structclutchlog_1_1fmt_1_1color-members.html index 9379dce..757fda2 100644 --- a/docs/structclutchlog_1_1fmt_1_1color-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1color.html b/docs/structclutchlog_1_1fmt_1_1color.html index 712e756..db95366 100644 --- a/docs/structclutchlog_1_1fmt_1_1color.html +++ b/docs/structclutchlog_1_1fmt_1_1color.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html index f4d107c..31557b4 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1color__16_m.html b/docs/structclutchlog_1_1fmt_1_1color__16_m.html index c04702e..0fe3bff 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1color__16_m.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1color__256-members.html b/docs/structclutchlog_1_1fmt_1_1color__256-members.html index fce44af..5cccd03 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__256-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color__256-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1color__256.html b/docs/structclutchlog_1_1fmt_1_1color__256.html index f3a6646..2f50ba0 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__256.html +++ b/docs/structclutchlog_1_1fmt_1_1color__256.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html index 84fec36..e3cc77f 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1fg__16_m.html b/docs/structclutchlog_1_1fmt_1_1fg__16_m.html index db89eeb..f247f4e 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__16_m.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1fg__256-members.html b/docs/structclutchlog_1_1fmt_1_1fg__256-members.html index d713712..12e7b3c 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__256-members.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__256-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1fmt_1_1fg__256.html b/docs/structclutchlog_1_1fmt_1_1fg__256.html index 5e639b3..1ad8c5e 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__256.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__256.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1scope__t-members.html b/docs/structclutchlog_1_1scope__t-members.html index 44ff5bf..d89e82b 100644 --- a/docs/structclutchlog_1_1scope__t-members.html +++ b/docs/structclutchlog_1_1scope__t-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/structclutchlog_1_1scope__t.html b/docs/structclutchlog_1_1scope__t.html index 27d9de9..d617018 100644 --- a/docs/structclutchlog_1_1scope__t.html +++ b/docs/structclutchlog_1_1scope__t.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
@@ -100,7 +100,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1scope__t.html','');

Detailed Description

Structure holding a location matching.

-

Definition at line 1062 of file clutchlog.h.

+

Definition at line 1108 of file clutchlog.h.

diff --git a/docs/t-assert_8cpp_source.html b/docs/t-assert_8cpp_source.html index be34ca5..8852f2e 100644 --- a/docs/t-assert_8cpp_source.html +++ b/docs/t-assert_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-color16_m_8cpp_source.html b/docs/t-color16_m_8cpp_source.html index 2e2acdc..85e3454 100644 --- a/docs/t-color16_m_8cpp_source.html +++ b/docs/t-color16_m_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-color256_8cpp_source.html b/docs/t-color256_8cpp_source.html index 0a483ed..706cf88 100644 --- a/docs/t-color256_8cpp_source.html +++ b/docs/t-color256_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-color_8cpp_source.html b/docs/t-color_8cpp_source.html index 8ed2576..93e8be3 100644 --- a/docs/t-color_8cpp_source.html +++ b/docs/t-color_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-demo-extravagant_8cpp_source.html b/docs/t-demo-extravagant_8cpp_source.html index bdb6a91..4784232 100644 --- a/docs/t-demo-extravagant_8cpp_source.html +++ b/docs/t-demo-extravagant_8cpp_source.html @@ -28,7 +28,7 @@ @@ -92,106 +92,127 @@ $(document).ready(function(){initNavTree('t-demo-extravagant_8cpp_source.html','
2 
3 #include "../clutchlog/clutchlog.h"
4 
-
5 void i()
+
5 void dump_data()
6 {
-
7  CLUTCHLOG(progress, "Reset data structures...");
-
8  CLUTCHLOG(debug, "OK");
-
9  CLUTCHLOG(info, "Reset functors...");
-
10  CLUTCHLOG(critical, "Impossible to reset, I cannot recover.");
+
7  CLUTCHLOG(progress, "Dump parsed data...");
+
8  CLUTCHLOG(debug, "Write in `data_dump.csv`");
+
9  CLUTCHLOG(debug, "Data frame size: " << 0 << "x" << "150");
+
10  CLUTCHLOG(xdebug, "Resolution: " << 0);
11 }
12 
-
13 void h()
+
13 void reset()
14 {
-
15  CLUTCHLOG(note, "Filling up data of size: " << 0);
-
16  CLUTCHLOG(error, "Cannot parse input, I will reset stuff.");
-
17  i();
-
18  CLUTCHLOG(xdebug, "Last seen state: " << 0);
-
19 }
-
20 
-
21 void g()
-
22 {
-
23  CLUTCHLOG(warning, "Input size < " << 1);
-
24  h();
-
25 }
-
26 
-
27 void f()
-
28 {
-
29  CLUTCHLOG(progress, "Initialize data structures...");
-
30  CLUTCHLOG(debug, "OK");
-
31  CLUTCHLOG(progress, "Initialize functors...");
-
32  CLUTCHLOG(debug, "OK");
-
33  g();
-
34 }
-
35 
-
36 int main(const int argc, char* argv[])
-
37 {
-
38  using level = clutchlog::level;
-
39  using fmt = clutchlog::fmt;
-
40  using fg = clutchlog::fmt::fg;
-
41  using bg = clutchlog::fmt::bg;
-
42  using typo = clutchlog::fmt::typo;
+
15  CLUTCHLOG(progress, "Reset data structures...");
+
16  CLUTCHLOG(debug, "OK");
+
17  CLUTCHLOG(info, "Reset functors...");
+
18  CLUTCHLOG(critical, "Impossible to reset, I cannot recover.");
+
19  dump_data();
+
20 }
+
21 
+
22 void process()
+
23 {
+
24  CLUTCHLOG(note, "Filling up data of size: " << 0);
+
25  CLUTCHLOG(error, "Cannot parse input, I will reset stuff.");
+
26  reset();
+
27  CLUTCHLOG(xdebug, "Last seen state: " << 0);
+
28 }
+
29 
+
30 void init_data()
+
31 {
+
32  CLUTCHLOG(debug, "Data frame size: " << 2 << "x" << "150");
+
33  CLUTCHLOG(xdebug, "Resolution: " << 0.001);
+
34  CLUTCHLOG(warning, "Input height < " << 3);
+
35 }
+
36 
+
37 void init_func()
+
38 {
+
39  CLUTCHLOG(progress, "Allocate memory...");
+
40  CLUTCHLOG(warning, "Dimension: " << 12);
+
41  CLUTCHLOG(debug, "OK");
+
42 }
43 
-
44  auto& log = clutchlog::logger();
-
45 
-
46  log.style(level::critical, 197);
-
47  log.style(level::error, 202);
-
48  log.style(level::warning, 208);
-
49  log.style(level::progress, 34);
-
50  log.style(level::note, 35);
-
51  log.style(level::info, 36);
-
52  log.style(level::debug, 39);
-
53  log.style(level::xdebug, 45);
-
54  std::ostringstream format;
-
55  fmt reset(typo::reset);
-
56  fmt discreet(fg::black);
-
57  fmt bold(fmt::typo::bold);
-
58 
-
59  log.depth_mark("| ");
-
60  log.hfill_min(400);
-
61  log.hfill_max(500);
-
62  log.hfill_mark('-');
-
63 
-
64  const short dark = 238;
-
65  const short lite = 250;
+
44 void init()
+
45 {
+
46  CLUTCHLOG(progress, "Initialize data structures...");
+
47  init_data();
+
48  CLUTCHLOG(debug, "OK");
+
49  CLUTCHLOG(progress, "Initialize functors...");
+
50  init_func();
+
51  CLUTCHLOG(debug, "OK");
+
52  CLUTCHLOG(progress, "Process...");
+
53  process();
+
54  CLUTCHLOG(debug, "OK");
+
55 }
+
56 
+
57 int main(const int argc, char* argv[])
+
58 {
+
59  using level = clutchlog::level;
+
60  using fmt = clutchlog::fmt;
+
61  using fg = clutchlog::fmt::fg;
+
62  using bg = clutchlog::fmt::bg;
+
63  using typo = clutchlog::fmt::typo;
+
64 
+
65  auto& log = clutchlog::logger();
66 
-
67  format
-
68  << fmt(dark,lite) << "{name}"
-
69  << fmt(lite,dark) << ""
-
70  << fmt(fg::none,dark) << "{level_fmt}" << " {level_short} " << reset
-
71  << fmt(dark,bg::none) << "" << reset
-
72  << fmt(dark,bg::none) << "{depth_marks}" << reset
-
73  << "{level_fmt}"
-
74  << bold("{msg}")
-
75  << discreet(" {hfill} ")
-
76  << fmt(dark,bg::none) << ""
-
77  << fmt(fg::none,dark) << "{level_fmt} {func} "
-
78  << fmt(lite,dark) << ""
-
79  << fmt(dark,lite) << "{file}" << reset
-
80  << fmt(dark,lite) << ""
-
81  << fmt(lite,dark) << "{line}" << reset
-
82  << "\n";
-
83  log.format(format.str());
+
67  log.style(level::critical, 197);
+
68  log.style(level::error, 202);
+
69  log.style(level::warning, 208);
+
70  log.style(level::progress, 34);
+
71  log.style(level::note, 35);
+
72  log.style(level::info, 36);
+
73  log.style(level::debug, 39);
+
74  log.style(level::xdebug, 45);
+
75  std::ostringstream format;
+
76  fmt reset(typo::reset);
+
77  fmt discreet(fg::black);
+
78  fmt bold(fmt::typo::bold);
+
79 
+
80  log.depth_mark("| ");
+
81  log.hfill_min(400);
+
82  log.hfill_max(500);
+
83  log.hfill_mark('-');
84 
-
85  log.out(std::clog);
-
86  log.strip_calls(4);
+
85  const short dark = 238;
+
86  const short lite = 250;
87 
-
88  if(argc <= 2) {
-
89  CLUTCHLOG(warning, "Log level not indicated, will default to xdebug");
-
90  log.threshold(level::xdebug);
-
91  } else {
-
92  try {
-
93  log.threshold(log.level_of(argv[1]));
-
94  } catch(std::out_of_range& err) {
-
95  CLUTCHLOG(critical,err.what());
-
96  exit(100);
-
97  }
-
98  }
-
99 
-
100  CLUTCHLOG(progress,"Start something");
-
101  f();
-
102  CLUTCHLOG(progress,"I have stopped");
-
103 }
-
104 
+
88  format
+
89  << fmt(dark,lite) << "{name}"
+
90  << fmt(lite,dark) << ""
+
91  << fmt(fg::none,dark) << "{level_fmt}" << " {level_short} " << reset
+
92  << fmt(dark,bg::none) << "" << reset
+
93  << fmt(dark,bg::none) << "{depth_marks}" << reset
+
94  << "{level_fmt}"
+
95  << bold("{msg}")
+
96  << discreet(" {hfill} ")
+
97  << fmt(dark,bg::none) << ""
+
98  << fmt(fg::none,dark) << "{level_fmt} {func} "
+
99  << fmt(lite,dark) << ""
+
100  << fmt(dark,lite) << "{file}" << reset
+
101  << fmt(dark,lite) << ""
+
102  << fmt(lite,dark) << "{line}" << reset
+
103  << "\n";
+
104  log.format(format.str());
+
105 
+
106  log.out(std::clog);
+
107  log.strip_calls(4);
+
108 
+
109  if(argc <= 2) {
+
110  CLUTCHLOG(warning, "Log level not indicated, will default to xdebug");
+
111  log.threshold(level::xdebug);
+
112  } else {
+
113  try {
+
114  log.threshold(log.level_of(argv[1]));
+
115  } catch(std::out_of_range& err) {
+
116  CLUTCHLOG(critical,err.what());
+
117  exit(100);
+
118  }
+
119  }
+
120 
+
121  CLUTCHLOG(progress,"Start analysis");
+
122  init();
+
123  CLUTCHLOG(progress,"I have stopped");
+
124 }
+
125 
level
Available log levels.
Definition: clutchlog.h:303
diff --git a/docs/t-demo_8cpp_source.html b/docs/t-demo_8cpp_source.html index 94db5cf..d28f1d6 100644 --- a/docs/t-demo_8cpp_source.html +++ b/docs/t-demo_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-dump_8cpp_source.html b/docs/t-dump_8cpp_source.html index 94d1b6c..86d4bdd 100644 --- a/docs/t-dump_8cpp_source.html +++ b/docs/t-dump_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-fmt-constructors_8cpp_source.html b/docs/t-fmt-constructors_8cpp_source.html index c5fddac..05e960c 100644 --- a/docs/t-fmt-constructors_8cpp_source.html +++ b/docs/t-fmt-constructors_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-hash-color_8cpp_source.html b/docs/t-hash-color_8cpp_source.html new file mode 100644 index 0000000..be054ac --- /dev/null +++ b/docs/t-hash-color_8cpp_source.html @@ -0,0 +1,156 @@ + + + + + + + +clutchlog: t-hash-color.cpp Source File + + + + + + + + + + + + + + +
+
+

Public Member Functions

clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
clutchlog -  0.13 +  0.14
+ + + + + + +
+
clutchlog +  0.14 +
+
+ + + + + + + + + +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
t-hash-color.cpp
+
+
+
1 #include <iostream>
+
2 #include <limits>
+
3 
+
4 #include "../clutchlog/clutchlog.h"
+
5 
+
6 void deepcall()
+
7 {
+
8  CLUTCHLOG(warning,"at depth 4");
+
9 }
+
10 
+
11 void subsubsubcall()
+
12 {
+
13  CLUTCHLOG(warning,"at depth 3");
+
14  deepcall();
+
15 }
+
16 
+
17 void subsubcall()
+
18 {
+
19  CLUTCHLOG(warning,"at depth 2");
+
20  subsubsubcall();
+
21 }
+
22 
+
23 void subcall()
+
24 {
+
25  CLUTCHLOG(warning,"at depth 1");
+
26  subsubcall();
+
27 }
+
28 
+
29 int main(/*const int argc, char* argv[]*/)
+
30 {
+
31  auto& log = clutchlog::logger();
+
32  using fmt = clutchlog::fmt;
+
33  using typo = clutchlog::fmt::typo;
+
34 
+
35  fmt reset(typo::reset);
+
36  std::ostringstream tpl;
+
37  tpl << "{level_fmt}Having a {level} {filehash_fmt}within {file} {funchash_fmt}calling {func} {depth_fmt}at level {depth}"
+
38  << reset << " : {msg}\n";
+
39  log.format(tpl.str());
+
40  log.threshold(clutchlog::level::xdebug);
+
41 
+
42  log.filehash_styles( {fmt(fmt::fg::red), fmt(fmt::fg::yellow)} );
+
43  log.funchash_styles( {fmt(fmt::fg::green), fmt(fmt::fg::blue),
+
44  fmt(fmt::fg::bright_green), fmt(fmt::fg::bright_blue), fmt(fmt::fg::magenta)} );
+
45  log.depth_styles( {fmt(255),fmt(250),fmt(245),fmt(240)} );
+
46 
+
47  CLUTCHLOG(warning,"in main");
+
48  subcall();
+
49 }
+
+
+
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:296
+
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:366
+
#define CLUTCHLOG(LEVEL, WHAT)
Log a message at the given level.
Definition: clutchlog.h:81
+
typo
Typographic style codes.
Definition: clutchlog.h:379
+ + + + diff --git a/docs/t-log_8cpp_source.html b/docs/t-log_8cpp_source.html index ec1e9f6..7cb9a37 100644 --- a/docs/t-log_8cpp_source.html +++ b/docs/t-log_8cpp_source.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
diff --git a/docs/t-one-line-if_8cpp_source.html b/docs/t-one-line-if_8cpp_source.html index c862313..4094cc3 100644 --- a/docs/t-one-line-if_8cpp_source.html +++ b/docs/t-one-line-if_8cpp_source.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.13 +  0.14
From 0b970fc2ee14bf9b76c71c56b4516e429a891087 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 29 Jan 2023 08:06:44 +0100 Subject: [PATCH 05/24] feat(depth_marks): atomic styling of depth marks Color each `{depth_marks}` with the corresponding `depth_styles`. Implements #8 --- README.md | 4 ++++ clutchlog/clutchlog.h | 20 ++++++++++++++------ tests/t-demo-extravagant.cpp | 24 ++++++++++++++++-------- tests/t-hash-color.cpp | 2 +- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d8a866d..a011415 100644 --- a/README.md +++ b/README.md @@ -412,6 +412,10 @@ For example: log.depth_styles({ fmt(255), fmt(250), fmt(245), fmt(240), fmt(235) }); ``` +If `clutchlog::depth_styles` is set, the `{depth_marks}` template tag will render +with each mark having each own style corresponding to its depth. +Note: a depth of zero showing no mark, the first style in the list is never applied to marks. + Advanced Usage ============== diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index c79e0e9..b5a09ef 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -1288,17 +1288,25 @@ class clutchlog row = replace(row, "\\{name\\}", name); row = replace(row, "\\{depth\\}", actual_depth); - std::ostringstream chevrons; - for(size_t i = _strip_calls; i < depth; ++i) { - chevrons << _depth_mark; - } - row = replace(row, "\\{depth_marks\\}", chevrons.str()); - if(_depth_fmts.size() == 0) { row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() ); + + std::ostringstream chevrons; + for(size_t i = 0; i < actual_depth; ++i) { + chevrons << _depth_mark; + } + row = replace(row, "\\{depth_marks\\}", chevrons.str()); + } else { row = replace(row, "\\{depth_fmt\\}", _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() ); + + std::ostringstream chevrons; + for(size_t i = 0; i < actual_depth; ++i) { + chevrons << _depth_fmts[std::min(i+1,_depth_fmts.size()-1)].str() + << _depth_mark; + } + row = replace(row, "\\{depth_marks\\}", chevrons.str()); } #endif row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str()); diff --git a/tests/t-demo-extravagant.cpp b/tests/t-demo-extravagant.cpp index 3637924..a7ed491 100644 --- a/tests/t-demo-extravagant.cpp +++ b/tests/t-demo-extravagant.cpp @@ -83,21 +83,29 @@ int main(const int argc, char* argv[]) log.hfill_mark('-'); const short dark = 238; - const short lite = 250; + const short lite = 245; + + std::vector greys = {fmt(15)}; + for(unsigned short i=255; i>231; i-=3) { + greys.push_back( fmt(i) ); + } + log.depth_styles(greys); format << fmt(dark,lite) << "{name}" - << fmt(lite,dark) << "" - << fmt(fg::none,dark) << "{level_fmt}" << " {level_short} " << reset - << fmt(dark,bg::none) << "" << reset - << fmt(dark,bg::none) << "{depth_marks}" << reset + << fmt(fg::none,lite,typo::inverse) << "{level_fmt}" + << fmt(fg::none,bg::black,typo::inverse) << "{level_fmt}" << " {level_short} " << reset + << "{level_fmt} " << reset + << fmt(dark,bg::none) << "{depth_marks}" //<< reset << "{level_fmt}" + // << "{funchash_fmt}" << bold("{msg}") - << discreet(" {hfill} ") + // << discreet(" {hfill} ") + << "{depth_fmt} {hfill} " << fmt(dark,bg::none) << "" - << fmt(fg::none,dark) << "{level_fmt} {func} " + << fmt(fg::none,dark) << "{funchash_fmt}{func} " << fmt(lite,dark) << "" - << fmt(dark,lite) << "{file}" << reset + << fmt(dark,lite) << "{filehash_fmt}{file}" << reset << fmt(dark,lite) << "" << fmt(lite,dark) << "{line}" << reset << "\n"; diff --git a/tests/t-hash-color.cpp b/tests/t-hash-color.cpp index 1c6882f..68b1c08 100644 --- a/tests/t-hash-color.cpp +++ b/tests/t-hash-color.cpp @@ -34,7 +34,7 @@ int main(/*const int argc, char* argv[]*/) fmt reset(typo::reset); std::ostringstream tpl; - tpl << "{level_fmt}Having a {level} {filehash_fmt}within {file} {funchash_fmt}calling {func} {depth_fmt}at level {depth}" + tpl << "{level_fmt}Having a {level} {filehash_fmt}within {file} {funchash_fmt}calling {func} {depth_fmt}at depth {depth_marks} {depth} " << reset << " : {msg}\n"; log.format(tpl.str()); log.threshold(clutchlog::level::xdebug); From d5aa2d829b70170993de46c72fb1738930d1b81e Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 29 Jan 2023 21:28:11 +0100 Subject: [PATCH 06/24] feat(stack): adds a call macro with depth delta Implements #9 --- README.md | 17 ++++++++++++ clutchlog/clutchlog.h | 39 ++++++++++++++++----------- tests/t-depth-delta.cpp | 58 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 tests/t-depth-delta.cpp diff --git a/README.md b/README.md index a011415..e909f2c 100644 --- a/README.md +++ b/README.md @@ -566,6 +566,23 @@ CLUTCHCODE(info, ``` +Manually Increase Stack Depth +----------------------------- + +You may want to manually increase the stack depth for a given logging call, +for instance to subdivise a single function in sections. +To do so, you can use the `CLUTCHLOGD` macro, which take an additional argument, +in the form of the number of additional (fake) stack depths you want: +```cpp +CLUTCHLOG( debug, "Call"); // Regular macro. +CLUTCHLOGD(debug, "Sub call", 1); // Adds an additional (fake) stack depth. +CLUTCHLOGD(debug, "Sub sub!", 2); // Adds two additional (fake) stack depths. +``` +That way, the depth will be rendered to the actual depth, plus the additional +depth delta. Note that the displayed function will stay the same. Any filtering +on the stack depth will take into account the fake depth and not the real one. + + Examples ======== diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index b5a09ef..7ddf721 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -76,23 +76,32 @@ //! Handy shortcuts to location. #define CLUTCHLOC __FILE__, __FUNCTION__, __LINE__ -//! Log a message at the given level. +//! Log a message at the given level and with a given depth delta. #ifndef NDEBUG - #define CLUTCHLOG( LEVEL, WHAT ) do { \ - auto& clutchlog__logger = clutchlog::logger(); \ - std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \ - clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC); \ + #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \ + auto& clutchlog__logger = clutchlog::logger(); \ + std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \ + clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \ } while(0) #else // not Debug build. - #define CLUTCHLOG( LEVEL, WHAT ) do { \ - if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \ - auto& clutchlog__logger = clutchlog::logger(); \ - std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \ - clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC); \ - } \ + #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \ + if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \ + auto& clutchlog__logger = clutchlog::logger(); \ + std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \ + clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \ + } \ } while(0) #endif // NDEBUG +//! Log a message at the given level. +#ifndef NDEBUG + #define CLUTCHLOG( LEVEL, WHAT ) \ + CLUTCHLOGD(LEVEL, WHAT, 0) +#else // not Debug build. + #define CLUTCHLOG( LEVEL, WHAT ) \ + CLUTCHLOGD(LEVEL, WHAT, 0) +#endif // NDEBUG + //! Dump the given container. #ifndef NDEBUG #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \ @@ -1364,7 +1373,8 @@ class clutchlog void log( const level& stage, const std::string& what, - const std::string& file, const std::string& func, size_t line + const std::string& file, const std::string& func, const size_t line, + const size_t depth_delta = 0 ) const { scope_t scope = locate(stage, file, func, line); @@ -1373,12 +1383,11 @@ class clutchlog #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 *_out << format(_format_log, what, basename(getenv("_")), stage, file, func, - line, scope.depth ); + line, scope.depth + depth_delta ); #else *_out << format(_format_log, what, stage, file, func, line ); - #endif _out->flush(); } // if scopes.matches @@ -1389,7 +1398,7 @@ class clutchlog void dump( const level& stage, const In container_begin, const In container_end, - const std::string& file, const std::string& func, size_t line, + const std::string& file, const std::string& func, const size_t line, const std::string& filename_template = "dump_{n}.dat", const std::string sep = dump_default_sep ) const diff --git a/tests/t-depth-delta.cpp b/tests/t-depth-delta.cpp new file mode 100644 index 0000000..0db389d --- /dev/null +++ b/tests/t-depth-delta.cpp @@ -0,0 +1,58 @@ +#include +#include + +#include "../clutchlog/clutchlog.h" + +void deepcall() +{ + CLUTCHLOG(warning,"at depth 4"); + CLUTCHLOGD(warning,"at depth 4+1", 1); + CLUTCHLOGD(warning,"at depth 4+2", 2); +} + +void subsubsubcall() +{ + CLUTCHLOG(warning,"at depth 3"); + CLUTCHLOGD(warning,"at depth 3+1", 1); + CLUTCHLOGD(warning,"at depth 3+2", 2); + deepcall(); +} + +void subsubcall() +{ + CLUTCHLOG(warning,"at depth 2"); + CLUTCHLOGD(warning,"at depth 2+1", 1); + CLUTCHLOGD(warning,"at depth 2+2", 2); + subsubsubcall(); +} + +void subcall() +{ + CLUTCHLOG(warning,"at depth 1"); + CLUTCHLOGD(warning,"at depth 1+1", 1); + CLUTCHLOGD(warning,"at depth 1+2", 2); + subsubcall(); +} + +int main(/*const int argc, char* argv[]*/) +{ + auto& log = clutchlog::logger(); + using fmt = clutchlog::fmt; + using typo = clutchlog::fmt::typo; + + fmt reset(typo::reset); + std::ostringstream tpl; + tpl << "{depth_fmt}{depth} {depth_marks}" + << reset << "{funchash_fmt}in {func} {msg}\t\n"; + log.format(tpl.str()); + log.threshold(clutchlog::level::xdebug); + std::vector greys = {fmt(15)}; + for(unsigned short i=255; i > 231; i-=3) { + greys.push_back( fmt(i) ); } + log.depth_styles( greys ); + log.depth_mark("| "); + + CLUTCHLOG(warning,"in main"); + subcall(); +} + From 2621e68c20b24071badb5c50314269247577283c Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 30 Jan 2023 22:16:00 +0100 Subject: [PATCH 07/24] feat(depth): adds the CLUTCHLOGD macro Allows to increase depth manually at log call. Implements #9 --- clutchlog/clutchlog.h | 1 + 1 file changed, 1 insertion(+) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index 7ddf721..23ad419 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -166,6 +166,7 @@ #else // not WITH_CLUTCHLOG // Disabled macros can still be called in Release builds. #define CLUTCHLOG( LEVEL, WHAT ) do {/*nothing*/} while(0) + #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do {/*nothing*/} while(0) #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {/*nothing*/} while(0) #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {/*nothing*/} while(0) #define CLUTCHCODE( LEVEL, CODE ) do {/*nothing*/} while(0) From 206fe1ab945c6ab9b80a3bb7c4a27e3708714b8c Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 30 Jan 2023 22:17:04 +0100 Subject: [PATCH 08/24] bump to v0.16 --- CMakeLists.txt | 2 +- docs/annotated.html | 2 +- docs/classclutchlog-members.html | 6 +- docs/classclutchlog.html | 56 +- docs/classclutchlog.js | 4 +- docs/classclutchlog_1_1fmt-members.html | 2 +- docs/classclutchlog_1_1fmt.html | 14 +- docs/classes.html | 2 +- docs/clutchlog_8h.html | 13 +- docs/clutchlog_8h.js | 1 + docs/clutchlog_8h__dep__incl.map | 13 +- docs/clutchlog_8h__dep__incl.md5 | 2 +- docs/clutchlog_8h__dep__incl.svg | 97 +- docs/clutchlog_8h__dep__incl_org.svg | 99 +- docs/clutchlog_8h_source.html | 2623 +++++++++-------- docs/dir_000001_000000.html | 4 +- .../dir_59425e443f801f1f2fd8bbe4959a3ccf.html | 5 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.map | 2 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 | 2 +- ...r_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg | 4 +- .../dir_c318bd5cf14aaa5601e6029e0b5b4048.html | 2 +- docs/files.html | 13 +- docs/files_dup.js | 1 + docs/functions.html | 6 +- docs/functions_enum.html | 2 +- docs/functions_func.html | 6 +- docs/functions_rela.html | 2 +- docs/functions_vars.html | 2 +- docs/globals.html | 5 +- docs/globals_defs.html | 5 +- docs/graph_legend.html | 2 +- docs/group___default_config.html | 2 +- docs/group___formating.html | 2 +- docs/group___main.html | 2 +- docs/group___main.js | 14 +- docs/group___use_macros.html | 44 +- docs/group___use_macros.js | 1 + docs/group__colors16.html | 2 +- docs/group__colors256__16_m.html | 2 +- docs/hierarchy.html | 2 +- docs/index.html | 125 +- docs/inherits.html | 2 +- docs/modules.html | 2 +- docs/navtreedata.js | 34 +- docs/navtreeindex0.js | 92 +- docs/navtreeindex1.js | 15 +- docs/search/all_10.js | 2 +- docs/search/all_3.js | 17 +- docs/search/all_4.js | 22 +- docs/search/all_5.js | 28 +- docs/search/all_6.js | 2 +- docs/search/all_7.js | 2 +- docs/search/all_8.js | 6 +- docs/search/all_9.js | 16 +- docs/search/all_a.js | 6 +- docs/search/all_b.js | 6 +- docs/search/all_c.js | 2 +- docs/search/all_d.js | 4 +- docs/search/all_e.js | 8 +- docs/search/all_f.js | 8 +- docs/search/classes_0.js | 4 +- docs/search/classes_1.js | 8 +- docs/search/classes_2.js | 6 +- docs/search/classes_3.js | 2 +- docs/search/defines_0.js | 6 +- docs/search/defines_1.js | 2 +- docs/search/enums_0.js | 2 +- docs/search/enums_1.js | 2 +- docs/search/enums_2.js | 2 +- docs/search/enums_3.js | 2 +- docs/search/enums_4.js | 2 +- docs/search/enums_5.js | 2 +- docs/search/enumvalues_0.js | 6 +- docs/search/files_0.js | 2 +- docs/search/functions_0.js | 4 +- docs/search/functions_1.js | 6 +- docs/search/functions_2.js | 4 +- docs/search/functions_3.js | 18 +- docs/search/functions_4.js | 2 +- docs/search/functions_5.js | 14 +- docs/search/functions_6.js | 4 +- docs/search/functions_7.js | 2 +- docs/search/functions_8.js | 2 +- docs/search/functions_9.js | 6 +- docs/search/functions_a.js | 2 +- docs/search/groups_0.js | 2 +- docs/search/groups_1.js | 2 +- docs/search/groups_2.js | 2 +- docs/search/groups_3.js | 2 +- docs/search/groups_4.js | 2 +- docs/search/groups_5.js | 2 +- docs/search/pages_0.js | 2 +- docs/search/related_0.js | 2 +- docs/search/variables_0.js | 28 +- docs/search/variables_1.js | 6 +- docs/search/variables_2.js | 16 +- docs/search/variables_3.js | 6 +- docs/search/variables_4.js | 2 +- docs/search/variables_5.js | 4 +- docs/search/variables_6.js | 2 +- docs/search/variables_7.js | 4 +- docs/search/variables_8.js | 4 +- ...tclutchlog_1_1fmt_1_1bg__16_m-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1bg__16_m.html | 10 +- ...ctclutchlog_1_1fmt_1_1bg__256-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1bg__256.html | 8 +- ...ructclutchlog_1_1fmt_1_1color-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1color.html | 6 +- ...utchlog_1_1fmt_1_1color__16_m-members.html | 2 +- ...structclutchlog_1_1fmt_1_1color__16_m.html | 16 +- ...lutchlog_1_1fmt_1_1color__256-members.html | 2 +- .../structclutchlog_1_1fmt_1_1color__256.html | 12 +- ...tclutchlog_1_1fmt_1_1fg__16_m-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1fg__16_m.html | 10 +- ...ctclutchlog_1_1fmt_1_1fg__256-members.html | 2 +- docs/structclutchlog_1_1fmt_1_1fg__256.html | 8 +- docs/structclutchlog_1_1scope__t-members.html | 2 +- docs/structclutchlog_1_1scope__t.html | 4 +- docs/t-assert_8cpp_source.html | 6 +- docs/t-color16_m_8cpp_source.html | 10 +- docs/t-color256_8cpp_source.html | 10 +- docs/t-color_8cpp_source.html | 14 +- docs/t-demo-extravagant_8cpp_source.html | 102 +- docs/t-demo_8cpp_source.html | 8 +- docs/t-depth-delta_8cpp_source.html | 166 ++ docs/t-dump_8cpp_source.html | 6 +- docs/t-fmt-constructors_8cpp_source.html | 10 +- docs/t-hash-color_8cpp_source.html | 12 +- docs/t-log_8cpp_source.html | 6 +- docs/t-one-line-if_8cpp_source.html | 4 +- 130 files changed, 2196 insertions(+), 1917 deletions(-) create mode 100644 docs/t-depth-delta_8cpp_source.html diff --git a/CMakeLists.txt b/CMakeLists.txt index 507a7f8..b794cc4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.10 FATAL_ERROR) project("clutchlog" - VERSION 0.15 + VERSION 0.16 DESCRIPTION "A logging system which targets versatile debugging") enable_language(CXX) # C++ diff --git a/docs/annotated.html b/docs/annotated.html index c9f4a52..7a8cdd9 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.14 +  0.15
diff --git a/docs/classclutchlog-members.html b/docs/classclutchlog-members.html index fe7c2cb..2fef3b8 100644 --- a/docs/classclutchlog-members.html +++ b/docs/classclutchlog-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.14 +  0.15
@@ -116,7 +116,7 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl default_hfill_minclutchloginlineprotectedstatic default_strip_callsclutchloginlineprotectedstatic depth_styles(std::vector< fmt > styles)clutchloginline - dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) constclutchloginline + dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) constclutchloginline dump_default_formatclutchloginlineprotectedstatic dump_default_sepclutchloginlineprotectedstatic error enum value (defined in clutchlog)clutchlog @@ -136,7 +136,7 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl line(std::string line)clutchloginline locate(const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")clutchloginline - log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) constclutchloginline + log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) constclutchloginline logger()clutchloginlinestatic note enum value (defined in clutchlog)clutchlog operator=(clutchlog const &)=delete (defined in clutchlog)clutchlog diff --git a/docs/classclutchlog.html b/docs/classclutchlog.html index 299f623..907d2d3 100644 --- a/docs/classclutchlog.html +++ b/docs/classclutchlog.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.14 +  0.15
@@ -100,7 +100,7 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl

The single class which holds everything.

This is a Singleton class.

-

Definition at line 177 of file clutchlog.h.

+

Definition at line 187 of file clutchlog.h.

@@ -201,15 +201,15 @@ std::string  - - - - + + + - - - + + +

Public Member Functions

format (std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
 Substitute all tags in the format string with the corresponding information and apply the style corresponding to the log level.
 
-void log (const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
 Print a log message IF the location matches the given one.
 
+
+void log (const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
 Print a log message IF the location matches the given one.
 
template<class In >
void dump (const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
 Dump a serializable container after a comment line with log information.
 
void dump (const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
 Dump a serializable container after a comment line with log information.
 
@@ -369,9 +369,9 @@ void  diff --git a/docs/classclutchlog_1_1fmt.html b/docs/classclutchlog_1_1fmt.html index b1bb17c..4a78df2 100644 --- a/docs/classclutchlog_1_1fmt.html +++ b/docs/classclutchlog_1_1fmt.html @@ -28,7 +28,7 @@ @@ -154,7 +154,7 @@ $(document).ready(function(){initNavTree('classclutchlog_1_1fmt.html',''); initR
All styles may not be supported by a given terminal/operating system.
-

Definition at line 366 of file clutchlog.h.

+

Definition at line 376 of file clutchlog.h.

Static Protected Attributes

operator= (

Get the logger instance.

-
+ -

Definition at line 296 of file clutchlog.h.

+

Definition at line 306 of file clutchlog.h.

@@ -403,9 +403,9 @@ void 
operator= (Style will be chosen based on the hash value of the filename among the candidate ones.

See the {filehash_fmt} template tag.

-

Definition at line 1028 of file clutchlog.h.

+

Definition at line 1038 of file clutchlog.h.

-

References _filehash_fmts.

+

References _filehash_fmts.

@@ -437,9 +437,9 @@ void 
operator= (Style will be chosen based on the hash value of the filename among the candidate ones.

See the {funchash_fmt} template tag.

-

Definition at line 1036 of file clutchlog.h.

+

Definition at line 1046 of file clutchlog.h.

-

References _funchash_fmts.

+

References _funchash_fmts.

@@ -471,7 +471,7 @@ void 
operator= (The given list should be ordered, styles will be applied for the corresponding depth level. If the actual depth is larger than the number of styles, the last one is used.

See the {depth_fmt} template tag.

-

Definition at line 1045 of file clutchlog.h.

+

Definition at line 1055 of file clutchlog.h.

@@ -502,11 +502,11 @@ void 
operator= (Return the log level tag corresponding to the given pre-configured name.

Note
This is case sensitive, see the pre-configured _level_word.
-

Definition at line 1060 of file clutchlog.h.

+

Definition at line 1070 of file clutchlog.h.

-

References _word_level.

+

References _word_level.

-

Referenced by threshold().

+

Referenced by threshold().

@@ -549,11 +549,11 @@ template<class ... FMT>

Set the style (color and typo) of the given log level.

This version accept style arguments as if they were passed to clutchlog::fmt.

-

Definition at line 1094 of file clutchlog.h.

+

Definition at line 1104 of file clutchlog.h.

-

References style().

+

References style().

-

Referenced by style().

+

Referenced by style().

@@ -598,12 +598,12 @@ template<class ... FMT>

Replace mark by tag in form.

-
log.replace("{greet} {world}", "\\{greet\\}", "hello");
+
log.replace("{greet} {world}", "\\{greet\\}", "hello");
// returns "hello {world}"
-

Definition at line 1183 of file clutchlog.h.

+

Definition at line 1193 of file clutchlog.h.

-

Referenced by dump(), format(), and replace().

+

Referenced by dump(), format(), and replace().

@@ -612,8 +612,8 @@ template<class ... FMT> -
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1356
-
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:296
+
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:306
+
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1374
clutchlog -  0.14 +  0.15
clutchlog -  0.14 +  0.15
@@ -415,9 +415,9 @@ std::ostream &  diff --git a/docs/clutchlog_8h.html b/docs/clutchlog_8h.html index afb9e50..2dbb3b1 100644 --- a/docs/clutchlog_8h.html +++ b/docs/clutchlog_8h.html @@ -28,7 +28,7 @@ @@ -114,8 +114,7 @@ $(document).ready(function(){initNavTree('clutchlog_8h.html',''); initResizable(

Go to the source code of this file.

@@ -179,8 +178,12 @@ Macros #define  - - + + + + + diff --git a/docs/clutchlog_8h.js b/docs/clutchlog_8h.js index 05cb530..bf6872c 100644 --- a/docs/clutchlog_8h.js +++ b/docs/clutchlog_8h.js @@ -7,6 +7,7 @@ var clutchlog_8h = [ "WITH_CLUTCHLOG", "clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4", null ], [ "CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG", "group___default_config.html#ga8564be479b948ee3052b61783c66d415", null ], [ "CLUTCHLOC", "group___use_macros.html#gae8911119d726a43b77f5781cb5a72813", null ], + [ "CLUTCHLOGD", "group___use_macros.html#ga369d365b7c25ec270596c3ca6839cf2c", null ], [ "CLUTCHLOG", "group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d", null ], [ "CLUTCHDUMP", "group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2", null ], [ "CLUTCHFUNC", "group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae", null ], diff --git a/docs/clutchlog_8h__dep__incl.map b/docs/clutchlog_8h__dep__incl.map index 20f2720..4740dc4 100644 --- a/docs/clutchlog_8h__dep__incl.map +++ b/docs/clutchlog_8h__dep__incl.map @@ -1,14 +1,15 @@ - + - - - - - + + + + + + diff --git a/docs/clutchlog_8h__dep__incl.md5 b/docs/clutchlog_8h__dep__incl.md5 index d28cb8a..440c2e6 100644 --- a/docs/clutchlog_8h__dep__incl.md5 +++ b/docs/clutchlog_8h__dep__incl.md5 @@ -1 +1 @@ -f0599479963670ec59fcd0540b0432ef \ No newline at end of file +03a5adb412c477109d73f308278ec653 \ No newline at end of file diff --git a/docs/clutchlog_8h__dep__incl.svg b/docs/clutchlog_8h__dep__incl.svg index 9fe6b9c..1422fbd 100644 --- a/docs/clutchlog_8h__dep__incl.svg +++ b/docs/clutchlog_8h__dep__incl.svg @@ -46,7 +46,7 @@ if (edges && edges.length) { @@ -54,13 +54,13 @@ var sectionId = 'dynsection-1'; clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -76,8 +76,8 @@ var sectionId = 'dynsection-1'; Node1->Node2 - - + + @@ -91,8 +91,8 @@ var sectionId = 'dynsection-1'; Node1->Node3 - - + + @@ -106,8 +106,8 @@ var sectionId = 'dynsection-1'; Node1->Node4 - - + + @@ -121,8 +121,8 @@ var sectionId = 'dynsection-1'; Node1->Node5 - - + + @@ -136,8 +136,8 @@ var sectionId = 'dynsection-1'; Node1->Node6 - - + + @@ -151,83 +151,98 @@ var sectionId = 'dynsection-1'; Node1->Node7 - - + + Node8 - - -t-dump.cpp + + +t-depth-delta.cpp Node1->Node8 - - + + Node9 - - -t-fmt-constructors.cpp + + +t-dump.cpp Node1->Node9 - - + + Node10 - - -t-hash-color.cpp + + +t-fmt-constructors.cpp Node1->Node10 - - + + Node11 - - -t-log.cpp + + +t-hash-color.cpp Node1->Node11 - - + + Node12 - - -t-one-line-if.cpp + + +t-log.cpp Node1->Node12 - - + + + + + +Node13 + + +t-one-line-if.cpp + + + + + +Node1->Node13 + + diff --git a/docs/clutchlog_8h__dep__incl_org.svg b/docs/clutchlog_8h__dep__incl_org.svg index df19fdd..3682d73 100644 --- a/docs/clutchlog_8h__dep__incl_org.svg +++ b/docs/clutchlog_8h__dep__incl_org.svg @@ -4,17 +4,17 @@ - + clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -30,8 +30,8 @@ Node1->Node2 - - + + @@ -45,8 +45,8 @@ Node1->Node3 - - + + @@ -60,8 +60,8 @@ Node1->Node4 - - + + @@ -75,8 +75,8 @@ Node1->Node5 - - + + @@ -90,8 +90,8 @@ Node1->Node6 - - + + @@ -105,83 +105,98 @@ Node1->Node7 - - + + Node8 - - -t-dump.cpp + + +t-depth-delta.cpp Node1->Node8 - - + + Node9 - - -t-fmt-constructors.cpp + + +t-dump.cpp Node1->Node9 - - + + Node10 - - -t-hash-color.cpp + + +t-fmt-constructors.cpp Node1->Node10 - - + + Node11 - - -t-log.cpp + + +t-hash-color.cpp Node1->Node11 - - + + Node12 - - -t-one-line-if.cpp + + +t-log.cpp Node1->Node12 - - + + + + + +Node13 + + +t-one-line-if.cpp + + + + + +Node1->Node13 + + diff --git a/docs/clutchlog_8h_source.html b/docs/clutchlog_8h_source.html index fa6a0cb..71543c2 100644 --- a/docs/clutchlog_8h_source.html +++ b/docs/clutchlog_8h_source.html @@ -28,7 +28,7 @@ Logo @@ -151,1352 +151,1369 @@ $(document).ready(function(){initNavTree('clutchlog_8h_source.html',''); initRes
76 #define CLUTCHLOC __FILE__, __FUNCTION__, __LINE__
78 
80 #ifndef NDEBUG
-
81  #define CLUTCHLOG( LEVEL, WHAT ) do { \
-
82  auto& clutchlog__logger = clutchlog::logger(); \
-
83  std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
-
84  clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC); \
+
81  #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \
+
82  auto& clutchlog__logger = clutchlog::logger(); \
+
83  std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
+
84  clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
85  } while(0)
86 #else // not Debug build.
-
87  #define CLUTCHLOG( LEVEL, WHAT ) do { \
-
88  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
-
89  auto& clutchlog__logger = clutchlog::logger(); \
-
90  std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
-
91  clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC); \
-
92  } \
+
87  #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \
+
88  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
+
89  auto& clutchlog__logger = clutchlog::logger(); \
+
90  std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
+
91  clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
+
92  } \
93  } while(0)
94 #endif // NDEBUG
95 
97 #ifndef NDEBUG
-
98  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
-
99  auto& clutchlog__logger = clutchlog::logger(); \
-
100  clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
-
101  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
-
102  } while(0)
-
103 #else // not Debug build.
-
104  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
-
105  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
-
106  auto& clutchlog__logger = clutchlog::logger(); \
-
107  clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
-
108  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
-
109  } \
-
110  } while(0)
-
111 #endif // NDEBUG
-
112 
-
114 #ifndef NDEBUG
-
115  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
-
116  auto& clutchlog__logger = clutchlog::logger(); \
-
117  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
-
118  if(clutchlog__scope.matches) { \
-
119  FUNC(__VA_ARGS__); \
-
120  } \
-
121  } while(0)
-
122 #else // not Debug build.
-
123  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
-
124  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
-
125  auto& clutchlog__logger = clutchlog::logger(); \
-
126  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
-
127  if(clutchlog__scope.matches) { \
-
128  FUNC(__VA_ARGS__); \
-
129  } \
-
130  } \
-
131  } while(0)
-
132 #endif // NDEBUG
-
133 
-
135 #ifndef NDEBUG
-
136  #define CLUTCHCODE( LEVEL, ... ) do { \
-
137  auto& clutchlog__logger = clutchlog::logger(); \
-
138  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
-
139  if(clutchlog__scope.matches) { \
-
140  __VA_ARGS__ \
-
141  } \
-
142  } while(0)
-
143 #else // not Debug build.
-
144  #define CLUTCHCODE( LEVEL, CODE ) do { \
-
145  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
-
146  auto& clutchlog__logger = clutchlog::logger(); \
-
147  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
-
148  if(clutchlog__scope.matches) { \
-
149  CODE \
-
150  } \
-
151  } \
-
152  } while(0)
-
153 #endif // NDEBUG
-
154 
-
157 #else // not WITH_CLUTCHLOG
-
158  // Disabled macros can still be called in Release builds.
-
159  #define CLUTCHLOG( LEVEL, WHAT ) do {/*nothing*/} while(0)
-
160  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {/*nothing*/} while(0)
-
161  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {/*nothing*/} while(0)
-
162  #define CLUTCHCODE( LEVEL, CODE ) do {/*nothing*/} while(0)
-
163 #endif // WITH_CLUTCHLOG
-
164 
-
165 /**********************************************************************
-
166  * Implementation
-
167  **********************************************************************/
-
168 
-
169 #ifdef WITH_CLUTCHLOG
-
170 
- -
178 {
-
179  protected:
+
98  #define CLUTCHLOG( LEVEL, WHAT ) \
+
99  CLUTCHLOGD(LEVEL, WHAT, 0)
+
100 #else // not Debug build.
+
101  #define CLUTCHLOG( LEVEL, WHAT ) \
+
102  CLUTCHLOGD(LEVEL, WHAT, 0)
+
103 #endif // NDEBUG
+
104 
+
106 #ifndef NDEBUG
+
107  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
+
108  auto& clutchlog__logger = clutchlog::logger(); \
+
109  clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
+
110  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
+
111  } while(0)
+
112 #else // not Debug build.
+
113  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
+
114  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
+
115  auto& clutchlog__logger = clutchlog::logger(); \
+
116  clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
+
117  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
+
118  } \
+
119  } while(0)
+
120 #endif // NDEBUG
+
121 
+
123 #ifndef NDEBUG
+
124  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
+
125  auto& clutchlog__logger = clutchlog::logger(); \
+
126  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
+
127  if(clutchlog__scope.matches) { \
+
128  FUNC(__VA_ARGS__); \
+
129  } \
+
130  } while(0)
+
131 #else // not Debug build.
+
132  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
+
133  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
+
134  auto& clutchlog__logger = clutchlog::logger(); \
+
135  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
+
136  if(clutchlog__scope.matches) { \
+
137  FUNC(__VA_ARGS__); \
+
138  } \
+
139  } \
+
140  } while(0)
+
141 #endif // NDEBUG
+
142 
+
144 #ifndef NDEBUG
+
145  #define CLUTCHCODE( LEVEL, ... ) do { \
+
146  auto& clutchlog__logger = clutchlog::logger(); \
+
147  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
+
148  if(clutchlog__scope.matches) { \
+
149  __VA_ARGS__ \
+
150  } \
+
151  } while(0)
+
152 #else // not Debug build.
+
153  #define CLUTCHCODE( LEVEL, CODE ) do { \
+
154  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
+
155  auto& clutchlog__logger = clutchlog::logger(); \
+
156  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
+
157  if(clutchlog__scope.matches) { \
+
158  CODE \
+
159  } \
+
160  } \
+
161  } while(0)
+
162 #endif // NDEBUG
+
163 
+
166 #else // not WITH_CLUTCHLOG
+
167  // Disabled macros can still be called in Release builds.
+
168  #define CLUTCHLOG( LEVEL, WHAT ) do {/*nothing*/} while(0)
+
169  #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do {/*nothing*/} while(0)
+
170  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {/*nothing*/} while(0)
+
171  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {/*nothing*/} while(0)
+
172  #define CLUTCHCODE( LEVEL, CODE ) do {/*nothing*/} while(0)
+
173 #endif // WITH_CLUTCHLOG
+
174 
+
175 /**********************************************************************
+
176  * Implementation
+
177  **********************************************************************/
+
178 
+
179 #ifdef WITH_CLUTCHLOG
180 
-
185  #ifndef NDEBUG
-
186  #ifndef CLUTCHLOG_DEFAULT_FORMAT
-
187  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 // Enables: name, depth and depth_marks
-
189  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1 // Enables: hfill
-
190  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n"
-
191  #else
-
192  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
-
193  #endif
-
194  #else
-
195  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
196  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg} {hfill} {func} @ {file}:{line}\n"
-
197  #else
-
198  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
-
199  #endif
-
200  #endif
-
201  #endif
-
202  #else
-
203  #ifndef CLUTCHLOG_DEFAULT_FORMAT
-
204  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
206  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func}\n"
-
207  #else
-
208  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func}\n"
-
209  #endif
-
210  #endif
-
211  #endif
-
212  static inline std::string default_format = CLUTCHLOG_DEFAULT_FORMAT;
-
214 
-
215  #ifndef NDEBUG
-
216  #ifndef CLUTCHDUMP_DEFAULT_FORMAT
-
217  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
219  #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}"
-
220  #else
-
221  #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func} @ {file}:{line}"
-
222  #endif
-
223  #endif // CLUTCHDUMP_DEFAULT_FORMAT
-
224  #else
-
225  #ifndef CLUTCHDUMP_DEFAULT_FORMAT
-
226  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
228  #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth})"
-
229  #else
-
230  #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func}"
-
231  #endif
-
232  #endif // CLUTCHDUMP_DEFAULT_FORMAT
-
233  #endif
-
234  static inline std::string dump_default_format = CLUTCHDUMP_DEFAULT_FORMAT;
-
236 
-
237  #ifndef CLUTCHDUMP_DEFAULT_SEP
-
238  #define CLUTCHDUMP_DEFAULT_SEP "\n"
-
240  #endif // CLUTCHDUMP_DEFAULT_SEP
-
241  static inline std::string dump_default_sep = CLUTCHDUMP_DEFAULT_SEP;
-
243 
-
244  #ifndef CLUTCHLOG_DEFAULT_DEPTH_MARK
-
245  #define CLUTCHLOG_DEFAULT_DEPTH_MARK ">"
-
247  #endif // CLUTCHLOG_DEFAULT_DEPTH_MARK
-
248  static inline std::string default_depth_mark = CLUTCHLOG_DEFAULT_DEPTH_MARK;
-
250 
-
251  #ifndef CLUTCHLOG_STRIP_CALLS
-
252  #define CLUTCHLOG_STRIP_CALLS 5
-
254  #endif // CLUTCHLOG_STRIP_CALLS
-
255  static inline unsigned int default_strip_calls = CLUTCHLOG_STRIP_CALLS;
-
257 
-
258  #ifndef CLUTCHLOG_DEFAULT_HFILL_MARK
-
259  #define CLUTCHLOG_DEFAULT_HFILL_MARK '.'
-
261  #endif // CLUTCHLOG_DEFAULT_HFILL_MARK
- -
264 
-
265 
-
266  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
267  #ifndef CLUTCHLOG_DEFAULT_HFILL_MAX
-
268  #define CLUTCHLOG_DEFAULT_HFILL_MAX 300
-
269  #endif
-
270  #ifndef CLUTCHLOG_DEFAULT_HFILL_MIN
-
271  #define CLUTCHLOG_DEFAULT_HFILL_MIN 150
-
272  #endif
-
273  #endif
-
274  static inline size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX;
-
277  static inline size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN;
-
278 
-
279  // NOTE: there is no CLUTCHLOG_HFILL_STYLE for defaulting,
-
280  // but you can still set `hfill_style(...)` on the logger singleton.
-
281  /* @} DefaultConfig */
-
282  /* @} */
-
283 
-
284 
-
285  public:
-
286 
-
296  static clutchlog& logger()
-
297  {
-
298  static clutchlog instance;
-
299  return instance;
-
300  }
-
301 
-
303  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
-
304 
-
366  class fmt {
-
367  public:
-
369  enum class ansi {
-
371  colors_16 = -1, // Not supposed to be casted.
-
373  colors_256 = 5, // Casted as short in color::operator<<.
-
375  colors_16M = 2 // Casted as short in color::operator<<
-
376  } mode;
-
377 
-
379  enum class typo {
-
380  reset = 0,
-
381  bold = 1,
-
382  underline = 4,
-
383  inverse = 7,
-
384  none = -1
-
385  } style;
-
386 
-
389  enum class fg {
-
391  black = 30,
-
392  red = 31,
-
393  green = 32,
-
394  yellow = 33,
-
395  blue = 34,
-
396  magenta = 35,
-
397  cyan = 36,
-
398  white = 37,
-
399  bright_black = 90,
-
400  bright_red = 91,
-
401  bright_green = 92,
-
402  bright_yellow = 93,
-
403  bright_blue = 94,
-
404  bright_magenta = 95,
-
405  bright_cyan = 96,
-
406  bright_white = 97,
-
407  none = -1
-
408  } fore;
-
409 
-
411  enum class bg {
-
412  black = 40,
-
413  red = 41,
-
414  green = 42,
-
415  yellow = 43,
-
416  blue = 44,
-
417  magenta = 45,
-
418  cyan = 46,
-
419  white = 47,
-
420  bright_black = 100,
-
421  bright_red = 101,
-
422  bright_green = 102,
-
423  bright_yellow = 103,
-
424  bright_blue = 104,
-
425  bright_magenta = 105,
-
426  bright_cyan = 106,
-
427  bright_white = 107,
-
428  none = -1
-
429  } back;
-
430 
-
431  protected:
-
433  friend std::ostream& operator<<(std::ostream& os, const std::tuple<fg,bg,typo>& fbs)
-
434  {
-
435  auto [f,b,s] = fbs;
-
436  std::vector<short> codes; codes.reserve(3);
-
437  if(f != fg::none) { codes.push_back(static_cast<short>(f));}
-
438  if(b != bg::none) { codes.push_back(static_cast<short>(b));}
-
439  if(s != typo::none) { codes.push_back(static_cast<short>(s));}
-
440  if(codes.size() == 0) {
-
441  return os;
-
442 
-
443  } else {
-
444  os << "\033[";
-
445  os << codes[0];
-
446  for(size_t i=1; i < codes.size(); ++i) {
-
447  os << ";" << codes[i];
-
448  }
-
449  os << "m";
-
450  }
-
451  return os;
-
452  }
-
453 
-
455  friend std::ostream& operator<<(std::ostream& os, const typo& s)
-
456  {
-
457  if(s != typo::none) {
-
458  os << "\033[" << static_cast<short>(s) << "m";
-
459  }
-
460  return os;
-
461  }
-
462 
-
465  protected:
-
470  struct color {
-
471  ansi mode; // Not const to allow for the implicit copy assignemnt operator.
+ +
188 {
+
189  protected:
+
190 
+
195  #ifndef NDEBUG
+
196  #ifndef CLUTCHLOG_DEFAULT_FORMAT
+
197  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 // Enables: name, depth and depth_marks
+
199  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1 // Enables: hfill
+
200  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n"
+
201  #else
+
202  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
+
203  #endif
+
204  #else
+
205  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
206  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg} {hfill} {func} @ {file}:{line}\n"
+
207  #else
+
208  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
+
209  #endif
+
210  #endif
+
211  #endif
+
212  #else
+
213  #ifndef CLUTCHLOG_DEFAULT_FORMAT
+
214  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
216  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func}\n"
+
217  #else
+
218  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func}\n"
+
219  #endif
+
220  #endif
+
221  #endif
+
222  static inline std::string default_format = CLUTCHLOG_DEFAULT_FORMAT;
+
224 
+
225  #ifndef NDEBUG
+
226  #ifndef CLUTCHDUMP_DEFAULT_FORMAT
+
227  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
229  #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}"
+
230  #else
+
231  #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func} @ {file}:{line}"
+
232  #endif
+
233  #endif // CLUTCHDUMP_DEFAULT_FORMAT
+
234  #else
+
235  #ifndef CLUTCHDUMP_DEFAULT_FORMAT
+
236  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
238  #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth})"
+
239  #else
+
240  #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func}"
+
241  #endif
+
242  #endif // CLUTCHDUMP_DEFAULT_FORMAT
+
243  #endif
+
244  static inline std::string dump_default_format = CLUTCHDUMP_DEFAULT_FORMAT;
+
246 
+
247  #ifndef CLUTCHDUMP_DEFAULT_SEP
+
248  #define CLUTCHDUMP_DEFAULT_SEP "\n"
+
250  #endif // CLUTCHDUMP_DEFAULT_SEP
+
251  static inline std::string dump_default_sep = CLUTCHDUMP_DEFAULT_SEP;
+
253 
+
254  #ifndef CLUTCHLOG_DEFAULT_DEPTH_MARK
+
255  #define CLUTCHLOG_DEFAULT_DEPTH_MARK ">"
+
257  #endif // CLUTCHLOG_DEFAULT_DEPTH_MARK
+
258  static inline std::string default_depth_mark = CLUTCHLOG_DEFAULT_DEPTH_MARK;
+
260 
+
261  #ifndef CLUTCHLOG_STRIP_CALLS
+
262  #define CLUTCHLOG_STRIP_CALLS 5
+
264  #endif // CLUTCHLOG_STRIP_CALLS
+
265  static inline unsigned int default_strip_calls = CLUTCHLOG_STRIP_CALLS;
+
267 
+
268  #ifndef CLUTCHLOG_DEFAULT_HFILL_MARK
+
269  #define CLUTCHLOG_DEFAULT_HFILL_MARK '.'
+
271  #endif // CLUTCHLOG_DEFAULT_HFILL_MARK
+ +
274 
+
275 
+
276  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
277  #ifndef CLUTCHLOG_DEFAULT_HFILL_MAX
+
278  #define CLUTCHLOG_DEFAULT_HFILL_MAX 300
+
279  #endif
+
280  #ifndef CLUTCHLOG_DEFAULT_HFILL_MIN
+
281  #define CLUTCHLOG_DEFAULT_HFILL_MIN 150
+
282  #endif
+
283  #endif
+
284  static inline size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX;
+
287  static inline size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN;
+
288 
+
289  // NOTE: there is no CLUTCHLOG_HFILL_STYLE for defaulting,
+
290  // but you can still set `hfill_style(...)` on the logger singleton.
+
291  /* @} DefaultConfig */
+
292  /* @} */
+
293 
+
294 
+
295  public:
+
296 
+
306  static clutchlog& logger()
+
307  {
+
308  static clutchlog instance;
+
309  return instance;
+
310  }
+
311 
+
313  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
+
314 
+
376  class fmt {
+
377  public:
+
379  enum class ansi {
+
381  colors_16 = -1, // Not supposed to be casted.
+
383  colors_256 = 5, // Casted as short in color::operator<<.
+
385  colors_16M = 2 // Casted as short in color::operator<<
+
386  } mode;
+
387 
+
389  enum class typo {
+
390  reset = 0,
+
391  bold = 1,
+
392  underline = 4,
+
393  inverse = 7,
+
394  none = -1
+
395  } style;
+
396 
+
399  enum class fg {
+
401  black = 30,
+
402  red = 31,
+
403  green = 32,
+
404  yellow = 33,
+
405  blue = 34,
+
406  magenta = 35,
+
407  cyan = 36,
+
408  white = 37,
+
409  bright_black = 90,
+
410  bright_red = 91,
+
411  bright_green = 92,
+
412  bright_yellow = 93,
+
413  bright_blue = 94,
+
414  bright_magenta = 95,
+
415  bright_cyan = 96,
+
416  bright_white = 97,
+
417  none = -1
+
418  } fore;
+
419 
+
421  enum class bg {
+
422  black = 40,
+
423  red = 41,
+
424  green = 42,
+
425  yellow = 43,
+
426  blue = 44,
+
427  magenta = 45,
+
428  cyan = 46,
+
429  white = 47,
+
430  bright_black = 100,
+
431  bright_red = 101,
+
432  bright_green = 102,
+
433  bright_yellow = 103,
+
434  bright_blue = 104,
+
435  bright_magenta = 105,
+
436  bright_cyan = 106,
+
437  bright_white = 107,
+
438  none = -1
+
439  } back;
+
440 
+
441  protected:
+
443  friend std::ostream& operator<<(std::ostream& os, const std::tuple<fg,bg,typo>& fbs)
+
444  {
+
445  auto [f,b,s] = fbs;
+
446  std::vector<short> codes; codes.reserve(3);
+
447  if(f != fg::none) { codes.push_back(static_cast<short>(f));}
+
448  if(b != bg::none) { codes.push_back(static_cast<short>(b));}
+
449  if(s != typo::none) { codes.push_back(static_cast<short>(s));}
+
450  if(codes.size() == 0) {
+
451  return os;
+
452 
+
453  } else {
+
454  os << "\033[";
+
455  os << codes[0];
+
456  for(size_t i=1; i < codes.size(); ++i) {
+
457  os << ";" << codes[i];
+
458  }
+
459  os << "m";
+
460  }
+
461  return os;
+
462  }
+
463 
+
465  friend std::ostream& operator<<(std::ostream& os, const typo& s)
+
466  {
+
467  if(s != typo::none) {
+
468  os << "\033[" << static_cast<short>(s) << "m";
+
469  }
+
470  return os;
+
471  }
472 
-
474  enum class ground { // idem.
-
475  fore = 38,
-
476  back = 48
-
477  } type;
-
478 
-
484  color(ansi a, ground g) : mode(a), type(g) {}
-
485 
-
487  virtual bool is_set() const = 0;
+
475  protected:
+
480  struct color {
+
481  ansi mode; // Not const to allow for the implicit copy assignemnt operator.
+
482 
+
484  enum class ground { // idem.
+
485  fore = 38,
+
486  back = 48
+
487  } type;
488 
-
490  virtual std::ostream& print_on( std::ostream& os) const = 0;
-
491 
-
493  friend std::ostream& operator<<(std::ostream& os, const color& c)
-
494  {
-
495  if(c.is_set()) {
-
496  os << "\033[" << static_cast<short>(c.type) << ";" << static_cast<short>(c.mode) << ";";
-
497  c.print_on(os);
-
498  os << "m";
-
499  }
-
500  return os;
-
501  }
-
502  };
-
503 
-
504  // There is no color_16 because it would be the same as color_256, only with different indices,
-
505  // hence making it more complicated for the user to select the right constructor.
-
506  // Here, we just use enum for 16 colors, and indices for 256 colors.
-
507 
-
509  struct color_256 : public color {
-
513  short index;
-
514 
-
518  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
-
519 
-
525  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {assert(-1 <= i and i <= 255);}
-
526 
-
528  bool is_set() const {return index > -1;}
+
494  color(ansi a, ground g) : mode(a), type(g) {}
+
495 
+
497  virtual bool is_set() const = 0;
+
498 
+
500  virtual std::ostream& print_on( std::ostream& os) const = 0;
+
501 
+
503  friend std::ostream& operator<<(std::ostream& os, const color& c)
+
504  {
+
505  if(c.is_set()) {
+
506  os << "\033[" << static_cast<short>(c.type) << ";" << static_cast<short>(c.mode) << ";";
+
507  c.print_on(os);
+
508  os << "m";
+
509  }
+
510  return os;
+
511  }
+
512  };
+
513 
+
514  // There is no color_16 because it would be the same as color_256, only with different indices,
+
515  // hence making it more complicated for the user to select the right constructor.
+
516  // Here, we just use enum for 16 colors, and indices for 256 colors.
+
517 
+
519  struct color_256 : public color {
+
523  short index;
+
524 
+
528  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
529 
-
531  std::ostream& print_on( std::ostream& os) const
-
532  {
-
533  os << index;
-
534  return os;
-
535  }
-
536  };
-
537 
-
539  struct fg_256 : public color_256 {
-
541  fg_256() : color_256(ground::fore) {}
-
542 
-
546  fg_256(const short f) : color_256(ground::fore, f) {}
+
535  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {assert(-1 <= i and i <= 255);}
+
536 
+
538  bool is_set() const {return index > -1;}
+
539 
+
541  std::ostream& print_on( std::ostream& os) const
+
542  {
+
543  os << index;
+
544  return os;
+
545  }
+
546  };
547 
-
551  fg_256(const fg&) : color_256(ground::fore, -1) {}
+
549  struct fg_256 : public color_256 {
+
551  fg_256() : color_256(ground::fore) {}
552 
-
553  } fore_256;
-
554 
-
556  struct bg_256 : public color_256 {
-
558  bg_256() : color_256(ground::back) {}
-
559 
-
563  bg_256(const short b) : color_256(ground::back, b) {}
+
556  fg_256(const short f) : color_256(ground::fore, f) {}
+
557 
+
561  fg_256(const fg&) : color_256(ground::fore, -1) {}
+
562 
+
563  } fore_256;
564 
-
568  bg_256(const bg&) : color_256(ground::back, -1) {}
+
566  struct bg_256 : public color_256 {
+
568  bg_256() : color_256(ground::back) {}
569 
-
570  } back_256;
-
571 
-
573  struct color_16M : public color {
-
577  short red, green, blue;
-
578 
-
582  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
-
583 
-
591  color_16M(ground t, short r, short g, short b)
-
592  : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
+
573  bg_256(const short b) : color_256(ground::back, b) {}
+
574 
+
578  bg_256(const bg&) : color_256(ground::back, -1) {}
+
579 
+
580  } back_256;
+
581 
+
583  struct color_16M : public color {
+
587  short red, green, blue;
+
588 
+
592  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
593 
-
601  color_16M(ground t, const std::string& srgb) : color(ansi::colors_16M, t)
-
602  {
-
603  assert(srgb.size() == 7);
-
604  if(srgb.size() != 7) {
-
605  red = -1;
-
606  green = -1;
-
607  blue = -1;
-
608  } else {
-
609  char i = 0;
-
610  if(srgb.at(0) == '#') {
-
611  i = 1;
-
612  }
-
613  std::istringstream(srgb.substr(0+i,2)) >> std::hex >> red;
-
614  std::istringstream(srgb.substr(2+i,2)) >> std::hex >> green;
-
615  std::istringstream(srgb.substr(4+i,2)) >> std::hex >> blue;
-
616  }
-
617  assert(-1 <= red and red <= 255);
-
618  assert(-1 <= green and green <= 255);
-
619  assert(-1 <= blue and blue <= 255);
-
620  }
-
621 
-
623  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
-
624 
-
626  std::ostream& print_on( std::ostream& os) const
-
627  {
-
628  os << red << ";" << green << ";" << blue;
-
629  return os;
+
601  color_16M(ground t, short r, short g, short b)
+
602  : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
+
603 
+
611  color_16M(ground t, const std::string& srgb) : color(ansi::colors_16M, t)
+
612  {
+
613  assert(srgb.size() == 7);
+
614  if(srgb.size() != 7) {
+
615  red = -1;
+
616  green = -1;
+
617  blue = -1;
+
618  } else {
+
619  char i = 0;
+
620  if(srgb.at(0) == '#') {
+
621  i = 1;
+
622  }
+
623  std::istringstream(srgb.substr(0+i,2)) >> std::hex >> red;
+
624  std::istringstream(srgb.substr(2+i,2)) >> std::hex >> green;
+
625  std::istringstream(srgb.substr(4+i,2)) >> std::hex >> blue;
+
626  }
+
627  assert(-1 <= red and red <= 255);
+
628  assert(-1 <= green and green <= 255);
+
629  assert(-1 <= blue and blue <= 255);
630  }
-
631  };
-
632 
-
634  struct fg_16M : public color_16M {
-
636  fg_16M() : color_16M(ground::fore) {}
-
637 
-
646  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
+
631 
+
633  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
+
634 
+
636  std::ostream& print_on( std::ostream& os) const
+
637  {
+
638  os << red << ";" << green << ";" << blue;
+
639  return os;
+
640  }
+
641  };
+
642 
+
644  struct fg_16M : public color_16M {
+
646  fg_16M() : color_16M(ground::fore) {}
647 
-
654  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
-
655 
-
659  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
-
660 
-
661  } fore_16M;
-
662 
-
664  struct bg_16M : public color_16M {
-
666  bg_16M() : color_16M(ground::back) {}
-
667 
-
676  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
+
656  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
+
657 
+
664  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
+
665 
+
669  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
+
670 
+
671  } fore_16M;
+
672 
+
674  struct bg_16M : public color_16M {
+
676  bg_16M() : color_16M(ground::back) {}
677 
-
684  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
-
685 
-
689  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
-
690 
-
691  } back_16M;
-
692 
-
695  public:
-
697  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
-
698 
-
701  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
702  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
703  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
704  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
705  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
706  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
711  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
-
712  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
-
713  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
-
718  fmt(const short fr, const short fg, const short fb,
-
719  const short gr, const short gg, const short gb,
-
720  typo s = typo::none)
-
721  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
-
722  fmt(fg,
-
723  const short gr, const short gg, const short gb,
-
724  typo s = typo::none)
-
725  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
-
726  fmt(const short fr, const short fg, const short fb,
-
727  bg, typo s = typo::none)
-
728  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
-
729  fmt(const short fr, const short fg, const short fb,
+
686  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
+
687 
+
694  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
+
695 
+
699  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
+
700 
+
701  } back_16M;
+
702 
+
705  public:
+
707  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
+
708 
+
711  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
712  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
713  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
714  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
715  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
716  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
721  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
+
722  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
+
723  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
+
728  fmt(const short fr, const short fg, const short fb,
+
729  const short gr, const short gg, const short gb,
730  typo s = typo::none)
-
731  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
-
732 
-
733  fmt(const std::string& f, const std::string& b, typo s = typo::none)
-
734  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
-
735  fmt(fg, const std::string& b, typo s = typo::none)
-
736  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
-
737  fmt(const std::string& f, bg, typo s = typo::none)
-
738  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
-
739  fmt(const std::string& f, typo s = typo::none)
-
740  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
-
743  protected:
-
744 
-
746  std::ostream& print_on( std::ostream& os) const
-
747  {
-
748  if(mode == ansi::colors_16) {
-
749  // Print all in a single escape.
-
750  os << std::make_tuple(fore,back,style);
-
751 
-
752  } else {
-
753  // 256 or 16M: always print separated escapes for foreground/background.
-
754  if(mode == ansi::colors_256) {
-
755  os << fore_256;
-
756  os << back_256;
-
757 
-
758  } else if(mode == ansi::colors_16M) {
-
759  os << fore_16M;
-
760  os << back_16M;
-
761  }
-
762  // In any case, print the style separately.
-
763  os << style;
-
764  }
-
765  return os;
-
766  }
+
731  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
+
732  fmt(fg,
+
733  const short gr, const short gg, const short gb,
+
734  typo s = typo::none)
+
735  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
+
736  fmt(const short fr, const short fg, const short fb,
+
737  bg, typo s = typo::none)
+
738  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
+
739  fmt(const short fr, const short fg, const short fb,
+
740  typo s = typo::none)
+
741  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
+
742 
+
743  fmt(const std::string& f, const std::string& b, typo s = typo::none)
+
744  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
+
745  fmt(fg, const std::string& b, typo s = typo::none)
+
746  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
+
747  fmt(const std::string& f, bg, typo s = typo::none)
+
748  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
+
749  fmt(const std::string& f, typo s = typo::none)
+
750  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
+
753  protected:
+
754 
+
756  std::ostream& print_on( std::ostream& os) const
+
757  {
+
758  if(mode == ansi::colors_16) {
+
759  // Print all in a single escape.
+
760  os << std::make_tuple(fore,back,style);
+
761 
+
762  } else {
+
763  // 256 or 16M: always print separated escapes for foreground/background.
+
764  if(mode == ansi::colors_256) {
+
765  os << fore_256;
+
766  os << back_256;
767 
-
768  public:
-
780  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
-
781  {
-
782  return fmt.print_on(os);
-
783  }
-
784 
-
795  std::string operator()( const std::string& msg ) const
-
796  {
-
797  std::ostringstream os;
-
798  this->print_on(os);
-
799  fmt reset(fmt::typo::reset);
-
800  os << msg;
-
801  reset.print_on(os);
-
802  return os.str();
-
803  }
-
804 
-
807  std::string str() const
-
808  {
-
809  std::ostringstream os;
-
810  this->print_on(os);
-
811  return os.str();
-
812  }
-
813 
-
814  static fmt hash( const std::string& str, const std::vector<fmt> domain = {})
-
815  {
-
816  size_t h = std::hash<std::string>{}(str);
-
817  if(domain.size() == 0) {
-
818  return fmt(static_cast<short>(h % 256));
-
819  } else {
-
820  return fmt(domain[h % domain.size()]);
-
821  }
+
768  } else if(mode == ansi::colors_16M) {
+
769  os << fore_16M;
+
770  os << back_16M;
+
771  }
+
772  // In any case, print the style separately.
+
773  os << style;
+
774  }
+
775  return os;
+
776  }
+
777 
+
778  public:
+
790  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
+
791  {
+
792  return fmt.print_on(os);
+
793  }
+
794 
+
805  std::string operator()( const std::string& msg ) const
+
806  {
+
807  std::ostringstream os;
+
808  this->print_on(os);
+
809  fmt reset(fmt::typo::reset);
+
810  os << msg;
+
811  reset.print_on(os);
+
812  return os.str();
+
813  }
+
814 
+
817  std::string str() const
+
818  {
+
819  std::ostringstream os;
+
820  this->print_on(os);
+
821  return os.str();
822  }
-
823  }; // fmt class
-
824 
-
830  public:
-
831  clutchlog(clutchlog const&) = delete;
-
832  void operator=(clutchlog const&) = delete;
-
833 
-
834  private:
-
835  clutchlog() :
-
836  // system, main, log
- -
838  _level_word({
-
839  {level::critical,"Critical"},
-
840  {level::error ,"Error"},
-
841  {level::warning ,"Warning"},
-
842  {level::progress,"Progress"},
-
843  {level::note ,"Note"},
-
844  {level::info ,"Info"},
-
845  {level::debug ,"Debug"},
-
846  {level::xdebug ,"XDebug"}
-
847  }),
-
848  _level_short({
-
849  {level::critical, "Crit"},
-
850  {level::error , "Erro"},
-
851  {level::warning , "Warn"},
-
852  {level::progress, "Prog"},
-
853  {level::note , "Note"},
-
854  {level::info , "Info"},
-
855  {level::debug , "Dbug"},
-
856  {level::xdebug , "XDbg"}
+
823 
+
824  static fmt hash( const std::string& str, const std::vector<fmt> domain = {})
+
825  {
+
826  size_t h = std::hash<std::string>{}(str);
+
827  if(domain.size() == 0) {
+
828  return fmt(static_cast<short>(h % 256));
+
829  } else {
+
830  return fmt(domain[h % domain.size()]);
+
831  }
+
832  }
+
833  }; // fmt class
+
834 
+
840  public:
+
841  clutchlog(clutchlog const&) = delete;
+
842  void operator=(clutchlog const&) = delete;
+
843 
+
844  private:
+
845  clutchlog() :
+
846  // system, main, log
+ +
848  _level_word({
+
849  {level::critical,"Critical"},
+
850  {level::error ,"Error"},
+
851  {level::warning ,"Warning"},
+
852  {level::progress,"Progress"},
+
853  {level::note ,"Note"},
+
854  {level::info ,"Info"},
+
855  {level::debug ,"Debug"},
+
856  {level::xdebug ,"XDebug"}
857  }),
-
858  _level_fmt({
-
859  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
-
860  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
-
861  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
-
862  {level::progress,fmt()},
-
863  {level::note ,fmt()},
-
864  {level::info ,fmt()},
-
865  {level::debug ,fmt()},
-
866  {level::xdebug ,fmt()}
+
858  _level_short({
+
859  {level::critical, "Crit"},
+
860  {level::error , "Erro"},
+
861  {level::warning , "Warn"},
+
862  {level::progress, "Prog"},
+
863  {level::note , "Note"},
+
864  {level::info , "Info"},
+
865  {level::debug , "Dbug"},
+
866  {level::xdebug , "XDbg"}
867  }),
- - -
870  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
871  _hfill_char(clutchlog::default_hfill_char),
-
872  _hfill_fmt(fmt::fg::none),
-
873  _hfill_max(clutchlog::default_hfill_max),
-
874  _hfill_min(clutchlog::default_hfill_min),
-
875  #endif
-
876  _out(&std::clog),
-
877  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
878  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
-
879  _depth_mark(clutchlog::default_depth_mark),
-
880  #endif
-
881  _stage(level::error),
-
882  _in_file(".*"),
-
883  _in_func(".*"),
-
884  _in_line(".*")
-
885  // Empty vectors by default:
-
886  // _filehash_fmts
-
887  // _funchash_fmts
-
888  // _depth_fmts
-
889  {
-
890  // Reverse the level->word map into a word->level map.
-
891  for(auto& lw : _level_word) {
-
892  _word_level[lw.second] = lw.first;
-
893  }
-
894 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
895  struct winsize w;
-
896  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
-
897  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
-
898 #endif
-
899  }
-
900 
-
901  protected:
-
903  size_t _strip_calls;
-
905  const std::map<level,std::string> _level_word;
-
907  std::map<std::string,level> _word_level;
-
909  std::map<level,std::string> _level_short;
-
911  std::map<level,fmt> _level_fmt;
-
913  std::string _format_log;
-
915  std::string _format_dump;
-
916  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
917 
-
918  char _hfill_char;
-
920  fmt _hfill_fmt;
-
922  size_t _hfill_max;
-
924  size_t _hfill_min;
-
925  #endif
-
926 
-
927  std::ostream* _out;
-
928  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
929 
-
930  size_t _depth;
-
932  std::string _depth_mark;
-
933  #endif
-
934 
- -
937  std::regex _in_file;
-
939  std::regex _in_func;
-
941  std::regex _in_line;
-
942 
-
944  std::vector<fmt> _filehash_fmts;
-
946  std::vector<fmt> _funchash_fmts;
-
947 
-
948 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
949 
-
950  static const size_t _max_buffer = 4096;
-
952  std::vector<fmt> _depth_fmts;
-
953 #endif
-
954 
-
955 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
956 
-
957  size_t _nb_columns;
-
958 #endif
+
868  _level_fmt({
+
869  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
+
870  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
+
871  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
+
872  {level::progress,fmt()},
+
873  {level::note ,fmt()},
+
874  {level::info ,fmt()},
+
875  {level::debug ,fmt()},
+
876  {level::xdebug ,fmt()}
+
877  }),
+ + +
880  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
881  _hfill_char(clutchlog::default_hfill_char),
+
882  _hfill_fmt(fmt::fg::none),
+
883  _hfill_max(clutchlog::default_hfill_max),
+
884  _hfill_min(clutchlog::default_hfill_min),
+
885  #endif
+
886  _out(&std::clog),
+
887  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
888  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
+
889  _depth_mark(clutchlog::default_depth_mark),
+
890  #endif
+
891  _stage(level::error),
+
892  _in_file(".*"),
+
893  _in_func(".*"),
+
894  _in_line(".*")
+
895  // Empty vectors by default:
+
896  // _filehash_fmts
+
897  // _funchash_fmts
+
898  // _depth_fmts
+
899  {
+
900  // Reverse the level->word map into a word->level map.
+
901  for(auto& lw : _level_word) {
+
902  _word_level[lw.second] = lw.first;
+
903  }
+
904 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
905  struct winsize w;
+
906  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
+
907  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
+
908 #endif
+
909  }
+
910 
+
911  protected:
+
913  size_t _strip_calls;
+
915  const std::map<level,std::string> _level_word;
+
917  std::map<std::string,level> _word_level;
+
919  std::map<level,std::string> _level_short;
+
921  std::map<level,fmt> _level_fmt;
+
923  std::string _format_log;
+
925  std::string _format_dump;
+
926  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
927 
+
928  char _hfill_char;
+
930  fmt _hfill_fmt;
+
932  size_t _hfill_max;
+
934  size_t _hfill_min;
+
935  #endif
+
936 
+
937  std::ostream* _out;
+
938  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
939 
+
940  size_t _depth;
+
942  std::string _depth_mark;
+
943  #endif
+
944 
+ +
947  std::regex _in_file;
+
949  std::regex _in_func;
+
951  std::regex _in_line;
+
952 
+
954  std::vector<fmt> _filehash_fmts;
+
956  std::vector<fmt> _funchash_fmts;
+
957 
+
958 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
959 
-
961  public:
-
962 
-
966  void format(const std::string& format) {_format_log = format;}
-
969  std::string format() const {return _format_log;}
-
970 
-
972  void format_comment(const std::string& format) {_format_dump = format;}
-
974  std::string format_comment() const {return _format_dump;}
-
975 
-
977  void out(std::ostream& out) {_out = &out;}
-
979  std::ostream& out() {return *_out;}
+
960  static const size_t _max_buffer = 4096;
+
962  std::vector<fmt> _depth_fmts;
+
963 #endif
+
964 
+
965 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
966 
+
967  size_t _nb_columns;
+
968 #endif
+
969 
+
971  public:
+
972 
+
976  void format(const std::string& format) {_format_log = format;}
+
979  std::string format() const {return _format_log;}
980 
-
981 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
982  void depth(size_t d) {_depth = d;}
-
985  size_t depth() const {return _depth;}
-
986 
-
988  void depth_mark(const std::string mark) {_depth_mark = mark;}
-
990  std::string depth_mark() const {return _depth_mark;}
-
991 
-
993  void strip_calls(const size_t n) {_strip_calls = n;}
-
995  size_t strip_calls() const {return _strip_calls;}
-
996 #endif
-
997 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
998  void hfill_mark(const char mark) {_hfill_char = mark;}
-
1001  char hfill_mark() const {return _hfill_char;}
-
1003  void hfill_style(fmt style) {_hfill_fmt = style;}
-
1008  template<class ... FMT>
-
1009  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
-
1011  fmt hfill_style() const {return _hfill_fmt;}
-
1013  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
-
1015  size_t hfill_max() {return _hfill_max;}
-
1017  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
-
1019  size_t hfill_min() {return _hfill_min;}
-
1020 #endif
-
1021 
-
1028  void filehash_styles(std::vector<fmt> styles) {_filehash_fmts = styles;}
-
1036  void funchash_styles(std::vector<fmt> styles) {_funchash_fmts = styles;}
-
1045  void depth_styles(std::vector<fmt> styles) {_depth_fmts = styles;}
-
1046 
-
1048  void threshold(level l) {_stage = l;}
-
1050  void threshold(const std::string& l) {_stage = this->level_of(l);}
-
1052  level threshold() const {return _stage;}
-
1054  const std::map<std::string,level>& levels() const { return _word_level;}
-
1055 
-
1060  level level_of(const std::string name)
-
1061  {
-
1062  const auto ilevel = _word_level.find(name);
-
1063  if( ilevel != std::end(_word_level)) {
-
1064  return ilevel->second;
-
1065  } else {
-
1066  throw std::out_of_range("'" + name + "' is not a valid log level name");
-
1067  }
-
1068  }
-
1069 
-
1071  void file(std::string file) {_in_file = file;}
-
1073  void func(std::string func) {_in_func = func;}
-
1075  void line(std::string line) {_in_line = line;}
-
1076 
-
1078  void location(
-
1079  const std::string& in_file,
-
1080  const std::string& in_function=".*",
-
1081  const std::string& in_line=".*"
-
1082  )
-
1083  {
-
1084  file(in_file);
-
1085  func(in_function);
-
1086  line(in_line);
-
1087  }
-
1088 
-
1093  template<class ... FMT>
-
1094  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
-
1096  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
-
1098  fmt style(level stage) const { return _level_fmt.at(stage); }
-
1099 
-
1102  public:
-
1103 
-
1107  struct scope_t {
-
1110  bool matches;
- -
1113 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1114 
-
1115  size_t depth;
-
1116 #endif
-
1117 
-
1118  bool there;
- -
1121  matches(false),
-
1122  stage(level::xdebug),
- -
1124  depth(0),
-
1125 #endif
-
1126  there(false)
-
1127  {}
-
1128  }; // scope_t
-
1129 
-
1130 
- -
1133  const level& stage,
-
1134  const std::string& file,
-
1135  const std::string& func,
-
1136  const size_t line
-
1137  ) const
-
1138  {
-
1139  scope_t scope; // False scope by default.
+
982  void format_comment(const std::string& format) {_format_dump = format;}
+
984  std::string format_comment() const {return _format_dump;}
+
985 
+
987  void out(std::ostream& out) {_out = &out;}
+
989  std::ostream& out() {return *_out;}
+
990 
+
991 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
992  void depth(size_t d) {_depth = d;}
+
995  size_t depth() const {return _depth;}
+
996 
+
998  void depth_mark(const std::string mark) {_depth_mark = mark;}
+
1000  std::string depth_mark() const {return _depth_mark;}
+
1001 
+
1003  void strip_calls(const size_t n) {_strip_calls = n;}
+
1005  size_t strip_calls() const {return _strip_calls;}
+
1006 #endif
+
1007 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
1008  void hfill_mark(const char mark) {_hfill_char = mark;}
+
1011  char hfill_mark() const {return _hfill_char;}
+
1013  void hfill_style(fmt style) {_hfill_fmt = style;}
+
1018  template<class ... FMT>
+
1019  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
+
1021  fmt hfill_style() const {return _hfill_fmt;}
+
1023  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
+
1025  size_t hfill_max() {return _hfill_max;}
+
1027  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
+
1029  size_t hfill_min() {return _hfill_min;}
+
1030 #endif
+
1031 
+
1038  void filehash_styles(std::vector<fmt> styles) {_filehash_fmts = styles;}
+
1046  void funchash_styles(std::vector<fmt> styles) {_funchash_fmts = styles;}
+
1055  void depth_styles(std::vector<fmt> styles) {_depth_fmts = styles;}
+
1056 
+
1058  void threshold(level l) {_stage = l;}
+
1060  void threshold(const std::string& l) {_stage = this->level_of(l);}
+
1062  level threshold() const {return _stage;}
+
1064  const std::map<std::string,level>& levels() const { return _word_level;}
+
1065 
+
1070  level level_of(const std::string name)
+
1071  {
+
1072  const auto ilevel = _word_level.find(name);
+
1073  if( ilevel != std::end(_word_level)) {
+
1074  return ilevel->second;
+
1075  } else {
+
1076  throw std::out_of_range("'" + name + "' is not a valid log level name");
+
1077  }
+
1078  }
+
1079 
+
1081  void file(std::string file) {_in_file = file;}
+
1083  void func(std::string func) {_in_func = func;}
+
1085  void line(std::string line) {_in_line = line;}
+
1086 
+
1088  void location(
+
1089  const std::string& in_file,
+
1090  const std::string& in_function=".*",
+
1091  const std::string& in_line=".*"
+
1092  )
+
1093  {
+
1094  file(in_file);
+
1095  func(in_function);
+
1096  line(in_line);
+
1097  }
+
1098 
+
1103  template<class ... FMT>
+
1104  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
+
1106  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
+
1108  fmt style(level stage) const { return _level_fmt.at(stage); }
+
1109 
+
1112  public:
+
1113 
+
1117  struct scope_t {
+
1120  bool matches;
+ +
1123 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1124 
+
1125  size_t depth;
+
1126 #endif
+
1127 
+
1128  bool there;
+ +
1131  matches(false),
+
1132  stage(level::xdebug),
+ +
1134  depth(0),
+
1135 #endif
+
1136  there(false)
+
1137  {}
+
1138  }; // scope_t
+
1139 
1140 
-
1141  /***** Log level stage *****/
-
1142  // Test stage first, because it's fastest.
-
1143  scope.stage = stage;
-
1144  if(not (scope.stage <= _stage)) {
-
1145  // Bypass useless computations if no match
-
1146  // because of the stage.
-
1147  return scope;
-
1148  }
-
1149 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1150  /***** Stack depth *****/
-
1151  // Backtrace in second, quite fast.
-
1152  size_t stack_depth;
-
1153  void *buffer[_max_buffer];
-
1154  stack_depth = backtrace(buffer, _max_buffer);
-
1155  scope.depth = stack_depth;
-
1156  if(not (scope.depth <= _depth + _strip_calls)) {
-
1157  // Bypass if no match.
-
1158  return scope;
-
1159  }
-
1160 #endif
-
1161 
-
1162  /***** Location *****/
-
1163  // Location last, slowest.
-
1164  std::ostringstream sline; sline << line;
-
1165  scope.there =
-
1166  std::regex_search(file, _in_file)
-
1167  and std::regex_search(func, _in_func)
-
1168  and std::regex_search(sline.str(), _in_line);
-
1169 
-
1170  // No need to retest stage and depth, which are true here.
-
1171  scope.matches = scope.there;
-
1172 
-
1173  return scope;
-
1174  } // locate
-
1175 
-
1183  std::string replace(
-
1184  const std::string& form,
-
1185  const std::string& mark,
-
1186  const std::string& tag
-
1187  ) const
-
1188  {
-
1189  // Useless debug code, unless something fancy would be done with name tags.
-
1190  // std::regex re;
-
1191  // try {
-
1192  // re = std::regex(mark);
-
1193  //
-
1194  // } catch(const std::regex_error& e) {
-
1195  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
-
1196  // switch(e.code()) {
-
1197  // case std::regex_constants::error_collate:
-
1198  // std::cerr << "the expression contains an invalid collating element name";
-
1199  // break;
-
1200  // case std::regex_constants::error_ctype:
-
1201  // std::cerr << "the expression contains an invalid character class name";
-
1202  // break;
-
1203  // case std::regex_constants::error_escape:
-
1204  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
-
1205  // break;
-
1206  // case std::regex_constants::error_backref:
-
1207  // std::cerr << "the expression contains an invalid back reference";
-
1208  // break;
-
1209  // case std::regex_constants::error_brack:
-
1210  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
-
1211  // break;
-
1212  // case std::regex_constants::error_paren:
-
1213  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
-
1214  // break;
-
1215  // case std::regex_constants::error_brace:
-
1216  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
-
1217  // break;
-
1218  // case std::regex_constants::error_badbrace:
-
1219  // std::cerr << "the expression contains an invalid range in a {} expression";
-
1220  // break;
-
1221  // case std::regex_constants::error_range:
-
1222  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
-
1223  // break;
-
1224  // case std::regex_constants::error_space:
-
1225  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
-
1226  // break;
-
1227  // case std::regex_constants::error_badrepeat:
-
1228  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
-
1229  // break;
-
1230  // case std::regex_constants::error_complexity:
-
1231  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
-
1232  // break;
-
1233  // case std::regex_constants::error_stack:
-
1234  // std::cerr << "there was not enough memory to perform a match";
-
1235  // break;
-
1236  // default:
-
1237  // std::cerr << "unknown error";
-
1238  // }
-
1239  // std::cerr << std::endl;
-
1240  // throw;
-
1241  // } // catch
-
1242 
-
1243  const std::regex re(mark);
-
1244  return std::regex_replace(form, re, tag);
-
1245  }
-
1246 
-
1248  std::string replace(
-
1249  const std::string& form,
-
1250  const std::string& mark,
-
1251  const size_t tag
-
1252  ) const
-
1253  {
-
1254  std::ostringstream stag; stag << tag;
-
1255  return replace(form, mark, stag.str());
-
1256  }
-
1257 
-
1259  std::string format(
-
1260  std::string row,
-
1261  const std::string& what,
- -
1263  const std::string& name,
-
1264 #endif
-
1265  const level& stage,
-
1266  const std::string& file,
-
1267  const std::string& func,
-
1268  const size_t line
- -
1270  ,
-
1271  const size_t depth
-
1272 #endif
-
1273  ) const
-
1274  {
-
1275  row = replace(row, "\\{msg\\}", what);
-
1276  row = replace(row, "\\{file\\}", file);
-
1277  row = replace(row, "\\{func\\}", func);
-
1278  row = replace(row, "\\{line\\}", line);
-
1279 
-
1280  row = replace(row, "\\{level\\}", _level_word.at(stage));
-
1281  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
-
1282  row = replace(row, "\\{level_letter\\}", letter);
-
1283 
-
1284  row = replace(row, "\\{level_short\\}", _level_short.at(stage));
-
1285 
-
1286 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1287  size_t actual_depth = depth - _strip_calls;
-
1288  row = replace(row, "\\{name\\}", name);
-
1289  row = replace(row, "\\{depth\\}", actual_depth);
-
1290 
-
1291  std::ostringstream chevrons;
-
1292  for(size_t i = _strip_calls; i < depth; ++i) {
-
1293  chevrons << _depth_mark;
-
1294  }
-
1295  row = replace(row, "\\{depth_marks\\}", chevrons.str());
-
1296 
-
1297  if(_depth_fmts.size() == 0) {
-
1298  row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() );
-
1299  } else {
-
1300  row = replace(row, "\\{depth_fmt\\}",
-
1301  _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() );
-
1302  }
-
1303 #endif
-
1304  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
-
1305  row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() );
-
1306  row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() );
-
1307 
-
1308 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
1309  // hfill is replaced last to allow for correct line width estimation.
-
1310  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
-
1311  const std::string hfill_tag = "{hfill}";
-
1312  const size_t hfill_pos = row.find(hfill_tag);
-
1313  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
-
1314  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
-
1315  if(hfill_pos != std::string::npos) {
-
1316  assert(raw_hfill_pos != std::string::npos);
-
1317  if(nb_columns > 0) {
-
1318  const size_t left_len = raw_hfill_pos;
-
1319  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
-
1320  if(right_len+left_len > nb_columns) {
-
1321  // The right part would go over the terminal width: add a new row.
-
1322  if(right_len < nb_columns) {
-
1323  // There is room for the right part on a new line.
-
1324  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
-
1325  const std::string hfill_styled = _hfill_fmt(hfill);
-
1326  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
-
1327  } else {
-
1328  // Right part still goes over columns: let it go.
-
1329  const std::string hfill(1, _hfill_char);
-
1330  const std::string hfill_styled = _hfill_fmt(hfill);
-
1331  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
-
1332  }
-
1333  } else {
-
1334  // There is some space in between left and right parts.
-
1335  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
-
1336  const std::string hfill_styled = _hfill_fmt(hfill);
-
1337  row = replace(row, "\\{hfill\\}", hfill_styled);
-
1338  }
-
1339  } else {
-
1340  // We don't know the terminal width.
-
1341  const std::string hfill(1, _hfill_char);
-
1342  const std::string hfill_styled = _hfill_fmt(hfill);
-
1343  row = replace(row, "\\{hfill\\}", hfill_styled);
-
1344  }
-
1345  }
-
1346 #else
-
1347  // We cannot know the terminal width.
-
1348  const std::string hfill(1, _hfill_char);
-
1349  const std::string hfill_styled = _hfill_fmt(hfill);
-
1350  row = replace(row, "\\{hfill\\}", hfill_styled);
-
1351 #endif
-
1352  return _level_fmt.at(stage)(row);
-
1353  }
-
1354 
-
1356  void log(
-
1357  const level& stage,
-
1358  const std::string& what,
-
1359  const std::string& file, const std::string& func, size_t line
-
1360  ) const
-
1361  {
-
1362  scope_t scope = locate(stage, file, func, line);
-
1363 
-
1364  if(scope.matches) {
-
1365 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1366  *_out << format(_format_log, what, basename(getenv("_")),
-
1367  stage, file, func,
-
1368  line, scope.depth );
-
1369 #else
-
1370  *_out << format(_format_log, what,
-
1371  stage, file, func,
-
1372  line );
-
1373 
-
1374 #endif
-
1375  _out->flush();
-
1376  } // if scopes.matches
-
1377  }
-
1378 
-
1380  template<class In>
-
1381  void dump(
-
1382  const level& stage,
-
1383  const In container_begin, const In container_end,
-
1384  const std::string& file, const std::string& func, size_t line,
-
1385  const std::string& filename_template = "dump_{n}.dat",
-
1386  const std::string sep = dump_default_sep
-
1387  ) const
-
1388  {
-
1389  scope_t scope = locate(stage, file, func, line);
-
1390 
-
1391  if(scope.matches) {
-
1392  const std::string tag = "\\{n\\}";
-
1393  const std::regex re(tag);
-
1394  std::string outfile = "";
-
1395 
-
1396  // If the file name template has the {n} tag.
-
1397  if(std::regex_search(filename_template, re)) {
-
1398  // Increment n until a free one is found.
-
1399  size_t n = 0;
-
1400  do {
-
1401  outfile = replace(filename_template, tag, n);
-
1402  n++;
-
1403  } while( fs::exists( outfile ) );
-
1404 
-
1405  } else {
-
1406  // Use the parameter as is.
-
1407  outfile = filename_template;
-
1408  }
-
1409 
-
1410  std::ofstream fd(outfile);
-
1411 
-
1412  if(_format_dump.size() > 0) {
-
1413 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1414  fd << format(_format_dump, "", basename(getenv("_")),
-
1415  stage, file, func,
-
1416  line, scope.depth );
-
1417 #else
-
1418  fd << format(_format_dump, "",
-
1419  stage, file, func,
-
1420  line );
-
1421 #endif
-
1422  fd << sep; // sep after comment line.
-
1423  }
-
1424 
-
1425  std::copy(container_begin, container_end,
-
1426  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
+ +
1143  const level& stage,
+
1144  const std::string& file,
+
1145  const std::string& func,
+
1146  const size_t line
+
1147  ) const
+
1148  {
+
1149  scope_t scope; // False scope by default.
+
1150 
+
1151  /***** Log level stage *****/
+
1152  // Test stage first, because it's fastest.
+
1153  scope.stage = stage;
+
1154  if(not (scope.stage <= _stage)) {
+
1155  // Bypass useless computations if no match
+
1156  // because of the stage.
+
1157  return scope;
+
1158  }
+
1159 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1160  /***** Stack depth *****/
+
1161  // Backtrace in second, quite fast.
+
1162  size_t stack_depth;
+
1163  void *buffer[_max_buffer];
+
1164  stack_depth = backtrace(buffer, _max_buffer);
+
1165  scope.depth = stack_depth;
+
1166  if(not (scope.depth <= _depth + _strip_calls)) {
+
1167  // Bypass if no match.
+
1168  return scope;
+
1169  }
+
1170 #endif
+
1171 
+
1172  /***** Location *****/
+
1173  // Location last, slowest.
+
1174  std::ostringstream sline; sline << line;
+
1175  scope.there =
+
1176  std::regex_search(file, _in_file)
+
1177  and std::regex_search(func, _in_func)
+
1178  and std::regex_search(sline.str(), _in_line);
+
1179 
+
1180  // No need to retest stage and depth, which are true here.
+
1181  scope.matches = scope.there;
+
1182 
+
1183  return scope;
+
1184  } // locate
+
1185 
+
1193  std::string replace(
+
1194  const std::string& form,
+
1195  const std::string& mark,
+
1196  const std::string& tag
+
1197  ) const
+
1198  {
+
1199  // Useless debug code, unless something fancy would be done with name tags.
+
1200  // std::regex re;
+
1201  // try {
+
1202  // re = std::regex(mark);
+
1203  //
+
1204  // } catch(const std::regex_error& e) {
+
1205  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
+
1206  // switch(e.code()) {
+
1207  // case std::regex_constants::error_collate:
+
1208  // std::cerr << "the expression contains an invalid collating element name";
+
1209  // break;
+
1210  // case std::regex_constants::error_ctype:
+
1211  // std::cerr << "the expression contains an invalid character class name";
+
1212  // break;
+
1213  // case std::regex_constants::error_escape:
+
1214  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
+
1215  // break;
+
1216  // case std::regex_constants::error_backref:
+
1217  // std::cerr << "the expression contains an invalid back reference";
+
1218  // break;
+
1219  // case std::regex_constants::error_brack:
+
1220  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
+
1221  // break;
+
1222  // case std::regex_constants::error_paren:
+
1223  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
+
1224  // break;
+
1225  // case std::regex_constants::error_brace:
+
1226  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
+
1227  // break;
+
1228  // case std::regex_constants::error_badbrace:
+
1229  // std::cerr << "the expression contains an invalid range in a {} expression";
+
1230  // break;
+
1231  // case std::regex_constants::error_range:
+
1232  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
+
1233  // break;
+
1234  // case std::regex_constants::error_space:
+
1235  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
+
1236  // break;
+
1237  // case std::regex_constants::error_badrepeat:
+
1238  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
+
1239  // break;
+
1240  // case std::regex_constants::error_complexity:
+
1241  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
+
1242  // break;
+
1243  // case std::regex_constants::error_stack:
+
1244  // std::cerr << "there was not enough memory to perform a match";
+
1245  // break;
+
1246  // default:
+
1247  // std::cerr << "unknown error";
+
1248  // }
+
1249  // std::cerr << std::endl;
+
1250  // throw;
+
1251  // } // catch
+
1252 
+
1253  const std::regex re(mark);
+
1254  return std::regex_replace(form, re, tag);
+
1255  }
+
1256 
+
1258  std::string replace(
+
1259  const std::string& form,
+
1260  const std::string& mark,
+
1261  const size_t tag
+
1262  ) const
+
1263  {
+
1264  std::ostringstream stag; stag << tag;
+
1265  return replace(form, mark, stag.str());
+
1266  }
+
1267 
+
1269  std::string format(
+
1270  std::string row,
+
1271  const std::string& what,
+ +
1273  const std::string& name,
+
1274 #endif
+
1275  const level& stage,
+
1276  const std::string& file,
+
1277  const std::string& func,
+
1278  const size_t line
+ +
1280  ,
+
1281  const size_t depth
+
1282 #endif
+
1283  ) const
+
1284  {
+
1285  row = replace(row, "\\{msg\\}", what);
+
1286  row = replace(row, "\\{file\\}", file);
+
1287  row = replace(row, "\\{func\\}", func);
+
1288  row = replace(row, "\\{line\\}", line);
+
1289 
+
1290  row = replace(row, "\\{level\\}", _level_word.at(stage));
+
1291  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
+
1292  row = replace(row, "\\{level_letter\\}", letter);
+
1293 
+
1294  row = replace(row, "\\{level_short\\}", _level_short.at(stage));
+
1295 
+
1296 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1297  size_t actual_depth = depth - _strip_calls;
+
1298  row = replace(row, "\\{name\\}", name);
+
1299  row = replace(row, "\\{depth\\}", actual_depth);
+
1300 
+
1301  if(_depth_fmts.size() == 0) {
+
1302  row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() );
+
1303 
+
1304  std::ostringstream chevrons;
+
1305  for(size_t i = 0; i < actual_depth; ++i) {
+
1306  chevrons << _depth_mark;
+
1307  }
+
1308  row = replace(row, "\\{depth_marks\\}", chevrons.str());
+
1309 
+
1310  } else {
+
1311  row = replace(row, "\\{depth_fmt\\}",
+
1312  _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() );
+
1313 
+
1314  std::ostringstream chevrons;
+
1315  for(size_t i = 0; i < actual_depth; ++i) {
+
1316  chevrons << _depth_fmts[std::min(i+1,_depth_fmts.size()-1)].str()
+
1317  << _depth_mark;
+
1318  }
+
1319  row = replace(row, "\\{depth_marks\\}", chevrons.str());
+
1320  }
+
1321 #endif
+
1322  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
+
1323  row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() );
+
1324  row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() );
+
1325 
+
1326 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
1327  // hfill is replaced last to allow for correct line width estimation.
+
1328  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
+
1329  const std::string hfill_tag = "{hfill}";
+
1330  const size_t hfill_pos = row.find(hfill_tag);
+
1331  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
+
1332  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
+
1333  if(hfill_pos != std::string::npos) {
+
1334  assert(raw_hfill_pos != std::string::npos);
+
1335  if(nb_columns > 0) {
+
1336  const size_t left_len = raw_hfill_pos;
+
1337  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
+
1338  if(right_len+left_len > nb_columns) {
+
1339  // The right part would go over the terminal width: add a new row.
+
1340  if(right_len < nb_columns) {
+
1341  // There is room for the right part on a new line.
+
1342  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
+
1343  const std::string hfill_styled = _hfill_fmt(hfill);
+
1344  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
+
1345  } else {
+
1346  // Right part still goes over columns: let it go.
+
1347  const std::string hfill(1, _hfill_char);
+
1348  const std::string hfill_styled = _hfill_fmt(hfill);
+
1349  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
+
1350  }
+
1351  } else {
+
1352  // There is some space in between left and right parts.
+
1353  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
+
1354  const std::string hfill_styled = _hfill_fmt(hfill);
+
1355  row = replace(row, "\\{hfill\\}", hfill_styled);
+
1356  }
+
1357  } else {
+
1358  // We don't know the terminal width.
+
1359  const std::string hfill(1, _hfill_char);
+
1360  const std::string hfill_styled = _hfill_fmt(hfill);
+
1361  row = replace(row, "\\{hfill\\}", hfill_styled);
+
1362  }
+
1363  }
+
1364 #else
+
1365  // We cannot know the terminal width.
+
1366  const std::string hfill(1, _hfill_char);
+
1367  const std::string hfill_styled = _hfill_fmt(hfill);
+
1368  row = replace(row, "\\{hfill\\}", hfill_styled);
+
1369 #endif
+
1370  return _level_fmt.at(stage)(row);
+
1371  }
+
1372 
+
1374  void log(
+
1375  const level& stage,
+
1376  const std::string& what,
+
1377  const std::string& file, const std::string& func, const size_t line,
+
1378  const size_t depth_delta = 0
+
1379  ) const
+
1380  {
+
1381  scope_t scope = locate(stage, file, func, line);
+
1382 
+
1383  if(scope.matches) {
+
1384 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1385  *_out << format(_format_log, what, basename(getenv("_")),
+
1386  stage, file, func,
+
1387  line, scope.depth + depth_delta );
+
1388 #else
+
1389  *_out << format(_format_log, what,
+
1390  stage, file, func,
+
1391  line );
+
1392 #endif
+
1393  _out->flush();
+
1394  } // if scopes.matches
+
1395  }
+
1396 
+
1398  template<class In>
+
1399  void dump(
+
1400  const level& stage,
+
1401  const In container_begin, const In container_end,
+
1402  const std::string& file, const std::string& func, const size_t line,
+
1403  const std::string& filename_template = "dump_{n}.dat",
+
1404  const std::string sep = dump_default_sep
+
1405  ) const
+
1406  {
+
1407  scope_t scope = locate(stage, file, func, line);
+
1408 
+
1409  if(scope.matches) {
+
1410  const std::string tag = "\\{n\\}";
+
1411  const std::regex re(tag);
+
1412  std::string outfile = "";
+
1413 
+
1414  // If the file name template has the {n} tag.
+
1415  if(std::regex_search(filename_template, re)) {
+
1416  // Increment n until a free one is found.
+
1417  size_t n = 0;
+
1418  do {
+
1419  outfile = replace(filename_template, tag, n);
+
1420  n++;
+
1421  } while( fs::exists( outfile ) );
+
1422 
+
1423  } else {
+
1424  // Use the parameter as is.
+
1425  outfile = filename_template;
+
1426  }
1427 
-
1428  fd.close();
-
1429  } // if scopes.matches
-
1430  }
-
1431 
-
1433 };
-
1434 
-
1437 #else // not WITH_CLUTCHLOG
-
1438 
-
1439 
-
1440 /**********************************************************************
-
1441  * Fake implementation
-
1442  **********************************************************************/
-
1443 
-
1444 // Equivalent class with empty methods, will be optimized out
-
1445 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
-
1446 #pragma GCC diagnostic push
-
1447 #pragma GCC diagnostic ignored "-Wreturn-type"
-
1448 class clutchlog
-
1449 {
-
1450  public:
-
1451  static clutchlog& logger() {}
-
1452  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
-
1453  class fmt {
-
1454  public:
-
1455  enum class ansi { colors_16, colors_256, colors_16M} mode;
-
1456  enum class typo { reset, bold, underline, inverse, none} style;
-
1457  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
-
1458  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
-
1459  protected:
-
1460  friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
-
1461  friend std::ostream& operator<<(std::ostream&, const typo&) {}
-
1462  protected:
-
1463  struct color {
-
1464  ansi mode;
-
1465  enum class ground { fore, back } type;
-
1466  color(ansi a, ground g) : mode(a), type(g) {}
-
1467  virtual bool is_set() const = 0;
-
1468  virtual std::ostream& print_on( std::ostream&) const = 0;
-
1469  friend std::ostream& operator<<(std::ostream&, const color&) {}
-
1470  };
-
1471  struct color_256 : public color {
-
1472  short index;
-
1473  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
-
1474  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
-
1475  bool is_set() const {}
-
1476  std::ostream& print_on( std::ostream&) const {}
-
1477  };
-
1478  struct fg_256 : public color_256 {
-
1479  fg_256() : color_256(ground::fore) {}
-
1480  fg_256(const short f) : color_256(ground::fore, f) {}
-
1481  fg_256(const fg&) : color_256(ground::fore, -1) {}
-
1482  } fore_256;
-
1483  struct bg_256 : public color_256 {
-
1484  bg_256() : color_256(ground::back) {}
-
1485  bg_256(const short b) : color_256(ground::back, b) {}
-
1486  bg_256(const bg&) : color_256(ground::back, -1) {}
-
1487  } back_256;
-
1488  struct color_16M : public color {
-
1489  short red, green, blue;
-
1490  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
-
1491  color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
-
1492  color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
-
1493  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
-
1494  std::ostream& print_on( std::ostream&) const {}
+
1428  std::ofstream fd(outfile);
+
1429 
+
1430  if(_format_dump.size() > 0) {
+
1431 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1432  fd << format(_format_dump, "", basename(getenv("_")),
+
1433  stage, file, func,
+
1434  line, scope.depth );
+
1435 #else
+
1436  fd << format(_format_dump, "",
+
1437  stage, file, func,
+
1438  line );
+
1439 #endif
+
1440  fd << sep; // sep after comment line.
+
1441  }
+
1442 
+
1443  std::copy(container_begin, container_end,
+
1444  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
+
1445 
+
1446  fd.close();
+
1447  } // if scopes.matches
+
1448  }
+
1449 
+
1451 };
+
1452 
+
1455 #else // not WITH_CLUTCHLOG
+
1456 
+
1457 
+
1458 /**********************************************************************
+
1459  * Fake implementation
+
1460  **********************************************************************/
+
1461 
+
1462 // Equivalent class with empty methods, will be optimized out
+
1463 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
+
1464 #pragma GCC diagnostic push
+
1465 #pragma GCC diagnostic ignored "-Wreturn-type"
+
1466 class clutchlog
+
1467 {
+
1468  public:
+
1469  static clutchlog& logger() {}
+
1470  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
+
1471  class fmt {
+
1472  public:
+
1473  enum class ansi { colors_16, colors_256, colors_16M} mode;
+
1474  enum class typo { reset, bold, underline, inverse, none} style;
+
1475  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
+
1476  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
+
1477  protected:
+
1478  friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
+
1479  friend std::ostream& operator<<(std::ostream&, const typo&) {}
+
1480  protected:
+
1481  struct color {
+
1482  ansi mode;
+
1483  enum class ground { fore, back } type;
+
1484  color(ansi a, ground g) : mode(a), type(g) {}
+
1485  virtual bool is_set() const = 0;
+
1486  virtual std::ostream& print_on( std::ostream&) const = 0;
+
1487  friend std::ostream& operator<<(std::ostream&, const color&) {}
+
1488  };
+
1489  struct color_256 : public color {
+
1490  short index;
+
1491  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
+
1492  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
+
1493  bool is_set() const {}
+
1494  std::ostream& print_on( std::ostream&) const {}
1495  };
-
1496  struct fg_16M : public color_16M {
-
1497  fg_16M() : color_16M(ground::fore) {}
-
1498  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
-
1499  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
-
1500  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
-
1501  } fore_16M;
-
1502  struct bg_16M : public color_16M {
-
1503  bg_16M() : color_16M(ground::back) {}
-
1504  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
-
1505  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
-
1506  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
-
1507  } back_16M;
-
1508  public:
-
1509  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
-
1510  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1511  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1512  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1513  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1514  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1515  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
-
1516  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
-
1517  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
-
1518  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
-
1519  fmt(const short fr, const short fg, const short fb,
-
1520  const short gr, const short gg, const short gb,
-
1521  typo s = typo::none)
-
1522  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
-
1523  fmt(fg,
-
1524  const short gr, const short gg, const short gb,
-
1525  typo s = typo::none)
-
1526  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
-
1527  fmt(const short fr, const short fg, const short fb,
-
1528  bg, typo s = typo::none)
-
1529  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
-
1530  fmt(const short fr, const short fg, const short fb,
-
1531  typo s = typo::none)
-
1532  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
-
1533 
-
1534  fmt(const std::string& f, const std::string& b, typo s = typo::none)
-
1535  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
-
1536  fmt(fg, const std::string& b, typo s = typo::none)
-
1537  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
-
1538  fmt(const std::string& f, bg, typo s = typo::none)
-
1539  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
-
1540  fmt(const std::string& f, typo s = typo::none)
-
1541  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
-
1542  protected:
-
1543  std::ostream& print_on( std::ostream&) const {}
-
1544  public:
-
1545  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
-
1546  std::string operator()( const std::string&) const {}
-
1547  std::string str() const {}
-
1548  static fmt hash( const std::string&, const std::vector<fmt>) {}
-
1549  };
-
1550  public:
-
1551  clutchlog(clutchlog const&) = delete;
-
1552  void operator=(clutchlog const&) = delete;
-
1553  private:
-
1554  clutchlog() {}
-
1555  protected:
-
1556  struct scope_t {};
-
1557  scope_t locate(
-
1558  const level&,
-
1559  const std::string&,
-
1560  const std::string&,
-
1561  const size_t
-
1562  ) const
-
1563  {}
-
1564  public:
-
1565  void format(const std::string&) {}
-
1566  std::string format() const {}
-
1567 
-
1568  void format_comment(const std::string&) {}
-
1569  std::string format_comment() const {}
-
1570 
-
1571  void out(std::ostream&) {}
-
1572  std::ostream& out() {}
-
1573 
-
1574 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1575  void depth(size_t) {}
-
1576  size_t depth() const {}
-
1577 
-
1578  void depth_mark(const std::string) {}
-
1579  std::string depth_mark() const {}
-
1580  void strip_calls(const size_t) {}
-
1581  size_t strip_calls() const {}
-
1582 #endif
-
1583 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
1584  void hfill_mark(const char) {}
-
1585  char hfill_mark() const {}
-
1586  void hfill_fmt(fmt) {}
-
1587  fmt hfill_fmt() const {}
-
1588  void hfill_min(const size_t) {}
-
1589  size_t hfill_min() {}
-
1590  void hfill_max(const size_t) {}
-
1591  size_t hfill_max() {}
-
1592 #endif
-
1593  void filehash_styles(std::vector<fmt> ) {}
-
1594  void funchash_styles(std::vector<fmt> ) {}
-
1595  void depth_styles(std::vector<fmt>) {}
-
1596 
-
1597  void threshold(level) {}
-
1598  void threshold(const std::string&) {}
-
1599  level threshold() const {}
-
1600  const std::map<std::string,level> levels() const {}
-
1601  level level_of(const std::string) {}
-
1602 
-
1603  void file(std::string) {}
-
1604  void func(std::string) {}
-
1605  void line(std::string) {}
-
1606 
-
1607 #pragma GCC diagnostic push
-
1608 #pragma GCC diagnostic ignored "-Wunused-parameter"
-
1609  void location(
-
1610  const std::string&,
-
1611  const std::string& in_function=".*",
-
1612  const std::string& in_line=".*"
-
1613  )
-
1614  {}
-
1615 #pragma GCC diagnostic pop
-
1616  template<class ... FMT>
-
1617  void style(level, FMT...) {}
-
1618  void style(level, fmt) {}
-
1619  fmt style(level) const {}
-
1620  public:
-
1621  std::string replace(
-
1622  const std::string&,
-
1623  const std::string&,
-
1624  const std::string&
-
1625  ) const
-
1626  {}
-
1627 
-
1628  std::string replace(
-
1629  const std::string&,
-
1630  const std::string&,
-
1631  const size_t
-
1632  ) const
-
1633  {}
-
1634 
-
1635  std::string format(
-
1636  std::string,
-
1637  const std::string&,
- -
1639  const std::string&,
-
1640 #endif
-
1641  const level&,
-
1642  const std::string&,
-
1643  const std::string&,
-
1644  const size_t
- -
1646  ,
-
1647  const size_t
-
1648 #endif
-
1649  ) const
-
1650  {}
-
1651 
-
1652  void log(
-
1653  const level&,
-
1654  const std::string&,
-
1655  const std::string&, const std::string&, size_t
-
1656  ) const
-
1657  {}
-
1658 
-
1659  template<class In>
-
1660  void dump(
-
1661  const level&,
-
1662  const In, const In,
-
1663  const std::string&, const std::string&, size_t,
-
1664  const std::string&,
-
1665  const std::string
-
1666  ) const
-
1667  {}
-
1668 };
-
1669 #pragma GCC diagnostic pop
-
1670 #endif // WITH_CLUTCHLOG
-
1671 
-
1672 #endif // CLUTCHLOG_H
+
1496  struct fg_256 : public color_256 {
+
1497  fg_256() : color_256(ground::fore) {}
+
1498  fg_256(const short f) : color_256(ground::fore, f) {}
+
1499  fg_256(const fg&) : color_256(ground::fore, -1) {}
+
1500  } fore_256;
+
1501  struct bg_256 : public color_256 {
+
1502  bg_256() : color_256(ground::back) {}
+
1503  bg_256(const short b) : color_256(ground::back, b) {}
+
1504  bg_256(const bg&) : color_256(ground::back, -1) {}
+
1505  } back_256;
+
1506  struct color_16M : public color {
+
1507  short red, green, blue;
+
1508  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
+
1509  color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
+
1510  color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
+
1511  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
+
1512  std::ostream& print_on( std::ostream&) const {}
+
1513  };
+
1514  struct fg_16M : public color_16M {
+
1515  fg_16M() : color_16M(ground::fore) {}
+
1516  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
+
1517  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
+
1518  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
+
1519  } fore_16M;
+
1520  struct bg_16M : public color_16M {
+
1521  bg_16M() : color_16M(ground::back) {}
+
1522  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
+
1523  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
+
1524  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
+
1525  } back_16M;
+
1526  public:
+
1527  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
+
1528  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1529  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1530  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1531  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1532  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1533  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
+
1534  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
+
1535  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
+
1536  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
+
1537  fmt(const short fr, const short fg, const short fb,
+
1538  const short gr, const short gg, const short gb,
+
1539  typo s = typo::none)
+
1540  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
+
1541  fmt(fg,
+
1542  const short gr, const short gg, const short gb,
+
1543  typo s = typo::none)
+
1544  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
+
1545  fmt(const short fr, const short fg, const short fb,
+
1546  bg, typo s = typo::none)
+
1547  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
+
1548  fmt(const short fr, const short fg, const short fb,
+
1549  typo s = typo::none)
+
1550  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
+
1551 
+
1552  fmt(const std::string& f, const std::string& b, typo s = typo::none)
+
1553  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
+
1554  fmt(fg, const std::string& b, typo s = typo::none)
+
1555  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
+
1556  fmt(const std::string& f, bg, typo s = typo::none)
+
1557  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
+
1558  fmt(const std::string& f, typo s = typo::none)
+
1559  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
+
1560  protected:
+
1561  std::ostream& print_on( std::ostream&) const {}
+
1562  public:
+
1563  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
+
1564  std::string operator()( const std::string&) const {}
+
1565  std::string str() const {}
+
1566  static fmt hash( const std::string&, const std::vector<fmt>) {}
+
1567  };
+
1568  public:
+
1569  clutchlog(clutchlog const&) = delete;
+
1570  void operator=(clutchlog const&) = delete;
+
1571  private:
+
1572  clutchlog() {}
+
1573  protected:
+
1574  struct scope_t {};
+
1575  scope_t locate(
+
1576  const level&,
+
1577  const std::string&,
+
1578  const std::string&,
+
1579  const size_t
+
1580  ) const
+
1581  {}
+
1582  public:
+
1583  void format(const std::string&) {}
+
1584  std::string format() const {}
+
1585 
+
1586  void format_comment(const std::string&) {}
+
1587  std::string format_comment() const {}
+
1588 
+
1589  void out(std::ostream&) {}
+
1590  std::ostream& out() {}
+
1591 
+
1592 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1593  void depth(size_t) {}
+
1594  size_t depth() const {}
+
1595 
+
1596  void depth_mark(const std::string) {}
+
1597  std::string depth_mark() const {}
+
1598  void strip_calls(const size_t) {}
+
1599  size_t strip_calls() const {}
+
1600 #endif
+
1601 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
1602  void hfill_mark(const char) {}
+
1603  char hfill_mark() const {}
+
1604  void hfill_fmt(fmt) {}
+
1605  fmt hfill_fmt() const {}
+
1606  void hfill_min(const size_t) {}
+
1607  size_t hfill_min() {}
+
1608  void hfill_max(const size_t) {}
+
1609  size_t hfill_max() {}
+
1610 #endif
+
1611  void filehash_styles(std::vector<fmt> ) {}
+
1612  void funchash_styles(std::vector<fmt> ) {}
+
1613  void depth_styles(std::vector<fmt>) {}
+
1614 
+
1615  void threshold(level) {}
+
1616  void threshold(const std::string&) {}
+
1617  level threshold() const {}
+
1618  const std::map<std::string,level> levels() const {}
+
1619  level level_of(const std::string) {}
+
1620 
+
1621  void file(std::string) {}
+
1622  void func(std::string) {}
+
1623  void line(std::string) {}
+
1624 
+
1625 #pragma GCC diagnostic push
+
1626 #pragma GCC diagnostic ignored "-Wunused-parameter"
+
1627  void location(
+
1628  const std::string&,
+
1629  const std::string& in_function=".*",
+
1630  const std::string& in_line=".*"
+
1631  )
+
1632  {}
+
1633 #pragma GCC diagnostic pop
+
1634  template<class ... FMT>
+
1635  void style(level, FMT...) {}
+
1636  void style(level, fmt) {}
+
1637  fmt style(level) const {}
+
1638  public:
+
1639  std::string replace(
+
1640  const std::string&,
+
1641  const std::string&,
+
1642  const std::string&
+
1643  ) const
+
1644  {}
+
1645 
+
1646  std::string replace(
+
1647  const std::string&,
+
1648  const std::string&,
+
1649  const size_t
+
1650  ) const
+
1651  {}
+
1652 
+
1653  std::string format(
+
1654  std::string,
+
1655  const std::string&,
+ +
1657  const std::string&,
+
1658 #endif
+
1659  const level&,
+
1660  const std::string&,
+
1661  const std::string&,
+
1662  const size_t
+ +
1664  ,
+
1665  const size_t
+
1666 #endif
+
1667  ) const
+
1668  {}
+
1669 
+
1670  void log(
+
1671  const level&,
+
1672  const std::string&,
+
1673  const std::string&, const std::string&, size_t
+
1674  ) const
+
1675  {}
+
1676 
+
1677  template<class In>
+
1678  void dump(
+
1679  const level&,
+
1680  const In, const In,
+
1681  const std::string&, const std::string&, size_t,
+
1682  const std::string&,
+
1683  const std::string
+
1684  ) const
+
1685  {}
+
1686 };
+
1687 #pragma GCC diagnostic pop
+
1688 #endif // WITH_CLUTCHLOG
+
1689 
+
1690 #endif // CLUTCHLOG_H
-
friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
Output stream operator for a 3-tuple of 16-colors mode tags.
Definition: clutchlog.h:433
-
static std::string default_depth_mark
Default mark for stack depth.
Definition: clutchlog.h:249
-
std::string _format_log
Current format of the standard output.
Definition: clutchlog.h:913
-
color_16M(ground t, const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:601
-
void depth_styles(std::vector< fmt > styles)
Set the styles for value-dependant depth formatting.
Definition: clutchlog.h:1045
-
std::map< level, fmt > _level_fmt
Dictionary of level identifier to their format.
Definition: clutchlog.h:911
-
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1356
+
friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
Output stream operator for a 3-tuple of 16-colors mode tags.
Definition: clutchlog.h:443
+
static std::string default_depth_mark
Default mark for stack depth.
Definition: clutchlog.h:259
+
std::string _format_log
Current format of the standard output.
Definition: clutchlog.h:923
+
color_16M(ground t, const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:611
+
void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
Dump a serializable container after a comment line with log information.
Definition: clutchlog.h:1399
+
void depth_styles(std::vector< fmt > styles)
Set the styles for value-dependant depth formatting.
Definition: clutchlog.h:1055
+
std::map< level, fmt > _level_fmt
Dictionary of level identifier to their format.
Definition: clutchlog.h:921
enum clutchlog::fmt::bg back
Background color.
-
std::vector< fmt > _funchash_fmts
List of candidate format objects for value-dependant function name styling.
Definition: clutchlog.h:946
-
std::string str() const
Return the formatting code as a string.
Definition: clutchlog.h:807
-
Foreground in 256-colors mode.
Definition: clutchlog.h:539
-
void line(std::string line)
Set the regular expression filtering the line location.
Definition: clutchlog.h:1075
-
friend std::ostream & operator<<(std::ostream &os, const color &c)
Print the actually encoded escaped color sequence on the given stream.
Definition: clutchlog.h:493
-
friend std::ostream & operator<<(std::ostream &os, const typo &s)
Output stream operator for a typo tag alone, in 16-colors mode.
Definition: clutchlog.h:455
-
static std::string dump_default_format
Default format of the comment line in file dump.
Definition: clutchlog.h:235
-
void out(std::ostream &out)
Set the output stream on which to print.
Definition: clutchlog.h:977
-
bool is_set() const
Returns true if the underying representation encodes an existing color.
Definition: clutchlog.h:623
-
fg_16M(const fg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:659
-
static std::string dump_default_sep
Default item separator for dump.
Definition: clutchlog.h:242
-
std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
Substitute all tags in the format string with the corresponding information and apply the style corre...
Definition: clutchlog.h:1259
-
Background in 256-colors mode.
Definition: clutchlog.h:556
-
#define CLUTCHLOG_DEFAULT_DEPTH_MARK
Compile-time default mark for stack depth.
Definition: clutchlog.h:246
-
static unsigned int default_strip_calls
Number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:256
-
static size_t default_hfill_min
Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
Definition: clutchlog.h:277
-
std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
Replace mark by tag in form.
Definition: clutchlog.h:1183
-
color_256(ground t)
Constructor.
Definition: clutchlog.h:518
+
std::vector< fmt > _funchash_fmts
List of candidate format objects for value-dependant function name styling.
Definition: clutchlog.h:956
+
std::string str() const
Return the formatting code as a string.
Definition: clutchlog.h:817
+
Foreground in 256-colors mode.
Definition: clutchlog.h:549
+
void line(std::string line)
Set the regular expression filtering the line location.
Definition: clutchlog.h:1085
+
friend std::ostream & operator<<(std::ostream &os, const color &c)
Print the actually encoded escaped color sequence on the given stream.
Definition: clutchlog.h:503
+
friend std::ostream & operator<<(std::ostream &os, const typo &s)
Output stream operator for a typo tag alone, in 16-colors mode.
Definition: clutchlog.h:465
+
static std::string dump_default_format
Default format of the comment line in file dump.
Definition: clutchlog.h:245
+
void out(std::ostream &out)
Set the output stream on which to print.
Definition: clutchlog.h:987
+
bool is_set() const
Returns true if the underying representation encodes an existing color.
Definition: clutchlog.h:633
+
fg_16M(const fg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:669
+
static std::string dump_default_sep
Default item separator for dump.
Definition: clutchlog.h:252
+
std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
Substitute all tags in the format string with the corresponding information and apply the style corre...
Definition: clutchlog.h:1269
+
Background in 256-colors mode.
Definition: clutchlog.h:566
+
#define CLUTCHLOG_DEFAULT_DEPTH_MARK
Compile-time default mark for stack depth.
Definition: clutchlog.h:256
+
static unsigned int default_strip_calls
Number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:266
+
static size_t default_hfill_min
Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
Definition: clutchlog.h:287
+
std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
Replace mark by tag in form.
Definition: clutchlog.h:1193
+
color_256(ground t)
Constructor.
Definition: clutchlog.h:528
clutchlog::fmt::bg_16M back_16M
Current background in 16M-colors mode.
-
Interface class for colors representation.
Definition: clutchlog.h:470
+
Interface class for colors representation.
Definition: clutchlog.h:480
@ colors_16
16 colors mode.
-
background in 256-colors mode.
Definition: clutchlog.h:664
-
static char default_hfill_char
Default character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:263
-
bool matches
Everything is compatible.
Definition: clutchlog.h:1110
+
background in 256-colors mode.
Definition: clutchlog.h:674
+
static char default_hfill_char
Default character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:273
+
bool matches
Everything is compatible.
Definition: clutchlog.h:1120
enum clutchlog::fmt::typo style
Typographic style.
-
Abstract base class for 16M colors objects (24-bits ANSI).
Definition: clutchlog.h:573
-
fg_256(const fg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:551
-
void format_comment(const std::string &format)
Set the template string for dumps.
Definition: clutchlog.h:972
-
bg_16M(const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:684
-
void file(std::string file)
Set the regular expression filtering the file location.
Definition: clutchlog.h:1071
-
scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
Gather information on the current location of the call.
Definition: clutchlog.h:1132
+
Abstract base class for 16M colors objects (24-bits ANSI).
Definition: clutchlog.h:583
+
fg_256(const fg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:561
+
void format_comment(const std::string &format)
Set the template string for dumps.
Definition: clutchlog.h:982
+
bg_16M(const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:694
+
void file(std::string file)
Set the regular expression filtering the file location.
Definition: clutchlog.h:1081
+
scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
Gather information on the current location of the call.
Definition: clutchlog.h:1142
clutchlog::fmt::fg_16M fore_16M
Current foreground in 16M-colors mode.
-
Abstract base class for 256 colors objects (8-bits ANSI).
Definition: clutchlog.h:509
-
fmt()
Empty constructor, only useful for a no-op formatter.
Definition: clutchlog.h:697
-
void style(level stage, fmt style)
Set the style (color and typo) of the given log level, passing a fmt instance.
Definition: clutchlog.h:1096
-
void threshold(level l)
Set the log level (below which logs are not printed) with an identifier.
Definition: clutchlog.h:1048
-
level threshold() const
Get the log level below which logs are not printed.
Definition: clutchlog.h:1052
+
Abstract base class for 256 colors objects (8-bits ANSI).
Definition: clutchlog.h:519
+
fmt()
Empty constructor, only useful for a no-op formatter.
Definition: clutchlog.h:707
+
void style(level stage, fmt style)
Set the style (color and typo) of the given log level, passing a fmt instance.
Definition: clutchlog.h:1106
+
void threshold(level l)
Set the log level (below which logs are not printed) with an identifier.
Definition: clutchlog.h:1058
+
level threshold() const
Get the log level below which logs are not printed.
Definition: clutchlog.h:1062
virtual bool is_set() const =0
Should return true if the underying representation encodes an existing color.
-
std::map< level, std::string > _level_short
dictionary of level identifier to their 4-letters representation.
Definition: clutchlog.h:909
-
level
Available log levels.
Definition: clutchlog.h:303
-
color_256(ground t, const short i)
Constructor.
Definition: clutchlog.h:525
-
std::ostream & print_on(std::ostream &os) const
Print the color index on the given stream.
Definition: clutchlog.h:531
-
color_16M(ground t)
Constructor.
Definition: clutchlog.h:582
-
static size_t default_hfill_max
Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
Definition: clutchlog.h:275
-
void funchash_styles(std::vector< fmt > styles)
Set the candidate styles for value-dependant function name formatting.
Definition: clutchlog.h:1036
-
scope_t()
Constructor.
Definition: clutchlog.h:1120
-
std::regex _in_func
Current function location filter.
Definition: clutchlog.h:939
-
static std::string default_format
Default format of the messages.
Definition: clutchlog.h:213
-
bg_16M(short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:676
-
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:296
-
Foreground in 256-colors mode.
Definition: clutchlog.h:634
-
void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
Dump a serializable container after a comment line with log information.
Definition: clutchlog.h:1381
+
std::map< level, std::string > _level_short
dictionary of level identifier to their 4-letters representation.
Definition: clutchlog.h:919
+
level
Available log levels.
Definition: clutchlog.h:313
+
color_256(ground t, const short i)
Constructor.
Definition: clutchlog.h:535
+
std::ostream & print_on(std::ostream &os) const
Print the color index on the given stream.
Definition: clutchlog.h:541
+
color_16M(ground t)
Constructor.
Definition: clutchlog.h:592
+
static size_t default_hfill_max
Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
Definition: clutchlog.h:285
+
void funchash_styles(std::vector< fmt > styles)
Set the candidate styles for value-dependant function name formatting.
Definition: clutchlog.h:1046
+
scope_t()
Constructor.
Definition: clutchlog.h:1130
+
std::regex _in_func
Current function location filter.
Definition: clutchlog.h:949
+
static std::string default_format
Default format of the messages.
Definition: clutchlog.h:223
+
bg_16M(short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:686
+
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:306
+
Foreground in 256-colors mode.
Definition: clutchlog.h:644
clutchlog::fmt::fg_256 fore_256
Current foreground in 256-colors mode.
enum clutchlog::fmt::fg fore
Foreground color.
-
void filehash_styles(std::vector< fmt > styles)
Set the candidate styles for value-dependant file name formatting.
Definition: clutchlog.h:1028
+
void filehash_styles(std::vector< fmt > styles)
Set the candidate styles for value-dependant file name formatting.
Definition: clutchlog.h:1038
enum clutchlog::fmt::color::ground type
Type of color (foreground or background).
-
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:366
-
short index
The encoded color index in 4-bits ANSI.
Definition: clutchlog.h:513
-
bg_256()
Empty constructor: no color.
Definition: clutchlog.h:558
-
void func(std::string func)
Set the regular expression filtering the function location.
Definition: clutchlog.h:1073
-
std::string format() const
Get the template string.
Definition: clutchlog.h:969
-
std::regex _in_file
Current file location filter.
Definition: clutchlog.h:937
-
void style(level stage, FMT... styles)
Set the style (color and typo) of the given log level.
Definition: clutchlog.h:1094
-
bg_256(const bg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:568
-
fg_16M()
Empty constructor: no color.
Definition: clutchlog.h:636
-
level level_of(const std::string name)
Return the log level tag corresponding to the given pre-configured name.
Definition: clutchlog.h:1060
-
const std::map< level, std::string > _level_word
Dictionary of level identifier to their string representation.
Definition: clutchlog.h:905
-
std::string operator()(const std::string &msg) const
Format the given string with the currently encoded format.
Definition: clutchlog.h:795
-
color_16M(ground t, short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:591
-
std::ostream & print_on(std::ostream &os) const
Print the color RGB triplet on the given stream.
Definition: clutchlog.h:626
-
bg
Background color codes.
Definition: clutchlog.h:411
-
#define CLUTCHLOG_DEFAULT_FORMAT
Compile-time default format of the messages (debug mode: with absolute location).
Definition: clutchlog.h:198
-
std::regex _in_line
Current line location filter.
Definition: clutchlog.h:941
-
fg_256(const short f)
Constructor.
Definition: clutchlog.h:546
+
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:376
+
short index
The encoded color index in 4-bits ANSI.
Definition: clutchlog.h:523
+
bg_256()
Empty constructor: no color.
Definition: clutchlog.h:568
+
void func(std::string func)
Set the regular expression filtering the function location.
Definition: clutchlog.h:1083
+
std::string format() const
Get the template string.
Definition: clutchlog.h:979
+
std::regex _in_file
Current file location filter.
Definition: clutchlog.h:947
+
void style(level stage, FMT... styles)
Set the style (color and typo) of the given log level.
Definition: clutchlog.h:1104
+
bg_256(const bg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:578
+
fg_16M()
Empty constructor: no color.
Definition: clutchlog.h:646
+
level level_of(const std::string name)
Return the log level tag corresponding to the given pre-configured name.
Definition: clutchlog.h:1070
+
const std::map< level, std::string > _level_word
Dictionary of level identifier to their string representation.
Definition: clutchlog.h:915
+
std::string operator()(const std::string &msg) const
Format the given string with the currently encoded format.
Definition: clutchlog.h:805
+
color_16M(ground t, short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:601
+
std::ostream & print_on(std::ostream &os) const
Print the color RGB triplet on the given stream.
Definition: clutchlog.h:636
+
bg
Background color codes.
Definition: clutchlog.h:421
+
#define CLUTCHLOG_DEFAULT_FORMAT
Compile-time default format of the messages (debug mode: with absolute location).
Definition: clutchlog.h:208
+
std::regex _in_line
Current line location filter.
Definition: clutchlog.h:951
+
fg_256(const short f)
Constructor.
Definition: clutchlog.h:556
@ colors_256
256 colors mode.
enum clutchlog::fmt::ansi mode
Current ANSI color mode.
-
std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
Replace mark by tag in form, converting tag to its string representation first.
Definition: clutchlog.h:1248
-
std::string format_comment() const
Get the template string for dumps.
Definition: clutchlog.h:974
-
fg_256()
Empty constructor: no color.
Definition: clutchlog.h:541
+
std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
Replace mark by tag in form, converting tag to its string representation first.
Definition: clutchlog.h:1258
+
std::string format_comment() const
Get the template string for dumps.
Definition: clutchlog.h:984
+
fg_256()
Empty constructor: no color.
Definition: clutchlog.h:551
@ colors_16M
16 millions ("true") colors mode.
-
std::string _format_dump
Current format of the file output.
Definition: clutchlog.h:915
-
#define CLUTCHDUMP_DEFAULT_SEP
Compile-time default item separator for dump.
Definition: clutchlog.h:239
-
bg_256(const short b)
Constructor.
Definition: clutchlog.h:563
-
ground
Codes for representing foreground or background.
Definition: clutchlog.h:474
-
Structure holding a location matching.
Definition: clutchlog.h:1108
-
#define CLUTCHLOG_DEFAULT_HFILL_MARK
Character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:260
-
std::ostream & print_on(std::ostream &os) const
Print the currently encoded format escape code on the given output stream.
Definition: clutchlog.h:746
-
bool is_set() const
Returns true if the underying representation encodes an existing color.
Definition: clutchlog.h:528
-
std::ostream * _out
Standard output.
Definition: clutchlog.h:927
-
std::ostream & out()
Get the output stream on which to print.
Definition: clutchlog.h:979
-
void threshold(const std::string &l)
Set the log level (below which logs are not printed) with a string.
Definition: clutchlog.h:1050
+
std::string _format_dump
Current format of the file output.
Definition: clutchlog.h:925
+
#define CLUTCHDUMP_DEFAULT_SEP
Compile-time default item separator for dump.
Definition: clutchlog.h:249
+
bg_256(const short b)
Constructor.
Definition: clutchlog.h:573
+
ground
Codes for representing foreground or background.
Definition: clutchlog.h:484
+
Structure holding a location matching.
Definition: clutchlog.h:1118
+
#define CLUTCHLOG_DEFAULT_HFILL_MARK
Character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:270
+
std::ostream & print_on(std::ostream &os) const
Print the currently encoded format escape code on the given output stream.
Definition: clutchlog.h:756
+
bool is_set() const
Returns true if the underying representation encodes an existing color.
Definition: clutchlog.h:538
+
std::ostream * _out
Standard output.
Definition: clutchlog.h:937
+
std::ostream & out()
Get the output stream on which to print.
Definition: clutchlog.h:989
+
void threshold(const std::string &l)
Set the log level (below which logs are not printed) with a string.
Definition: clutchlog.h:1060
virtual std::ostream & print_on(std::ostream &os) const =0
Should print the underlying representation on the given stream.
-
const std::map< std::string, level > & levels() const
Get the map of available log levels string representations toward their identifier....
Definition: clutchlog.h:1054
-
size_t _strip_calls
Current number of call stack levels to remove from depth display.
Definition: clutchlog.h:903
-
level stage
Current log level.
Definition: clutchlog.h:1112
-
bool there
Location is compatible.
Definition: clutchlog.h:1118
-
fg_16M(const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:654
-
#define CLUTCHLOG_STRIP_CALLS
Compile-time number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:253
-
friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
Output stream overload.
Definition: clutchlog.h:780
-
bg_16M(const bg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:689
-
bg_16M()
Empty constructor: no color.
Definition: clutchlog.h:666
-
std::map< std::string, level > _word_level
Dictionary of level string to their identifier.
Definition: clutchlog.h:907
-
level _stage
Current log level.
Definition: clutchlog.h:935
-
fmt style(level stage) const
Get the configured fmt instance of the given log level.
Definition: clutchlog.h:1098
-
typo
Typographic style codes.
Definition: clutchlog.h:379
-
void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
Set the regular expressions filtering the location.
Definition: clutchlog.h:1078
+
const std::map< std::string, level > & levels() const
Get the map of available log levels string representations toward their identifier....
Definition: clutchlog.h:1064
+
size_t _strip_calls
Current number of call stack levels to remove from depth display.
Definition: clutchlog.h:913
+
level stage
Current log level.
Definition: clutchlog.h:1122
+
bool there
Location is compatible.
Definition: clutchlog.h:1128
+
fg_16M(const std::string &srgb)
Hex triplet string constructor.
Definition: clutchlog.h:664
+
#define CLUTCHLOG_STRIP_CALLS
Compile-time number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:263
+
friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
Output stream overload.
Definition: clutchlog.h:790
+
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:1374
+
bg_16M(const bg &)
Conversion constructor from 16-colors mode.
Definition: clutchlog.h:699
+
bg_16M()
Empty constructor: no color.
Definition: clutchlog.h:676
+
std::map< std::string, level > _word_level
Dictionary of level string to their identifier.
Definition: clutchlog.h:917
+
level _stage
Current log level.
Definition: clutchlog.h:945
+
fmt style(level stage) const
Get the configured fmt instance of the given log level.
Definition: clutchlog.h:1108
+
typo
Typographic style codes.
Definition: clutchlog.h:389
+
void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
Set the regular expressions filtering the location.
Definition: clutchlog.h:1088
#define CLUTCHLOG_HAVE_UNIX_SYSINFO
True if POSIX headers necessary for stack depth management are available.
Definition: clutchlog.h:33
-
std::vector< fmt > _filehash_fmts
List of candidate format objects for value-dependant file name styling.
Definition: clutchlog.h:944
-
The single class which holds everything.
Definition: clutchlog.h:177
-
ansi
ANSI code configuring the available number of colors.
Definition: clutchlog.h:369
-
fg_16M(short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:646
-
fg
Foreground color codes.
Definition: clutchlog.h:390
-
short red
The encoded RGB indices.
Definition: clutchlog.h:577
-
#define CLUTCHDUMP_DEFAULT_FORMAT
Compile-time default format of the comment line in file dump.
Definition: clutchlog.h:221
-
color(ansi a, ground g)
Constructor.
Definition: clutchlog.h:484
+
std::vector< fmt > _filehash_fmts
List of candidate format objects for value-dependant file name styling.
Definition: clutchlog.h:954
+
The single class which holds everything.
Definition: clutchlog.h:187
+
ansi
ANSI code configuring the available number of colors.
Definition: clutchlog.h:379
+
fg_16M(short r, short g, short b)
Numeric triplet constructor.
Definition: clutchlog.h:656
+
fg
Foreground color codes.
Definition: clutchlog.h:400
+
short red
The encoded RGB indices.
Definition: clutchlog.h:587
+
#define CLUTCHDUMP_DEFAULT_FORMAT
Compile-time default format of the comment line in file dump.
Definition: clutchlog.h:231
+
color(ansi a, ground g)
Constructor.
Definition: clutchlog.h:494
clutchlog::fmt::bg_256 back_256
Current background in 256-colors mode.
@@ -84,7 +84,7 @@ $(document).ready(function(){initNavTree('dir_59425e443f801f1f2fd8bbe4959a3ccf.h
-

tests → clutchlog Relation

Public Member Functions

std::cout << error("ERROR") << std::endl;
Note
A formatter called this way WILL output a reset escape code at the end.
-

Definition at line 795 of file clutchlog.h.

+

Definition at line 805 of file clutchlog.h.

-

References print_on().

+

References print_on().

@@ -462,7 +462,7 @@ std::ostream & 
std::cout << error << "ERROR" << end << std::endl;
Note
An formatter called this way will NOT output a reset escape code.
-

Definition at line 780 of file clutchlog.h.

+

Definition at line 790 of file clutchlog.h.

@@ -497,7 +497,7 @@ std::ostream & 
Definition at line 369 of file clutchlog.h.

+

Definition at line 379 of file clutchlog.h.

@@ -506,7 +506,7 @@ std::ostream & 
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:366
+
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:376
clutchlog -  0.14 +  0.15
clutchlog -  0.14 +  0.15
CLUTCHLOC   __FILE__, __FUNCTION__, __LINE__
 Handy shortcuts to location.
 
#define CLUTCHLOG(LEVEL, WHAT)
 Log a message at the given level. More...
#define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
 Log a message at the given level and with a given depth delta. More...
 
+#define CLUTCHLOG(LEVEL, WHAT)   CLUTCHLOGD(LEVEL, WHAT, 0)
 Log a message at the given level.
 
#define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
 Dump the given container. More...
clutchlog -  0.14 +  0.15
clutchlog -  0.14 +  0.15
File in testsIncludes file in clutchlog
t-assert.cppclutchlog.h
t-color.cppclutchlog.h
t-color16M.cppclutchlog.h
t-color256.cppclutchlog.h
t-demo-extravagant.cppclutchlog.h
t-demo.cppclutchlog.h
t-dump.cppclutchlog.h
t-fmt-constructors.cppclutchlog.h
t-hash-color.cppclutchlog.h
t-log.cppclutchlog.h
t-one-line-if.cppclutchlog.h
+

tests → clutchlog Relation

File in testsIncludes file in clutchlog
t-assert.cppclutchlog.h
t-color.cppclutchlog.h
t-color16M.cppclutchlog.h
t-color256.cppclutchlog.h
t-demo-extravagant.cppclutchlog.h
t-demo.cppclutchlog.h
t-depth-delta.cppclutchlog.h
t-dump.cppclutchlog.h
t-fmt-constructors.cppclutchlog.h
t-hash-color.cppclutchlog.h
t-log.cppclutchlog.h
t-one-line-if.cppclutchlog.h
diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map index 903a130..bb0a10c 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.map @@ -1,5 +1,5 @@ - + diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 index 2919850..0ad8513 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 @@ -1 +1 @@ -16d7faff1b9c3198b20cf3ae5437a2db \ No newline at end of file +531b57d09121179fe636e2cda048c80c \ No newline at end of file diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg index 211c012..57a16f0 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg @@ -32,8 +32,8 @@ dir_59425e443f801f1f2fd8bbe4959a3ccf->dir_c318bd5cf14aaa5601e6029e0b5b4048 - -11 + +12
diff --git a/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html index 8a19fbd..abfa9b5 100644 --- a/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html +++ b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.14 +  0.15
diff --git a/docs/files.html b/docs/files.html index 7ec8eeb..f535eb4 100644 --- a/docs/files.html +++ b/docs/files.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.14 +  0.15
@@ -97,11 +97,12 @@ $(document).ready(function(){initNavTree('files.html',''); initResizable(); });  t-color256.cpp  t-demo-extravagant.cpp  t-demo.cpp - t-dump.cpp - t-fmt-constructors.cpp - t-hash-color.cpp - t-log.cpp - t-one-line-if.cpp + t-depth-delta.cpp + t-dump.cpp + t-fmt-constructors.cpp + t-hash-color.cpp + t-log.cpp + t-one-line-if.cpp diff --git a/docs/files_dup.js b/docs/files_dup.js index bda5401..de394c4 100644 --- a/docs/files_dup.js +++ b/docs/files_dup.js @@ -7,6 +7,7 @@ var files_dup = [ "t-color256.cpp", "t-color256_8cpp_source.html", null ], [ "t-demo-extravagant.cpp", "t-demo-extravagant_8cpp_source.html", null ], [ "t-demo.cpp", "t-demo_8cpp_source.html", null ], + [ "t-depth-delta.cpp", "t-depth-delta_8cpp_source.html", null ], [ "t-dump.cpp", "t-dump_8cpp_source.html", null ], [ "t-fmt-constructors.cpp", "t-fmt-constructors_8cpp_source.html", null ], [ "t-hash-color.cpp", "t-hash-color_8cpp_source.html", null ], diff --git a/docs/functions.html b/docs/functions.html index b3457b8..7ae6bc1 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.14 +  0.15
@@ -197,7 +197,7 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable(); : clutchlog
  • dump() -: clutchlog +: clutchlog
  • dump_default_format : clutchlog @@ -290,7 +290,7 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable(); : clutchlog
  • log() -: clutchlog +: clutchlog
  • logger() : clutchlog diff --git a/docs/functions_enum.html b/docs/functions_enum.html index c268733..3dccd46 100644 --- a/docs/functions_enum.html +++ b/docs/functions_enum.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    diff --git a/docs/functions_func.html b/docs/functions_func.html index 955935c..eab349f 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    @@ -114,7 +114,7 @@ $(document).ready(function(){initNavTree('functions_func.html',''); initResizabl : clutchlog
  • dump() -: clutchlog +: clutchlog
  • @@ -176,7 +176,7 @@ $(document).ready(function(){initNavTree('functions_func.html',''); initResizabl : clutchlog
  • log() -: clutchlog +: clutchlog
  • logger() : clutchlog diff --git a/docs/functions_rela.html b/docs/functions_rela.html index 42d1030..c2eefc2 100644 --- a/docs/functions_rela.html +++ b/docs/functions_rela.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    diff --git a/docs/functions_vars.html b/docs/functions_vars.html index c5212bc..d4a0507 100644 --- a/docs/functions_vars.html +++ b/docs/functions_vars.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    diff --git a/docs/globals.html b/docs/globals.html index 30cf2a9..918f052 100644 --- a/docs/globals.html +++ b/docs/globals.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    @@ -130,6 +130,9 @@ $(document).ready(function(){initNavTree('globals.html',''); initResizable(); })
  • CLUTCHLOG_STRIP_CALLS : clutchlog.h
  • +
  • CLUTCHLOGD +: clutchlog.h +
  • WITH_CLUTCHLOG : clutchlog.h
  • diff --git a/docs/globals_defs.html b/docs/globals_defs.html index 222ec62..a0cb07e 100644 --- a/docs/globals_defs.html +++ b/docs/globals_defs.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    @@ -130,6 +130,9 @@ $(document).ready(function(){initNavTree('globals_defs.html',''); initResizable(
  • CLUTCHLOG_STRIP_CALLS : clutchlog.h
  • +
  • CLUTCHLOGD +: clutchlog.h +
  • WITH_CLUTCHLOG : clutchlog.h
  • diff --git a/docs/graph_legend.html b/docs/graph_legend.html index 8e89892..edb553d 100644 --- a/docs/graph_legend.html +++ b/docs/graph_legend.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    diff --git a/docs/group___default_config.html b/docs/group___default_config.html index 3453ca4..fe42a2a 100644 --- a/docs/group___default_config.html +++ b/docs/group___default_config.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    diff --git a/docs/group___formating.html b/docs/group___formating.html index f29caec..5bbe894 100644 --- a/docs/group___formating.html +++ b/docs/group___formating.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    diff --git a/docs/group___main.html b/docs/group___main.html index f62f38f..80a0c24 100644 --- a/docs/group___main.html +++ b/docs/group___main.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    diff --git a/docs/group___main.js b/docs/group___main.js index 9920517..c1d2ac0 100644 --- a/docs/group___main.js +++ b/docs/group___main.js @@ -1,11 +1,11 @@ var group___main = [ [ "clutchlog", "classclutchlog.html", [ - [ "System-dependent stack depth", "index.html#autotoc_md24", null ], - [ "System-dependent horizontal fill", "index.html#autotoc_md25", null ], - [ "Dependencies", "index.html#autotoc_md26", null ], - [ "Variable names within the CLUTCHLOG macro", "index.html#autotoc_md27", null ], - [ "Features", "index.html#autotoc_md28", null ], + [ "System-dependent stack depth", "index.html#autotoc_md26", null ], + [ "System-dependent horizontal fill", "index.html#autotoc_md27", null ], + [ "Dependencies", "index.html#autotoc_md28", null ], + [ "Variable names within the CLUTCHLOG macro", "index.html#autotoc_md29", null ], + [ "Features", "index.html#autotoc_md30", null ], [ "scope_t", "structclutchlog_1_1scope__t.html", [ [ "scope_t", "structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572", null ], [ "matches", "structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9", null ], @@ -41,8 +41,8 @@ var group___main = [ "replace", "classclutchlog.html#a972f895c70edc335f3018a2c8971d59e", null ], [ "replace", "classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2", null ], [ "format", "classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761", null ], - [ "log", "classclutchlog.html#a23dbb98f0d3c5cc21c232cde16cf317a", null ], - [ "dump", "classclutchlog.html#a63308e8deae3cfec6801318203494143", null ], + [ "log", "classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a", null ], + [ "dump", "classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb", null ], [ "default_format", "classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc", null ], [ "dump_default_format", "classclutchlog.html#ace879554298e6e6e36dafef330c27be8", null ], [ "dump_default_sep", "classclutchlog.html#af898bffe23b125245e338d7495c76d45", null ], diff --git a/docs/group___use_macros.html b/docs/group___use_macros.html index 359c78e..dfca8d2 100644 --- a/docs/group___use_macros.html +++ b/docs/group___use_macros.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    @@ -98,8 +98,12 @@ Macros #define CLUTCHLOC   __FILE__, __FUNCTION__, __LINE__  Handy shortcuts to location.
      -#define CLUTCHLOG(LEVEL, WHAT) - Log a message at the given level. More...
    +#define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA) + Log a message at the given level and with a given depth delta. More...
    +  + +#define CLUTCHLOG(LEVEL, WHAT)   CLUTCHLOGD(LEVEL, WHAT, 0) + Log a message at the given level.
      #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)  Dump the given container. More...
    @@ -112,14 +116,14 @@ Macros  

    Macro Definition Documentation

    - -

    ◆ CLUTCHLOG

    + +

    ◆ CLUTCHLOGD

    - + @@ -128,7 +132,13 @@ Macros - + + + + + + + @@ -137,13 +147,13 @@ Macros
    #define CLUTCHLOG#define CLUTCHLOGD (   LEVEL,
     WHAT WHAT,
     DEPTH_DELTA 
    -Value:
    do { \
    -
    auto& clutchlog__logger = clutchlog::logger(); \
    -
    std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
    -
    clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC); \
    +Value:
    do { \
    +
    auto& clutchlog__logger = clutchlog::logger(); \
    +
    std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
    +
    clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
    } while(0)
    -

    Log a message at the given level.

    +

    Log a message at the given level and with a given depth delta.

    Definition at line 81 of file clutchlog.h.

    @@ -188,7 +198,7 @@ Macros

    Dump the given container.

    -

    Definition at line 98 of file clutchlog.h.

    +

    Definition at line 107 of file clutchlog.h.

    @@ -233,7 +243,7 @@ Macros

    Call any function if the scope matches.

    -

    Definition at line 115 of file clutchlog.h.

    +

    Definition at line 124 of file clutchlog.h.

    @@ -272,15 +282,15 @@ Macros

    Run any code if the scope matches.

    -

    Definition at line 136 of file clutchlog.h.

    +

    Definition at line 145 of file clutchlog.h.

    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:296
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    #define CLUTCHLOC
    Handy shortcuts to location.
    Definition: clutchlog.h:77
    -
    #define CLUTCHDUMP_DEFAULT_SEP
    Compile-time default item separator for dump.
    Definition: clutchlog.h:239
    +
    #define CLUTCHDUMP_DEFAULT_SEP
    Compile-time default item separator for dump.
    Definition: clutchlog.h:249

    Clutchlog is a spatial logging system that targets versatile debugging. It allows to (de)clutch messages for a given: log level, source code location or call stack depth.

    @@ -232,12 +234,15 @@ Output Configuration
  • {file}: the current file (absolute path),
  • {func}: the current function,
  • {line}: the current line number,
  • -
  • {level_fmt}: the format of the current level (i.e. configured with clutchlog::style).
  • +
  • {level_fmt}: the style of the current level (i.e. configured with clutchlog::style),
  • +
  • {filehash_fmt}: a style for file names, which is value-dependant (see clutchlog::filehash_styles),
  • +
  • {funchash_fmt}: a style for function names, which is value-dependant (see clutchlog::funchash_styles).
  • Some tags are only available on POSIX operating systems as of now:

    • {name}: the name of the current binary,
    • {depth}: the current depth of the call stack,
    • {depth_marks}: as many chevrons > as there is calls in the stack,
    • +
    • {depth_fmt}: a style depending on the current depth value (see clutchlog::depth_styles),
    • {hfill}: Inserts a sequence of characters that will stretch to fill the space available in the current terminal, between the rightmost and leftmost part of the log message.

    @@ -245,8 +250,9 @@ Log Format

    The default log format is "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n", it can be overriden at compile time by defining the CLUTCHLOG_DEFAULT_FORMAT macro.

    By default, and if CLUTCHLOG_DEFAULT_FORMAT is not defined, clutchlog will not put the location-related tags in the message formats (i.e. {name}, {func}, and {line}) when not in Debug builds.

    -Output style

    -

    Output lines can be colored differently depending on the log level.

    // Print error messages in bold red:
    +Output Styling +

    Output lines can be styled differently depending on their content.

    +

    For example, output lines can be colored differently depending on the log level.

    // Print error messages in bold red:
    log.style(level::error, // First, the log level.
    fmt::fg::red, // Then the styles, in any order...
    fmt::typo::bold);
    @@ -261,7 +267,7 @@ Output style
  • numeric triplets or web hex strings will encode a 16 million ("true") colors mode,
  • clutchlog::fg::none and clutchlog::bg::none can be passed in all modes.
  • -

    For example, all the following lines encode a bright red foreground for the critical level:

    log.style(level:critical,
    +

    For example, all the following lines encode a bright red foreground for the critical level (see the "Colors" section below):

    log.style(level:critical,
    fmt::fg::red); // 16-colors mode.
    log.style(level:critical,
    255); // 256-colors mode.
    @@ -335,28 +341,42 @@ Colors

    In 16M-colors mode, if you want to only encode the background color, you cannot just omit the foreground color, you have to pass a fg::none tag as first argument.

    log.style(level::info, fg::none, 100,0,0); // No color over dark red.
    log.style(level::info, fg::none, 100,0,0, typo::bold); // No color over bold dark red.
    -

    +

    +Value-dependant Format Tags

    +

    Some tags can be used to change the style of (part of) the output line,

    +

    depending on its content. The {filehash_fmt} and {funchash_fmt} will introduce a styling sequence which depends on the current file name, and function name respectively. The chosen style is chosen at random among the candidate ones, but will always be the same for each value.

    +

    The set of candidate styles can be configured with clutchlog::filehash_styles and clutchlog::funchash_styles, which both take a vector of clutchlog::fmt objects as argument:

    // Either one or the other color for filenames:
    +
    log.filehash_styles( { fmt(fg::red), fmt(fg::yellow) } );
    +
    // This would fix the function name style to a single one:
    +
    log.funchash_styles( { fmt(typo::bold) } );
    +
    // Works with any `fmt` constructor
    +
    // (here, shades of blues in 256-colors mode):
    +
    log.funchash_styles( { fmt(33), fmt(27), fmt(39), fmt(45) } );
    +

    The same idea applies to {depth_fmt}. However, if clutchlog::depth_styles is configured, then the styles are chosen in order. That is, a depth of 1 would lead to the first style being chosen. If the current depth of the stack is larger than the number of configured styles, then the last one is used. For example:

    // Increasingly darker depth level colors (using the 256-colors mode).
    +
    log.depth_styles({ fmt(255), fmt(250), fmt(245), fmt(240), fmt(235) });
    +

    If clutchlog::depth_styles is set, the {depth_marks} template tag will render with each mark having each own style corresponding to its depth. Note: a depth of zero showing no mark, the first style in the list is never applied to marks.

    +

    Advanced Usage

    -

    +

    More Output Configuration

    -

    +

    Dump Format

    The default format of the first line of comment added with the dump macro is "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}". It can be edited with the format_comment method. If it is set to an empty string, then no comment line is added. The default can be modified at compile time with CLUTCHDUMP_DEFAULT_FORMAT.

    By default, the separator between items in the container is a new line. To change this behaviour, you can change CLUTCHDUMP_DEFAULT_SEP or call the low-level dump method.

    By default, and if CLUTCHDUMP_DEFAULT_FORMAT is not defined, clutchlog will not put the location-related tags in the message formats (i.e. {file} and {line}) when not in Debug builds.

    -

    +

    Stack Depth Mark

    The mark used with the {depth_marks} tag can be configured with the clutchlog::depth_mark method, and its default with the CLUTCHLOG_DEFAULT_DEPTH_MARK macro:

    log.depth_mark(CLUTCHLOG_DEFAULT_DEPTH_MARK); // Defaults to ">".
    -

    +

    Horizontal Filling

    The character used with the {hfill} tag can be configured wth the clutchlog::hfill_mark method, and its default with the CLUTCHLOG_DEFAULT_HFILL_MARK macro:

    log.hfill_mark(CLUTCHLOG_DEFAULT_HFILL_MARK); // Defaults to '.'.

    Clutchlog measures the width of the standard error channel. If it is redirected, it may be measured as very large (or very small). Thus, the clutchlog::hfill_min clutchlog::hfill_max accessors allow to set a minimum and a maximum width (in number of characters).

    log.hfill_max(CLUTCHLOG_DEFAULT_HFILL_MAX); // Defaults to 300.
    log.hfill_min(CLUTCHLOG_DEFAULT_HFILL_MIN); // Defaults to 150.

    Note: clutchlog will use the measured width, unless it goes out of [clutchlog::hfill_min,clutchlog::hfill_max], in which case it will be caped to those bounds.

    -

    +

    Stack Depth

    By default, clutchlog removes 5 levels of the calls stack, so that your main entrypoint corresponds to a depth of zero. You can change this behaviour by defining the CLUTCHLOG_STRIP_CALLS macro, or calling clutchlog::strip_calls.

    log.strip_calls(CLUTCHLOG_STRIP_CALLS); // Defaults to 5.
    -

    +

    Disabled calls

    By default, clutchlog is always enabled if the NDEBUG preprocessor variable is not defined (this variable is set by CMake in build types that differs from Debug).

    You can however force clutchlog to be enabled in any build type by setting the WITH_CLUTCHLOG preprocessor variable.

    @@ -365,26 +385,32 @@ Disabled calls
    #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::xdebug

    Note that allowing a log level does not mean that it will actually output something. If the configured log level at runtime is lower than the log level of the message, it will still not be printed.

    This behavior intend to remove as many conditional statements as possible when not debugging, without having to use preprocessor guards around calls to clutchlog, thus saving run time at no readability cost.

    -

    +

    Low-level API

    All configuration setters have a getters counterpart, with the same name but taking no parameter, for example:

    std::string mark = log.depth_mark();
    -

    To control more precisely the logging, one can use the low-level clutchlog::log method:

    log.log(clutchlog::level::xdebug, "hello world", "main.cpp", "main", 122);
    +

    To control more precisely the logging, one can use the low-level clutchlog::log method:

    log.log(clutchlog::level::xdebug, "hello world", "main.cpp", "main", 122);

    A helper macro can helps to fill in the location with the actual one, as seen by the compiler:

    log.log(clutchlog::level::xdebug, "hello world", CLUTCHLOC);

    A similar dump method exists:

    log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), CLUTCHLOC, "dumped_{n}.dat", "\n");
    log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), "main.cpp", "main", 122, "dumped.dat", "\n\n");

    You can access the identifier of log levels with clutchlog::level_of:

    log.threshold( log.level_of("XDebug") ); // You have to know the exact string.
    -

    +

    (De)clutch any function call

    The CLUTHFUNC macro allows to wrap any function within the current logger.

    For instance, this can be useful if you want to (de)clutch calls to asserts. To do that, just declare your own macro:

    #define ASSERT(...) { CLUTCHFUNC(error, assert, __VA_ARGS__) }

    Thus, any call like ASSERT(x > 3); will be declutchable with the same configuration than a call to CLUTCHLOG.

    -

    +

    (De)clutch any code section

    The CLUTCHCODE macro allows to wrap any code within the current logger.

    For instance:

    std::clog << "We are clutched!\n";
    );
    -

    +

    +Manually Increase Stack Depth

    +

    You may want to manually increase the stack depth for a given logging call, for instance to subdivise a single function in sections. To do so, you can use the CLUTCHLOGD macro, which take an additional argument, in the form of the number of additional (fake) stack depths you want:

    CLUTCHLOG( debug, "Call"); // Regular macro.
    +
    CLUTCHLOGD(debug, "Sub call", 1); // Adds an additional (fake) stack depth.
    +
    CLUTCHLOGD(debug, "Sub sub!", 2); // Adds two additional (fake) stack depths.
    +

    That way, the depth will be rendered to the actual depth, plus the additional depth delta. Note that the displayed function will stay the same. Any filtering on the stack depth will take into account the fake depth and not the real one.

    +

    Examples

    Here what you would do to setup clutchlog with the default configuration:

    auto& log = clutchlog::logger();
    log.out(std::clog);
    @@ -456,29 +482,29 @@ Examples
    log.hfill_char('.');
    log.hfill_max(300);
    log.hfill_style(clutchlog::fmt::fg::none);
    -

    +

    Limitations

    -

    +

    System-dependent stack depth

    Because access to the call stack depth and program name are system-dependent, the features relying on the depth of the call stack and the display of the program name are only available for operating systems having the following headers: execinfo.h, stdlib.h and libgen.h (so far, tested with Linux).

    Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSINFO to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

    #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    log.depth( x );
    #endif
    -

    +

    System-dependent horizontal fill

    Because access to the current terminal width is system-dependent, the {hfill} format tag feature is only available for operating systems having the following headers: sys/ioctl.h, stdio.h and unistd.h (so far, tested with Linux).

    Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSIOCTL to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

    #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
    log.hfill_mark( '_' );
    #endif

    If you use unicode characters in your template, the horizontal width will not be computed properly, resulting in incorrectly right-aligned lines. Solving this would require the use of third-party libraries, making portability more difficult.

    -

    +

    Dependencies

    Some colors/styles may not be supported by some exotic terminal emulators.

    Clutchlog needs C++-17 with the filesystem feature. You may need to indicate -std=c++17 -lstdc++fs to some compilers.

    -

    +

    Variable names within the CLUTCHLOG macro

    Calling the CLUTCHLOG macro with a message using a variable named clutchlog__msg will end in an error.

    -

    +

    Features

    What Clutchlog do not provide at the moment (but may in a near future):

      @@ -494,7 +520,7 @@ Features
    • Automatic argument parser (please, use a dedicated lib).
    • Signal handling (WTF would you do that, anyway?).
    -

    +

    Build and tests

    To use clutchlog, just include its header in your code and either ensure that the NDEBUG preprocessor variable is not set, either define the WITH_CLUTCHLOG preprocessor variable.

    If you're using CMake (or another modern build system), it will unset NDEBUG —and thus enable clutchlog— only for the "Debug" build type, which is usually what you want if you use clutchlog, anyway.

    @@ -507,17 +533,18 @@ Build and tests -
    #define CLUTCHLOG_DEFAULT_DEPTH_MARK
    Compile-time default mark for stack depth.
    Definition: clutchlog.h:246
    +
    #define CLUTCHLOG_DEFAULT_DEPTH_MARK
    Compile-time default mark for stack depth.
    Definition: clutchlog.h:256
    enum clutchlog::fmt::typo style
    Typographic style.
    -
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:98
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:296
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:366
    +
    #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
    Log a message at the given level and with a given depth delta.
    Definition: clutchlog.h:81
    +
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:107
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:376
    #define CLUTCHLOC
    Handy shortcuts to location.
    Definition: clutchlog.h:77
    -
    #define CLUTCHLOG_DEFAULT_HFILL_MARK
    Character used as a filling for right-align the right part of messages with "{hfill}".
    Definition: clutchlog.h:260
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:81
    -
    #define CLUTCHFUNC(LEVEL, FUNC,...)
    Call any function if the scope matches.
    Definition: clutchlog.h:115
    -
    #define CLUTCHLOG_STRIP_CALLS
    Compile-time number of call stack levels to remove from depth display by default.
    Definition: clutchlog.h:253
    -
    #define CLUTCHCODE(LEVEL,...)
    Run any code if the scope matches.
    Definition: clutchlog.h:136
    +
    #define CLUTCHLOG_DEFAULT_HFILL_MARK
    Character used as a filling for right-align the right part of messages with "{hfill}".
    Definition: clutchlog.h:270
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    +
    #define CLUTCHFUNC(LEVEL, FUNC,...)
    Call any function if the scope matches.
    Definition: clutchlog.h:124
    +
    #define CLUTCHLOG_STRIP_CALLS
    Compile-time number of call stack levels to remove from depth display by default.
    Definition: clutchlog.h:263
    +
    #define CLUTCHCODE(LEVEL,...)
    Run any code if the scope matches.
    Definition: clutchlog.h:145
    + + + + + + + + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    t-depth-delta.cpp
    +
    +
    +
    1 #include <iostream>
    +
    2 #include <limits>
    +
    3 
    +
    4 #include "../clutchlog/clutchlog.h"
    +
    5 
    +
    6 void deepcall()
    +
    7 {
    +
    8  CLUTCHLOG(warning,"at depth 4");
    +
    9  CLUTCHLOGD(warning,"at depth 4+1", 1);
    +
    10  CLUTCHLOGD(warning,"at depth 4+2", 2);
    +
    11 }
    +
    12 
    +
    13 void subsubsubcall()
    +
    14 {
    +
    15  CLUTCHLOG(warning,"at depth 3");
    +
    16  CLUTCHLOGD(warning,"at depth 3+1", 1);
    +
    17  CLUTCHLOGD(warning,"at depth 3+2", 2);
    +
    18  deepcall();
    +
    19 }
    +
    20 
    +
    21 void subsubcall()
    +
    22 {
    +
    23  CLUTCHLOG(warning,"at depth 2");
    +
    24  CLUTCHLOGD(warning,"at depth 2+1", 1);
    +
    25  CLUTCHLOGD(warning,"at depth 2+2", 2);
    +
    26  subsubsubcall();
    +
    27 }
    +
    28 
    +
    29 void subcall()
    +
    30 {
    +
    31  CLUTCHLOG(warning,"at depth 1");
    +
    32  CLUTCHLOGD(warning,"at depth 1+1", 1);
    +
    33  CLUTCHLOGD(warning,"at depth 1+2", 2);
    +
    34  subsubcall();
    +
    35 }
    +
    36 
    +
    37 int main(/*const int argc, char* argv[]*/)
    +
    38 {
    +
    39  auto& log = clutchlog::logger();
    +
    40  using fmt = clutchlog::fmt;
    +
    41  using typo = clutchlog::fmt::typo;
    +
    42 
    +
    43  fmt reset(typo::reset);
    +
    44  std::ostringstream tpl;
    +
    45  tpl << "{depth_fmt}{depth} {depth_marks}"
    +
    46  << reset << "{funchash_fmt}in {func} {msg}\t\n";
    +
    47  log.format(tpl.str());
    +
    48  log.threshold(clutchlog::level::xdebug);
    +
    49  std::vector<fmt> greys = {fmt(15)};
    +
    50  for(unsigned short i=255; i > 231; i-=3) {
    +
    51  greys.push_back( fmt(i) ); }
    +
    52  log.depth_styles( greys );
    +
    53  log.depth_mark("| ");
    +
    54 
    +
    55  CLUTCHLOG(warning,"in main");
    +
    56  subcall();
    +
    57 }
    +
    58 
    +
    +
    +
    #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
    Log a message at the given level and with a given depth delta.
    Definition: clutchlog.h:81
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:376
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:389
    + + + + diff --git a/docs/t-dump_8cpp_source.html b/docs/t-dump_8cpp_source.html index 86d4bdd..b9fbeba 100644 --- a/docs/t-dump_8cpp_source.html +++ b/docs/t-dump_8cpp_source.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.14 +  0.15
    @@ -111,8 +111,8 @@ $(document).ready(function(){initNavTree('t-dump_8cpp_source.html',''); initResi
    21 }
    -
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:98
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:296
    +
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:107
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:366
    -
    bg
    Background color codes.
    Definition: clutchlog.h:411
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:379
    -
    fg
    Foreground color codes.
    Definition: clutchlog.h:390
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:376
    +
    bg
    Background color codes.
    Definition: clutchlog.h:421
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:389
    +
    fg
    Foreground color codes.
    Definition: clutchlog.h:400
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:296
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:366
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:81
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:379
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:376
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:389
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:296
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:81
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:81
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    diff --git a/docs/classclutchlog.html b/docs/classclutchlog.html index 907d2d3..31e86fb 100644 --- a/docs/classclutchlog.html +++ b/docs/classclutchlog.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    @@ -185,6 +185,10 @@ void fmt style (level stage) const  Get the configured fmt instance of the given log level.
      + +void filename (filename f) + Sets the file naming scheme. *‍/.
    Low-level API
    scope_t locate (const level &stage, const std::string &file, const std::string &func, const size_t line) const @@ -272,6 +276,18 @@ High-level API }  Available log levels.
      +enum  filename {
    +  path, +base, +dir, +dirbase, +
    +  stem, +dirstem +
    + } + Available filename rendering methods.
    +  static clutchloglogger ()  Get the logger instance. More...
      @@ -334,6 +350,10 @@ std::vector< fmt > std::vector< fmt_funchash_fmts  List of candidate format objects for value-dependant function name styling.
      + +filename _filename + Filename rendering method.
     clutchlog (clutchlog const &)=delete   @@ -403,9 +423,9 @@ void operator= (Style will be chosen based on the hash value of the filename among the candidate ones.

    See the {filehash_fmt} template tag.

    -

    Definition at line 1038 of file clutchlog.h.

    +

    Definition at line 1045 of file clutchlog.h.

    -

    References _filehash_fmts.

    +

    References _filehash_fmts.

    @@ -437,9 +457,9 @@ void operator= (Style will be chosen based on the hash value of the filename among the candidate ones.

    See the {funchash_fmt} template tag.

    -

    Definition at line 1046 of file clutchlog.h.

    +

    Definition at line 1053 of file clutchlog.h.

    -

    References _funchash_fmts.

    +

    References _funchash_fmts.

    @@ -471,7 +491,7 @@ void operator= (The given list should be ordered, styles will be applied for the corresponding depth level. If the actual depth is larger than the number of styles, the last one is used.

    See the {depth_fmt} template tag.

    -

    Definition at line 1055 of file clutchlog.h.

    +

    Definition at line 1062 of file clutchlog.h.

    @@ -502,11 +522,11 @@ void operator= (Return the log level tag corresponding to the given pre-configured name.

    Note
    This is case sensitive, see the pre-configured _level_word.
    -

    Definition at line 1070 of file clutchlog.h.

    +

    Definition at line 1077 of file clutchlog.h.

    -

    References _word_level.

    +

    References _word_level.

    -

    Referenced by threshold().

    +

    Referenced by threshold().

    @@ -549,11 +569,11 @@ template<class ... FMT>

    Set the style (color and typo) of the given log level.

    This version accept style arguments as if they were passed to clutchlog::fmt.

    -

    Definition at line 1104 of file clutchlog.h.

    +

    Definition at line 1111 of file clutchlog.h.

    -

    References style().

    +

    References style().

    -

    Referenced by style().

    +

    Referenced by style().

    @@ -601,9 +621,9 @@ template<class ... FMT>
    log.replace("{greet} {world}", "\\{greet\\}", "hello");
    // returns "hello {world}"
    -

    Definition at line 1193 of file clutchlog.h.

    +

    Definition at line 1203 of file clutchlog.h.

    -

    Referenced by dump(), format(), and replace().

    +

    Referenced by dump(), format(), and replace().

    @@ -613,7 +633,7 @@ template<class ... FMT>
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
    Print a log message IF the location matches the given one.
    Definition: clutchlog.h:1374
    +
    void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
    Print a log message IF the location matches the given one.
    Definition: clutchlog.h:1412
    @@ -415,9 +415,9 @@ std::ostream &  diff --git a/docs/clutchlog_8h.html b/docs/clutchlog_8h.html index 2dbb3b1..1dc3cd5 100644 --- a/docs/clutchlog_8h.html +++ b/docs/clutchlog_8h.html @@ -28,7 +28,7 @@ diff --git a/docs/clutchlog_8h__dep__incl.map b/docs/clutchlog_8h__dep__incl.map index 4740dc4..8180ccb 100644 --- a/docs/clutchlog_8h__dep__incl.map +++ b/docs/clutchlog_8h__dep__incl.map @@ -1,5 +1,5 @@ - + @@ -8,8 +8,9 @@ - - - - + + + + + diff --git a/docs/clutchlog_8h__dep__incl.md5 b/docs/clutchlog_8h__dep__incl.md5 index 440c2e6..80b393d 100644 --- a/docs/clutchlog_8h__dep__incl.md5 +++ b/docs/clutchlog_8h__dep__incl.md5 @@ -1 +1 @@ -03a5adb412c477109d73f308278ec653 \ No newline at end of file +a81a51c1f045be087627e35d5e6b32ef \ No newline at end of file diff --git a/docs/clutchlog_8h__dep__incl.svg b/docs/clutchlog_8h__dep__incl.svg index 1422fbd..e4f4e4c 100644 --- a/docs/clutchlog_8h__dep__incl.svg +++ b/docs/clutchlog_8h__dep__incl.svg @@ -46,7 +46,7 @@ if (edges && edges.length) { @@ -54,13 +54,13 @@ var sectionId = 'dynsection-1'; clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -76,8 +76,8 @@ var sectionId = 'dynsection-1'; Node1->Node2 - - + + @@ -91,8 +91,8 @@ var sectionId = 'dynsection-1'; Node1->Node3 - - + + @@ -106,8 +106,8 @@ var sectionId = 'dynsection-1'; Node1->Node4 - - + + @@ -121,8 +121,8 @@ var sectionId = 'dynsection-1'; Node1->Node5 - - + + @@ -136,8 +136,8 @@ var sectionId = 'dynsection-1'; Node1->Node6 - - + + @@ -151,8 +151,8 @@ var sectionId = 'dynsection-1'; Node1->Node7 - - + + @@ -166,8 +166,8 @@ var sectionId = 'dynsection-1'; Node1->Node8 - - + + @@ -181,68 +181,83 @@ var sectionId = 'dynsection-1'; Node1->Node9 - - + + Node10 - - -t-fmt-constructors.cpp + + +t-filename.cpp Node1->Node10 - - + + Node11 - - -t-hash-color.cpp + + +t-fmt-constructors.cpp Node1->Node11 - - + + Node12 - - -t-log.cpp + + +t-hash-color.cpp Node1->Node12 - - + + Node13 - - -t-one-line-if.cpp + + +t-log.cpp Node1->Node13 - - + + + + + +Node14 + + +t-one-line-if.cpp + + + + + +Node1->Node14 + + diff --git a/docs/clutchlog_8h__dep__incl_org.svg b/docs/clutchlog_8h__dep__incl_org.svg index 3682d73..bcf3f63 100644 --- a/docs/clutchlog_8h__dep__incl_org.svg +++ b/docs/clutchlog_8h__dep__incl_org.svg @@ -4,17 +4,17 @@ - + clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -30,8 +30,8 @@ Node1->Node2 - - + + @@ -45,8 +45,8 @@ Node1->Node3 - - + + @@ -60,8 +60,8 @@ Node1->Node4 - - + + @@ -75,8 +75,8 @@ Node1->Node5 - - + + @@ -90,8 +90,8 @@ Node1->Node6 - - + + @@ -105,8 +105,8 @@ Node1->Node7 - - + + @@ -120,8 +120,8 @@ Node1->Node8 - - + + @@ -135,68 +135,83 @@ Node1->Node9 - - + + Node10 - - -t-fmt-constructors.cpp + + +t-filename.cpp Node1->Node10 - - + + Node11 - - -t-hash-color.cpp + + +t-fmt-constructors.cpp Node1->Node11 - - + + Node12 - - -t-log.cpp + + +t-hash-color.cpp Node1->Node12 - - + + Node13 - - -t-one-line-if.cpp + + +t-log.cpp Node1->Node13 - - + + + + + +Node14 + + +t-one-line-if.cpp + + + + + +Node1->Node14 + + diff --git a/docs/clutchlog_8h_source.html b/docs/clutchlog_8h_source.html index 71543c2..fe6753b 100644 --- a/docs/clutchlog_8h_source.html +++ b/docs/clutchlog_8h_source.html @@ -28,7 +28,7 @@ Logo @@ -343,1177 +343,1216 @@ $(document).ready(function(){initNavTree('clutchlog_8h_source.html',''); initRes
    311 
    313  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    314 
    -
    376  class fmt {
    -
    377  public:
    -
    379  enum class ansi {
    -
    381  colors_16 = -1, // Not supposed to be casted.
    -
    383  colors_256 = 5, // Casted as short in color::operator<<.
    -
    385  colors_16M = 2 // Casted as short in color::operator<<
    -
    386  } mode;
    -
    387 
    -
    389  enum class typo {
    -
    390  reset = 0,
    -
    391  bold = 1,
    -
    392  underline = 4,
    -
    393  inverse = 7,
    -
    394  none = -1
    -
    395  } style;
    -
    396 
    -
    399  enum class fg {
    -
    401  black = 30,
    -
    402  red = 31,
    -
    403  green = 32,
    -
    404  yellow = 33,
    -
    405  blue = 34,
    -
    406  magenta = 35,
    -
    407  cyan = 36,
    -
    408  white = 37,
    -
    409  bright_black = 90,
    -
    410  bright_red = 91,
    -
    411  bright_green = 92,
    -
    412  bright_yellow = 93,
    -
    413  bright_blue = 94,
    -
    414  bright_magenta = 95,
    -
    415  bright_cyan = 96,
    -
    416  bright_white = 97,
    -
    417  none = -1
    -
    418  } fore;
    -
    419 
    -
    421  enum class bg {
    -
    422  black = 40,
    -
    423  red = 41,
    -
    424  green = 42,
    -
    425  yellow = 43,
    -
    426  blue = 44,
    -
    427  magenta = 45,
    -
    428  cyan = 46,
    -
    429  white = 47,
    -
    430  bright_black = 100,
    -
    431  bright_red = 101,
    -
    432  bright_green = 102,
    -
    433  bright_yellow = 103,
    -
    434  bright_blue = 104,
    -
    435  bright_magenta = 105,
    -
    436  bright_cyan = 106,
    -
    437  bright_white = 107,
    -
    438  none = -1
    -
    439  } back;
    -
    440 
    -
    441  protected:
    -
    443  friend std::ostream& operator<<(std::ostream& os, const std::tuple<fg,bg,typo>& fbs)
    -
    444  {
    -
    445  auto [f,b,s] = fbs;
    -
    446  std::vector<short> codes; codes.reserve(3);
    -
    447  if(f != fg::none) { codes.push_back(static_cast<short>(f));}
    -
    448  if(b != bg::none) { codes.push_back(static_cast<short>(b));}
    -
    449  if(s != typo::none) { codes.push_back(static_cast<short>(s));}
    -
    450  if(codes.size() == 0) {
    -
    451  return os;
    -
    452 
    -
    453  } else {
    -
    454  os << "\033[";
    -
    455  os << codes[0];
    -
    456  for(size_t i=1; i < codes.size(); ++i) {
    -
    457  os << ";" << codes[i];
    -
    458  }
    -
    459  os << "m";
    -
    460  }
    -
    461  return os;
    -
    462  }
    -
    463 
    -
    465  friend std::ostream& operator<<(std::ostream& os, const typo& s)
    -
    466  {
    -
    467  if(s != typo::none) {
    -
    468  os << "\033[" << static_cast<short>(s) << "m";
    -
    469  }
    -
    470  return os;
    -
    471  }
    -
    472 
    -
    475  protected:
    -
    480  struct color {
    -
    481  ansi mode; // Not const to allow for the implicit copy assignemnt operator.
    -
    482 
    -
    484  enum class ground { // idem.
    -
    485  fore = 38,
    -
    486  back = 48
    -
    487  } type;
    -
    488 
    -
    494  color(ansi a, ground g) : mode(a), type(g) {}
    -
    495 
    -
    497  virtual bool is_set() const = 0;
    +
    316  enum filename {path, base, dir, dirbase, stem, dirstem};
    +
    317 
    +
    379  class fmt {
    +
    380  public:
    +
    382  enum class ansi {
    +
    384  colors_16 = -1, // Not supposed to be casted.
    +
    386  colors_256 = 5, // Casted as short in color::operator<<.
    +
    388  colors_16M = 2 // Casted as short in color::operator<<
    +
    389  } mode;
    +
    390 
    +
    392  enum class typo {
    +
    393  reset = 0,
    +
    394  bold = 1,
    +
    395  underline = 4,
    +
    396  inverse = 7,
    +
    397  none = -1
    +
    398  } style;
    +
    399 
    +
    402  enum class fg {
    +
    404  black = 30,
    +
    405  red = 31,
    +
    406  green = 32,
    +
    407  yellow = 33,
    +
    408  blue = 34,
    +
    409  magenta = 35,
    +
    410  cyan = 36,
    +
    411  white = 37,
    +
    412  bright_black = 90,
    +
    413  bright_red = 91,
    +
    414  bright_green = 92,
    +
    415  bright_yellow = 93,
    +
    416  bright_blue = 94,
    +
    417  bright_magenta = 95,
    +
    418  bright_cyan = 96,
    +
    419  bright_white = 97,
    +
    420  none = -1
    +
    421  } fore;
    +
    422 
    +
    424  enum class bg {
    +
    425  black = 40,
    +
    426  red = 41,
    +
    427  green = 42,
    +
    428  yellow = 43,
    +
    429  blue = 44,
    +
    430  magenta = 45,
    +
    431  cyan = 46,
    +
    432  white = 47,
    +
    433  bright_black = 100,
    +
    434  bright_red = 101,
    +
    435  bright_green = 102,
    +
    436  bright_yellow = 103,
    +
    437  bright_blue = 104,
    +
    438  bright_magenta = 105,
    +
    439  bright_cyan = 106,
    +
    440  bright_white = 107,
    +
    441  none = -1
    +
    442  } back;
    +
    443 
    +
    444  protected:
    +
    446  friend std::ostream& operator<<(std::ostream& os, const std::tuple<fg,bg,typo>& fbs)
    +
    447  {
    +
    448  auto [f,b,s] = fbs;
    +
    449  std::vector<short> codes; codes.reserve(3);
    +
    450  if(f != fg::none) { codes.push_back(static_cast<short>(f));}
    +
    451  if(b != bg::none) { codes.push_back(static_cast<short>(b));}
    +
    452  if(s != typo::none) { codes.push_back(static_cast<short>(s));}
    +
    453  if(codes.size() == 0) {
    +
    454  return os;
    +
    455 
    +
    456  } else {
    +
    457  os << "\033[";
    +
    458  os << codes[0];
    +
    459  for(size_t i=1; i < codes.size(); ++i) {
    +
    460  os << ";" << codes[i];
    +
    461  }
    +
    462  os << "m";
    +
    463  }
    +
    464  return os;
    +
    465  }
    +
    466 
    +
    468  friend std::ostream& operator<<(std::ostream& os, const typo& s)
    +
    469  {
    +
    470  if(s != typo::none) {
    +
    471  os << "\033[" << static_cast<short>(s) << "m";
    +
    472  }
    +
    473  return os;
    +
    474  }
    +
    475 
    +
    478  protected:
    +
    483  struct color {
    +
    484  ansi mode; // Not const to allow for the implicit copy assignemnt operator.
    +
    485 
    +
    487  enum class ground { // idem.
    +
    488  fore = 38,
    +
    489  back = 48
    +
    490  } type;
    +
    491 
    +
    497  color(ansi a, ground g) : mode(a), type(g) {}
    498 
    -
    500  virtual std::ostream& print_on( std::ostream& os) const = 0;
    +
    500  virtual bool is_set() const = 0;
    501 
    -
    503  friend std::ostream& operator<<(std::ostream& os, const color& c)
    -
    504  {
    -
    505  if(c.is_set()) {
    -
    506  os << "\033[" << static_cast<short>(c.type) << ";" << static_cast<short>(c.mode) << ";";
    -
    507  c.print_on(os);
    -
    508  os << "m";
    -
    509  }
    -
    510  return os;
    -
    511  }
    -
    512  };
    -
    513 
    -
    514  // There is no color_16 because it would be the same as color_256, only with different indices,
    -
    515  // hence making it more complicated for the user to select the right constructor.
    -
    516  // Here, we just use enum for 16 colors, and indices for 256 colors.
    -
    517 
    -
    519  struct color_256 : public color {
    -
    523  short index;
    -
    524 
    -
    528  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
    -
    529 
    -
    535  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {assert(-1 <= i and i <= 255);}
    -
    536 
    -
    538  bool is_set() const {return index > -1;}
    +
    503  virtual std::ostream& print_on( std::ostream& os) const = 0;
    +
    504 
    +
    506  friend std::ostream& operator<<(std::ostream& os, const color& c)
    +
    507  {
    +
    508  if(c.is_set()) {
    +
    509  os << "\033[" << static_cast<short>(c.type) << ";" << static_cast<short>(c.mode) << ";";
    +
    510  c.print_on(os);
    +
    511  os << "m";
    +
    512  }
    +
    513  return os;
    +
    514  }
    +
    515  };
    +
    516 
    +
    517  // There is no color_16 because it would be the same as color_256, only with different indices,
    +
    518  // hence making it more complicated for the user to select the right constructor.
    +
    519  // Here, we just use enum for 16 colors, and indices for 256 colors.
    +
    520 
    +
    522  struct color_256 : public color {
    +
    526  short index;
    +
    527 
    +
    531  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
    +
    532 
    +
    538  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {assert(-1 <= i and i <= 255);}
    539 
    -
    541  std::ostream& print_on( std::ostream& os) const
    -
    542  {
    -
    543  os << index;
    -
    544  return os;
    -
    545  }
    -
    546  };
    -
    547 
    -
    549  struct fg_256 : public color_256 {
    -
    551  fg_256() : color_256(ground::fore) {}
    -
    552 
    -
    556  fg_256(const short f) : color_256(ground::fore, f) {}
    -
    557 
    -
    561  fg_256(const fg&) : color_256(ground::fore, -1) {}
    -
    562 
    -
    563  } fore_256;
    -
    564 
    -
    566  struct bg_256 : public color_256 {
    -
    568  bg_256() : color_256(ground::back) {}
    -
    569 
    -
    573  bg_256(const short b) : color_256(ground::back, b) {}
    -
    574 
    -
    578  bg_256(const bg&) : color_256(ground::back, -1) {}
    -
    579 
    -
    580  } back_256;
    -
    581 
    -
    583  struct color_16M : public color {
    -
    587  short red, green, blue;
    -
    588 
    -
    592  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
    -
    593 
    -
    601  color_16M(ground t, short r, short g, short b)
    -
    602  : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
    -
    603 
    -
    611  color_16M(ground t, const std::string& srgb) : color(ansi::colors_16M, t)
    -
    612  {
    -
    613  assert(srgb.size() == 7);
    -
    614  if(srgb.size() != 7) {
    -
    615  red = -1;
    -
    616  green = -1;
    -
    617  blue = -1;
    -
    618  } else {
    -
    619  char i = 0;
    -
    620  if(srgb.at(0) == '#') {
    -
    621  i = 1;
    -
    622  }
    -
    623  std::istringstream(srgb.substr(0+i,2)) >> std::hex >> red;
    -
    624  std::istringstream(srgb.substr(2+i,2)) >> std::hex >> green;
    -
    625  std::istringstream(srgb.substr(4+i,2)) >> std::hex >> blue;
    -
    626  }
    -
    627  assert(-1 <= red and red <= 255);
    -
    628  assert(-1 <= green and green <= 255);
    -
    629  assert(-1 <= blue and blue <= 255);
    -
    630  }
    -
    631 
    -
    633  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
    +
    541  bool is_set() const {return index > -1;}
    +
    542 
    +
    544  std::ostream& print_on( std::ostream& os) const
    +
    545  {
    +
    546  os << index;
    +
    547  return os;
    +
    548  }
    +
    549  };
    +
    550 
    +
    552  struct fg_256 : public color_256 {
    +
    554  fg_256() : color_256(ground::fore) {}
    +
    555 
    +
    559  fg_256(const short f) : color_256(ground::fore, f) {}
    +
    560 
    +
    564  fg_256(const fg&) : color_256(ground::fore, -1) {}
    +
    565 
    +
    566  } fore_256;
    +
    567 
    +
    569  struct bg_256 : public color_256 {
    +
    571  bg_256() : color_256(ground::back) {}
    +
    572 
    +
    576  bg_256(const short b) : color_256(ground::back, b) {}
    +
    577 
    +
    581  bg_256(const bg&) : color_256(ground::back, -1) {}
    +
    582 
    +
    583  } back_256;
    +
    584 
    +
    586  struct color_16M : public color {
    +
    590  short red, green, blue;
    +
    591 
    +
    595  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
    +
    596 
    +
    604  color_16M(ground t, short r, short g, short b)
    +
    605  : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
    +
    606 
    +
    614  color_16M(ground t, const std::string& srgb) : color(ansi::colors_16M, t)
    +
    615  {
    +
    616  assert(srgb.size() == 7);
    +
    617  if(srgb.size() != 7) {
    +
    618  red = -1;
    +
    619  green = -1;
    +
    620  blue = -1;
    +
    621  } else {
    +
    622  char i = 0;
    +
    623  if(srgb.at(0) == '#') {
    +
    624  i = 1;
    +
    625  }
    +
    626  std::istringstream(srgb.substr(0+i,2)) >> std::hex >> red;
    +
    627  std::istringstream(srgb.substr(2+i,2)) >> std::hex >> green;
    +
    628  std::istringstream(srgb.substr(4+i,2)) >> std::hex >> blue;
    +
    629  }
    +
    630  assert(-1 <= red and red <= 255);
    +
    631  assert(-1 <= green and green <= 255);
    +
    632  assert(-1 <= blue and blue <= 255);
    +
    633  }
    634 
    -
    636  std::ostream& print_on( std::ostream& os) const
    -
    637  {
    -
    638  os << red << ";" << green << ";" << blue;
    -
    639  return os;
    -
    640  }
    -
    641  };
    -
    642 
    -
    644  struct fg_16M : public color_16M {
    -
    646  fg_16M() : color_16M(ground::fore) {}
    -
    647 
    -
    656  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
    -
    657 
    -
    664  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
    -
    665 
    -
    669  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
    -
    670 
    -
    671  } fore_16M;
    -
    672 
    -
    674  struct bg_16M : public color_16M {
    -
    676  bg_16M() : color_16M(ground::back) {}
    -
    677 
    -
    686  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
    -
    687 
    -
    694  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
    -
    695 
    -
    699  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
    -
    700 
    -
    701  } back_16M;
    -
    702 
    -
    705  public:
    -
    707  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
    -
    708 
    -
    711  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    712  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    713  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    714  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    715  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    716  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    721  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
    -
    722  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
    -
    723  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
    -
    728  fmt(const short fr, const short fg, const short fb,
    -
    729  const short gr, const short gg, const short gb,
    -
    730  typo s = typo::none)
    -
    731  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
    -
    732  fmt(fg,
    -
    733  const short gr, const short gg, const short gb,
    -
    734  typo s = typo::none)
    -
    735  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
    -
    736  fmt(const short fr, const short fg, const short fb,
    -
    737  bg, typo s = typo::none)
    -
    738  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
    +
    636  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
    +
    637 
    +
    639  std::ostream& print_on( std::ostream& os) const
    +
    640  {
    +
    641  os << red << ";" << green << ";" << blue;
    +
    642  return os;
    +
    643  }
    +
    644  };
    +
    645 
    +
    647  struct fg_16M : public color_16M {
    +
    649  fg_16M() : color_16M(ground::fore) {}
    +
    650 
    +
    659  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
    +
    660 
    +
    667  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
    +
    668 
    +
    672  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
    +
    673 
    +
    674  } fore_16M;
    +
    675 
    +
    677  struct bg_16M : public color_16M {
    +
    679  bg_16M() : color_16M(ground::back) {}
    +
    680 
    +
    689  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
    +
    690 
    +
    697  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
    +
    698 
    +
    702  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
    +
    703 
    +
    704  } back_16M;
    +
    705 
    +
    708  public:
    +
    710  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
    +
    711 
    +
    714  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    715  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    716  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    717  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    718  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    719  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    724  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
    +
    725  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
    +
    726  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
    +
    731  fmt(const short fr, const short fg, const short fb,
    +
    732  const short gr, const short gg, const short gb,
    +
    733  typo s = typo::none)
    +
    734  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
    +
    735  fmt(fg,
    +
    736  const short gr, const short gg, const short gb,
    +
    737  typo s = typo::none)
    +
    738  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
    739  fmt(const short fr, const short fg, const short fb,
    -
    740  typo s = typo::none)
    +
    740  bg, typo s = typo::none)
    741  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
    -
    742 
    -
    743  fmt(const std::string& f, const std::string& b, typo s = typo::none)
    -
    744  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
    -
    745  fmt(fg, const std::string& b, typo s = typo::none)
    -
    746  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
    -
    747  fmt(const std::string& f, bg, typo s = typo::none)
    -
    748  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    -
    749  fmt(const std::string& f, typo s = typo::none)
    -
    750  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    -
    753  protected:
    -
    754 
    -
    756  std::ostream& print_on( std::ostream& os) const
    -
    757  {
    -
    758  if(mode == ansi::colors_16) {
    -
    759  // Print all in a single escape.
    -
    760  os << std::make_tuple(fore,back,style);
    -
    761 
    -
    762  } else {
    -
    763  // 256 or 16M: always print separated escapes for foreground/background.
    -
    764  if(mode == ansi::colors_256) {
    -
    765  os << fore_256;
    -
    766  os << back_256;
    -
    767 
    -
    768  } else if(mode == ansi::colors_16M) {
    -
    769  os << fore_16M;
    -
    770  os << back_16M;
    -
    771  }
    -
    772  // In any case, print the style separately.
    -
    773  os << style;
    -
    774  }
    -
    775  return os;
    -
    776  }
    -
    777 
    -
    778  public:
    -
    790  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
    -
    791  {
    -
    792  return fmt.print_on(os);
    -
    793  }
    -
    794 
    -
    805  std::string operator()( const std::string& msg ) const
    -
    806  {
    -
    807  std::ostringstream os;
    -
    808  this->print_on(os);
    -
    809  fmt reset(fmt::typo::reset);
    -
    810  os << msg;
    -
    811  reset.print_on(os);
    -
    812  return os.str();
    -
    813  }
    -
    814 
    -
    817  std::string str() const
    -
    818  {
    -
    819  std::ostringstream os;
    -
    820  this->print_on(os);
    -
    821  return os.str();
    -
    822  }
    -
    823 
    -
    824  static fmt hash( const std::string& str, const std::vector<fmt> domain = {})
    -
    825  {
    -
    826  size_t h = std::hash<std::string>{}(str);
    -
    827  if(domain.size() == 0) {
    -
    828  return fmt(static_cast<short>(h % 256));
    -
    829  } else {
    -
    830  return fmt(domain[h % domain.size()]);
    -
    831  }
    -
    832  }
    -
    833  }; // fmt class
    -
    834 
    -
    840  public:
    -
    841  clutchlog(clutchlog const&) = delete;
    -
    842  void operator=(clutchlog const&) = delete;
    -
    843 
    -
    844  private:
    -
    845  clutchlog() :
    -
    846  // system, main, log
    - -
    848  _level_word({
    -
    849  {level::critical,"Critical"},
    -
    850  {level::error ,"Error"},
    -
    851  {level::warning ,"Warning"},
    -
    852  {level::progress,"Progress"},
    -
    853  {level::note ,"Note"},
    -
    854  {level::info ,"Info"},
    -
    855  {level::debug ,"Debug"},
    -
    856  {level::xdebug ,"XDebug"}
    -
    857  }),
    -
    858  _level_short({
    -
    859  {level::critical, "Crit"},
    -
    860  {level::error , "Erro"},
    -
    861  {level::warning , "Warn"},
    -
    862  {level::progress, "Prog"},
    -
    863  {level::note , "Note"},
    -
    864  {level::info , "Info"},
    -
    865  {level::debug , "Dbug"},
    -
    866  {level::xdebug , "XDbg"}
    -
    867  }),
    -
    868  _level_fmt({
    -
    869  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
    -
    870  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
    -
    871  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
    -
    872  {level::progress,fmt()},
    -
    873  {level::note ,fmt()},
    -
    874  {level::info ,fmt()},
    -
    875  {level::debug ,fmt()},
    -
    876  {level::xdebug ,fmt()}
    -
    877  }),
    - - -
    880  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    -
    881  _hfill_char(clutchlog::default_hfill_char),
    -
    882  _hfill_fmt(fmt::fg::none),
    -
    883  _hfill_max(clutchlog::default_hfill_max),
    -
    884  _hfill_min(clutchlog::default_hfill_min),
    -
    885  #endif
    -
    886  _out(&std::clog),
    -
    887  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    888  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
    -
    889  _depth_mark(clutchlog::default_depth_mark),
    -
    890  #endif
    -
    891  _stage(level::error),
    -
    892  _in_file(".*"),
    -
    893  _in_func(".*"),
    -
    894  _in_line(".*")
    -
    895  // Empty vectors by default:
    -
    896  // _filehash_fmts
    -
    897  // _funchash_fmts
    -
    898  // _depth_fmts
    -
    899  {
    -
    900  // Reverse the level->word map into a word->level map.
    -
    901  for(auto& lw : _level_word) {
    -
    902  _word_level[lw.second] = lw.first;
    -
    903  }
    -
    904 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    -
    905  struct winsize w;
    -
    906  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
    -
    907  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
    -
    908 #endif
    -
    909  }
    -
    910 
    -
    911  protected:
    -
    913  size_t _strip_calls;
    -
    915  const std::map<level,std::string> _level_word;
    -
    917  std::map<std::string,level> _word_level;
    -
    919  std::map<level,std::string> _level_short;
    -
    921  std::map<level,fmt> _level_fmt;
    -
    923  std::string _format_log;
    -
    925  std::string _format_dump;
    -
    926  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    -
    927 
    -
    928  char _hfill_char;
    -
    930  fmt _hfill_fmt;
    -
    932  size_t _hfill_max;
    -
    934  size_t _hfill_min;
    -
    935  #endif
    -
    936 
    -
    937  std::ostream* _out;
    -
    938  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    939 
    -
    940  size_t _depth;
    -
    942  std::string _depth_mark;
    -
    943  #endif
    -
    944 
    - -
    947  std::regex _in_file;
    -
    949  std::regex _in_func;
    -
    951  std::regex _in_line;
    -
    952 
    -
    954  std::vector<fmt> _filehash_fmts;
    -
    956  std::vector<fmt> _funchash_fmts;
    -
    957 
    -
    958 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    959 
    -
    960  static const size_t _max_buffer = 4096;
    -
    962  std::vector<fmt> _depth_fmts;
    -
    963 #endif
    -
    964 
    -
    965 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    -
    966 
    -
    967  size_t _nb_columns;
    -
    968 #endif
    -
    969 
    -
    971  public:
    -
    972 
    -
    976  void format(const std::string& format) {_format_log = format;}
    -
    979  std::string format() const {return _format_log;}
    -
    980 
    -
    982  void format_comment(const std::string& format) {_format_dump = format;}
    -
    984  std::string format_comment() const {return _format_dump;}
    -
    985 
    -
    987  void out(std::ostream& out) {_out = &out;}
    -
    989  std::ostream& out() {return *_out;}
    -
    990 
    -
    991 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    992  void depth(size_t d) {_depth = d;}
    -
    995  size_t depth() const {return _depth;}
    -
    996 
    -
    998  void depth_mark(const std::string mark) {_depth_mark = mark;}
    -
    1000  std::string depth_mark() const {return _depth_mark;}
    -
    1001 
    -
    1003  void strip_calls(const size_t n) {_strip_calls = n;}
    -
    1005  size_t strip_calls() const {return _strip_calls;}
    -
    1006 #endif
    -
    1007 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
    -
    1008  void hfill_mark(const char mark) {_hfill_char = mark;}
    -
    1011  char hfill_mark() const {return _hfill_char;}
    -
    1013  void hfill_style(fmt style) {_hfill_fmt = style;}
    -
    1018  template<class ... FMT>
    -
    1019  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
    -
    1021  fmt hfill_style() const {return _hfill_fmt;}
    -
    1023  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
    -
    1025  size_t hfill_max() {return _hfill_max;}
    -
    1027  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
    -
    1029  size_t hfill_min() {return _hfill_min;}
    -
    1030 #endif
    -
    1031 
    -
    1038  void filehash_styles(std::vector<fmt> styles) {_filehash_fmts = styles;}
    -
    1046  void funchash_styles(std::vector<fmt> styles) {_funchash_fmts = styles;}
    -
    1055  void depth_styles(std::vector<fmt> styles) {_depth_fmts = styles;}
    -
    1056 
    -
    1058  void threshold(level l) {_stage = l;}
    -
    1060  void threshold(const std::string& l) {_stage = this->level_of(l);}
    -
    1062  level threshold() const {return _stage;}
    -
    1064  const std::map<std::string,level>& levels() const { return _word_level;}
    -
    1065 
    -
    1070  level level_of(const std::string name)
    -
    1071  {
    -
    1072  const auto ilevel = _word_level.find(name);
    -
    1073  if( ilevel != std::end(_word_level)) {
    -
    1074  return ilevel->second;
    -
    1075  } else {
    -
    1076  throw std::out_of_range("'" + name + "' is not a valid log level name");
    -
    1077  }
    -
    1078  }
    -
    1079 
    -
    1081  void file(std::string file) {_in_file = file;}
    -
    1083  void func(std::string func) {_in_func = func;}
    -
    1085  void line(std::string line) {_in_line = line;}
    +
    742  fmt(const short fr, const short fg, const short fb,
    +
    743  typo s = typo::none)
    +
    744  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
    +
    745 
    +
    746  fmt(const std::string& f, const std::string& b, typo s = typo::none)
    +
    747  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
    +
    748  fmt(fg, const std::string& b, typo s = typo::none)
    +
    749  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
    +
    750  fmt(const std::string& f, bg, typo s = typo::none)
    +
    751  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    +
    752  fmt(const std::string& f, typo s = typo::none)
    +
    753  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    +
    756  protected:
    +
    757 
    +
    759  std::ostream& print_on( std::ostream& os) const
    +
    760  {
    +
    761  if(mode == ansi::colors_16) {
    +
    762  // Print all in a single escape.
    +
    763  os << std::make_tuple(fore,back,style);
    +
    764 
    +
    765  } else {
    +
    766  // 256 or 16M: always print separated escapes for foreground/background.
    +
    767  if(mode == ansi::colors_256) {
    +
    768  os << fore_256;
    +
    769  os << back_256;
    +
    770 
    +
    771  } else if(mode == ansi::colors_16M) {
    +
    772  os << fore_16M;
    +
    773  os << back_16M;
    +
    774  }
    +
    775  // In any case, print the style separately.
    +
    776  os << style;
    +
    777  }
    +
    778  return os;
    +
    779  }
    +
    780 
    +
    781  public:
    +
    793  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
    +
    794  {
    +
    795  return fmt.print_on(os);
    +
    796  }
    +
    797 
    +
    808  std::string operator()( const std::string& msg ) const
    +
    809  {
    +
    810  std::ostringstream os;
    +
    811  this->print_on(os);
    +
    812  fmt reset(fmt::typo::reset);
    +
    813  os << msg;
    +
    814  reset.print_on(os);
    +
    815  return os.str();
    +
    816  }
    +
    817 
    +
    820  std::string str() const
    +
    821  {
    +
    822  std::ostringstream os;
    +
    823  this->print_on(os);
    +
    824  return os.str();
    +
    825  }
    +
    826 
    +
    827  static fmt hash( const std::string& str, const std::vector<fmt> domain = {})
    +
    828  {
    +
    829  size_t h = std::hash<std::string>{}(str);
    +
    830  if(domain.size() == 0) {
    +
    831  return fmt(static_cast<short>(h % 256));
    +
    832  } else {
    +
    833  return fmt(domain[h % domain.size()]);
    +
    834  }
    +
    835  }
    +
    836  }; // fmt class
    +
    837 
    +
    843  public:
    +
    844  clutchlog(clutchlog const&) = delete;
    +
    845  void operator=(clutchlog const&) = delete;
    +
    846 
    +
    847  private:
    +
    848  clutchlog() :
    +
    849  // system, main, log
    + +
    851  _level_word({
    +
    852  {level::critical,"Critical"},
    +
    853  {level::error ,"Error"},
    +
    854  {level::warning ,"Warning"},
    +
    855  {level::progress,"Progress"},
    +
    856  {level::note ,"Note"},
    +
    857  {level::info ,"Info"},
    +
    858  {level::debug ,"Debug"},
    +
    859  {level::xdebug ,"XDebug"}
    +
    860  }),
    +
    861  _level_short({
    +
    862  {level::critical, "Crit"},
    +
    863  {level::error , "Erro"},
    +
    864  {level::warning , "Warn"},
    +
    865  {level::progress, "Prog"},
    +
    866  {level::note , "Note"},
    +
    867  {level::info , "Info"},
    +
    868  {level::debug , "Dbug"},
    +
    869  {level::xdebug , "XDbg"}
    +
    870  }),
    +
    871  _level_fmt({
    +
    872  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
    +
    873  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
    +
    874  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
    +
    875  {level::progress,fmt()},
    +
    876  {level::note ,fmt()},
    +
    877  {level::info ,fmt()},
    +
    878  {level::debug ,fmt()},
    +
    879  {level::xdebug ,fmt()}
    +
    880  }),
    + + +
    883  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    +
    884  _hfill_char(clutchlog::default_hfill_char),
    +
    885  _hfill_fmt(fmt::fg::none),
    +
    886  _hfill_max(clutchlog::default_hfill_max),
    +
    887  _hfill_min(clutchlog::default_hfill_min),
    +
    888  #endif
    +
    889  _out(&std::clog),
    +
    890  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    891  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
    +
    892  _depth_mark(clutchlog::default_depth_mark),
    +
    893  #endif
    +
    894  _stage(level::error),
    +
    895  _in_file(".*"),
    +
    896  _in_func(".*"),
    +
    897  _in_line(".*"),
    +
    898  // Empty vectors by default:
    +
    899  // _filehash_fmts
    +
    900  // _funchash_fmts
    +
    901  // _depth_fmts
    +
    902  _filename(filename::path)
    +
    903  {
    +
    904  // Reverse the level->word map into a word->level map.
    +
    905  for(auto& lw : _level_word) {
    +
    906  _word_level[lw.second] = lw.first;
    +
    907  }
    +
    908 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    +
    909  struct winsize w;
    +
    910  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
    +
    911  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
    +
    912 #endif
    +
    913  }
    +
    914 
    +
    915  protected:
    +
    917  size_t _strip_calls;
    +
    919  const std::map<level,std::string> _level_word;
    +
    921  std::map<std::string,level> _word_level;
    +
    923  std::map<level,std::string> _level_short;
    +
    925  std::map<level,fmt> _level_fmt;
    +
    927  std::string _format_log;
    +
    929  std::string _format_dump;
    +
    930  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    +
    931 
    +
    932  char _hfill_char;
    +
    934  fmt _hfill_fmt;
    +
    936  size_t _hfill_max;
    +
    938  size_t _hfill_min;
    +
    939  #endif
    +
    940 
    +
    941  std::ostream* _out;
    +
    942  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    943 
    +
    944  size_t _depth;
    +
    946  std::string _depth_mark;
    +
    947  #endif
    +
    948 
    + +
    951  std::regex _in_file;
    +
    953  std::regex _in_func;
    +
    955  std::regex _in_line;
    +
    956 
    +
    958  std::vector<fmt> _filehash_fmts;
    +
    960  std::vector<fmt> _funchash_fmts;
    +
    961 
    +
    962 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    963 
    +
    964  static const size_t _max_buffer = 4096;
    +
    966  std::vector<fmt> _depth_fmts;
    +
    967 #endif
    +
    968 
    +
    969 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    +
    970 
    +
    971  size_t _nb_columns;
    +
    972 #endif
    +
    973 
    + +
    978  public:
    +
    979 
    +
    983  void format(const std::string& format) {_format_log = format;}
    +
    986  std::string format() const {return _format_log;}
    +
    987 
    +
    989  void format_comment(const std::string& format) {_format_dump = format;}
    +
    991  std::string format_comment() const {return _format_dump;}
    +
    992 
    +
    994  void out(std::ostream& out) {_out = &out;}
    +
    996  std::ostream& out() {return *_out;}
    +
    997 
    +
    998 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    999  void depth(size_t d) {_depth = d;}
    +
    1002  size_t depth() const {return _depth;}
    +
    1003 
    +
    1005  void depth_mark(const std::string mark) {_depth_mark = mark;}
    +
    1007  std::string depth_mark() const {return _depth_mark;}
    +
    1008 
    +
    1010  void strip_calls(const size_t n) {_strip_calls = n;}
    +
    1012  size_t strip_calls() const {return _strip_calls;}
    +
    1013 #endif
    +
    1014 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
    +
    1015  void hfill_mark(const char mark) {_hfill_char = mark;}
    +
    1018  char hfill_mark() const {return _hfill_char;}
    +
    1020  void hfill_style(fmt style) {_hfill_fmt = style;}
    +
    1025  template<class ... FMT>
    +
    1026  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
    +
    1028  fmt hfill_style() const {return _hfill_fmt;}
    +
    1030  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
    +
    1032  size_t hfill_max() {return _hfill_max;}
    +
    1034  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
    +
    1036  size_t hfill_min() {return _hfill_min;}
    +
    1037 #endif
    +
    1038 
    +
    1045  void filehash_styles(std::vector<fmt> styles) {_filehash_fmts = styles;}
    +
    1053  void funchash_styles(std::vector<fmt> styles) {_funchash_fmts = styles;}
    +
    1062  void depth_styles(std::vector<fmt> styles) {_depth_fmts = styles;}
    +
    1063 
    +
    1065  void threshold(level l) {_stage = l;}
    +
    1067  void threshold(const std::string& l) {_stage = this->level_of(l);}
    +
    1069  level threshold() const {return _stage;}
    +
    1071  const std::map<std::string,level>& levels() const { return _word_level;}
    +
    1072 
    +
    1077  level level_of(const std::string name)
    +
    1078  {
    +
    1079  const auto ilevel = _word_level.find(name);
    +
    1080  if( ilevel != std::end(_word_level)) {
    +
    1081  return ilevel->second;
    +
    1082  } else {
    +
    1083  throw std::out_of_range("'" + name + "' is not a valid log level name");
    +
    1084  }
    +
    1085  }
    1086 
    -
    1088  void location(
    -
    1089  const std::string& in_file,
    -
    1090  const std::string& in_function=".*",
    -
    1091  const std::string& in_line=".*"
    -
    1092  )
    -
    1093  {
    -
    1094  file(in_file);
    -
    1095  func(in_function);
    -
    1096  line(in_line);
    -
    1097  }
    -
    1098 
    -
    1103  template<class ... FMT>
    -
    1104  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
    -
    1106  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
    -
    1108  fmt style(level stage) const { return _level_fmt.at(stage); }
    -
    1109 
    -
    1112  public:
    -
    1113 
    -
    1117  struct scope_t {
    -
    1120  bool matches;
    - -
    1123 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    1124 
    -
    1125  size_t depth;
    -
    1126 #endif
    -
    1127 
    -
    1128  bool there;
    - -
    1131  matches(false),
    -
    1132  stage(level::xdebug),
    - -
    1134  depth(0),
    -
    1135 #endif
    -
    1136  there(false)
    -
    1137  {}
    -
    1138  }; // scope_t
    -
    1139 
    -
    1140 
    - -
    1143  const level& stage,
    -
    1144  const std::string& file,
    -
    1145  const std::string& func,
    -
    1146  const size_t line
    -
    1147  ) const
    -
    1148  {
    -
    1149  scope_t scope; // False scope by default.
    +
    1088  void file(std::string file) {_in_file = file;}
    +
    1090  void func(std::string func) {_in_func = func;}
    +
    1092  void line(std::string line) {_in_line = line;}
    +
    1093 
    +
    1095  void location(
    +
    1096  const std::string& in_file,
    +
    1097  const std::string& in_function=".*",
    +
    1098  const std::string& in_line=".*"
    +
    1099  )
    +
    1100  {
    +
    1101  file(in_file);
    +
    1102  func(in_function);
    +
    1103  line(in_line);
    +
    1104  }
    +
    1105 
    +
    1110  template<class ... FMT>
    +
    1111  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
    +
    1113  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
    +
    1115  fmt style(level stage) const { return _level_fmt.at(stage); }
    +
    1116 
    +
    1118  void filename(filename f) {_filename = f;}
    +
    1119 
    +
    1122  public:
    +
    1123 
    +
    1127  struct scope_t {
    +
    1130  bool matches;
    + +
    1133 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    1134 
    +
    1135  size_t depth;
    +
    1136 #endif
    +
    1137 
    +
    1138  bool there;
    + +
    1141  matches(false),
    +
    1142  stage(level::xdebug),
    + +
    1144  depth(0),
    +
    1145 #endif
    +
    1146  there(false)
    +
    1147  {}
    +
    1148  }; // scope_t
    +
    1149 
    1150 
    -
    1151  /***** Log level stage *****/
    -
    1152  // Test stage first, because it's fastest.
    -
    1153  scope.stage = stage;
    -
    1154  if(not (scope.stage <= _stage)) {
    -
    1155  // Bypass useless computations if no match
    -
    1156  // because of the stage.
    -
    1157  return scope;
    -
    1158  }
    -
    1159 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    1160  /***** Stack depth *****/
    -
    1161  // Backtrace in second, quite fast.
    -
    1162  size_t stack_depth;
    -
    1163  void *buffer[_max_buffer];
    -
    1164  stack_depth = backtrace(buffer, _max_buffer);
    -
    1165  scope.depth = stack_depth;
    -
    1166  if(not (scope.depth <= _depth + _strip_calls)) {
    -
    1167  // Bypass if no match.
    -
    1168  return scope;
    -
    1169  }
    -
    1170 #endif
    -
    1171 
    -
    1172  /***** Location *****/
    -
    1173  // Location last, slowest.
    -
    1174  std::ostringstream sline; sline << line;
    -
    1175  scope.there =
    -
    1176  std::regex_search(file, _in_file)
    -
    1177  and std::regex_search(func, _in_func)
    -
    1178  and std::regex_search(sline.str(), _in_line);
    -
    1179 
    -
    1180  // No need to retest stage and depth, which are true here.
    -
    1181  scope.matches = scope.there;
    -
    1182 
    -
    1183  return scope;
    -
    1184  } // locate
    -
    1185 
    -
    1193  std::string replace(
    -
    1194  const std::string& form,
    -
    1195  const std::string& mark,
    -
    1196  const std::string& tag
    -
    1197  ) const
    -
    1198  {
    -
    1199  // Useless debug code, unless something fancy would be done with name tags.
    -
    1200  // std::regex re;
    -
    1201  // try {
    -
    1202  // re = std::regex(mark);
    -
    1203  //
    -
    1204  // } catch(const std::regex_error& e) {
    -
    1205  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
    -
    1206  // switch(e.code()) {
    -
    1207  // case std::regex_constants::error_collate:
    -
    1208  // std::cerr << "the expression contains an invalid collating element name";
    -
    1209  // break;
    -
    1210  // case std::regex_constants::error_ctype:
    -
    1211  // std::cerr << "the expression contains an invalid character class name";
    -
    1212  // break;
    -
    1213  // case std::regex_constants::error_escape:
    -
    1214  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
    -
    1215  // break;
    -
    1216  // case std::regex_constants::error_backref:
    -
    1217  // std::cerr << "the expression contains an invalid back reference";
    -
    1218  // break;
    -
    1219  // case std::regex_constants::error_brack:
    -
    1220  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
    -
    1221  // break;
    -
    1222  // case std::regex_constants::error_paren:
    -
    1223  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
    -
    1224  // break;
    -
    1225  // case std::regex_constants::error_brace:
    -
    1226  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
    -
    1227  // break;
    -
    1228  // case std::regex_constants::error_badbrace:
    -
    1229  // std::cerr << "the expression contains an invalid range in a {} expression";
    -
    1230  // break;
    -
    1231  // case std::regex_constants::error_range:
    -
    1232  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
    -
    1233  // break;
    -
    1234  // case std::regex_constants::error_space:
    -
    1235  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
    -
    1236  // break;
    -
    1237  // case std::regex_constants::error_badrepeat:
    -
    1238  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
    -
    1239  // break;
    -
    1240  // case std::regex_constants::error_complexity:
    -
    1241  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
    -
    1242  // break;
    -
    1243  // case std::regex_constants::error_stack:
    -
    1244  // std::cerr << "there was not enough memory to perform a match";
    -
    1245  // break;
    -
    1246  // default:
    -
    1247  // std::cerr << "unknown error";
    -
    1248  // }
    -
    1249  // std::cerr << std::endl;
    -
    1250  // throw;
    -
    1251  // } // catch
    -
    1252 
    -
    1253  const std::regex re(mark);
    -
    1254  return std::regex_replace(form, re, tag);
    -
    1255  }
    -
    1256 
    -
    1258  std::string replace(
    -
    1259  const std::string& form,
    -
    1260  const std::string& mark,
    -
    1261  const size_t tag
    -
    1262  ) const
    -
    1263  {
    -
    1264  std::ostringstream stag; stag << tag;
    -
    1265  return replace(form, mark, stag.str());
    -
    1266  }
    -
    1267 
    -
    1269  std::string format(
    -
    1270  std::string row,
    -
    1271  const std::string& what,
    - -
    1273  const std::string& name,
    -
    1274 #endif
    -
    1275  const level& stage,
    -
    1276  const std::string& file,
    -
    1277  const std::string& func,
    -
    1278  const size_t line
    - -
    1280  ,
    -
    1281  const size_t depth
    -
    1282 #endif
    -
    1283  ) const
    -
    1284  {
    -
    1285  row = replace(row, "\\{msg\\}", what);
    -
    1286  row = replace(row, "\\{file\\}", file);
    -
    1287  row = replace(row, "\\{func\\}", func);
    -
    1288  row = replace(row, "\\{line\\}", line);
    -
    1289 
    -
    1290  row = replace(row, "\\{level\\}", _level_word.at(stage));
    -
    1291  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
    -
    1292  row = replace(row, "\\{level_letter\\}", letter);
    -
    1293 
    -
    1294  row = replace(row, "\\{level_short\\}", _level_short.at(stage));
    -
    1295 
    -
    1296 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    1297  size_t actual_depth = depth - _strip_calls;
    -
    1298  row = replace(row, "\\{name\\}", name);
    -
    1299  row = replace(row, "\\{depth\\}", actual_depth);
    -
    1300 
    -
    1301  if(_depth_fmts.size() == 0) {
    -
    1302  row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() );
    -
    1303 
    -
    1304  std::ostringstream chevrons;
    -
    1305  for(size_t i = 0; i < actual_depth; ++i) {
    -
    1306  chevrons << _depth_mark;
    -
    1307  }
    -
    1308  row = replace(row, "\\{depth_marks\\}", chevrons.str());
    -
    1309 
    -
    1310  } else {
    -
    1311  row = replace(row, "\\{depth_fmt\\}",
    -
    1312  _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() );
    -
    1313 
    -
    1314  std::ostringstream chevrons;
    -
    1315  for(size_t i = 0; i < actual_depth; ++i) {
    -
    1316  chevrons << _depth_fmts[std::min(i+1,_depth_fmts.size()-1)].str()
    -
    1317  << _depth_mark;
    -
    1318  }
    -
    1319  row = replace(row, "\\{depth_marks\\}", chevrons.str());
    -
    1320  }
    -
    1321 #endif
    -
    1322  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
    -
    1323  row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() );
    -
    1324  row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() );
    + +
    1153  const level& stage,
    +
    1154  const std::string& file,
    +
    1155  const std::string& func,
    +
    1156  const size_t line
    +
    1157  ) const
    +
    1158  {
    +
    1159  scope_t scope; // False scope by default.
    +
    1160 
    +
    1161  /***** Log level stage *****/
    +
    1162  // Test stage first, because it's fastest.
    +
    1163  scope.stage = stage;
    +
    1164  if(not (scope.stage <= _stage)) {
    +
    1165  // Bypass useless computations if no match
    +
    1166  // because of the stage.
    +
    1167  return scope;
    +
    1168  }
    +
    1169 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    1170  /***** Stack depth *****/
    +
    1171  // Backtrace in second, quite fast.
    +
    1172  size_t stack_depth;
    +
    1173  void *buffer[_max_buffer];
    +
    1174  stack_depth = backtrace(buffer, _max_buffer);
    +
    1175  scope.depth = stack_depth;
    +
    1176  if(not (scope.depth <= _depth + _strip_calls)) {
    +
    1177  // Bypass if no match.
    +
    1178  return scope;
    +
    1179  }
    +
    1180 #endif
    +
    1181 
    +
    1182  /***** Location *****/
    +
    1183  // Location last, slowest.
    +
    1184  std::ostringstream sline; sline << line;
    +
    1185  scope.there =
    +
    1186  std::regex_search(file, _in_file)
    +
    1187  and std::regex_search(func, _in_func)
    +
    1188  and std::regex_search(sline.str(), _in_line);
    +
    1189 
    +
    1190  // No need to retest stage and depth, which are true here.
    +
    1191  scope.matches = scope.there;
    +
    1192 
    +
    1193  return scope;
    +
    1194  } // locate
    +
    1195 
    +
    1203  std::string replace(
    +
    1204  const std::string& form,
    +
    1205  const std::string& mark,
    +
    1206  const std::string& tag
    +
    1207  ) const
    +
    1208  {
    +
    1209  // Useless debug code, unless something fancy would be done with name tags.
    +
    1210  // std::regex re;
    +
    1211  // try {
    +
    1212  // re = std::regex(mark);
    +
    1213  //
    +
    1214  // } catch(const std::regex_error& e) {
    +
    1215  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
    +
    1216  // switch(e.code()) {
    +
    1217  // case std::regex_constants::error_collate:
    +
    1218  // std::cerr << "the expression contains an invalid collating element name";
    +
    1219  // break;
    +
    1220  // case std::regex_constants::error_ctype:
    +
    1221  // std::cerr << "the expression contains an invalid character class name";
    +
    1222  // break;
    +
    1223  // case std::regex_constants::error_escape:
    +
    1224  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
    +
    1225  // break;
    +
    1226  // case std::regex_constants::error_backref:
    +
    1227  // std::cerr << "the expression contains an invalid back reference";
    +
    1228  // break;
    +
    1229  // case std::regex_constants::error_brack:
    +
    1230  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
    +
    1231  // break;
    +
    1232  // case std::regex_constants::error_paren:
    +
    1233  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
    +
    1234  // break;
    +
    1235  // case std::regex_constants::error_brace:
    +
    1236  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
    +
    1237  // break;
    +
    1238  // case std::regex_constants::error_badbrace:
    +
    1239  // std::cerr << "the expression contains an invalid range in a {} expression";
    +
    1240  // break;
    +
    1241  // case std::regex_constants::error_range:
    +
    1242  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
    +
    1243  // break;
    +
    1244  // case std::regex_constants::error_space:
    +
    1245  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
    +
    1246  // break;
    +
    1247  // case std::regex_constants::error_badrepeat:
    +
    1248  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
    +
    1249  // break;
    +
    1250  // case std::regex_constants::error_complexity:
    +
    1251  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
    +
    1252  // break;
    +
    1253  // case std::regex_constants::error_stack:
    +
    1254  // std::cerr << "there was not enough memory to perform a match";
    +
    1255  // break;
    +
    1256  // default:
    +
    1257  // std::cerr << "unknown error";
    +
    1258  // }
    +
    1259  // std::cerr << std::endl;
    +
    1260  // throw;
    +
    1261  // } // catch
    +
    1262 
    +
    1263  const std::regex re(mark);
    +
    1264  return std::regex_replace(form, re, tag);
    +
    1265  }
    +
    1266 
    +
    1268  std::string replace(
    +
    1269  const std::string& form,
    +
    1270  const std::string& mark,
    +
    1271  const size_t tag
    +
    1272  ) const
    +
    1273  {
    +
    1274  std::ostringstream stag; stag << tag;
    +
    1275  return replace(form, mark, stag.str());
    +
    1276  }
    +
    1277 
    +
    1279  std::string format(
    +
    1280  std::string row,
    +
    1281  const std::string& what,
    + +
    1283  const std::string& name,
    +
    1284 #endif
    +
    1285  const level& stage,
    +
    1286  const std::string& file,
    +
    1287  const std::string& func,
    +
    1288  const size_t line
    + +
    1290  ,
    +
    1291  const size_t depth
    +
    1292 #endif
    +
    1293  ) const
    +
    1294  {
    +
    1295  row = replace(row, "\\{msg\\}", what);
    +
    1296 
    +
    1297  const std::filesystem::path filepath(file);
    +
    1298  assert(filepath.is_absolute());
    +
    1299  std::string filename;
    +
    1300  std::filesystem::path::iterator ip = filepath.end();
    +
    1301  std::advance(ip, -2);
    +
    1302  switch(_filename) {
    +
    1303  case filename::base:
    +
    1304  filename = filepath.filename().string();
    +
    1305  break;
    +
    1306  case filename::dir:
    +
    1307  filename = ip->string();
    +
    1308  break;
    +
    1309  case filename::dirbase:
    +
    1310  filename = (*ip / filepath.filename()).string();
    +
    1311  break;
    +
    1312  case filename::stem:
    +
    1313  filename = filepath.stem().string();
    +
    1314  break;
    +
    1315  case filename::dirstem:
    +
    1316  filename = (*ip / filepath.stem()).string();
    +
    1317  break;
    +
    1318  case filename::path:
    +
    1319  default:
    +
    1320  filename = file;
    +
    1321  break;
    +
    1322  }
    +
    1323  row = replace(row, "\\{file\\}", filename);
    +
    1324 
    1325 
    -
    1326 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    -
    1327  // hfill is replaced last to allow for correct line width estimation.
    -
    1328  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
    -
    1329  const std::string hfill_tag = "{hfill}";
    -
    1330  const size_t hfill_pos = row.find(hfill_tag);
    -
    1331  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
    -
    1332  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
    -
    1333  if(hfill_pos != std::string::npos) {
    -
    1334  assert(raw_hfill_pos != std::string::npos);
    -
    1335  if(nb_columns > 0) {
    -
    1336  const size_t left_len = raw_hfill_pos;
    -
    1337  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
    -
    1338  if(right_len+left_len > nb_columns) {
    -
    1339  // The right part would go over the terminal width: add a new row.
    -
    1340  if(right_len < nb_columns) {
    -
    1341  // There is room for the right part on a new line.
    -
    1342  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
    -
    1343  const std::string hfill_styled = _hfill_fmt(hfill);
    -
    1344  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
    -
    1345  } else {
    -
    1346  // Right part still goes over columns: let it go.
    -
    1347  const std::string hfill(1, _hfill_char);
    -
    1348  const std::string hfill_styled = _hfill_fmt(hfill);
    -
    1349  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
    -
    1350  }
    -
    1351  } else {
    -
    1352  // There is some space in between left and right parts.
    -
    1353  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
    -
    1354  const std::string hfill_styled = _hfill_fmt(hfill);
    -
    1355  row = replace(row, "\\{hfill\\}", hfill_styled);
    -
    1356  }
    -
    1357  } else {
    -
    1358  // We don't know the terminal width.
    -
    1359  const std::string hfill(1, _hfill_char);
    -
    1360  const std::string hfill_styled = _hfill_fmt(hfill);
    -
    1361  row = replace(row, "\\{hfill\\}", hfill_styled);
    -
    1362  }
    -
    1363  }
    -
    1364 #else
    -
    1365  // We cannot know the terminal width.
    -
    1366  const std::string hfill(1, _hfill_char);
    -
    1367  const std::string hfill_styled = _hfill_fmt(hfill);
    -
    1368  row = replace(row, "\\{hfill\\}", hfill_styled);
    -
    1369 #endif
    -
    1370  return _level_fmt.at(stage)(row);
    -
    1371  }
    -
    1372 
    -
    1374  void log(
    -
    1375  const level& stage,
    -
    1376  const std::string& what,
    -
    1377  const std::string& file, const std::string& func, const size_t line,
    -
    1378  const size_t depth_delta = 0
    -
    1379  ) const
    -
    1380  {
    -
    1381  scope_t scope = locate(stage, file, func, line);
    -
    1382 
    -
    1383  if(scope.matches) {
    -
    1384 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    1385  *_out << format(_format_log, what, basename(getenv("_")),
    -
    1386  stage, file, func,
    -
    1387  line, scope.depth + depth_delta );
    -
    1388 #else
    -
    1389  *_out << format(_format_log, what,
    -
    1390  stage, file, func,
    -
    1391  line );
    -
    1392 #endif
    -
    1393  _out->flush();
    -
    1394  } // if scopes.matches
    -
    1395  }
    -
    1396 
    -
    1398  template<class In>
    -
    1399  void dump(
    -
    1400  const level& stage,
    -
    1401  const In container_begin, const In container_end,
    -
    1402  const std::string& file, const std::string& func, const size_t line,
    -
    1403  const std::string& filename_template = "dump_{n}.dat",
    -
    1404  const std::string sep = dump_default_sep
    -
    1405  ) const
    -
    1406  {
    -
    1407  scope_t scope = locate(stage, file, func, line);
    -
    1408 
    -
    1409  if(scope.matches) {
    -
    1410  const std::string tag = "\\{n\\}";
    -
    1411  const std::regex re(tag);
    -
    1412  std::string outfile = "";
    -
    1413 
    -
    1414  // If the file name template has the {n} tag.
    -
    1415  if(std::regex_search(filename_template, re)) {
    -
    1416  // Increment n until a free one is found.
    -
    1417  size_t n = 0;
    -
    1418  do {
    -
    1419  outfile = replace(filename_template, tag, n);
    -
    1420  n++;
    -
    1421  } while( fs::exists( outfile ) );
    -
    1422 
    -
    1423  } else {
    -
    1424  // Use the parameter as is.
    -
    1425  outfile = filename_template;
    -
    1426  }
    -
    1427 
    -
    1428  std::ofstream fd(outfile);
    -
    1429 
    -
    1430  if(_format_dump.size() > 0) {
    -
    1431 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    1432  fd << format(_format_dump, "", basename(getenv("_")),
    -
    1433  stage, file, func,
    -
    1434  line, scope.depth );
    -
    1435 #else
    -
    1436  fd << format(_format_dump, "",
    -
    1437  stage, file, func,
    -
    1438  line );
    -
    1439 #endif
    -
    1440  fd << sep; // sep after comment line.
    -
    1441  }
    -
    1442 
    -
    1443  std::copy(container_begin, container_end,
    -
    1444  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
    -
    1445 
    -
    1446  fd.close();
    -
    1447  } // if scopes.matches
    -
    1448  }
    -
    1449 
    -
    1451 };
    -
    1452 
    -
    1455 #else // not WITH_CLUTCHLOG
    -
    1456 
    -
    1457 
    -
    1458 /**********************************************************************
    -
    1459  * Fake implementation
    -
    1460  **********************************************************************/
    -
    1461 
    -
    1462 // Equivalent class with empty methods, will be optimized out
    -
    1463 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
    -
    1464 #pragma GCC diagnostic push
    -
    1465 #pragma GCC diagnostic ignored "-Wreturn-type"
    -
    1466 class clutchlog
    -
    1467 {
    -
    1468  public:
    -
    1469  static clutchlog& logger() {}
    -
    1470  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    -
    1471  class fmt {
    -
    1472  public:
    -
    1473  enum class ansi { colors_16, colors_256, colors_16M} mode;
    -
    1474  enum class typo { reset, bold, underline, inverse, none} style;
    -
    1475  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
    -
    1476  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
    -
    1477  protected:
    -
    1478  friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
    -
    1479  friend std::ostream& operator<<(std::ostream&, const typo&) {}
    -
    1480  protected:
    -
    1481  struct color {
    -
    1482  ansi mode;
    -
    1483  enum class ground { fore, back } type;
    -
    1484  color(ansi a, ground g) : mode(a), type(g) {}
    -
    1485  virtual bool is_set() const = 0;
    -
    1486  virtual std::ostream& print_on( std::ostream&) const = 0;
    -
    1487  friend std::ostream& operator<<(std::ostream&, const color&) {}
    -
    1488  };
    -
    1489  struct color_256 : public color {
    -
    1490  short index;
    -
    1491  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
    -
    1492  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
    -
    1493  bool is_set() const {}
    -
    1494  std::ostream& print_on( std::ostream&) const {}
    -
    1495  };
    -
    1496  struct fg_256 : public color_256 {
    -
    1497  fg_256() : color_256(ground::fore) {}
    -
    1498  fg_256(const short f) : color_256(ground::fore, f) {}
    -
    1499  fg_256(const fg&) : color_256(ground::fore, -1) {}
    -
    1500  } fore_256;
    -
    1501  struct bg_256 : public color_256 {
    -
    1502  bg_256() : color_256(ground::back) {}
    -
    1503  bg_256(const short b) : color_256(ground::back, b) {}
    -
    1504  bg_256(const bg&) : color_256(ground::back, -1) {}
    -
    1505  } back_256;
    -
    1506  struct color_16M : public color {
    -
    1507  short red, green, blue;
    -
    1508  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
    -
    1509  color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
    -
    1510  color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
    -
    1511  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
    -
    1512  std::ostream& print_on( std::ostream&) const {}
    -
    1513  };
    -
    1514  struct fg_16M : public color_16M {
    -
    1515  fg_16M() : color_16M(ground::fore) {}
    -
    1516  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
    -
    1517  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
    -
    1518  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
    -
    1519  } fore_16M;
    -
    1520  struct bg_16M : public color_16M {
    -
    1521  bg_16M() : color_16M(ground::back) {}
    -
    1522  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
    -
    1523  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
    -
    1524  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
    -
    1525  } back_16M;
    -
    1526  public:
    -
    1527  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
    -
    1528  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    1529  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    1530  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    1531  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    1532  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    1533  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    -
    1534  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
    -
    1535  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
    -
    1536  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
    -
    1537  fmt(const short fr, const short fg, const short fb,
    -
    1538  const short gr, const short gg, const short gb,
    -
    1539  typo s = typo::none)
    -
    1540  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
    -
    1541  fmt(fg,
    -
    1542  const short gr, const short gg, const short gb,
    -
    1543  typo s = typo::none)
    -
    1544  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
    -
    1545  fmt(const short fr, const short fg, const short fb,
    -
    1546  bg, typo s = typo::none)
    -
    1547  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
    -
    1548  fmt(const short fr, const short fg, const short fb,
    -
    1549  typo s = typo::none)
    -
    1550  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
    -
    1551 
    -
    1552  fmt(const std::string& f, const std::string& b, typo s = typo::none)
    -
    1553  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
    -
    1554  fmt(fg, const std::string& b, typo s = typo::none)
    -
    1555  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
    -
    1556  fmt(const std::string& f, bg, typo s = typo::none)
    -
    1557  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    -
    1558  fmt(const std::string& f, typo s = typo::none)
    -
    1559  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    -
    1560  protected:
    -
    1561  std::ostream& print_on( std::ostream&) const {}
    -
    1562  public:
    -
    1563  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
    -
    1564  std::string operator()( const std::string&) const {}
    -
    1565  std::string str() const {}
    -
    1566  static fmt hash( const std::string&, const std::vector<fmt>) {}
    -
    1567  };
    -
    1568  public:
    -
    1569  clutchlog(clutchlog const&) = delete;
    -
    1570  void operator=(clutchlog const&) = delete;
    -
    1571  private:
    -
    1572  clutchlog() {}
    -
    1573  protected:
    -
    1574  struct scope_t {};
    -
    1575  scope_t locate(
    -
    1576  const level&,
    -
    1577  const std::string&,
    -
    1578  const std::string&,
    -
    1579  const size_t
    -
    1580  ) const
    -
    1581  {}
    -
    1582  public:
    -
    1583  void format(const std::string&) {}
    -
    1584  std::string format() const {}
    -
    1585 
    -
    1586  void format_comment(const std::string&) {}
    -
    1587  std::string format_comment() const {}
    -
    1588 
    -
    1589  void out(std::ostream&) {}
    -
    1590  std::ostream& out() {}
    -
    1591 
    -
    1592 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    1593  void depth(size_t) {}
    -
    1594  size_t depth() const {}
    -
    1595 
    -
    1596  void depth_mark(const std::string) {}
    -
    1597  std::string depth_mark() const {}
    -
    1598  void strip_calls(const size_t) {}
    -
    1599  size_t strip_calls() const {}
    -
    1600 #endif
    -
    1601 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
    -
    1602  void hfill_mark(const char) {}
    -
    1603  char hfill_mark() const {}
    -
    1604  void hfill_fmt(fmt) {}
    -
    1605  fmt hfill_fmt() const {}
    -
    1606  void hfill_min(const size_t) {}
    -
    1607  size_t hfill_min() {}
    -
    1608  void hfill_max(const size_t) {}
    -
    1609  size_t hfill_max() {}
    -
    1610 #endif
    -
    1611  void filehash_styles(std::vector<fmt> ) {}
    -
    1612  void funchash_styles(std::vector<fmt> ) {}
    -
    1613  void depth_styles(std::vector<fmt>) {}
    -
    1614 
    -
    1615  void threshold(level) {}
    -
    1616  void threshold(const std::string&) {}
    -
    1617  level threshold() const {}
    -
    1618  const std::map<std::string,level> levels() const {}
    -
    1619  level level_of(const std::string) {}
    -
    1620 
    -
    1621  void file(std::string) {}
    -
    1622  void func(std::string) {}
    -
    1623  void line(std::string) {}
    +
    1326  row = replace(row, "\\{func\\}", func);
    +
    1327  row = replace(row, "\\{line\\}", line);
    +
    1328 
    +
    1329  row = replace(row, "\\{level\\}", _level_word.at(stage));
    +
    1330  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
    +
    1331  row = replace(row, "\\{level_letter\\}", letter);
    +
    1332  row = replace(row, "\\{level_short\\}", _level_short.at(stage));
    +
    1333 
    +
    1334 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    1335  size_t actual_depth = depth - _strip_calls;
    +
    1336  row = replace(row, "\\{name\\}", name);
    +
    1337  row = replace(row, "\\{depth\\}", actual_depth);
    +
    1338 
    +
    1339  if(_depth_fmts.size() == 0) {
    +
    1340  row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() );
    +
    1341 
    +
    1342  std::ostringstream chevrons;
    +
    1343  for(size_t i = 0; i < actual_depth; ++i) {
    +
    1344  chevrons << _depth_mark;
    +
    1345  }
    +
    1346  row = replace(row, "\\{depth_marks\\}", chevrons.str());
    +
    1347 
    +
    1348  } else {
    +
    1349  row = replace(row, "\\{depth_fmt\\}",
    +
    1350  _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() );
    +
    1351 
    +
    1352  std::ostringstream chevrons;
    +
    1353  for(size_t i = 0; i < actual_depth; ++i) {
    +
    1354  chevrons << _depth_fmts[std::min(i+1,_depth_fmts.size()-1)].str()
    +
    1355  << _depth_mark;
    +
    1356  }
    +
    1357  row = replace(row, "\\{depth_marks\\}", chevrons.str());
    +
    1358  }
    +
    1359 #endif
    +
    1360  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
    +
    1361  row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() );
    +
    1362  row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() );
    +
    1363 
    +
    1364 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
    +
    1365  // hfill is replaced last to allow for correct line width estimation.
    +
    1366  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
    +
    1367  const std::string hfill_tag = "{hfill}";
    +
    1368  const size_t hfill_pos = row.find(hfill_tag);
    +
    1369  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
    +
    1370  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
    +
    1371  if(hfill_pos != std::string::npos) {
    +
    1372  assert(raw_hfill_pos != std::string::npos);
    +
    1373  if(nb_columns > 0) {
    +
    1374  const size_t left_len = raw_hfill_pos;
    +
    1375  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
    +
    1376  if(right_len+left_len > nb_columns) {
    +
    1377  // The right part would go over the terminal width: add a new row.
    +
    1378  if(right_len < nb_columns) {
    +
    1379  // There is room for the right part on a new line.
    +
    1380  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
    +
    1381  const std::string hfill_styled = _hfill_fmt(hfill);
    +
    1382  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
    +
    1383  } else {
    +
    1384  // Right part still goes over columns: let it go.
    +
    1385  const std::string hfill(1, _hfill_char);
    +
    1386  const std::string hfill_styled = _hfill_fmt(hfill);
    +
    1387  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
    +
    1388  }
    +
    1389  } else {
    +
    1390  // There is some space in between left and right parts.
    +
    1391  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
    +
    1392  const std::string hfill_styled = _hfill_fmt(hfill);
    +
    1393  row = replace(row, "\\{hfill\\}", hfill_styled);
    +
    1394  }
    +
    1395  } else {
    +
    1396  // We don't know the terminal width.
    +
    1397  const std::string hfill(1, _hfill_char);
    +
    1398  const std::string hfill_styled = _hfill_fmt(hfill);
    +
    1399  row = replace(row, "\\{hfill\\}", hfill_styled);
    +
    1400  }
    +
    1401  }
    +
    1402 #else
    +
    1403  // We cannot know the terminal width.
    +
    1404  const std::string hfill(1, _hfill_char);
    +
    1405  const std::string hfill_styled = _hfill_fmt(hfill);
    +
    1406  row = replace(row, "\\{hfill\\}", hfill_styled);
    +
    1407 #endif
    +
    1408  return _level_fmt.at(stage)(row);
    +
    1409  }
    +
    1410 
    +
    1412  void log(
    +
    1413  const level& stage,
    +
    1414  const std::string& what,
    +
    1415  const std::string& file, const std::string& func, const size_t line,
    +
    1416  const size_t depth_delta = 0
    +
    1417  ) const
    +
    1418  {
    +
    1419  scope_t scope = locate(stage, file, func, line);
    +
    1420 
    +
    1421  if(scope.matches) {
    +
    1422 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    1423  *_out << format(_format_log, what, basename(getenv("_")),
    +
    1424  stage, file, func,
    +
    1425  line, scope.depth + depth_delta );
    +
    1426 #else
    +
    1427  *_out << format(_format_log, what,
    +
    1428  stage, file, func,
    +
    1429  line );
    +
    1430 #endif
    +
    1431  _out->flush();
    +
    1432  } // if scopes.matches
    +
    1433  }
    +
    1434 
    +
    1436  template<class In>
    +
    1437  void dump(
    +
    1438  const level& stage,
    +
    1439  const In container_begin, const In container_end,
    +
    1440  const std::string& file, const std::string& func, const size_t line,
    +
    1441  const std::string& filename_template = "dump_{n}.dat",
    +
    1442  const std::string sep = dump_default_sep
    +
    1443  ) const
    +
    1444  {
    +
    1445  scope_t scope = locate(stage, file, func, line);
    +
    1446 
    +
    1447  if(scope.matches) {
    +
    1448  const std::string tag = "\\{n\\}";
    +
    1449  const std::regex re(tag);
    +
    1450  std::string outfile = "";
    +
    1451 
    +
    1452  // If the file name template has the {n} tag.
    +
    1453  if(std::regex_search(filename_template, re)) {
    +
    1454  // Increment n until a free one is found.
    +
    1455  size_t n = 0;
    +
    1456  do {
    +
    1457  outfile = replace(filename_template, tag, n);
    +
    1458  n++;
    +
    1459  } while( fs::exists( outfile ) );
    +
    1460 
    +
    1461  } else {
    +
    1462  // Use the parameter as is.
    +
    1463  outfile = filename_template;
    +
    1464  }
    +
    1465 
    +
    1466  std::ofstream fd(outfile);
    +
    1467 
    +
    1468  if(_format_dump.size() > 0) {
    +
    1469 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    1470  fd << format(_format_dump, "", basename(getenv("_")),
    +
    1471  stage, file, func,
    +
    1472  line, scope.depth );
    +
    1473 #else
    +
    1474  fd << format(_format_dump, "",
    +
    1475  stage, file, func,
    +
    1476  line );
    +
    1477 #endif
    +
    1478  fd << sep; // sep after comment line.
    +
    1479  }
    +
    1480 
    +
    1481  std::copy(container_begin, container_end,
    +
    1482  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
    +
    1483 
    +
    1484  fd.close();
    +
    1485  } // if scopes.matches
    +
    1486  }
    +
    1487 
    +
    1489 };
    +
    1490 
    +
    1493 #else // not WITH_CLUTCHLOG
    +
    1494 
    +
    1495 
    +
    1496 /**********************************************************************
    +
    1497  * Fake implementation
    +
    1498  **********************************************************************/
    +
    1499 
    +
    1500 // Equivalent class with empty methods, will be optimized out
    +
    1501 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
    +
    1502 #pragma GCC diagnostic push
    +
    1503 #pragma GCC diagnostic ignored "-Wreturn-type"
    +
    1504 class clutchlog
    +
    1505 {
    +
    1506  public:
    +
    1507  static clutchlog& logger() {}
    +
    1508  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    +
    1509  enum filename {path, base, dir, dirbase, stem, dirstem};
    +
    1510  class fmt {
    +
    1511  public:
    +
    1512  enum class ansi { colors_16, colors_256, colors_16M} mode;
    +
    1513  enum class typo { reset, bold, underline, inverse, none} style;
    +
    1514  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
    +
    1515  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
    +
    1516  protected:
    +
    1517  friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
    +
    1518  friend std::ostream& operator<<(std::ostream&, const typo&) {}
    +
    1519  protected:
    +
    1520  struct color {
    +
    1521  ansi mode;
    +
    1522  enum class ground { fore, back } type;
    +
    1523  color(ansi a, ground g) : mode(a), type(g) {}
    +
    1524  virtual bool is_set() const = 0;
    +
    1525  virtual std::ostream& print_on( std::ostream&) const = 0;
    +
    1526  friend std::ostream& operator<<(std::ostream&, const color&) {}
    +
    1527  };
    +
    1528  struct color_256 : public color {
    +
    1529  short index;
    +
    1530  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
    +
    1531  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
    +
    1532  bool is_set() const {}
    +
    1533  std::ostream& print_on( std::ostream&) const {}
    +
    1534  };
    +
    1535  struct fg_256 : public color_256 {
    +
    1536  fg_256() : color_256(ground::fore) {}
    +
    1537  fg_256(const short f) : color_256(ground::fore, f) {}
    +
    1538  fg_256(const fg&) : color_256(ground::fore, -1) {}
    +
    1539  } fore_256;
    +
    1540  struct bg_256 : public color_256 {
    +
    1541  bg_256() : color_256(ground::back) {}
    +
    1542  bg_256(const short b) : color_256(ground::back, b) {}
    +
    1543  bg_256(const bg&) : color_256(ground::back, -1) {}
    +
    1544  } back_256;
    +
    1545  struct color_16M : public color {
    +
    1546  short red, green, blue;
    +
    1547  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
    +
    1548  color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
    +
    1549  color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
    +
    1550  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
    +
    1551  std::ostream& print_on( std::ostream&) const {}
    +
    1552  };
    +
    1553  struct fg_16M : public color_16M {
    +
    1554  fg_16M() : color_16M(ground::fore) {}
    +
    1555  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
    +
    1556  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
    +
    1557  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
    +
    1558  } fore_16M;
    +
    1559  struct bg_16M : public color_16M {
    +
    1560  bg_16M() : color_16M(ground::back) {}
    +
    1561  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
    +
    1562  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
    +
    1563  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
    +
    1564  } back_16M;
    +
    1565  public:
    +
    1566  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
    +
    1567  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    1568  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    1569  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    1570  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    1571  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    1572  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
    +
    1573  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
    +
    1574  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
    +
    1575  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
    +
    1576  fmt(const short fr, const short fg, const short fb,
    +
    1577  const short gr, const short gg, const short gb,
    +
    1578  typo s = typo::none)
    +
    1579  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
    +
    1580  fmt(fg,
    +
    1581  const short gr, const short gg, const short gb,
    +
    1582  typo s = typo::none)
    +
    1583  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
    +
    1584  fmt(const short fr, const short fg, const short fb,
    +
    1585  bg, typo s = typo::none)
    +
    1586  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
    +
    1587  fmt(const short fr, const short fg, const short fb,
    +
    1588  typo s = typo::none)
    +
    1589  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
    +
    1590 
    +
    1591  fmt(const std::string& f, const std::string& b, typo s = typo::none)
    +
    1592  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
    +
    1593  fmt(fg, const std::string& b, typo s = typo::none)
    +
    1594  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
    +
    1595  fmt(const std::string& f, bg, typo s = typo::none)
    +
    1596  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    +
    1597  fmt(const std::string& f, typo s = typo::none)
    +
    1598  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
    +
    1599  protected:
    +
    1600  std::ostream& print_on( std::ostream&) const {}
    +
    1601  public:
    +
    1602  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
    +
    1603  std::string operator()( const std::string&) const {}
    +
    1604  std::string str() const {}
    +
    1605  static fmt hash( const std::string&, const std::vector<fmt>) {}
    +
    1606  };
    +
    1607  public:
    +
    1608  clutchlog(clutchlog const&) = delete;
    +
    1609  void operator=(clutchlog const&) = delete;
    +
    1610  private:
    +
    1611  clutchlog() {}
    +
    1612  protected:
    +
    1613  struct scope_t {};
    +
    1614  scope_t locate(
    +
    1615  const level&,
    +
    1616  const std::string&,
    +
    1617  const std::string&,
    +
    1618  const size_t
    +
    1619  ) const
    +
    1620  {}
    +
    1621  public:
    +
    1622  void format(const std::string&) {}
    +
    1623  std::string format() const {}
    1624 
    -
    1625 #pragma GCC diagnostic push
    -
    1626 #pragma GCC diagnostic ignored "-Wunused-parameter"
    -
    1627  void location(
    -
    1628  const std::string&,
    -
    1629  const std::string& in_function=".*",
    -
    1630  const std::string& in_line=".*"
    -
    1631  )
    -
    1632  {}
    -
    1633 #pragma GCC diagnostic pop
    -
    1634  template<class ... FMT>
    -
    1635  void style(level, FMT...) {}
    -
    1636  void style(level, fmt) {}
    -
    1637  fmt style(level) const {}
    -
    1638  public:
    -
    1639  std::string replace(
    -
    1640  const std::string&,
    -
    1641  const std::string&,
    -
    1642  const std::string&
    -
    1643  ) const
    -
    1644  {}
    -
    1645 
    -
    1646  std::string replace(
    -
    1647  const std::string&,
    -
    1648  const std::string&,
    -
    1649  const size_t
    -
    1650  ) const
    -
    1651  {}
    -
    1652 
    -
    1653  std::string format(
    -
    1654  std::string,
    -
    1655  const std::string&,
    - -
    1657  const std::string&,
    -
    1658 #endif
    -
    1659  const level&,
    -
    1660  const std::string&,
    -
    1661  const std::string&,
    -
    1662  const size_t
    - -
    1664  ,
    -
    1665  const size_t
    -
    1666 #endif
    -
    1667  ) const
    -
    1668  {}
    -
    1669 
    -
    1670  void log(
    -
    1671  const level&,
    -
    1672  const std::string&,
    -
    1673  const std::string&, const std::string&, size_t
    -
    1674  ) const
    -
    1675  {}
    -
    1676 
    -
    1677  template<class In>
    -
    1678  void dump(
    -
    1679  const level&,
    -
    1680  const In, const In,
    -
    1681  const std::string&, const std::string&, size_t,
    -
    1682  const std::string&,
    -
    1683  const std::string
    -
    1684  ) const
    -
    1685  {}
    -
    1686 };
    -
    1687 #pragma GCC diagnostic pop
    -
    1688 #endif // WITH_CLUTCHLOG
    -
    1689 
    -
    1690 #endif // CLUTCHLOG_H
    +
    1625  void format_comment(const std::string&) {}
    +
    1626  std::string format_comment() const {}
    +
    1627 
    +
    1628  void out(std::ostream&) {}
    +
    1629  std::ostream& out() {}
    +
    1630 
    +
    1631 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    1632  void depth(size_t) {}
    +
    1633  size_t depth() const {}
    +
    1634 
    +
    1635  void depth_mark(const std::string) {}
    +
    1636  std::string depth_mark() const {}
    +
    1637  void strip_calls(const size_t) {}
    +
    1638  size_t strip_calls() const {}
    +
    1639 #endif
    +
    1640 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
    +
    1641  void hfill_mark(const char) {}
    +
    1642  char hfill_mark() const {}
    +
    1643  void hfill_fmt(fmt) {}
    +
    1644  fmt hfill_fmt() const {}
    +
    1645  void hfill_min(const size_t) {}
    +
    1646  size_t hfill_min() {}
    +
    1647  void hfill_max(const size_t) {}
    +
    1648  size_t hfill_max() {}
    +
    1649 #endif
    +
    1650  void filehash_styles(std::vector<fmt> ) {}
    +
    1651  void funchash_styles(std::vector<fmt> ) {}
    +
    1652  void depth_styles(std::vector<fmt>) {}
    +
    1653 
    +
    1654  void threshold(level) {}
    +
    1655  void threshold(const std::string&) {}
    +
    1656  level threshold() const {}
    +
    1657  const std::map<std::string,level> levels() const {}
    +
    1658  level level_of(const std::string) {}
    +
    1659 
    +
    1660  void file(std::string) {}
    +
    1661  void func(std::string) {}
    +
    1662  void line(std::string) {}
    +
    1663 
    +
    1664 #pragma GCC diagnostic push
    +
    1665 #pragma GCC diagnostic ignored "-Wunused-parameter"
    +
    1666  void location(
    +
    1667  const std::string&,
    +
    1668  const std::string& in_function=".*",
    +
    1669  const std::string& in_line=".*"
    +
    1670  )
    +
    1671  {}
    +
    1672 #pragma GCC diagnostic pop
    +
    1673  template<class ... FMT>
    +
    1674  void style(level, FMT...) {}
    +
    1675  void style(level, fmt) {}
    +
    1676  fmt style(level) const {}
    +
    1677  void filename(filename) {}
    +
    1678  public:
    +
    1679  std::string replace(
    +
    1680  const std::string&,
    +
    1681  const std::string&,
    +
    1682  const std::string&
    +
    1683  ) const
    +
    1684  {}
    +
    1685 
    +
    1686  std::string replace(
    +
    1687  const std::string&,
    +
    1688  const std::string&,
    +
    1689  const size_t
    +
    1690  ) const
    +
    1691  {}
    +
    1692 
    +
    1693  std::string format(
    +
    1694  std::string,
    +
    1695  const std::string&,
    + +
    1697  const std::string&,
    +
    1698 #endif
    +
    1699  const level&,
    +
    1700  const std::string&,
    +
    1701  const std::string&,
    +
    1702  const size_t
    + +
    1704  ,
    +
    1705  const size_t
    +
    1706 #endif
    +
    1707  ) const
    +
    1708  {}
    +
    1709 
    +
    1710  void log(
    +
    1711  const level&,
    +
    1712  const std::string&,
    +
    1713  const std::string&, const std::string&, size_t
    +
    1714  ) const
    +
    1715  {}
    +
    1716 
    +
    1717  template<class In>
    +
    1718  void dump(
    +
    1719  const level&,
    +
    1720  const In, const In,
    +
    1721  const std::string&, const std::string&, size_t,
    +
    1722  const std::string&,
    +
    1723  const std::string
    +
    1724  ) const
    +
    1725  {}
    +
    1726 };
    +
    1727 #pragma GCC diagnostic pop
    +
    1728 #endif // WITH_CLUTCHLOG
    +
    1729 
    +
    1730 #endif // CLUTCHLOG_H
    -
    friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
    Output stream operator for a 3-tuple of 16-colors mode tags.
    Definition: clutchlog.h:443
    +
    friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
    Output stream operator for a 3-tuple of 16-colors mode tags.
    Definition: clutchlog.h:446
    static std::string default_depth_mark
    Default mark for stack depth.
    Definition: clutchlog.h:259
    -
    std::string _format_log
    Current format of the standard output.
    Definition: clutchlog.h:923
    -
    color_16M(ground t, const std::string &srgb)
    Hex triplet string constructor.
    Definition: clutchlog.h:611
    -
    void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
    Dump a serializable container after a comment line with log information.
    Definition: clutchlog.h:1399
    -
    void depth_styles(std::vector< fmt > styles)
    Set the styles for value-dependant depth formatting.
    Definition: clutchlog.h:1055
    -
    std::map< level, fmt > _level_fmt
    Dictionary of level identifier to their format.
    Definition: clutchlog.h:921
    +
    std::string _format_log
    Current format of the standard output.
    Definition: clutchlog.h:927
    +
    color_16M(ground t, const std::string &srgb)
    Hex triplet string constructor.
    Definition: clutchlog.h:614
    +
    void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
    Dump a serializable container after a comment line with log information.
    Definition: clutchlog.h:1437
    +
    void depth_styles(std::vector< fmt > styles)
    Set the styles for value-dependant depth formatting.
    Definition: clutchlog.h:1062
    +
    std::map< level, fmt > _level_fmt
    Dictionary of level identifier to their format.
    Definition: clutchlog.h:925
    enum clutchlog::fmt::bg back
    Background color.
    -
    std::vector< fmt > _funchash_fmts
    List of candidate format objects for value-dependant function name styling.
    Definition: clutchlog.h:956
    -
    std::string str() const
    Return the formatting code as a string.
    Definition: clutchlog.h:817
    -
    Foreground in 256-colors mode.
    Definition: clutchlog.h:549
    -
    void line(std::string line)
    Set the regular expression filtering the line location.
    Definition: clutchlog.h:1085
    -
    friend std::ostream & operator<<(std::ostream &os, const color &c)
    Print the actually encoded escaped color sequence on the given stream.
    Definition: clutchlog.h:503
    -
    friend std::ostream & operator<<(std::ostream &os, const typo &s)
    Output stream operator for a typo tag alone, in 16-colors mode.
    Definition: clutchlog.h:465
    +
    std::vector< fmt > _funchash_fmts
    List of candidate format objects for value-dependant function name styling.
    Definition: clutchlog.h:960
    +
    std::string str() const
    Return the formatting code as a string.
    Definition: clutchlog.h:820
    +
    Foreground in 256-colors mode.
    Definition: clutchlog.h:552
    +
    void line(std::string line)
    Set the regular expression filtering the line location.
    Definition: clutchlog.h:1092
    +
    friend std::ostream & operator<<(std::ostream &os, const color &c)
    Print the actually encoded escaped color sequence on the given stream.
    Definition: clutchlog.h:506
    +
    friend std::ostream & operator<<(std::ostream &os, const typo &s)
    Output stream operator for a typo tag alone, in 16-colors mode.
    Definition: clutchlog.h:468
    static std::string dump_default_format
    Default format of the comment line in file dump.
    Definition: clutchlog.h:245
    -
    void out(std::ostream &out)
    Set the output stream on which to print.
    Definition: clutchlog.h:987
    -
    bool is_set() const
    Returns true if the underying representation encodes an existing color.
    Definition: clutchlog.h:633
    -
    fg_16M(const fg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:669
    +
    filename _filename
    Filename rendering method.
    Definition: clutchlog.h:975
    +
    void out(std::ostream &out)
    Set the output stream on which to print.
    Definition: clutchlog.h:994
    +
    bool is_set() const
    Returns true if the underying representation encodes an existing color.
    Definition: clutchlog.h:636
    +
    fg_16M(const fg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:672
    static std::string dump_default_sep
    Default item separator for dump.
    Definition: clutchlog.h:252
    -
    std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Substitute all tags in the format string with the corresponding information and apply the style corre...
    Definition: clutchlog.h:1269
    -
    Background in 256-colors mode.
    Definition: clutchlog.h:566
    +
    std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Substitute all tags in the format string with the corresponding information and apply the style corre...
    Definition: clutchlog.h:1279
    +
    Background in 256-colors mode.
    Definition: clutchlog.h:569
    #define CLUTCHLOG_DEFAULT_DEPTH_MARK
    Compile-time default mark for stack depth.
    Definition: clutchlog.h:256
    static unsigned int default_strip_calls
    Number of call stack levels to remove from depth display by default.
    Definition: clutchlog.h:266
    static size_t default_hfill_min
    Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
    Definition: clutchlog.h:287
    -
    std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
    Replace mark by tag in form.
    Definition: clutchlog.h:1193
    -
    color_256(ground t)
    Constructor.
    Definition: clutchlog.h:528
    +
    std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
    Replace mark by tag in form.
    Definition: clutchlog.h:1203
    +
    color_256(ground t)
    Constructor.
    Definition: clutchlog.h:531
    clutchlog::fmt::bg_16M back_16M
    Current background in 16M-colors mode.
    -
    Interface class for colors representation.
    Definition: clutchlog.h:480
    +
    Interface class for colors representation.
    Definition: clutchlog.h:483
    @ colors_16
    16 colors mode.
    -
    background in 256-colors mode.
    Definition: clutchlog.h:674
    +
    background in 256-colors mode.
    Definition: clutchlog.h:677
    static char default_hfill_char
    Default character used as a filling for right-align the right part of messages with "{hfill}".
    Definition: clutchlog.h:273
    -
    bool matches
    Everything is compatible.
    Definition: clutchlog.h:1120
    +
    bool matches
    Everything is compatible.
    Definition: clutchlog.h:1130
    enum clutchlog::fmt::typo style
    Typographic style.
    -
    Abstract base class for 16M colors objects (24-bits ANSI).
    Definition: clutchlog.h:583
    -
    fg_256(const fg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:561
    -
    void format_comment(const std::string &format)
    Set the template string for dumps.
    Definition: clutchlog.h:982
    -
    bg_16M(const std::string &srgb)
    Hex triplet string constructor.
    Definition: clutchlog.h:694
    -
    void file(std::string file)
    Set the regular expression filtering the file location.
    Definition: clutchlog.h:1081
    -
    scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Gather information on the current location of the call.
    Definition: clutchlog.h:1142
    +
    Abstract base class for 16M colors objects (24-bits ANSI).
    Definition: clutchlog.h:586
    +
    fg_256(const fg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:564
    +
    void format_comment(const std::string &format)
    Set the template string for dumps.
    Definition: clutchlog.h:989
    +
    bg_16M(const std::string &srgb)
    Hex triplet string constructor.
    Definition: clutchlog.h:697
    +
    void file(std::string file)
    Set the regular expression filtering the file location.
    Definition: clutchlog.h:1088
    +
    scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
    Gather information on the current location of the call.
    Definition: clutchlog.h:1152
    clutchlog::fmt::fg_16M fore_16M
    Current foreground in 16M-colors mode.
    -
    Abstract base class for 256 colors objects (8-bits ANSI).
    Definition: clutchlog.h:519
    -
    fmt()
    Empty constructor, only useful for a no-op formatter.
    Definition: clutchlog.h:707
    -
    void style(level stage, fmt style)
    Set the style (color and typo) of the given log level, passing a fmt instance.
    Definition: clutchlog.h:1106
    -
    void threshold(level l)
    Set the log level (below which logs are not printed) with an identifier.
    Definition: clutchlog.h:1058
    -
    level threshold() const
    Get the log level below which logs are not printed.
    Definition: clutchlog.h:1062
    +
    Abstract base class for 256 colors objects (8-bits ANSI).
    Definition: clutchlog.h:522
    +
    fmt()
    Empty constructor, only useful for a no-op formatter.
    Definition: clutchlog.h:710
    +
    void style(level stage, fmt style)
    Set the style (color and typo) of the given log level, passing a fmt instance.
    Definition: clutchlog.h:1113
    +
    void threshold(level l)
    Set the log level (below which logs are not printed) with an identifier.
    Definition: clutchlog.h:1065
    +
    level threshold() const
    Get the log level below which logs are not printed.
    Definition: clutchlog.h:1069
    virtual bool is_set() const =0
    Should return true if the underying representation encodes an existing color.
    -
    std::map< level, std::string > _level_short
    dictionary of level identifier to their 4-letters representation.
    Definition: clutchlog.h:919
    +
    std::map< level, std::string > _level_short
    dictionary of level identifier to their 4-letters representation.
    Definition: clutchlog.h:923
    level
    Available log levels.
    Definition: clutchlog.h:313
    -
    color_256(ground t, const short i)
    Constructor.
    Definition: clutchlog.h:535
    -
    std::ostream & print_on(std::ostream &os) const
    Print the color index on the given stream.
    Definition: clutchlog.h:541
    -
    color_16M(ground t)
    Constructor.
    Definition: clutchlog.h:592
    +
    color_256(ground t, const short i)
    Constructor.
    Definition: clutchlog.h:538
    +
    std::ostream & print_on(std::ostream &os) const
    Print the color index on the given stream.
    Definition: clutchlog.h:544
    +
    color_16M(ground t)
    Constructor.
    Definition: clutchlog.h:595
    static size_t default_hfill_max
    Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
    Definition: clutchlog.h:285
    -
    void funchash_styles(std::vector< fmt > styles)
    Set the candidate styles for value-dependant function name formatting.
    Definition: clutchlog.h:1046
    -
    scope_t()
    Constructor.
    Definition: clutchlog.h:1130
    -
    std::regex _in_func
    Current function location filter.
    Definition: clutchlog.h:949
    +
    void funchash_styles(std::vector< fmt > styles)
    Set the candidate styles for value-dependant function name formatting.
    Definition: clutchlog.h:1053
    +
    scope_t()
    Constructor.
    Definition: clutchlog.h:1140
    +
    std::regex _in_func
    Current function location filter.
    Definition: clutchlog.h:953
    static std::string default_format
    Default format of the messages.
    Definition: clutchlog.h:223
    -
    bg_16M(short r, short g, short b)
    Numeric triplet constructor.
    Definition: clutchlog.h:686
    +
    bg_16M(short r, short g, short b)
    Numeric triplet constructor.
    Definition: clutchlog.h:689
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Foreground in 256-colors mode.
    Definition: clutchlog.h:644
    +
    Foreground in 256-colors mode.
    Definition: clutchlog.h:647
    clutchlog::fmt::fg_256 fore_256
    Current foreground in 256-colors mode.
    enum clutchlog::fmt::fg fore
    Foreground color.
    -
    void filehash_styles(std::vector< fmt > styles)
    Set the candidate styles for value-dependant file name formatting.
    Definition: clutchlog.h:1038
    +
    void filehash_styles(std::vector< fmt > styles)
    Set the candidate styles for value-dependant file name formatting.
    Definition: clutchlog.h:1045
    enum clutchlog::fmt::color::ground type
    Type of color (foreground or background).
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:376
    -
    short index
    The encoded color index in 4-bits ANSI.
    Definition: clutchlog.h:523
    -
    bg_256()
    Empty constructor: no color.
    Definition: clutchlog.h:568
    -
    void func(std::string func)
    Set the regular expression filtering the function location.
    Definition: clutchlog.h:1083
    -
    std::string format() const
    Get the template string.
    Definition: clutchlog.h:979
    -
    std::regex _in_file
    Current file location filter.
    Definition: clutchlog.h:947
    -
    void style(level stage, FMT... styles)
    Set the style (color and typo) of the given log level.
    Definition: clutchlog.h:1104
    -
    bg_256(const bg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:578
    -
    fg_16M()
    Empty constructor: no color.
    Definition: clutchlog.h:646
    -
    level level_of(const std::string name)
    Return the log level tag corresponding to the given pre-configured name.
    Definition: clutchlog.h:1070
    -
    const std::map< level, std::string > _level_word
    Dictionary of level identifier to their string representation.
    Definition: clutchlog.h:915
    -
    std::string operator()(const std::string &msg) const
    Format the given string with the currently encoded format.
    Definition: clutchlog.h:805
    -
    color_16M(ground t, short r, short g, short b)
    Numeric triplet constructor.
    Definition: clutchlog.h:601
    -
    std::ostream & print_on(std::ostream &os) const
    Print the color RGB triplet on the given stream.
    Definition: clutchlog.h:636
    -
    bg
    Background color codes.
    Definition: clutchlog.h:421
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    +
    short index
    The encoded color index in 4-bits ANSI.
    Definition: clutchlog.h:526
    +
    bg_256()
    Empty constructor: no color.
    Definition: clutchlog.h:571
    +
    void func(std::string func)
    Set the regular expression filtering the function location.
    Definition: clutchlog.h:1090
    +
    std::string format() const
    Get the template string.
    Definition: clutchlog.h:986
    +
    std::regex _in_file
    Current file location filter.
    Definition: clutchlog.h:951
    +
    void style(level stage, FMT... styles)
    Set the style (color and typo) of the given log level.
    Definition: clutchlog.h:1111
    +
    bg_256(const bg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:581
    +
    fg_16M()
    Empty constructor: no color.
    Definition: clutchlog.h:649
    +
    level level_of(const std::string name)
    Return the log level tag corresponding to the given pre-configured name.
    Definition: clutchlog.h:1077
    +
    void filename(filename f)
    Sets the file naming scheme. *‍/.
    Definition: clutchlog.h:1118
    +
    const std::map< level, std::string > _level_word
    Dictionary of level identifier to their string representation.
    Definition: clutchlog.h:919
    +
    std::string operator()(const std::string &msg) const
    Format the given string with the currently encoded format.
    Definition: clutchlog.h:808
    +
    color_16M(ground t, short r, short g, short b)
    Numeric triplet constructor.
    Definition: clutchlog.h:604
    +
    std::ostream & print_on(std::ostream &os) const
    Print the color RGB triplet on the given stream.
    Definition: clutchlog.h:639
    +
    bg
    Background color codes.
    Definition: clutchlog.h:424
    #define CLUTCHLOG_DEFAULT_FORMAT
    Compile-time default format of the messages (debug mode: with absolute location).
    Definition: clutchlog.h:208
    -
    std::regex _in_line
    Current line location filter.
    Definition: clutchlog.h:951
    -
    fg_256(const short f)
    Constructor.
    Definition: clutchlog.h:556
    +
    std::regex _in_line
    Current line location filter.
    Definition: clutchlog.h:955
    +
    fg_256(const short f)
    Constructor.
    Definition: clutchlog.h:559
    @ colors_256
    256 colors mode.
    enum clutchlog::fmt::ansi mode
    Current ANSI color mode.
    -
    std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
    Replace mark by tag in form, converting tag to its string representation first.
    Definition: clutchlog.h:1258
    -
    std::string format_comment() const
    Get the template string for dumps.
    Definition: clutchlog.h:984
    -
    fg_256()
    Empty constructor: no color.
    Definition: clutchlog.h:551
    +
    std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
    Replace mark by tag in form, converting tag to its string representation first.
    Definition: clutchlog.h:1268
    +
    std::string format_comment() const
    Get the template string for dumps.
    Definition: clutchlog.h:991
    +
    fg_256()
    Empty constructor: no color.
    Definition: clutchlog.h:554
    @ colors_16M
    16 millions ("true") colors mode.
    -
    std::string _format_dump
    Current format of the file output.
    Definition: clutchlog.h:925
    +
    std::string _format_dump
    Current format of the file output.
    Definition: clutchlog.h:929
    #define CLUTCHDUMP_DEFAULT_SEP
    Compile-time default item separator for dump.
    Definition: clutchlog.h:249
    -
    bg_256(const short b)
    Constructor.
    Definition: clutchlog.h:573
    -
    ground
    Codes for representing foreground or background.
    Definition: clutchlog.h:484
    -
    Structure holding a location matching.
    Definition: clutchlog.h:1118
    +
    bg_256(const short b)
    Constructor.
    Definition: clutchlog.h:576
    +
    ground
    Codes for representing foreground or background.
    Definition: clutchlog.h:487
    +
    filename
    Available filename rendering methods.
    Definition: clutchlog.h:316
    +
    Structure holding a location matching.
    Definition: clutchlog.h:1128
    #define CLUTCHLOG_DEFAULT_HFILL_MARK
    Character used as a filling for right-align the right part of messages with "{hfill}".
    Definition: clutchlog.h:270
    -
    std::ostream & print_on(std::ostream &os) const
    Print the currently encoded format escape code on the given output stream.
    Definition: clutchlog.h:756
    -
    bool is_set() const
    Returns true if the underying representation encodes an existing color.
    Definition: clutchlog.h:538
    -
    std::ostream * _out
    Standard output.
    Definition: clutchlog.h:937
    -
    std::ostream & out()
    Get the output stream on which to print.
    Definition: clutchlog.h:989
    -
    void threshold(const std::string &l)
    Set the log level (below which logs are not printed) with a string.
    Definition: clutchlog.h:1060
    +
    std::ostream & print_on(std::ostream &os) const
    Print the currently encoded format escape code on the given output stream.
    Definition: clutchlog.h:759
    +
    bool is_set() const
    Returns true if the underying representation encodes an existing color.
    Definition: clutchlog.h:541
    +
    std::ostream * _out
    Standard output.
    Definition: clutchlog.h:941
    +
    std::ostream & out()
    Get the output stream on which to print.
    Definition: clutchlog.h:996
    +
    void threshold(const std::string &l)
    Set the log level (below which logs are not printed) with a string.
    Definition: clutchlog.h:1067
    virtual std::ostream & print_on(std::ostream &os) const =0
    Should print the underlying representation on the given stream.
    -
    const std::map< std::string, level > & levels() const
    Get the map of available log levels string representations toward their identifier....
    Definition: clutchlog.h:1064
    -
    size_t _strip_calls
    Current number of call stack levels to remove from depth display.
    Definition: clutchlog.h:913
    -
    level stage
    Current log level.
    Definition: clutchlog.h:1122
    -
    bool there
    Location is compatible.
    Definition: clutchlog.h:1128
    -
    fg_16M(const std::string &srgb)
    Hex triplet string constructor.
    Definition: clutchlog.h:664
    +
    const std::map< std::string, level > & levels() const
    Get the map of available log levels string representations toward their identifier....
    Definition: clutchlog.h:1071
    +
    size_t _strip_calls
    Current number of call stack levels to remove from depth display.
    Definition: clutchlog.h:917
    +
    level stage
    Current log level.
    Definition: clutchlog.h:1132
    +
    bool there
    Location is compatible.
    Definition: clutchlog.h:1138
    +
    fg_16M(const std::string &srgb)
    Hex triplet string constructor.
    Definition: clutchlog.h:667
    #define CLUTCHLOG_STRIP_CALLS
    Compile-time number of call stack levels to remove from depth display by default.
    Definition: clutchlog.h:263
    -
    friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
    Output stream overload.
    Definition: clutchlog.h:790
    -
    void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
    Print a log message IF the location matches the given one.
    Definition: clutchlog.h:1374
    -
    bg_16M(const bg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:699
    -
    bg_16M()
    Empty constructor: no color.
    Definition: clutchlog.h:676
    -
    std::map< std::string, level > _word_level
    Dictionary of level string to their identifier.
    Definition: clutchlog.h:917
    -
    level _stage
    Current log level.
    Definition: clutchlog.h:945
    -
    fmt style(level stage) const
    Get the configured fmt instance of the given log level.
    Definition: clutchlog.h:1108
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:389
    -
    void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
    Set the regular expressions filtering the location.
    Definition: clutchlog.h:1088
    +
    friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
    Output stream overload.
    Definition: clutchlog.h:793
    +
    void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
    Print a log message IF the location matches the given one.
    Definition: clutchlog.h:1412
    +
    bg_16M(const bg &)
    Conversion constructor from 16-colors mode.
    Definition: clutchlog.h:702
    +
    bg_16M()
    Empty constructor: no color.
    Definition: clutchlog.h:679
    +
    std::map< std::string, level > _word_level
    Dictionary of level string to their identifier.
    Definition: clutchlog.h:921
    +
    level _stage
    Current log level.
    Definition: clutchlog.h:949
    +
    fmt style(level stage) const
    Get the configured fmt instance of the given log level.
    Definition: clutchlog.h:1115
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:392
    +
    void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
    Set the regular expressions filtering the location.
    Definition: clutchlog.h:1095
    #define CLUTCHLOG_HAVE_UNIX_SYSINFO
    True if POSIX headers necessary for stack depth management are available.
    Definition: clutchlog.h:33
    -
    std::vector< fmt > _filehash_fmts
    List of candidate format objects for value-dependant file name styling.
    Definition: clutchlog.h:954
    +
    std::vector< fmt > _filehash_fmts
    List of candidate format objects for value-dependant file name styling.
    Definition: clutchlog.h:958
    The single class which holds everything.
    Definition: clutchlog.h:187
    -
    ansi
    ANSI code configuring the available number of colors.
    Definition: clutchlog.h:379
    -
    fg_16M(short r, short g, short b)
    Numeric triplet constructor.
    Definition: clutchlog.h:656
    -
    fg
    Foreground color codes.
    Definition: clutchlog.h:400
    -
    short red
    The encoded RGB indices.
    Definition: clutchlog.h:587
    +
    ansi
    ANSI code configuring the available number of colors.
    Definition: clutchlog.h:382
    +
    fg_16M(short r, short g, short b)
    Numeric triplet constructor.
    Definition: clutchlog.h:659
    +
    fg
    Foreground color codes.
    Definition: clutchlog.h:403
    +
    short red
    The encoded RGB indices.
    Definition: clutchlog.h:590
    #define CLUTCHDUMP_DEFAULT_FORMAT
    Compile-time default format of the comment line in file dump.
    Definition: clutchlog.h:231
    -
    color(ansi a, ground g)
    Constructor.
    Definition: clutchlog.h:494
    +
    color(ansi a, ground g)
    Constructor.
    Definition: clutchlog.h:497
    clutchlog::fmt::bg_256 back_256
    Current background in 256-colors mode.
    @@ -84,7 +84,7 @@ $(document).ready(function(){initNavTree('dir_59425e443f801f1f2fd8bbe4959a3ccf.h
    -

    tests → clutchlog Relation

    Public Member Functions

    std::cout << error("ERROR") << std::endl;
    Note
    A formatter called this way WILL output a reset escape code at the end.
    -

    Definition at line 805 of file clutchlog.h.

    +

    Definition at line 808 of file clutchlog.h.

    -

    References print_on().

    +

    References print_on().

    @@ -462,7 +462,7 @@ std::ostream & 
    std::cout << error << "ERROR" << end << std::endl;
    Note
    An formatter called this way will NOT output a reset escape code.
    -

    Definition at line 790 of file clutchlog.h.

    +

    Definition at line 793 of file clutchlog.h.

    @@ -497,7 +497,7 @@ std::ostream & 
    Definition at line 379 of file clutchlog.h.

    +

    Definition at line 382 of file clutchlog.h.

    @@ -506,7 +506,7 @@ std::ostream & 
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:376
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    clutchlog -  0.15 +  0.16
    clutchlog -  0.15 +  0.16
    clutchlog -  0.15 +  0.16
    clutchlog -  0.15 +  0.16
    File in testsIncludes file in clutchlog
    t-assert.cppclutchlog.h
    t-color.cppclutchlog.h
    t-color16M.cppclutchlog.h
    t-color256.cppclutchlog.h
    t-demo-extravagant.cppclutchlog.h
    t-demo.cppclutchlog.h
    t-depth-delta.cppclutchlog.h
    t-dump.cppclutchlog.h
    t-fmt-constructors.cppclutchlog.h
    t-hash-color.cppclutchlog.h
    t-log.cppclutchlog.h
    t-one-line-if.cppclutchlog.h
    +

    tests → clutchlog Relation

    File in testsIncludes file in clutchlog
    t-assert.cppclutchlog.h
    t-color.cppclutchlog.h
    t-color16M.cppclutchlog.h
    t-color256.cppclutchlog.h
    t-demo-extravagant.cppclutchlog.h
    t-demo.cppclutchlog.h
    t-depth-delta.cppclutchlog.h
    t-dump.cppclutchlog.h
    t-filename.cppclutchlog.h
    t-fmt-constructors.cppclutchlog.h
    t-hash-color.cppclutchlog.h
    t-log.cppclutchlog.h
    t-one-line-if.cppclutchlog.h
    diff --git a/docs/files_dup.js b/docs/files_dup.js index de394c4..e4d1828 100644 --- a/docs/files_dup.js +++ b/docs/files_dup.js @@ -9,6 +9,7 @@ var files_dup = [ "t-demo.cpp", "t-demo_8cpp_source.html", null ], [ "t-depth-delta.cpp", "t-depth-delta_8cpp_source.html", null ], [ "t-dump.cpp", "t-dump_8cpp_source.html", null ], + [ "t-filename.cpp", "t-filename_8cpp_source.html", null ], [ "t-fmt-constructors.cpp", "t-fmt-constructors_8cpp_source.html", null ], [ "t-hash-color.cpp", "t-hash-color_8cpp_source.html", null ], [ "t-log.cpp", "t-log_8cpp_source.html", null ], diff --git a/docs/functions.html b/docs/functions.html index 7ae6bc1..31320a1 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    @@ -90,6 +90,9 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
  • _filehash_fmts : clutchlog
  • +
  • _filename +: clutchlog +
  • _format_dump : clutchlog
  • @@ -224,6 +227,9 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
  • filehash_styles() : clutchlog
  • +
  • filename +: clutchlog +
  • fmt() : clutchlog::fmt
  • @@ -237,10 +243,10 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable(); : clutchlog::fmt
  • format() -: clutchlog +: clutchlog
  • format_comment() -: clutchlog +: clutchlog
  • func() : clutchlog diff --git a/docs/functions_enum.html b/docs/functions_enum.html index 3dccd46..f965338 100644 --- a/docs/functions_enum.html +++ b/docs/functions_enum.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    @@ -94,6 +94,9 @@ $(document).ready(function(){initNavTree('functions_enum.html',''); initResizabl
  • fg : clutchlog::fmt
  • +
  • filename +: clutchlog +
  • ground : clutchlog::fmt::color
  • diff --git a/docs/functions_func.html b/docs/functions_func.html index eab349f..64f0a99 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    @@ -132,11 +132,14 @@ $(document).ready(function(){initNavTree('functions_func.html',''); initResizabl
  • filehash_styles() : clutchlog
  • +
  • filename() +: clutchlog +
  • fmt() : clutchlog::fmt
  • format() -: clutchlog +: clutchlog
  • format_comment() : clutchlog diff --git a/docs/functions_rela.html b/docs/functions_rela.html index c2eefc2..035e264 100644 --- a/docs/functions_rela.html +++ b/docs/functions_rela.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/functions_vars.html b/docs/functions_vars.html index d4a0507..5f74176 100644 --- a/docs/functions_vars.html +++ b/docs/functions_vars.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    @@ -90,6 +90,9 @@ $(document).ready(function(){initNavTree('functions_vars.html',''); initResizabl
  • _filehash_fmts : clutchlog
  • +
  • _filename +: clutchlog +
  • _format_dump : clutchlog
  • diff --git a/docs/globals.html b/docs/globals.html index 918f052..7584db1 100644 --- a/docs/globals.html +++ b/docs/globals.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/globals_defs.html b/docs/globals_defs.html index a0cb07e..01b28ff 100644 --- a/docs/globals_defs.html +++ b/docs/globals_defs.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/graph_legend.html b/docs/graph_legend.html index edb553d..003b89f 100644 --- a/docs/graph_legend.html +++ b/docs/graph_legend.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/group___default_config.html b/docs/group___default_config.html index fe42a2a..a06d5bb 100644 --- a/docs/group___default_config.html +++ b/docs/group___default_config.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/group___formating.html b/docs/group___formating.html index 5bbe894..2a6ff4e 100644 --- a/docs/group___formating.html +++ b/docs/group___formating.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/group___main.html b/docs/group___main.html index 80a0c24..1ae3900 100644 --- a/docs/group___main.html +++ b/docs/group___main.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/group___main.js b/docs/group___main.js index c1d2ac0..5fc80f3 100644 --- a/docs/group___main.js +++ b/docs/group___main.js @@ -1,11 +1,11 @@ var group___main = [ [ "clutchlog", "classclutchlog.html", [ - [ "System-dependent stack depth", "index.html#autotoc_md26", null ], - [ "System-dependent horizontal fill", "index.html#autotoc_md27", null ], - [ "Dependencies", "index.html#autotoc_md28", null ], - [ "Variable names within the CLUTCHLOG macro", "index.html#autotoc_md29", null ], - [ "Features", "index.html#autotoc_md30", null ], + [ "System-dependent stack depth", "index.html#autotoc_md27", null ], + [ "System-dependent horizontal fill", "index.html#autotoc_md28", null ], + [ "Dependencies", "index.html#autotoc_md29", null ], + [ "Variable names within the CLUTCHLOG macro", "index.html#autotoc_md30", null ], + [ "Features", "index.html#autotoc_md31", null ], [ "scope_t", "structclutchlog_1_1scope__t.html", [ [ "scope_t", "structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572", null ], [ "matches", "structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9", null ], @@ -37,6 +37,7 @@ var group___main = [ "style", "classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591", null ], [ "style", "classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6", null ], [ "style", "classclutchlog.html#a4831f44fd5ade102e57320632095934d", null ], + [ "filename", "classclutchlog.html#a82b9375728af2d962831a743d95f4ae7", null ], [ "locate", "classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96", null ], [ "replace", "classclutchlog.html#a972f895c70edc335f3018a2c8971d59e", null ], [ "replace", "classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2", null ], @@ -65,6 +66,7 @@ var group___main = [ "_in_line", "classclutchlog.html#a41757198b29862832a14472a9e5e24c6", null ], [ "_filehash_fmts", "classclutchlog.html#a2a334e009533744b52f01ef240a59e9d", null ], [ "_funchash_fmts", "classclutchlog.html#a095e1545a2085ac623e4af19364fea7f", null ], + [ "_filename", "classclutchlog.html#a0431616914dbbecb908a794f5b46dada", null ], [ "level", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928", [ [ "critical", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701", null ], [ "error", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9", null ], @@ -74,6 +76,14 @@ var group___main = [ "info", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aa1ea607f2bfe5db06f1cf2bd991f7dc1", null ], [ "debug", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a911f5ef324f37061f68a239577e0d0bd", null ], [ "xdebug", "classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928abba74b810831c7753777e6dcc0c0f4e2", null ] + ] ], + [ "filename", "classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e", [ + [ "path", "classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea19ebb39c0f117afbe6658bbc9bea68a4", null ], + [ "base", "classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ead79ddc78294d362c22ba917cba2cd3ef", null ], + [ "dir", "classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea35cf5f272267d9656cfcfe52243f4841", null ], + [ "dirbase", "classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea9534ecbf6a632833ca32ea5bb33f7eea", null ], + [ "stem", "classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea04548b133168127416623d51dd3b9338", null ], + [ "dirstem", "classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea5b96778dd84a50c1b288b31a5200df4d", null ] ] ] ] ] ]; \ No newline at end of file diff --git a/docs/group___use_macros.html b/docs/group___use_macros.html index dfca8d2..9b21266 100644 --- a/docs/group___use_macros.html +++ b/docs/group___use_macros.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/group__colors16.html b/docs/group__colors16.html index c5291b3..0dcd958 100644 --- a/docs/group__colors16.html +++ b/docs/group__colors16.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/group__colors256__16_m.html b/docs/group__colors256__16_m.html index ce01f78..8f5793f 100644 --- a/docs/group__colors256__16_m.html +++ b/docs/group__colors256__16_m.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 9399f28..a9d01bd 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    diff --git a/docs/index.html b/docs/index.html index 4c937e3..5f42249 100644 --- a/docs/index.html +++ b/docs/index.html @@ -28,7 +28,7 @@ Logo
    clutchlog -  0.15 +  0.16
    @@ -109,25 +109,26 @@ $(document).ready(function(){initNavTree('index.html',''); initResizable(); });
  • Stack Depth Mark
  • Horizontal Filling
  • Stack Depth
  • +
  • Filename
  • -
  • Disabled calls
  • -
  • Low-level API
  • -
  • (De)clutch any function call
  • -
  • (De)clutch any code section
  • -
  • Manually Increase Stack Depth
  • +
  • Disabled calls
  • +
  • Low-level API
  • +
  • (De)clutch any function call
  • +
  • (De)clutch any code section
  • +
  • Manually Increase Stack Depth
  • -
  • Examples
  • -
  • Limitations

      Clutchlog is a spatial logging system that targets versatile debugging. It allows to (de)clutch messages for a given: log level, source code location or call stack depth.

      @@ -231,7 +232,7 @@ Output Configuration
    • {level}: the current log level (i.e. Critical, Error, Warning, Progress, Note, Info, Debug or XDebug),
    • {level_letter}: the first letter of the current log level,
    • {level_short}: the current log level, printed in only four letters,
    • -
    • {file}: the current file (absolute path),
    • +
    • {file}: the current file name,
    • {func}: the current function,
    • {line}: the current line number,
    • {level_fmt}: the style of the current level (i.e. configured with clutchlog::style),
    • @@ -376,7 +377,24 @@ Horizontal Filling

      Stack Depth

      By default, clutchlog removes 5 levels of the calls stack, so that your main entrypoint corresponds to a depth of zero. You can change this behaviour by defining the CLUTCHLOG_STRIP_CALLS macro, or calling clutchlog::strip_calls.

      log.strip_calls(CLUTCHLOG_STRIP_CALLS); // Defaults to 5.
      -

      +

      +Filename

      +

      By default, the {file} template tag is rendered as the absolute path (which is usualy handy if your terminal detects paths and allows to run a command on click).

      +

      You can change this behavior to display shorter names, using clutchlog::filename, and passing one of the following the shortening method:

        +
      • clutchlog::filename::base: the file name itself,
      • +
      • clutchlog::filename::dir: the name of the single last directory containing the file,
      • +
      • clutchlog::filename::dirbase: the last directory and the file names,
      • +
      • clutchlog::filename::stem: the file name without its extension,
      • +
      • clutchlog::filename::dirstem: the last directory and the file without extension.
      • +
      • clutchlog::filename::path: the absolute path (the default).
      • +
      +

      Example:

      log.filename(clutchlog::filename::path) // /home/nojhan/code/clutchlog/tests/t-filename.cpp
      +
      log.filename(clutchlog::filename::base) // t-filename.cpp
      +
      log.filename(clutchlog::filename::dir) // tests
      +
      log.filename(clutchlog::filename::dirbase) // tests/t-filename.cpp
      +
      log.filename(clutchlog::filename::stem) // t-filename
      +
      log.filename(clutchlog::filename::dirstem) // tests/t-filename
      +

      Disabled calls

      By default, clutchlog is always enabled if the NDEBUG preprocessor variable is not defined (this variable is set by CMake in build types that differs from Debug).

      You can however force clutchlog to be enabled in any build type by setting the WITH_CLUTCHLOG preprocessor variable.

      @@ -385,7 +403,7 @@ Disabled calls
      #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::xdebug

      Note that allowing a log level does not mean that it will actually output something. If the configured log level at runtime is lower than the log level of the message, it will still not be printed.

      This behavior intend to remove as many conditional statements as possible when not debugging, without having to use preprocessor guards around calls to clutchlog, thus saving run time at no readability cost.

      -

      +

      Low-level API

      All configuration setters have a getters counterpart, with the same name but taking no parameter, for example:

      std::string mark = log.depth_mark();

      To control more precisely the logging, one can use the low-level clutchlog::log method:

      log.log(clutchlog::level::xdebug, "hello world", "main.cpp", "main", 122);
      @@ -393,24 +411,24 @@ Low-level API

      A similar dump method exists:

      log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), CLUTCHLOC, "dumped_{n}.dat", "\n");
      log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), "main.cpp", "main", 122, "dumped.dat", "\n\n");

      You can access the identifier of log levels with clutchlog::level_of:

      log.threshold( log.level_of("XDebug") ); // You have to know the exact string.
      -

      +

      (De)clutch any function call

      The CLUTHFUNC macro allows to wrap any function within the current logger.

      For instance, this can be useful if you want to (de)clutch calls to asserts. To do that, just declare your own macro:

      #define ASSERT(...) { CLUTCHFUNC(error, assert, __VA_ARGS__) }

      Thus, any call like ASSERT(x > 3); will be declutchable with the same configuration than a call to CLUTCHLOG.

      -

      +

      (De)clutch any code section

      The CLUTCHCODE macro allows to wrap any code within the current logger.

      For instance:

      std::clog << "We are clutched!\n";
      );
      -

      +

      Manually Increase Stack Depth

      You may want to manually increase the stack depth for a given logging call, for instance to subdivise a single function in sections. To do so, you can use the CLUTCHLOGD macro, which take an additional argument, in the form of the number of additional (fake) stack depths you want:

      CLUTCHLOG( debug, "Call"); // Regular macro.
      CLUTCHLOGD(debug, "Sub call", 1); // Adds an additional (fake) stack depth.
      CLUTCHLOGD(debug, "Sub sub!", 2); // Adds two additional (fake) stack depths.

      That way, the depth will be rendered to the actual depth, plus the additional depth delta. Note that the displayed function will stay the same. Any filtering on the stack depth will take into account the fake depth and not the real one.

      -

      +

      Examples

      Here what you would do to setup clutchlog with the default configuration:

      auto& log = clutchlog::logger();
      log.out(std::clog);
      @@ -482,29 +500,29 @@ Examples
      log.hfill_char('.');
      log.hfill_max(300);
      log.hfill_style(clutchlog::fmt::fg::none);
      -

      +

      Limitations

      -

      +

      System-dependent stack depth

      Because access to the call stack depth and program name are system-dependent, the features relying on the depth of the call stack and the display of the program name are only available for operating systems having the following headers: execinfo.h, stdlib.h and libgen.h (so far, tested with Linux).

      Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSINFO to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

      #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      log.depth( x );
      #endif
      -

      +

      System-dependent horizontal fill

      Because access to the current terminal width is system-dependent, the {hfill} format tag feature is only available for operating systems having the following headers: sys/ioctl.h, stdio.h and unistd.h (so far, tested with Linux).

      Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSIOCTL to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

      #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      log.hfill_mark( '_' );
      #endif

      If you use unicode characters in your template, the horizontal width will not be computed properly, resulting in incorrectly right-aligned lines. Solving this would require the use of third-party libraries, making portability more difficult.

      -

      +

      Dependencies

      Some colors/styles may not be supported by some exotic terminal emulators.

      Clutchlog needs C++-17 with the filesystem feature. You may need to indicate -std=c++17 -lstdc++fs to some compilers.

      -

      +

      Variable names within the CLUTCHLOG macro

      Calling the CLUTCHLOG macro with a message using a variable named clutchlog__msg will end in an error.

      -

      +

      Features

      What Clutchlog do not provide at the moment (but may in a near future):

        @@ -520,7 +538,7 @@ Features
      • Automatic argument parser (please, use a dedicated lib).
      • Signal handling (WTF would you do that, anyway?).
      -

      +

      Build and tests

      To use clutchlog, just include its header in your code and either ensure that the NDEBUG preprocessor variable is not set, either define the WITH_CLUTCHLOG preprocessor variable.

      If you're using CMake (or another modern build system), it will unset NDEBUG —and thus enable clutchlog— only for the "Debug" build type, which is usually what you want if you use clutchlog, anyway.

      @@ -538,7 +556,7 @@ Build and tests
      #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
      Log a message at the given level and with a given depth delta.
      Definition: clutchlog.h:81
      #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
      Dump the given container.
      Definition: clutchlog.h:107
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      #define CLUTCHLOC
      Handy shortcuts to location.
      Definition: clutchlog.h:77
      #define CLUTCHLOG_DEFAULT_HFILL_MARK
      Character used as a filling for right-align the right part of messages with "{hfill}".
      Definition: clutchlog.h:270
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      diff --git a/docs/inherits.html b/docs/inherits.html index 276ad39..7d1cca4 100644 --- a/docs/inherits.html +++ b/docs/inherits.html @@ -28,7 +28,7 @@ Logo
      clutchlog -  0.15 +  0.16
      diff --git a/docs/modules.html b/docs/modules.html index 1055d3d..2174db0 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -28,7 +28,7 @@ Logo
      clutchlog -  0.15 +  0.16
      diff --git a/docs/navtreedata.js b/docs/navtreedata.js index d99221a..b21b8d8 100644 --- a/docs/navtreedata.js +++ b/docs/navtreedata.js @@ -45,17 +45,18 @@ var NAVTREE = [ "Dump Format", "index.html#autotoc_md15", null ], [ "Stack Depth Mark", "index.html#autotoc_md16", null ], [ "Horizontal Filling", "index.html#autotoc_md17", null ], - [ "Stack Depth", "index.html#autotoc_md18", null ] + [ "Stack Depth", "index.html#autotoc_md18", null ], + [ "Filename", "index.html#autotoc_md19", null ] ] ], - [ "Disabled calls", "index.html#autotoc_md19", null ], - [ "Low-level API", "index.html#autotoc_md20", null ], - [ "(De)clutch any function call", "index.html#autotoc_md21", null ], - [ "(De)clutch any code section", "index.html#autotoc_md22", null ], - [ "Manually Increase Stack Depth", "index.html#autotoc_md23", null ] + [ "Disabled calls", "index.html#autotoc_md20", null ], + [ "Low-level API", "index.html#autotoc_md21", null ], + [ "(De)clutch any function call", "index.html#autotoc_md22", null ], + [ "(De)clutch any code section", "index.html#autotoc_md23", null ], + [ "Manually Increase Stack Depth", "index.html#autotoc_md24", null ] ] ], - [ "Examples", "index.html#autotoc_md24", null ], - [ "Limitations", "index.html#autotoc_md25", null ], - [ "Build and tests", "index.html#autotoc_md31", null ] + [ "Examples", "index.html#autotoc_md25", null ], + [ "Limitations", "index.html#autotoc_md26", null ], + [ "Build and tests", "index.html#autotoc_md32", null ] ] ], [ "Modules", "modules.html", "modules" ], [ "Classes", "annotated.html", [ @@ -83,7 +84,7 @@ var NAVTREE = var NAVTREEINDEX = [ "annotated.html", -"structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6" +"structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/docs/navtreeindex0.js b/docs/navtreeindex0.js index b13489b..8df93de 100644 --- a/docs/navtreeindex0.js +++ b/docs/navtreeindex0.js @@ -3,65 +3,74 @@ var NAVTREEINDEX0 = "annotated.html":[2,0], "classclutchlog.html":[1,2,0], "classclutchlog.html#a03b145e36f15435a640bb5a885d9f642":[1,2,0,7], +"classclutchlog.html#a0431616914dbbecb908a794f5b46dada":[1,2,0,60], "classclutchlog.html#a08310b92e86687349e70f56f9ac1d656":[1,2,0,18], -"classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae":[1,2,0,48], +"classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae":[1,2,0,49], "classclutchlog.html#a0906d74275cedcd403da94879764815e":[1,2,0,6], -"classclutchlog.html#a095e1545a2085ac623e4af19364fea7f":[1,2,0,58], -"classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc":[1,2,0,37], +"classclutchlog.html#a095e1545a2085ac623e4af19364fea7f":[1,2,0,59], +"classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc":[1,2,0,38], "classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c":[1,2,0,24], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928":[1,2,0,59], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9":[1,2,0,59,1], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a6efd7b28f876c0473c6dfeae82fc8e05":[1,2,0,59,3], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a911f5ef324f37061f68a239577e0d0bd":[1,2,0,59,6], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aa1ea607f2bfe5db06f1cf2bd991f7dc1":[1,2,0,59,5], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aab4ce1a501f9cbe27666659d3b19534c":[1,2,0,59,2], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928abba74b810831c7753777e6dcc0c0f4e2":[1,2,0,59,7], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701":[1,2,0,59,0], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af89a12aab2a73ea31e19b04ecadbdc0d":[1,2,0,59,4], -"classclutchlog.html#a130c4f12eacbd2028102838fe16b734e":[1,2,0,55], -"classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a":[1,2,0,35], -"classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167":[1,2,0,52], -"classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468":[1,2,0,41], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928":[1,2,0,61], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9":[1,2,0,61,1], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a6efd7b28f876c0473c6dfeae82fc8e05":[1,2,0,61,3], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a911f5ef324f37061f68a239577e0d0bd":[1,2,0,61,6], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aa1ea607f2bfe5db06f1cf2bd991f7dc1":[1,2,0,61,5], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aab4ce1a501f9cbe27666659d3b19534c":[1,2,0,61,2], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928abba74b810831c7753777e6dcc0c0f4e2":[1,2,0,61,7], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701":[1,2,0,61,0], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af89a12aab2a73ea31e19b04ecadbdc0d":[1,2,0,61,4], +"classclutchlog.html#a130c4f12eacbd2028102838fe16b734e":[1,2,0,56], +"classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a":[1,2,0,36], +"classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167":[1,2,0,53], +"classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468":[1,2,0,42], "classclutchlog.html#a2144abe4ec6f630126b6490908b5f924":[1,2,0,12], -"classclutchlog.html#a229fd61519f1245282440120f2d45fb5":[1,2,0,40], -"classclutchlog.html#a2a334e009533744b52f01ef240a59e9d":[1,2,0,57], -"classclutchlog.html#a356df86455409193792b6ed550dfd09e":[1,2,0,45], +"classclutchlog.html#a229fd61519f1245282440120f2d45fb5":[1,2,0,41], +"classclutchlog.html#a2a334e009533744b52f01ef240a59e9d":[1,2,0,58], +"classclutchlog.html#a356df86455409193792b6ed550dfd09e":[1,2,0,46], "classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4":[1,2,0,19], -"classclutchlog.html#a41757198b29862832a14472a9e5e24c6":[1,2,0,56], +"classclutchlog.html#a41757198b29862832a14472a9e5e24c6":[1,2,0,57], "classclutchlog.html#a4831f44fd5ade102e57320632095934d":[1,2,0,30], -"classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96":[1,2,0,31], -"classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7":[1,2,0,44], -"classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5":[1,2,0,51], +"classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96":[1,2,0,32], +"classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7":[1,2,0,45], +"classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5":[1,2,0,52], "classclutchlog.html#a656c277e074b64728cca871f2b484d1c":[1,2,0,10], "classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3":[1,2,0,27], "classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266":[1,2,0,15], -"classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6":[1,2,0,42], +"classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6":[1,2,0,43], "classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9":[1,2,0,20], -"classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e":[1,2,0,50], +"classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e":[1,2,0,51], "classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d":[1,2,0,14], -"classclutchlog.html#a972f895c70edc335f3018a2c8971d59e":[1,2,0,32], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e":[1,2,0,62], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea04548b133168127416623d51dd3b9338":[1,2,0,62,4], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea19ebb39c0f117afbe6658bbc9bea68a4":[1,2,0,62,0], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea35cf5f272267d9656cfcfe52243f4841":[1,2,0,62,2], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea5b96778dd84a50c1b288b31a5200df4d":[1,2,0,62,5], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea9534ecbf6a632833ca32ea5bb33f7eea":[1,2,0,62,3], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ead79ddc78294d362c22ba917cba2cd3ef":[1,2,0,62,1], +"classclutchlog.html#a82b9375728af2d962831a743d95f4ae7":[1,2,0,31], +"classclutchlog.html#a972f895c70edc335f3018a2c8971d59e":[1,2,0,33], "classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9":[1,2,0,26], "classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5":[1,2,0,13], -"classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f":[1,2,0,46], +"classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f":[1,2,0,47], "classclutchlog.html#ab45287cc9c14217904a13aff49573732":[1,2,0,21], -"classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb":[1,2,0,36], -"classclutchlog.html#ab805ac5c33885459f9f752518a4aa735":[1,2,0,49], -"classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888":[1,2,0,47], -"classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761":[1,2,0,34], +"classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb":[1,2,0,37], +"classclutchlog.html#ab805ac5c33885459f9f752518a4aa735":[1,2,0,50], +"classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888":[1,2,0,48], +"classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761":[1,2,0,35], "classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591":[1,2,0,28], -"classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1":[1,2,0,43], +"classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1":[1,2,0,44], "classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416":[1,2,0,17], -"classclutchlog.html#ace879554298e6e6e36dafef330c27be8":[1,2,0,38], +"classclutchlog.html#ace879554298e6e6e36dafef330c27be8":[1,2,0,39], "classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd":[1,2,0,23], "classclutchlog.html#acfaceb77da01503b432644a3efaee4fa":[1,2,0,8], "classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6":[1,2,0,29], "classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447":[1,2,0,25], -"classclutchlog.html#aded03528f34d9000f618419c482c5042":[1,2,0,54], +"classclutchlog.html#aded03528f34d9000f618419c482c5042":[1,2,0,55], "classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf":[1,2,0,16], -"classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2":[1,2,0,33], -"classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993":[1,2,0,53], +"classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2":[1,2,0,34], +"classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993":[1,2,0,54], "classclutchlog.html#aef653a9744a72a889ca8163269bb781e":[1,2,0,9], -"classclutchlog.html#af898bffe23b125245e338d7495c76d45":[1,2,0,39], +"classclutchlog.html#af898bffe23b125245e338d7495c76d45":[1,2,0,40], "classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80":[1,2,0,11], "classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a":[1,2,0,22], "classclutchlog_1_1fmt.html":[1,3,0], @@ -122,10 +131,10 @@ var NAVTREEINDEX0 = "group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9":[1,0,4], "group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805":[1,0,6], "group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805":[3,0,0,17], -"group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa":[1,0,1], "group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa":[3,0,0,12], -"group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[1,0,3], +"group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa":[1,0,1], "group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[3,0,0,14], +"group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[1,0,3], "group___default_config.html#ga8564be479b948ee3052b61783c66d415":[3,0,0,5], "group___default_config.html#ga8564be479b948ee3052b61783c66d415":[1,0,0], "group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf":[1,0,5], @@ -139,12 +148,12 @@ var NAVTREEINDEX0 = "group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2":[1,1,3], "group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d":[1,1,2], "group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d":[3,0,0,8], -"group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae":[1,1,4], "group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae":[3,0,0,10], -"group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73":[3,0,0,11], +"group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae":[1,1,4], "group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73":[1,1,5], -"group___use_macros.html#gae8911119d726a43b77f5781cb5a72813":[3,0,0,6], +"group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73":[3,0,0,11], "group___use_macros.html#gae8911119d726a43b77f5781cb5a72813":[1,1,0], +"group___use_macros.html#gae8911119d726a43b77f5781cb5a72813":[3,0,0,6], "group__colors16.html":[1,4], "group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e":[1,3,0,36], "group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e":[1,4,1], @@ -152,10 +161,10 @@ var NAVTREEINDEX0 = "group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33":[1,4,5], "group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0":[1,3,0,35], "group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0":[1,4,0], -"group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,4,4], "group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,3,0,22], -"group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,4,2], +"group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,4,4], "group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,3,0,27], +"group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,4,2], "group__colors16.html#ga86696b20e5b31c96ba592926efb324f3":[1,4,3], "group__colors16.html#ga86696b20e5b31c96ba592926efb324f3":[1,3,0,28], "group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea1ffd9e753c8054cc61456ac7fac1ac89":[1,3,0,36,0], @@ -193,17 +202,17 @@ var NAVTREEINDEX0 = "group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ad508fe45cecaf653904a0e774084bb5c":[1,3,0,35,7], "group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ada7527acf78cb4e7b582e8163a1f642a":[1,3,0,35,15], "group__colors256__16_m.html":[1,5], -"group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,3,0,30], "group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,5,8], +"group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,3,0,30], "group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de":[1,3,0,31], "group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de":[1,5,9], "group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0":[1,5,10], "group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0":[1,3,0,32], -"group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,3,0,29], "group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,5,7], +"group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,3,0,29], "hierarchy.html":[2,2], -"index.html":[0], "index.html":[], +"index.html":[0], "index.html#autotoc_md0":[0,0], "index.html#autotoc_md1":[0,1], "index.html#autotoc_md10":[0,3,4,0], @@ -215,21 +224,22 @@ var NAVTREEINDEX0 = "index.html#autotoc_md16":[0,4,0,1], "index.html#autotoc_md17":[0,4,0,2], "index.html#autotoc_md18":[0,4,0,3], -"index.html#autotoc_md19":[0,4,1], +"index.html#autotoc_md19":[0,4,0,4], "index.html#autotoc_md2":[0,2], -"index.html#autotoc_md20":[0,4,2], -"index.html#autotoc_md21":[0,4,3], -"index.html#autotoc_md22":[0,4,4], -"index.html#autotoc_md23":[0,4,5], -"index.html#autotoc_md24":[0,5], -"index.html#autotoc_md25":[0,6], -"index.html#autotoc_md26":[0], -"index.html#autotoc_md27":[1], -"index.html#autotoc_md28":[2], -"index.html#autotoc_md29":[3], +"index.html#autotoc_md20":[0,4,1], +"index.html#autotoc_md21":[0,4,2], +"index.html#autotoc_md22":[0,4,3], +"index.html#autotoc_md23":[0,4,4], +"index.html#autotoc_md24":[0,4,5], +"index.html#autotoc_md25":[0,5], +"index.html#autotoc_md26":[0,6], +"index.html#autotoc_md27":[0], +"index.html#autotoc_md28":[1], +"index.html#autotoc_md29":[2], "index.html#autotoc_md3":[0,3], -"index.html#autotoc_md30":[4], -"index.html#autotoc_md31":[0,7], +"index.html#autotoc_md30":[3], +"index.html#autotoc_md31":[4], +"index.html#autotoc_md32":[0,7], "index.html#autotoc_md4":[0,3,0], "index.html#autotoc_md5":[0,3,1], "index.html#autotoc_md6":[0,3,2], @@ -239,15 +249,5 @@ var NAVTREEINDEX0 = "modules.html":[1], "pages.html":[], "structclutchlog_1_1fmt_1_1bg__16_m.html":[1,5,6], -"structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0":[1,5,6,0], -"structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d":[1,5,6,3], -"structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501":[1,5,6,1], -"structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97":[1,5,6,2], -"structclutchlog_1_1fmt_1_1bg__256.html":[1,5,3], -"structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd":[1,5,3,2], -"structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90":[1,5,3,0], -"structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad":[1,5,3,1], -"structclutchlog_1_1fmt_1_1color.html":[1,5,0], -"structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae":[1,5,0,5], -"structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac":[1,5,0,0] +"structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0":[1,5,6,0] }; diff --git a/docs/navtreeindex1.js b/docs/navtreeindex1.js index 84950af..c6d0f2d 100644 --- a/docs/navtreeindex1.js +++ b/docs/navtreeindex1.js @@ -1,5 +1,15 @@ var NAVTREEINDEX1 = { +"structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d":[1,5,6,3], +"structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501":[1,5,6,1], +"structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97":[1,5,6,2], +"structclutchlog_1_1fmt_1_1bg__256.html":[1,5,3], +"structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd":[1,5,3,2], +"structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90":[1,5,3,0], +"structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad":[1,5,3,1], +"structclutchlog_1_1fmt_1_1color.html":[1,5,0], +"structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae":[1,5,0,5], +"structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac":[1,5,0,0], "structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6":[1,5,0,3], "structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603":[1,5,0,1], "structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f":[1,5,0,2], @@ -44,8 +54,9 @@ var NAVTREEINDEX1 = "t-demo_8cpp_source.html":[3,0,6], "t-depth-delta_8cpp_source.html":[3,0,7], "t-dump_8cpp_source.html":[3,0,8], -"t-fmt-constructors_8cpp_source.html":[3,0,9], -"t-hash-color_8cpp_source.html":[3,0,10], -"t-log_8cpp_source.html":[3,0,11], -"t-one-line-if_8cpp_source.html":[3,0,12] +"t-filename_8cpp_source.html":[3,0,9], +"t-fmt-constructors_8cpp_source.html":[3,0,10], +"t-hash-color_8cpp_source.html":[3,0,11], +"t-log_8cpp_source.html":[3,0,12], +"t-one-line-if_8cpp_source.html":[3,0,13] }; diff --git a/docs/search/all_0.js b/docs/search/all_0.js index e6209f7..4cb16ca 100644 --- a/docs/search/all_0.js +++ b/docs/search/all_0.js @@ -1,17 +1,18 @@ var searchData= [ ['_5ffilehash_5ffmts_0',['_filehash_fmts',['../classclutchlog.html#a2a334e009533744b52f01ef240a59e9d',1,'clutchlog']]], - ['_5fformat_5fdump_1',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], - ['_5fformat_5flog_2',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], - ['_5ffunchash_5ffmts_3',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], - ['_5fin_5ffile_4',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], - ['_5fin_5ffunc_5',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], - ['_5fin_5fline_6',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], - ['_5flevel_5ffmt_7',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], - ['_5flevel_5fshort_8',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], - ['_5flevel_5fword_9',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], - ['_5fout_10',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], - ['_5fstage_11',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], - ['_5fstrip_5fcalls_12',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], - ['_5fword_5flevel_13',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] + ['_5ffilename_1',['_filename',['../classclutchlog.html#a0431616914dbbecb908a794f5b46dada',1,'clutchlog']]], + ['_5fformat_5fdump_2',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], + ['_5fformat_5flog_3',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], + ['_5ffunchash_5ffmts_4',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], + ['_5fin_5ffile_5',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], + ['_5fin_5ffunc_6',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], + ['_5fin_5fline_7',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], + ['_5flevel_5ffmt_8',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], + ['_5flevel_5fshort_9',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], + ['_5flevel_5fword_10',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], + ['_5fout_11',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], + ['_5fstage_12',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], + ['_5fstrip_5fcalls_13',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], + ['_5fword_5flevel_14',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] ]; diff --git a/docs/search/all_1.js b/docs/search/all_1.js index eafa84d..2aa49b3 100644 --- a/docs/search/all_1.js +++ b/docs/search/all_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['ansi_14',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] + ['ansi_15',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/all_10.js b/docs/search/all_10.js index 7af2ab2..3ad80e3 100644 --- a/docs/search/all_10.js +++ b/docs/search/all_10.js @@ -1,4 +1,4 @@ var searchData= [ - ['with_5fclutchlog_101',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] + ['with_5fclutchlog_103',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] ]; diff --git a/docs/search/all_2.js b/docs/search/all_2.js index 86a1b84..bb2aa6d 100644 --- a/docs/search/all_2.js +++ b/docs/search/all_2.js @@ -1,9 +1,9 @@ var searchData= [ - ['back_15',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], - ['back_5f16m_16',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], - ['back_5f256_17',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]], - ['bg_18',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]], - ['bg_5f16m_19',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt::bg_16M'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], - ['bg_5f256_20',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt::bg_256'],['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] + ['back_16',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], + ['back_5f16m_17',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], + ['back_5f256_18',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]], + ['bg_19',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]], + ['bg_5f16m_20',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt::bg_16M'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], + ['bg_5f256_21',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt::bg_256'],['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] ]; diff --git a/docs/search/all_3.js b/docs/search/all_3.js index 288d35a..00ceeae 100644 --- a/docs/search/all_3.js +++ b/docs/search/all_3.js @@ -1,28 +1,28 @@ var searchData= [ - ['clutchcode_21',['CLUTCHCODE',['../group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73',1,'clutchlog.h']]], - ['clutchdump_22',['CLUTCHDUMP',['../group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2',1,'clutchlog.h']]], - ['clutchdump_5fdefault_5fformat_23',['CLUTCHDUMP_DEFAULT_FORMAT',['../group___default_config.html#ga27b613c6727857a7cbcd0165d862034e',1,'clutchlog.h']]], - ['clutchdump_5fdefault_5fsep_24',['CLUTCHDUMP_DEFAULT_SEP',['../group___default_config.html#ga54d29e956575e1c731eab5406135c5df',1,'clutchlog.h']]], - ['clutchfunc_25',['CLUTCHFUNC',['../group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae',1,'clutchlog.h']]], - ['clutchloc_26',['CLUTCHLOC',['../group___use_macros.html#gae8911119d726a43b77f5781cb5a72813',1,'clutchlog.h']]], - ['clutchlog_27',['clutchlog',['../classclutchlog.html',1,'clutchlog'],['../group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d',1,'CLUTCHLOG(): clutchlog.h']]], - ['clutchlog_2eh_28',['clutchlog.h',['../clutchlog_8h.html',1,'']]], - ['clutchlog_5fdefault_5fdepth_5fbuilt_5fnodebug_29',['CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG',['../group___default_config.html#ga8564be479b948ee3052b61783c66d415',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fdepth_5fmark_30',['CLUTCHLOG_DEFAULT_DEPTH_MARK',['../group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fformat_31',['CLUTCHLOG_DEFAULT_FORMAT',['../group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fhfill_5fmark_32',['CLUTCHLOG_DEFAULT_HFILL_MARK',['../group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805',1,'clutchlog.h']]], - ['clutchlog_5fh_33',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysinfo_34',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysioctl_35',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]], - ['clutchlog_5fstrip_5fcalls_36',['CLUTCHLOG_STRIP_CALLS',['../group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf',1,'clutchlog.h']]], - ['clutchlogd_37',['CLUTCHLOGD',['../group___use_macros.html#ga369d365b7c25ec270596c3ca6839cf2c',1,'clutchlog.h']]], - ['color_38',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt::color'],['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color::color()']]], - ['color_5f16m_39',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt::color_16M'],['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], - ['color_5f256_40',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt::color_256'],['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]], - ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_41',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]], - ['colors_5f16_42',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], - ['colors_5f16m_43',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], - ['colors_5f256_44',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]], - ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_45',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] + ['clutchcode_22',['CLUTCHCODE',['../group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73',1,'clutchlog.h']]], + ['clutchdump_23',['CLUTCHDUMP',['../group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2',1,'clutchlog.h']]], + ['clutchdump_5fdefault_5fformat_24',['CLUTCHDUMP_DEFAULT_FORMAT',['../group___default_config.html#ga27b613c6727857a7cbcd0165d862034e',1,'clutchlog.h']]], + ['clutchdump_5fdefault_5fsep_25',['CLUTCHDUMP_DEFAULT_SEP',['../group___default_config.html#ga54d29e956575e1c731eab5406135c5df',1,'clutchlog.h']]], + ['clutchfunc_26',['CLUTCHFUNC',['../group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae',1,'clutchlog.h']]], + ['clutchloc_27',['CLUTCHLOC',['../group___use_macros.html#gae8911119d726a43b77f5781cb5a72813',1,'clutchlog.h']]], + ['clutchlog_28',['clutchlog',['../classclutchlog.html',1,'clutchlog'],['../group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d',1,'CLUTCHLOG(): clutchlog.h']]], + ['clutchlog_2eh_29',['clutchlog.h',['../clutchlog_8h.html',1,'']]], + ['clutchlog_5fdefault_5fdepth_5fbuilt_5fnodebug_30',['CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG',['../group___default_config.html#ga8564be479b948ee3052b61783c66d415',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fdepth_5fmark_31',['CLUTCHLOG_DEFAULT_DEPTH_MARK',['../group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fformat_32',['CLUTCHLOG_DEFAULT_FORMAT',['../group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fhfill_5fmark_33',['CLUTCHLOG_DEFAULT_HFILL_MARK',['../group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805',1,'clutchlog.h']]], + ['clutchlog_5fh_34',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysinfo_35',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysioctl_36',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]], + ['clutchlog_5fstrip_5fcalls_37',['CLUTCHLOG_STRIP_CALLS',['../group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf',1,'clutchlog.h']]], + ['clutchlogd_38',['CLUTCHLOGD',['../group___use_macros.html#ga369d365b7c25ec270596c3ca6839cf2c',1,'clutchlog.h']]], + ['color_39',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt::color'],['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color::color()']]], + ['color_5f16m_40',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt::color_16M'],['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], + ['color_5f256_41',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt::color_256'],['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]], + ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_42',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]], + ['colors_5f16_43',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], + ['colors_5f16m_44',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], + ['colors_5f256_45',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]], + ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_46',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] ]; diff --git a/docs/search/all_4.js b/docs/search/all_4.js index 46bf0a2..3f03f41 100644 --- a/docs/search/all_4.js +++ b/docs/search/all_4.js @@ -1,14 +1,14 @@ var searchData= [ - ['default_5fdepth_5fmark_46',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], - ['default_5fformat_47',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], - ['default_5fhfill_5fchar_48',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], - ['default_5fhfill_5fmax_49',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], - ['default_5fhfill_5fmin_50',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], - ['default_5fstrip_5fcalls_51',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], - ['default_20configuration_20management_52',['Default configuration management',['../group___default_config.html',1,'']]], - ['depth_5fstyles_53',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], - ['dump_54',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]], - ['dump_5fdefault_5fformat_55',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], - ['dump_5fdefault_5fsep_56',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] + ['default_5fdepth_5fmark_47',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], + ['default_5fformat_48',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], + ['default_5fhfill_5fchar_49',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], + ['default_5fhfill_5fmax_50',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], + ['default_5fhfill_5fmin_51',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], + ['default_5fstrip_5fcalls_52',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], + ['default_20configuration_20management_53',['Default configuration management',['../group___default_config.html',1,'']]], + ['depth_5fstyles_54',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], + ['dump_55',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]], + ['dump_5fdefault_5fformat_56',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], + ['dump_5fdefault_5fsep_57',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] ]; diff --git a/docs/search/all_5.js b/docs/search/all_5.js index a1b1827..e1b533b 100644 --- a/docs/search/all_5.js +++ b/docs/search/all_5.js @@ -1,17 +1,18 @@ var searchData= [ - ['fg_57',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], - ['fg_5f16m_58',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt::fg_16M'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], - ['fg_5f256_59',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt::fg_256'],['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], - ['file_60',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], - ['filehash_5fstyles_61',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], - ['fmt_62',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog::fmt'],['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt::fmt()']]], - ['fore_63',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], - ['fore_5f16m_64',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], - ['fore_5f256_65',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]], - ['format_66',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], - ['format_5fcomment_67',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], - ['formating_20tools_68',['Formating tools',['../group___formating.html',1,'']]], - ['func_69',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], - ['funchash_5fstyles_70',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] + ['fg_58',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], + ['fg_5f16m_59',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt::fg_16M'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], + ['fg_5f256_60',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt::fg_256'],['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], + ['file_61',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], + ['filehash_5fstyles_62',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], + ['filename_63',['filename',['../classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e',1,'clutchlog::filename()'],['../classclutchlog.html#a82b9375728af2d962831a743d95f4ae7',1,'clutchlog::filename(filename f)']]], + ['fmt_64',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog::fmt'],['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt::fmt()']]], + ['fore_65',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], + ['fore_5f16m_66',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], + ['fore_5f256_67',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]], + ['format_68',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], + ['format_5fcomment_69',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], + ['formating_20tools_70',['Formating tools',['../group___formating.html',1,'']]], + ['func_71',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], + ['funchash_5fstyles_72',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] ]; diff --git a/docs/search/all_6.js b/docs/search/all_6.js index 18610bc..7734da7 100644 --- a/docs/search/all_6.js +++ b/docs/search/all_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['ground_71',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] + ['ground_73',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/search/all_7.js b/docs/search/all_7.js index 034b038..68cafeb 100644 --- a/docs/search/all_7.js +++ b/docs/search/all_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['high_2dlevel_20api_20macros_72',['High-level API macros',['../group___use_macros.html',1,'']]] + ['high_2dlevel_20api_20macros_74',['High-level API macros',['../group___use_macros.html',1,'']]] ]; diff --git a/docs/search/all_8.js b/docs/search/all_8.js index beb9e6e..1de2bbd 100644 --- a/docs/search/all_8.js +++ b/docs/search/all_8.js @@ -1,6 +1,6 @@ var searchData= [ - ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_73',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]], - ['index_74',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]], - ['is_5fset_75',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] + ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_75',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]], + ['index_76',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]], + ['is_5fset_77',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] ]; diff --git a/docs/search/all_9.js b/docs/search/all_9.js index 6341594..dfc3e8a 100644 --- a/docs/search/all_9.js +++ b/docs/search/all_9.js @@ -1,11 +1,11 @@ var searchData= [ - ['level_76',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]], - ['level_5fof_77',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], - ['levels_78',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], - ['line_79',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], - ['locate_80',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], - ['location_81',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], - ['log_82',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], - ['logger_83',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] + ['level_78',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]], + ['level_5fof_79',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], + ['levels_80',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], + ['line_81',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], + ['locate_82',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], + ['location_83',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], + ['log_84',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], + ['logger_85',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] ]; diff --git a/docs/search/all_a.js b/docs/search/all_a.js index c3fc305..2972a6d 100644 --- a/docs/search/all_a.js +++ b/docs/search/all_a.js @@ -1,6 +1,6 @@ var searchData= [ - ['main_20class_84',['Main class',['../group___main.html',1,'']]], - ['matches_85',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], - ['mode_86',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] + ['main_20class_86',['Main class',['../group___main.html',1,'']]], + ['matches_87',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], + ['mode_88',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/all_b.js b/docs/search/all_b.js index 343a4ed..d173001 100644 --- a/docs/search/all_b.js +++ b/docs/search/all_b.js @@ -1,6 +1,6 @@ var searchData= [ - ['operator_28_29_87',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], - ['operator_3c_3c_88',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]], - ['out_89',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] + ['operator_28_29_89',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], + ['operator_3c_3c_90',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]], + ['out_91',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] ]; diff --git a/docs/search/all_c.js b/docs/search/all_c.js index 9560a5c..b7a232d 100644 --- a/docs/search/all_c.js +++ b/docs/search/all_c.js @@ -1,4 +1,4 @@ var searchData= [ - ['print_5fon_90',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] + ['print_5fon_92',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] ]; diff --git a/docs/search/all_d.js b/docs/search/all_d.js index 3961c91..16fdbcb 100644 --- a/docs/search/all_d.js +++ b/docs/search/all_d.js @@ -1,5 +1,5 @@ var searchData= [ - ['red_91',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]], - ['replace_92',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] + ['red_93',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]], + ['replace_94',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] ]; diff --git a/docs/search/all_e.js b/docs/search/all_e.js index 02ec835..e1f8b5a 100644 --- a/docs/search/all_e.js +++ b/docs/search/all_e.js @@ -1,7 +1,7 @@ var searchData= [ - ['scope_5ft_93',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog::scope_t'],['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t::scope_t()']]], - ['stage_94',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], - ['str_95',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], - ['style_96',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt::style()'],['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] + ['scope_5ft_95',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog::scope_t'],['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t::scope_t()']]], + ['stage_96',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], + ['str_97',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], + ['style_98',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt::style()'],['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] ]; diff --git a/docs/search/all_f.js b/docs/search/all_f.js index 42bb7c9..ab2b559 100644 --- a/docs/search/all_f.js +++ b/docs/search/all_f.js @@ -1,7 +1,7 @@ var searchData= [ - ['there_97',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], - ['threshold_98',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]], - ['type_99',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]], - ['typo_100',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] + ['there_99',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], + ['threshold_100',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]], + ['type_101',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]], + ['typo_102',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_0.js b/docs/search/classes_0.js index f692a3e..fdb2334 100644 --- a/docs/search/classes_0.js +++ b/docs/search/classes_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['bg_5f16m_102',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt']]], - ['bg_5f256_103',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt']]] + ['bg_5f16m_104',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt']]], + ['bg_5f256_105',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_1.js b/docs/search/classes_1.js index fa43409..3894de8 100644 --- a/docs/search/classes_1.js +++ b/docs/search/classes_1.js @@ -1,7 +1,7 @@ var searchData= [ - ['clutchlog_104',['clutchlog',['../classclutchlog.html',1,'']]], - ['color_105',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt']]], - ['color_5f16m_106',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt']]], - ['color_5f256_107',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt']]] + ['clutchlog_106',['clutchlog',['../classclutchlog.html',1,'']]], + ['color_107',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt']]], + ['color_5f16m_108',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt']]], + ['color_5f256_109',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_2.js b/docs/search/classes_2.js index db7f454..b6d5ae6 100644 --- a/docs/search/classes_2.js +++ b/docs/search/classes_2.js @@ -1,6 +1,6 @@ var searchData= [ - ['fg_5f16m_108',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt']]], - ['fg_5f256_109',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt']]], - ['fmt_110',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog']]] + ['fg_5f16m_110',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt']]], + ['fg_5f256_111',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt']]], + ['fmt_112',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog']]] ]; diff --git a/docs/search/classes_3.js b/docs/search/classes_3.js index 0ec6e6c..94d55bd 100644 --- a/docs/search/classes_3.js +++ b/docs/search/classes_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['scope_5ft_111',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog']]] + ['scope_5ft_113',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog']]] ]; diff --git a/docs/search/defines_0.js b/docs/search/defines_0.js index a6e00ca..0e94cd9 100644 --- a/docs/search/defines_0.js +++ b/docs/search/defines_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['clutchlog_5fh_191',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysinfo_192',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysioctl_193',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]] + ['clutchlog_5fh_196',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysinfo_197',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysioctl_198',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]] ]; diff --git a/docs/search/defines_1.js b/docs/search/defines_1.js index 2852c6f..0f8fb71 100644 --- a/docs/search/defines_1.js +++ b/docs/search/defines_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['with_5fclutchlog_194',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] + ['with_5fclutchlog_199',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] ]; diff --git a/docs/search/enums_0.js b/docs/search/enums_0.js index 4aac607..de05d1c 100644 --- a/docs/search/enums_0.js +++ b/docs/search/enums_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['ansi_181',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] + ['ansi_185',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enums_1.js b/docs/search/enums_1.js index 9040ba8..38744d8 100644 --- a/docs/search/enums_1.js +++ b/docs/search/enums_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['bg_182',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]] + ['bg_186',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enums_2.js b/docs/search/enums_2.js index 571f951..c374900 100644 --- a/docs/search/enums_2.js +++ b/docs/search/enums_2.js @@ -1,4 +1,5 @@ var searchData= [ - ['fg_183',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]] + ['fg_187',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], + ['filename_188',['filename',['../classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e',1,'clutchlog']]] ]; diff --git a/docs/search/enums_3.js b/docs/search/enums_3.js index d194dd9..4e146eb 100644 --- a/docs/search/enums_3.js +++ b/docs/search/enums_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['ground_184',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] + ['ground_189',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/search/enums_4.js b/docs/search/enums_4.js index 7ed93d8..c3daf46 100644 --- a/docs/search/enums_4.js +++ b/docs/search/enums_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['level_185',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]] + ['level_190',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]] ]; diff --git a/docs/search/enums_5.js b/docs/search/enums_5.js index 19089d1..24bc40b 100644 --- a/docs/search/enums_5.js +++ b/docs/search/enums_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['typo_186',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] + ['typo_191',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enumvalues_0.js b/docs/search/enumvalues_0.js index b51a3fb..a9f6d14 100644 --- a/docs/search/enumvalues_0.js +++ b/docs/search/enumvalues_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['colors_5f16_187',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], - ['colors_5f16m_188',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], - ['colors_5f256_189',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]] + ['colors_5f16_192',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], + ['colors_5f16m_193',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], + ['colors_5f256_194',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/files_0.js b/docs/search/files_0.js index f64c748..712b4cc 100644 --- a/docs/search/files_0.js +++ b/docs/search/files_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['clutchlog_2eh_112',['clutchlog.h',['../clutchlog_8h.html',1,'']]] + ['clutchlog_2eh_114',['clutchlog.h',['../clutchlog_8h.html',1,'']]] ]; diff --git a/docs/search/functions_0.js b/docs/search/functions_0.js index eaf6e3e..609cc2c 100644 --- a/docs/search/functions_0.js +++ b/docs/search/functions_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['bg_5f16m_113',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], - ['bg_5f256_114',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] + ['bg_5f16m_115',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], + ['bg_5f256_116',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] ]; diff --git a/docs/search/functions_1.js b/docs/search/functions_1.js index c971e35..f05ad1f 100644 --- a/docs/search/functions_1.js +++ b/docs/search/functions_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['color_115',['color',['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color']]], - ['color_5f16m_116',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], - ['color_5f256_117',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]] + ['color_117',['color',['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color']]], + ['color_5f16m_118',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], + ['color_5f256_119',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]] ]; diff --git a/docs/search/functions_2.js b/docs/search/functions_2.js index 4082572..10882d3 100644 --- a/docs/search/functions_2.js +++ b/docs/search/functions_2.js @@ -1,5 +1,5 @@ var searchData= [ - ['depth_5fstyles_118',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], - ['dump_119',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]] + ['depth_5fstyles_120',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], + ['dump_121',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]] ]; diff --git a/docs/search/functions_3.js b/docs/search/functions_3.js index db0bc74..9a3c384 100644 --- a/docs/search/functions_3.js +++ b/docs/search/functions_3.js @@ -1,12 +1,13 @@ var searchData= [ - ['fg_5f16m_120',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], - ['fg_5f256_121',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], - ['file_122',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], - ['filehash_5fstyles_123',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], - ['fmt_124',['fmt',['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt']]], - ['format_125',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], - ['format_5fcomment_126',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], - ['func_127',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], - ['funchash_5fstyles_128',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] + ['fg_5f16m_122',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], + ['fg_5f256_123',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], + ['file_124',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], + ['filehash_5fstyles_125',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], + ['filename_126',['filename',['../classclutchlog.html#a82b9375728af2d962831a743d95f4ae7',1,'clutchlog']]], + ['fmt_127',['fmt',['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt']]], + ['format_128',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], + ['format_5fcomment_129',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], + ['func_130',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], + ['funchash_5fstyles_131',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] ]; diff --git a/docs/search/functions_4.js b/docs/search/functions_4.js index 007774f..94d08f7 100644 --- a/docs/search/functions_4.js +++ b/docs/search/functions_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['is_5fset_129',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] + ['is_5fset_132',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] ]; diff --git a/docs/search/functions_5.js b/docs/search/functions_5.js index df8c2ff..363dae5 100644 --- a/docs/search/functions_5.js +++ b/docs/search/functions_5.js @@ -1,10 +1,10 @@ var searchData= [ - ['level_5fof_130',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], - ['levels_131',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], - ['line_132',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], - ['locate_133',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], - ['location_134',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], - ['log_135',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], - ['logger_136',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] + ['level_5fof_133',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], + ['levels_134',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], + ['line_135',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], + ['locate_136',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], + ['location_137',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], + ['log_138',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], + ['logger_139',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] ]; diff --git a/docs/search/functions_6.js b/docs/search/functions_6.js index 1f7d753..08fcb6f 100644 --- a/docs/search/functions_6.js +++ b/docs/search/functions_6.js @@ -1,5 +1,5 @@ var searchData= [ - ['operator_28_29_137',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], - ['out_138',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] + ['operator_28_29_140',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], + ['out_141',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] ]; diff --git a/docs/search/functions_7.js b/docs/search/functions_7.js index e2c9df8..93b995b 100644 --- a/docs/search/functions_7.js +++ b/docs/search/functions_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['print_5fon_139',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] + ['print_5fon_142',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] ]; diff --git a/docs/search/functions_8.js b/docs/search/functions_8.js index e49296e..bf04779 100644 --- a/docs/search/functions_8.js +++ b/docs/search/functions_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['replace_140',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] + ['replace_143',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] ]; diff --git a/docs/search/functions_9.js b/docs/search/functions_9.js index f14f868..2fa02c1 100644 --- a/docs/search/functions_9.js +++ b/docs/search/functions_9.js @@ -1,6 +1,6 @@ var searchData= [ - ['scope_5ft_141',['scope_t',['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t']]], - ['str_142',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], - ['style_143',['style',['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] + ['scope_5ft_144',['scope_t',['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t']]], + ['str_145',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], + ['style_146',['style',['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] ]; diff --git a/docs/search/functions_a.js b/docs/search/functions_a.js index f208321..76e1c6c 100644 --- a/docs/search/functions_a.js +++ b/docs/search/functions_a.js @@ -1,4 +1,4 @@ var searchData= [ - ['threshold_144',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]] + ['threshold_147',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]] ]; diff --git a/docs/search/groups_0.js b/docs/search/groups_0.js index 9a760b0..14df792 100644 --- a/docs/search/groups_0.js +++ b/docs/search/groups_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_195',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]] + ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_200',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]] ]; diff --git a/docs/search/groups_1.js b/docs/search/groups_1.js index 5385ac5..18748e5 100644 --- a/docs/search/groups_1.js +++ b/docs/search/groups_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['default_20configuration_20management_196',['Default configuration management',['../group___default_config.html',1,'']]] + ['default_20configuration_20management_201',['Default configuration management',['../group___default_config.html',1,'']]] ]; diff --git a/docs/search/groups_2.js b/docs/search/groups_2.js index 1faaacb..af09b20 100644 --- a/docs/search/groups_2.js +++ b/docs/search/groups_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['formating_20tools_197',['Formating tools',['../group___formating.html',1,'']]] + ['formating_20tools_202',['Formating tools',['../group___formating.html',1,'']]] ]; diff --git a/docs/search/groups_3.js b/docs/search/groups_3.js index 10a7814..0ffa1f2 100644 --- a/docs/search/groups_3.js +++ b/docs/search/groups_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['high_2dlevel_20api_20macros_198',['High-level API macros',['../group___use_macros.html',1,'']]] + ['high_2dlevel_20api_20macros_203',['High-level API macros',['../group___use_macros.html',1,'']]] ]; diff --git a/docs/search/groups_4.js b/docs/search/groups_4.js index 8d5a78f..d53afb4 100644 --- a/docs/search/groups_4.js +++ b/docs/search/groups_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_199',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]] + ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_204',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]] ]; diff --git a/docs/search/groups_5.js b/docs/search/groups_5.js index e7a7c7f..ed6c036 100644 --- a/docs/search/groups_5.js +++ b/docs/search/groups_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['main_20class_200',['Main class',['../group___main.html',1,'']]] + ['main_20class_205',['Main class',['../group___main.html',1,'']]] ]; diff --git a/docs/search/pages_0.js b/docs/search/pages_0.js index ed42b7b..1be2024 100644 --- a/docs/search/pages_0.js +++ b/docs/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_201',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] + ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_206',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] ]; diff --git a/docs/search/related_0.js b/docs/search/related_0.js index 75eef0d..1716d1d 100644 --- a/docs/search/related_0.js +++ b/docs/search/related_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['operator_3c_3c_190',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]] + ['operator_3c_3c_195',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]] ]; diff --git a/docs/search/variables_0.js b/docs/search/variables_0.js index 3b8a1d2..1ece70e 100644 --- a/docs/search/variables_0.js +++ b/docs/search/variables_0.js @@ -1,17 +1,18 @@ var searchData= [ - ['_5ffilehash_5ffmts_145',['_filehash_fmts',['../classclutchlog.html#a2a334e009533744b52f01ef240a59e9d',1,'clutchlog']]], - ['_5fformat_5fdump_146',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], - ['_5fformat_5flog_147',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], - ['_5ffunchash_5ffmts_148',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], - ['_5fin_5ffile_149',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], - ['_5fin_5ffunc_150',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], - ['_5fin_5fline_151',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], - ['_5flevel_5ffmt_152',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], - ['_5flevel_5fshort_153',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], - ['_5flevel_5fword_154',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], - ['_5fout_155',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], - ['_5fstage_156',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], - ['_5fstrip_5fcalls_157',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], - ['_5fword_5flevel_158',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] + ['_5ffilehash_5ffmts_148',['_filehash_fmts',['../classclutchlog.html#a2a334e009533744b52f01ef240a59e9d',1,'clutchlog']]], + ['_5ffilename_149',['_filename',['../classclutchlog.html#a0431616914dbbecb908a794f5b46dada',1,'clutchlog']]], + ['_5fformat_5fdump_150',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], + ['_5fformat_5flog_151',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], + ['_5ffunchash_5ffmts_152',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], + ['_5fin_5ffile_153',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], + ['_5fin_5ffunc_154',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], + ['_5fin_5fline_155',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], + ['_5flevel_5ffmt_156',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], + ['_5flevel_5fshort_157',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], + ['_5flevel_5fword_158',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], + ['_5fout_159',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], + ['_5fstage_160',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], + ['_5fstrip_5fcalls_161',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], + ['_5fword_5flevel_162',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] ]; diff --git a/docs/search/variables_1.js b/docs/search/variables_1.js index 75b7fab..9c562a3 100644 --- a/docs/search/variables_1.js +++ b/docs/search/variables_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['back_159',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], - ['back_5f16m_160',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], - ['back_5f256_161',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]] + ['back_163',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], + ['back_5f16m_164',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], + ['back_5f256_165',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_2.js b/docs/search/variables_2.js index a8f7e53..51ce6d8 100644 --- a/docs/search/variables_2.js +++ b/docs/search/variables_2.js @@ -1,11 +1,11 @@ var searchData= [ - ['default_5fdepth_5fmark_162',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], - ['default_5fformat_163',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], - ['default_5fhfill_5fchar_164',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], - ['default_5fhfill_5fmax_165',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], - ['default_5fhfill_5fmin_166',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], - ['default_5fstrip_5fcalls_167',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], - ['dump_5fdefault_5fformat_168',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], - ['dump_5fdefault_5fsep_169',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] + ['default_5fdepth_5fmark_166',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], + ['default_5fformat_167',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], + ['default_5fhfill_5fchar_168',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], + ['default_5fhfill_5fmax_169',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], + ['default_5fhfill_5fmin_170',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], + ['default_5fstrip_5fcalls_171',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], + ['dump_5fdefault_5fformat_172',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], + ['dump_5fdefault_5fsep_173',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] ]; diff --git a/docs/search/variables_3.js b/docs/search/variables_3.js index 6186677..b61972b 100644 --- a/docs/search/variables_3.js +++ b/docs/search/variables_3.js @@ -1,6 +1,6 @@ var searchData= [ - ['fore_170',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], - ['fore_5f16m_171',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], - ['fore_5f256_172',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]] + ['fore_174',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], + ['fore_5f16m_175',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], + ['fore_5f256_176',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_4.js b/docs/search/variables_4.js index 03d3f81..0968584 100644 --- a/docs/search/variables_4.js +++ b/docs/search/variables_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['index_173',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]] + ['index_177',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]] ]; diff --git a/docs/search/variables_5.js b/docs/search/variables_5.js index 794a719..d8a2af2 100644 --- a/docs/search/variables_5.js +++ b/docs/search/variables_5.js @@ -1,5 +1,5 @@ var searchData= [ - ['matches_174',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], - ['mode_175',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] + ['matches_178',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], + ['mode_179',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_6.js b/docs/search/variables_6.js index 805e351..7fb85fc 100644 --- a/docs/search/variables_6.js +++ b/docs/search/variables_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['red_176',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]] + ['red_180',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]] ]; diff --git a/docs/search/variables_7.js b/docs/search/variables_7.js index a25bb1e..f18253a 100644 --- a/docs/search/variables_7.js +++ b/docs/search/variables_7.js @@ -1,5 +1,5 @@ var searchData= [ - ['stage_177',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], - ['style_178',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt']]] + ['stage_181',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], + ['style_182',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_8.js b/docs/search/variables_8.js index 455079e..2260ac2 100644 --- a/docs/search/variables_8.js +++ b/docs/search/variables_8.js @@ -1,5 +1,5 @@ var searchData= [ - ['there_179',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], - ['type_180',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]] + ['there_183',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], + ['type_184',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html index 9d3e70a..7b185bf 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html @@ -28,7 +28,7 @@ Logo
      clutchlog -  0.15 +  0.16
      diff --git a/docs/structclutchlog_1_1fmt_1_1bg__16_m.html b/docs/structclutchlog_1_1fmt_1_1bg__16_m.html index 8c209c5..22a9e70 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__16_m.html @@ -28,7 +28,7 @@ Logo
      clutchlog -  0.15 +  0.16
      @@ -113,7 +113,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__16_m.htm

      Detailed Description

      background in 256-colors mode.

      -

      Definition at line 674 of file clutchlog.h.

      +

      Definition at line 677 of file clutchlog.h.

      @@ -232,7 +232,7 @@ enum Definition at line 686 of file clutchlog.h.

      +

      Definition at line 689 of file clutchlog.h.

      @@ -269,7 +269,7 @@ enum Definition at line 694 of file clutchlog.h.

      +

      Definition at line 697 of file clutchlog.h.

      @@ -300,7 +300,7 @@ enum
      Warning
      Only encodes "no color", whatever is passed.
      -

      Definition at line 699 of file clutchlog.h.

      +

      Definition at line 702 of file clutchlog.h.

      diff --git a/docs/structclutchlog_1_1fmt_1_1bg__256-members.html b/docs/structclutchlog_1_1fmt_1_1bg__256-members.html index 56a5825..9fab318 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__256-members.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__256-members.html @@ -28,7 +28,7 @@ diff --git a/docs/structclutchlog_1_1fmt_1_1bg__256.html b/docs/structclutchlog_1_1fmt_1_1bg__256.html index b345c80..de835a5 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__256.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__256.html @@ -28,7 +28,7 @@ @@ -113,7 +113,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__256.html

      Detailed Description

      Background in 256-colors mode.

      -

      Definition at line 566 of file clutchlog.h.

      +

      Definition at line 569 of file clutchlog.h.

      Public Member Functions

      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      @@ -201,7 +201,7 @@ enum Definition at line 573 of file clutchlog.h.

      +

      Definition at line 576 of file clutchlog.h.

      @@ -232,7 +232,7 @@ enum
      Warning
      Only encodes "no color", whatever is passed.
      -

      Definition at line 578 of file clutchlog.h.

      +

      Definition at line 581 of file clutchlog.h.

      diff --git a/docs/structclutchlog_1_1fmt_1_1color-members.html b/docs/structclutchlog_1_1fmt_1_1color-members.html index 667e66c..8ffbea5 100644 --- a/docs/structclutchlog_1_1fmt_1_1color-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color-members.html @@ -28,7 +28,7 @@ diff --git a/docs/structclutchlog_1_1fmt_1_1color.html b/docs/structclutchlog_1_1fmt_1_1color.html index f6a6ed7..b66fd1c 100644 --- a/docs/structclutchlog_1_1fmt_1_1color.html +++ b/docs/structclutchlog_1_1fmt_1_1color.html @@ -28,7 +28,7 @@ @@ -109,7 +109,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color.html',

      Detailed Description

      Interface class for colors representation.

      -

      Definition at line 480 of file clutchlog.h.

      +

      Definition at line 483 of file clutchlog.h.

      Public Member Functions

      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      @@ -194,7 +194,7 @@ std::ostream &  diff --git a/docs/structclutchlog_1_1fmt_1_1color__16_m.html b/docs/structclutchlog_1_1fmt_1_1color__16_m.html index 34c58b2..ddb2451 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1color__16_m.html @@ -28,7 +28,7 @@ @@ -114,7 +114,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__16_m.

      Detailed Description

      Abstract base class for 16M colors objects (24-bits ANSI).

      -

      Definition at line 583 of file clutchlog.h.

      +

      Definition at line 586 of file clutchlog.h.

      Public Member Functions

      Definition at line 494 of file clutchlog.h.

      +

      Definition at line 497 of file clutchlog.h.

      diff --git a/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html index 6b0c6ad..c3d2dc3 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html @@ -28,7 +28,7 @@
      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      @@ -202,7 +202,7 @@ Additional Inherited Members -

      Definition at line 592 of file clutchlog.h.

      +

      Definition at line 595 of file clutchlog.h.

      @@ -263,7 +263,7 @@ Additional Inherited Members -

      Definition at line 601 of file clutchlog.h.

      +

      Definition at line 604 of file clutchlog.h.

      @@ -311,9 +311,9 @@ Additional Inherited Members -

      Definition at line 611 of file clutchlog.h.

      +

      Definition at line 614 of file clutchlog.h.

      -

      References red.

      +

      References red.

      @@ -333,9 +333,9 @@ Additional Inherited Members

      The encoded RGB indices.

      "No color" is encoded as -1.

      -

      Definition at line 587 of file clutchlog.h.

      +

      Definition at line 590 of file clutchlog.h.

      -

      Referenced by color_16M(), is_set(), and print_on().

      +

      Referenced by color_16M(), is_set(), and print_on().

      diff --git a/docs/structclutchlog_1_1fmt_1_1color__256-members.html b/docs/structclutchlog_1_1fmt_1_1color__256-members.html index 9844daa..ad6ae0c 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__256-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color__256-members.html @@ -28,7 +28,7 @@ diff --git a/docs/structclutchlog_1_1fmt_1_1color__256.html b/docs/structclutchlog_1_1fmt_1_1color__256.html index c3eeb2a..c52ec60 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__256.html +++ b/docs/structclutchlog_1_1fmt_1_1color__256.html @@ -28,7 +28,7 @@ @@ -114,7 +114,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__256.h

      Detailed Description

      Abstract base class for 256 colors objects (8-bits ANSI).

      -

      Definition at line 519 of file clutchlog.h.

      +

      Definition at line 522 of file clutchlog.h.

      Public Member Functions

      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      @@ -193,7 +193,7 @@ Additional Inherited Members -

      Definition at line 528 of file clutchlog.h.

      +

      Definition at line 531 of file clutchlog.h.

      @@ -240,7 +240,7 @@ Additional Inherited Members -

      Definition at line 535 of file clutchlog.h.

      +

      Definition at line 538 of file clutchlog.h.

      @@ -260,9 +260,9 @@ Additional Inherited Members

      The encoded color index in 4-bits ANSI.

      "No color" is encoded as -1.

      -

      Definition at line 523 of file clutchlog.h.

      +

      Definition at line 526 of file clutchlog.h.

      -

      Referenced by is_set(), and print_on().

      +

      Referenced by is_set(), and print_on().

      diff --git a/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html index 1fc68ff..a2dad5d 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html @@ -28,7 +28,7 @@ diff --git a/docs/structclutchlog_1_1fmt_1_1fg__16_m.html b/docs/structclutchlog_1_1fmt_1_1fg__16_m.html index ffdfbe2..a23ddfe 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__16_m.html @@ -28,7 +28,7 @@ @@ -113,7 +113,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__16_m.htm

      Detailed Description

      Foreground in 256-colors mode.

      -

      Definition at line 644 of file clutchlog.h.

      +

      Definition at line 647 of file clutchlog.h.

      Public Member Functions

      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      @@ -232,7 +232,7 @@ enum Definition at line 656 of file clutchlog.h.

      +

      Definition at line 659 of file clutchlog.h.

      @@ -269,7 +269,7 @@ enum Definition at line 664 of file clutchlog.h.

      +

      Definition at line 667 of file clutchlog.h.

      @@ -300,7 +300,7 @@ enum
      Warning
      Only encodes "no color", whatever is passed.
      -

      Definition at line 669 of file clutchlog.h.

      +

      Definition at line 672 of file clutchlog.h.

      diff --git a/docs/structclutchlog_1_1fmt_1_1fg__256-members.html b/docs/structclutchlog_1_1fmt_1_1fg__256-members.html index bb0ad86..4a20033 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__256-members.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__256-members.html @@ -28,7 +28,7 @@ diff --git a/docs/structclutchlog_1_1fmt_1_1fg__256.html b/docs/structclutchlog_1_1fmt_1_1fg__256.html index 6d68b30..1bf58d2 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__256.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__256.html @@ -28,7 +28,7 @@ @@ -113,7 +113,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__256.html

      Detailed Description

      Foreground in 256-colors mode.

      -

      Definition at line 549 of file clutchlog.h.

      +

      Definition at line 552 of file clutchlog.h.

      Public Member Functions

      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      @@ -201,7 +201,7 @@ enum Definition at line 556 of file clutchlog.h.

      +

      Definition at line 559 of file clutchlog.h.

      @@ -232,7 +232,7 @@ enum
      Warning
      Only encodes "no color", whatever is passed.
      -

      Definition at line 561 of file clutchlog.h.

      +

      Definition at line 564 of file clutchlog.h.

      diff --git a/docs/structclutchlog_1_1scope__t-members.html b/docs/structclutchlog_1_1scope__t-members.html index c17a89c..d690cfe 100644 --- a/docs/structclutchlog_1_1scope__t-members.html +++ b/docs/structclutchlog_1_1scope__t-members.html @@ -28,7 +28,7 @@ diff --git a/docs/structclutchlog_1_1scope__t.html b/docs/structclutchlog_1_1scope__t.html index 45885ae..c11b24b 100644 --- a/docs/structclutchlog_1_1scope__t.html +++ b/docs/structclutchlog_1_1scope__t.html @@ -28,7 +28,7 @@ @@ -100,7 +100,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1scope__t.html','');

      Detailed Description

      Structure holding a location matching.

      -

      Definition at line 1118 of file clutchlog.h.

      +

      Definition at line 1128 of file clutchlog.h.

      Public Member Functions

      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      diff --git a/docs/t-assert_8cpp_source.html b/docs/t-assert_8cpp_source.html index 26ec708..1fc9176 100644 --- a/docs/t-assert_8cpp_source.html +++ b/docs/t-assert_8cpp_source.html @@ -28,7 +28,7 @@ diff --git a/docs/t-color16_m_8cpp_source.html b/docs/t-color16_m_8cpp_source.html index 13f8741..bc24383 100644 --- a/docs/t-color16_m_8cpp_source.html +++ b/docs/t-color16_m_8cpp_source.html @@ -28,7 +28,7 @@ @@ -138,9 +138,9 @@ $(document).ready(function(){initNavTree('t-color16_m_8cpp_source.html',''); ini
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:389
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      @@ -137,9 +137,9 @@ $(document).ready(function(){initNavTree('t-color256_8cpp_source.html',''); init
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:389
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      @@ -136,11 +136,11 @@ $(document).ready(function(){initNavTree('t-color_8cpp_source.html',''); initRes
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      -
      bg
      Background color codes.
      Definition: clutchlog.h:421
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      +
      bg
      Background color codes.
      Definition: clutchlog.h:424
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:389
      -
      fg
      Foreground color codes.
      Definition: clutchlog.h:400
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      +
      fg
      Foreground color codes.
      Definition: clutchlog.h:403
      @@ -191,7 +191,7 @@ $(document).ready(function(){initNavTree('t-demo-extravagant_8cpp_source.html','
      101  // << "{funchash_fmt}"
      102  << bold("{msg}")
      103  // << discreet(" {hfill} ")
      -
      104  << "{depth_fmt} {hfill} "
      +
      104  << "{funchash_fmt} <-{hfill}"
      105  << fmt(dark,bg::none) << ""
      106  << fmt(fg::none,dark) << "{funchash_fmt}{func} "
      107  << fmt(lite,dark) << ""
      @@ -225,11 +225,11 @@ $(document).ready(function(){initNavTree('t-demo-extravagant_8cpp_source.html','
      level
      Available log levels.
      Definition: clutchlog.h:313
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      -
      bg
      Background color codes.
      Definition: clutchlog.h:421
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      +
      bg
      Background color codes.
      Definition: clutchlog.h:424
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:389
      -
      fg
      Foreground color codes.
      Definition: clutchlog.h:400
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      +
      fg
      Foreground color codes.
      Definition: clutchlog.h:403
      @@ -184,7 +184,7 @@ $(document).ready(function(){initNavTree('t-demo_8cpp_source.html',''); initResi
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      @@ -150,9 +150,9 @@ $(document).ready(function(){initNavTree('t-depth-delta_8cpp_source.html',''); i
      #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
      Log a message at the given level and with a given depth delta.
      Definition: clutchlog.h:81
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:389
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      diff --git a/docs/t-filename_8cpp_source.html b/docs/t-filename_8cpp_source.html new file mode 100644 index 0000000..3f00cb7 --- /dev/null +++ b/docs/t-filename_8cpp_source.html @@ -0,0 +1,136 @@ + + + + + + + +clutchlog: t-filename.cpp Source File + + + + + + + + + + + + + + +
      +
      +

      Public Member Functions

      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      clutchlog -  0.15 +  0.16
      + + + + + + +
      +
      clutchlog +  0.16 +
      +
      + + + + + + + + + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      + +
      + +
      +
      +
      t-filename.cpp
      +
      +
      +
      1 #include <iostream>
      +
      2 #include <limits>
      +
      3 
      +
      4 #include "../clutchlog/clutchlog.h"
      +
      5 
      +
      6 int main(/*const int argc, char* argv[]*/)
      +
      7 {
      +
      8  auto& log = clutchlog::logger();
      +
      9  log.format("{msg}\t= {filehash_fmt}{file}\n");
      +
      10  log.threshold(clutchlog::level::xdebug);
      +
      11 
      +
      12  log.filename(clutchlog::filename::path);
      +
      13  CLUTCHLOG(note,"clutchlog::filename::path");
      +
      14 
      +
      15  log.filename(clutchlog::filename::base);
      +
      16  CLUTCHLOG(note,"clutchlog::filename::base");
      +
      17 
      +
      18  log.filename(clutchlog::filename::dir);
      +
      19  CLUTCHLOG(note,"clutchlog::filename::dir");
      +
      20 
      +
      21  log.filename(clutchlog::filename::dirbase);
      +
      22  CLUTCHLOG(note,"clutchlog::filename::dirbase");
      +
      23 
      +
      24  log.filename(clutchlog::filename::stem);
      +
      25  CLUTCHLOG(note,"clutchlog::filename::stem");
      +
      26 
      +
      27  log.filename(clutchlog::filename::dirstem);
      +
      28  CLUTCHLOG(note,"clutchlog::filename::dirstem");
      +
      29 }
      +
      30 
      +
      31 
      +
      +
      +
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      +
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      + + + + diff --git a/docs/t-fmt-constructors_8cpp_source.html b/docs/t-fmt-constructors_8cpp_source.html index c781daa..1f181a8 100644 --- a/docs/t-fmt-constructors_8cpp_source.html +++ b/docs/t-fmt-constructors_8cpp_source.html @@ -28,7 +28,7 @@ Logo
      clutchlog -  0.15 +  0.16
      @@ -135,10 +135,10 @@ $(document).ready(function(){initNavTree('t-fmt-constructors_8cpp_source.html','
      45 
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      -
      bg
      Background color codes.
      Definition: clutchlog.h:421
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:389
      -
      fg
      Foreground color codes.
      Definition: clutchlog.h:400
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      +
      bg
      Background color codes.
      Definition: clutchlog.h:424
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      +
      fg
      Foreground color codes.
      Definition: clutchlog.h:403
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:376
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      #define CLUTCHLOG(LEVEL, WHAT)
      Log a message at the given level.
      Definition: clutchlog.h:98
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:389
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,8 +84,7 @@ $(document).ready(function(){initNavTree('annotated.html',''); initResizable();
      -
      -
      Class List
      +
      Class List
      Here are the classes, structs, unions and interfaces with brief descriptions:
      @@ -107,9 +106,7 @@ $(document).ready(function(){initNavTree('annotated.html',''); initResizable(); diff --git a/docs/classclutchlog-members.html b/docs/classclutchlog-members.html index f817574..8ea54b8 100644 --- a/docs/classclutchlog-members.html +++ b/docs/classclutchlog-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,92 +84,89 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl
      -
      -
      clutchlog Member List
      +
      clutchlog Member List

      This is the complete list of members for clutchlog, including all inherited members.

      - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - +
      _filehash_fmtsclutchlogprotected
      _filenameclutchlogprotected
      _filenameclutchlogprotected
      _format_dumpclutchlogprotected
      _format_logclutchlogprotected
      _format_logclutchlogprotected
      _funchash_fmtsclutchlogprotected
      _in_fileclutchlogprotected
      _in_fileclutchlogprotected
      _in_funcclutchlogprotected
      _in_lineclutchlogprotected
      _in_lineclutchlogprotected
      _level_fmtclutchlogprotected
      _level_shortclutchlogprotected
      _level_shortclutchlogprotected
      _level_wordclutchlogprotected
      _outclutchlogprotected
      _outclutchlogprotected
      _stageclutchlogprotected
      _strip_callsclutchlogprotected
      _strip_callsclutchlogprotected
      _word_levelclutchlogprotected
      base enum value (defined in clutchlog)clutchlog
      base enum value (defined in clutchlog)clutchlog
      clutchlog(clutchlog const &)=delete (defined in clutchlog)clutchlog
      clutchlog() (defined in clutchlog)clutchloginlineprivate
      clutchlog() (defined in clutchlog)clutchloginlineprivate
      critical enum value (defined in clutchlog)clutchlog
      debug enum value (defined in clutchlog)clutchlog
      debug enum value (defined in clutchlog)clutchlog
      default_depth_markclutchloginlineprotectedstatic
      default_formatclutchloginlineprotectedstatic
      default_formatclutchloginlineprotectedstatic
      default_hfill_charclutchloginlineprotectedstatic
      default_hfill_maxclutchloginlineprotectedstatic
      default_hfill_maxclutchloginlineprotectedstatic
      default_hfill_minclutchloginlineprotectedstatic
      default_strip_callsclutchloginlineprotectedstatic
      default_strip_callsclutchloginlineprotectedstatic
      depth_styles(std::vector< fmt > styles)clutchloginline
      dir enum value (defined in clutchlog)clutchlog
      dir enum value (defined in clutchlog)clutchlog
      dirbase enum value (defined in clutchlog)clutchlog
      dirstem enum value (defined in clutchlog)clutchlog
      dirstem enum value (defined in clutchlog)clutchlog
      dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) constclutchloginline
      dump_default_formatclutchloginlineprotectedstatic
      dump_default_formatclutchloginlineprotectedstatic
      dump_default_sepclutchloginlineprotectedstatic
      error enum value (defined in clutchlog)clutchlog
      error enum value (defined in clutchlog)clutchlog
      file(std::string file)clutchloginline
      filehash_styles(std::vector< fmt > styles)clutchloginline
      filehash_styles(std::vector< fmt > styles)clutchloginline
      filename enum nameclutchlog
      filename(filename f)clutchloginline
      filename(filename f)clutchloginline
      format(const std::string &format)clutchloginline
      format() constclutchloginline
      format() constclutchloginline
      format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline
      format_comment(const std::string &format)clutchloginline
      format_comment(const std::string &format)clutchloginline
      format_comment() constclutchloginline
      func(std::string func)clutchloginline
      func(std::string func)clutchloginline
      funchash_styles(std::vector< fmt > styles)clutchloginline
      info enum value (defined in clutchlog)clutchlog
      info enum value (defined in clutchlog)clutchlog
      level enum nameclutchlog
      level_of(const std::string name)clutchloginline
      levels() constclutchloginline
      line(std::string line)clutchloginline
      level_of(const std::string name)clutchloginline
      levels() constclutchloginline
      line(std::string line)clutchloginline
      locate(const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline
      location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")clutchloginline
      location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")clutchloginline
      log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) constclutchloginline
      logger()clutchloginlinestatic
      logger()clutchloginlinestatic
      note enum value (defined in clutchlog)clutchlog
      operator=(clutchlog const &)=delete (defined in clutchlog)clutchlog
      operator=(clutchlog const &)=delete (defined in clutchlog)clutchlog
      out(std::ostream &out)clutchloginline
      out()clutchloginline
      out()clutchloginline
      path enum value (defined in clutchlog)clutchlog
      progress enum value (defined in clutchlog)clutchlog
      progress enum value (defined in clutchlog)clutchlog
      replace(const std::string &form, const std::string &mark, const std::string &tag) constclutchloginline
      replace(const std::string &form, const std::string &mark, const size_t tag) constclutchloginline
      replace(const std::string &form, const std::string &mark, const size_t tag) constclutchloginline
      stem enum value (defined in clutchlog)clutchlog
      style(level stage, FMT... styles)clutchloginline
      style(level stage, FMT... styles)clutchloginline
      style(level stage, fmt style)clutchloginline
      style(level stage) constclutchloginline
      style(level stage) constclutchloginline
      threshold(level l)clutchloginline
      threshold(const std::string &l)clutchloginline
      threshold(const std::string &l)clutchloginline
      threshold() constclutchloginline
      warning enum value (defined in clutchlog)clutchlog
      warning enum value (defined in clutchlog)clutchlog
      xdebug enum value (defined in clutchlog)clutchlog
      diff --git a/docs/classclutchlog.html b/docs/classclutchlog.html index 31e86fb..a7e611c 100644 --- a/docs/classclutchlog.html +++ b/docs/classclutchlog.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog Class Reference @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -87,8 +87,7 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl -
      -
      clutchlog Class Reference
      +
      clutchlog Class Reference
      @@ -97,38 +96,32 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl

      #include <clutchlog.h>

      Detailed Description

      -

      The single class which holds everything.

      -

      This is a Singleton class.

      +

      The single class which holds everything.

      +

      This is a Singleton class.

      -

      Definition at line 187 of file clutchlog.h.

      +

      Definition at line 188 of file clutchlog.h.

      - - - + + - - + + - - + + - - + + - - + + - - - + + + @@ -138,120 +131,96 @@ std::ostream &  - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - +

      +

      Public Member Functions

      Configuration accessors
      -void format (const std::string &format)
       Set the template string.
      void format (const std::string &format)
       Set the template string. More...
       
      -std::string format () const
       Get the template string.
      std::string format () const
       Get the template string. More...
       
      -void format_comment (const std::string &format)
       Set the template string for dumps.
      void format_comment (const std::string &format)
       Set the template string for dumps. More...
       
      -std::string format_comment () const
       Get the template string for dumps.
      std::string format_comment () const
       Get the template string for dumps. More...
       
      -void out (std::ostream &out)
       Set the output stream on which to print.
      void out (std::ostream &out)
       Set the output stream on which to print. More...
       
      -std::ostream & out ()
       Get the output stream on which to print.
       
      std::ostream & out ()
       Get the output stream on which to print. More...
       
      void filehash_styles (std::vector< fmt > styles)
       Set the candidate styles for value-dependant file name formatting. More...
       
      void depth_styles (std::vector< fmt > styles)
       Set the styles for value-dependant depth formatting. More...
       
      -void threshold (level l)
       Set the log level (below which logs are not printed) with an identifier.
      void threshold (level l)
       Set the log level (below which logs are not printed) with an identifier. More...
       
      -void threshold (const std::string &l)
       Set the log level (below which logs are not printed) with a string.
      void threshold (const std::string &l)
       Set the log level (below which logs are not printed) with a string. More...
       
      -level threshold () const
       Get the log level below which logs are not printed.
      level threshold () const
       Get the log level below which logs are not printed. More...
       
      -const std::map< std::string, level > & levels () const
       Get the map of available log levels string representations toward their identifier. *‍/.
       
      const std::map< std::string, level > & levels () const
       Get the map of available log levels string representations toward their identifier. *‍/. More...
       
      level level_of (const std::string name)
       Return the log level tag corresponding to the given pre-configured name. More...
       
      -void file (std::string file)
       Set the regular expression filtering the file location.
      void file (std::string file)
       Set the regular expression filtering the file location. More...
       
      -void func (std::string func)
       Set the regular expression filtering the function location.
      void func (std::string func)
       Set the regular expression filtering the function location. More...
       
      -void line (std::string line)
       Set the regular expression filtering the line location.
      void line (std::string line)
       Set the regular expression filtering the line location. More...
       
      -void location (const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
       Set the regular expressions filtering the location.
      void location (const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
       Set the regular expressions filtering the location. More...
       
      template<class ... FMT>
      void style (level stage, FMT... styles)
       Set the style (color and typo) of the given log level. More...
       
      -void style (level stage, fmt style)
       Set the style (color and typo) of the given log level, passing a fmt instance.
      void style (level stage, fmt style)
       Set the style (color and typo) of the given log level, passing a fmt instance. More...
       
      -fmt style (level stage) const
       Get the configured fmt instance of the given log level.
      fmt style (level stage) const
       Get the configured fmt instance of the given log level. More...
       
      -void filename (filename f)
       Sets the file naming scheme. *‍/.
      void filename (filename f)
       Sets the file naming scheme. *‍/. More...
       
      Low-level API
      -scope_t locate (const level &stage, const std::string &file, const std::string &func, const size_t line) const
       Gather information on the current location of the call.
      scope_t locate (const level &stage, const std::string &file, const std::string &func, const size_t line) const
       Gather information on the current location of the call. More...
       
      std::string replace (const std::string &form, const std::string &mark, const std::string &tag) const
       Replace mark by tag in form. More...
       
      -std::string replace (const std::string &form, const std::string &mark, const size_t tag) const
       Replace mark by tag in form, converting tag to its string representation first.
      std::string replace (const std::string &form, const std::string &mark, const size_t tag) const
       Replace mark by tag in form, converting tag to its string representation first. More...
       
      -std::string format (std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
       Substitute all tags in the format string with the corresponding information and apply the style corresponding to the log level.
      std::string format (std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
       Substitute all tags in the format string with the corresponding information and apply the style corresponding to the log level. More...
       
      -void log (const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
       Print a log message IF the location matches the given one.
      void log (const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
       Print a log message IF the location matches the given one. More...
       
      -template<class In >
      template<class In >
      void dump (const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
       Dump a serializable container after a comment line with log information.
       Dump a serializable container after a comment line with log information. More...
       
      - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +

      +

      Static Protected Attributes

      Default configuration members
      -static std::string default_format = CLUTCHLOG_DEFAULT_FORMAT
       Default format of the messages.
      static std::string default_format = CLUTCHLOG_DEFAULT_FORMAT
       Default format of the messages. More...
       
      -static std::string dump_default_format = CLUTCHDUMP_DEFAULT_FORMAT
       Default format of the comment line in file dump.
      static std::string dump_default_format = CLUTCHDUMP_DEFAULT_FORMAT
       Default format of the comment line in file dump. More...
       
      -static std::string dump_default_sep = CLUTCHDUMP_DEFAULT_SEP
       Default item separator for dump.
      static std::string dump_default_sep = CLUTCHDUMP_DEFAULT_SEP
       Default item separator for dump. More...
       
      -static std::string default_depth_mark = CLUTCHLOG_DEFAULT_DEPTH_MARK
       Default mark for stack depth.
      static std::string default_depth_mark = CLUTCHLOG_DEFAULT_DEPTH_MARK
       Default mark for stack depth. More...
       
      -static unsigned int default_strip_calls = CLUTCHLOG_STRIP_CALLS
       Number of call stack levels to remove from depth display by default.
      static unsigned int default_strip_calls = CLUTCHLOG_STRIP_CALLS
       Number of call stack levels to remove from depth display by default. More...
       
      -static char default_hfill_char = CLUTCHLOG_DEFAULT_HFILL_MARK
       Default character used as a filling for right-align the right part of messages with "{hfill}".
      static char default_hfill_char = CLUTCHLOG_DEFAULT_HFILL_MARK
       Default character used as a filling for right-align the right part of messages with "{hfill}". More...
       
      -static size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX
       Default maximum width (number of characters) for which to fill for right-aligning the right part of messages (using "{hfill}").
      static size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX
       Default maximum width (number of characters) for which to fill for right-aligning the right part of messages (using "{hfill}"). More...
       
      -static size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN
       Default minimum width (number of characters) at which to fill for right-aligning the right part of messages (using "{hfill}").
      static size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN
       Default minimum width (number of characters) at which to fill for right-aligning the right part of messages (using "{hfill}"). More...
       
      - @@ -260,113 +229,95 @@ Classes

      +

      Classes

      class  fmt
       Color and style formatter for ANSI terminal escape sequences. More...
       Structure holding a location matching. More...
       
      - - + - + - - + - - - + + +

      -High-level API

      enum  level {
      -  critical =0, -error =1, -warning =2, -progress =3, -
      -  note =4, -info =5, -debug =6, -xdebug =7 +

      High-level API

      enum  level {
      +  critical =0 +, error =1 +, warning =2 +, progress =3 +,
      +  note =4 +, info =5 +, debug =6 +, xdebug =7
      }
       Available log levels.
       Available log levels. More...
       
      enum  filename {
      -  path, -base, -dir, -dirbase, -
      -  stem, -dirstem +
      enum  filename {
      +  path +, base +, dir +, dirbase +,
      +  stem +, dirstem
      }
       Available filename rendering methods.
       Available filename rendering methods. More...
       
      static clutchloglogger ()
       Get the logger instance. More...
       
      static clutchloglogger ()
       Get the logger instance. More...
       
      - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - +

      -Internal details

      -size_t _strip_calls
       Current number of call stack levels to remove from depth display.

      Internal details

      size_t _strip_calls
       Current number of call stack levels to remove from depth display. More...
       
      -const std::map< level, std::string > _level_word
       Dictionary of level identifier to their string representation.
      const std::map< level, std::string > _level_word
       Dictionary of level identifier to their string representation. More...
       
      -std::map< std::string, level_word_level
       Dictionary of level string to their identifier.
      std::map< std::string, level_word_level
       Dictionary of level string to their identifier. More...
       
      -std::map< level, std::string > _level_short
       dictionary of level identifier to their 4-letters representation.
      std::map< level, std::string > _level_short
       dictionary of level identifier to their 4-letters representation. More...
       
      -std::map< level, fmt_level_fmt
       Dictionary of level identifier to their format.
      std::map< level, fmt_level_fmt
       Dictionary of level identifier to their format. More...
       
      -std::string _format_log
       Current format of the standard output.
      std::string _format_log
       Current format of the standard output. More...
       
      -std::string _format_dump
       Current format of the file output.
      std::string _format_dump
       Current format of the file output. More...
       
      -std::ostream * _out
       Standard output.
      std::ostream * _out
       Standard output. More...
       
      -level _stage
       Current log level.
      level _stage
       Current log level. More...
       
      -std::regex _in_file
       Current file location filter.
      std::regex _in_file
       Current file location filter. More...
       
      -std::regex _in_func
       Current function location filter.
      std::regex _in_func
       Current function location filter. More...
       
      -std::regex _in_line
       Current line location filter.
      std::regex _in_line
       Current line location filter. More...
       
      -std::vector< fmt_filehash_fmts
       List of candidate format objects for value-dependant file name styling.
      std::vector< fmt_filehash_fmts
       List of candidate format objects for value-dependant file name styling. More...
       
      -std::vector< fmt_funchash_fmts
       List of candidate format objects for value-dependant function name styling.
      std::vector< fmt_funchash_fmts
       List of candidate format objects for value-dependant function name styling. More...
       
      -filename _filename
       Filename rendering method.
      filename _filename
       Filename rendering method. More...
       
      +
       clutchlog (clutchlog const &)=delete
       
      +
      void operator= (clutchlog const &)=delete
       
      clutchlog ()
       clutchlog ()
       
      -

      Member Function Documentation

      - -

      ◆ logger()

      +

      Constructor & Destructor Documentation

      + +

      ◆ clutchlog()

      +

      Member Function Documentation

      + +

      ◆ logger()

      + +
      +
      + + +
      + + + @@ -389,13 +368,210 @@ void  + + +
      static clutchlog & clutchlog::logger ( ) operator= (

      Get the logger instance.

      -
      +
      +
      void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
      Print a log message IF the location matches the given one.
      Definition: clutchlog.h:1413
      +
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:307
      -

      Definition at line 306 of file clutchlog.h.

      +

      Definition at line 307 of file clutchlog.h.

      - + +

      ◆ format() [1/3]

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::format (const std::string & format)
      +
      +inline
      +
      + +

      Set the template string.

      + +

      Definition at line 986 of file clutchlog.h.

      + +

      References _format_log, and format().

      + +

      Referenced by format().

      + +
      +
      + +

      ◆ format() [2/3]

      + +
      +
      + + + + + +
      + + + + + + + +
      std::string clutchlog::format () const
      +
      +inline
      +
      + +

      Get the template string.

      + +

      Definition at line 988 of file clutchlog.h.

      + +

      References _format_log.

      + +

      Referenced by dump(), format_comment(), and log().

      + +
      +
      + +

      ◆ format_comment() [1/2]

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::format_comment (const std::string & format)
      +
      +inline
      +
      + +

      Set the template string for dumps.

      + +

      Definition at line 991 of file clutchlog.h.

      + +

      References _format_dump, and format().

      + +
      +
      + +

      ◆ format_comment() [2/2]

      + +
      +
      + + + + + +
      + + + + + + + +
      std::string clutchlog::format_comment () const
      +
      +inline
      +
      + +

      Get the template string for dumps.

      + +

      Definition at line 993 of file clutchlog.h.

      + +

      References _format_dump.

      + +
      +
      + +

      ◆ out() [1/2]

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::out (std::ostream & out)
      +
      +inline
      +
      + +

      Set the output stream on which to print.

      + +

      Definition at line 996 of file clutchlog.h.

      + +

      References _out, and out().

      + +

      Referenced by out().

      + +
      +
      + +

      ◆ out() [2/2]

      + +
      +
      + + + + + +
      + + + + + + + +
      std::ostream & clutchlog::out ()
      +
      +inline
      +
      + +

      Get the output stream on which to print.

      + +

      Definition at line 998 of file clutchlog.h.

      + +

      References _out.

      + +
      +
      +

      ◆ filehash_styles()

      @@ -420,16 +596,16 @@ void 
      operator= ( - +

      ◆ funchash_styles()

      @@ -454,16 +630,16 @@ void 
      operator= ( - +

      ◆ depth_styles()

      @@ -488,14 +664,140 @@ void 
      operator= ( - + +

      ◆ threshold() [1/3]

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::threshold (level l)
      +
      +inline
      +
      + +

      Set the log level (below which logs are not printed) with an identifier.

      + +

      Definition at line 1067 of file clutchlog.h.

      + +

      References _stage.

      + +
      +
      + +

      ◆ threshold() [2/3]

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::threshold (const std::string & l)
      +
      +inline
      +
      + +

      Set the log level (below which logs are not printed) with a string.

      + +

      Definition at line 1069 of file clutchlog.h.

      + +

      References _stage, and level_of().

      + +
      +
      + +

      ◆ threshold() [3/3]

      + +
      +
      + + + + + +
      + + + + + + + +
      level clutchlog::threshold () const
      +
      +inline
      +
      + +

      Get the log level below which logs are not printed.

      + +

      Definition at line 1071 of file clutchlog.h.

      + +

      References _stage.

      + +
      +
      + +

      ◆ levels()

      + +
      +
      + + + + + +
      + + + + + + + +
      const std::map< std::string, level > & clutchlog::levels () const
      +
      +inline
      +
      + +

      Get the map of available log levels string representations toward their identifier. *‍/.

      + +

      Definition at line 1073 of file clutchlog.h.

      + +

      References _word_level.

      + +
      +
      +

      ◆ level_of()

      @@ -522,16 +824,166 @@ void 
      operator= (Return the log level tag corresponding to the given pre-configured name.

      Note
      This is case sensitive, see the pre-configured _level_word.
      -

      Definition at line 1077 of file clutchlog.h.

      +

      Definition at line 1079 of file clutchlog.h.

      -

      References _word_level.

      +

      References _word_level.

      -

      Referenced by threshold().

      +

      Referenced by threshold().

      - -

      ◆ style()

      + +

      ◆ file()

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::file (std::string file)
      +
      +inline
      +
      + +

      Set the regular expression filtering the file location.

      + +

      Definition at line 1090 of file clutchlog.h.

      + +

      References _in_file, and file().

      + +

      Referenced by dump(), file(), format(), locate(), location(), and log().

      + +
      +
      + +

      ◆ func()

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::func (std::string func)
      +
      +inline
      +
      + +

      Set the regular expression filtering the function location.

      + +

      Definition at line 1092 of file clutchlog.h.

      + +

      References _in_func, and func().

      + +

      Referenced by dump(), format(), func(), locate(), location(), and log().

      + +
      +
      + +

      ◆ line()

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::line (std::string line)
      +
      +inline
      +
      + +

      Set the regular expression filtering the line location.

      + +

      Definition at line 1094 of file clutchlog.h.

      + +

      References _in_line, and line().

      + +

      Referenced by dump(), format(), line(), locate(), location(), and log().

      + +
      +
      + +

      ◆ location()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void clutchlog::location (const std::string & in_file,
      const std::string & in_function = ".*",
      const std::string & in_line = ".*" 
      )
      +
      +inline
      +
      + +

      Set the regular expressions filtering the location.

      + +

      Definition at line 1097 of file clutchlog.h.

      + +

      References file(), func(), and line().

      + +
      +
      + +

      ◆ style() [1/3]

      @@ -567,18 +1019,182 @@ template<class ... FMT>

      Set the style (color and typo) of the given log level.

      -

      This version accept style arguments as if they were passed to clutchlog::fmt.

      +

      This version accept style arguments as if they were passed to clutchlog::fmt.

      -

      Definition at line 1111 of file clutchlog.h.

      +

      Definition at line 1113 of file clutchlog.h.

      -

      References style().

      +

      References style().

      -

      Referenced by style().

      +

      Referenced by style().

      - -

      ◆ replace()

      + +

      ◆ style() [2/3]

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      void clutchlog::style (level stage,
      fmt style 
      )
      +
      +inline
      +
      + +

      Set the style (color and typo) of the given log level, passing a fmt instance.

      + +

      Definition at line 1115 of file clutchlog.h.

      + +

      References _level_fmt, and style().

      + +

      Referenced by style().

      + +
      +
      + +

      ◆ style() [3/3]

      + +
      +
      + + + + + +
      + + + + + + + + +
      fmt clutchlog::style (level stage) const
      +
      +inline
      +
      + +

      Get the configured fmt instance of the given log level.

      + +

      Definition at line 1117 of file clutchlog.h.

      + +

      References _level_fmt.

      + +
      +
      + +

      ◆ filename()

      + +
      +
      + + + + + +
      + + + + + + + + +
      void clutchlog::filename (filename f)
      +
      +inline
      +
      + +

      Sets the file naming scheme. *‍/.

      + +

      Definition at line 1120 of file clutchlog.h.

      + +

      References _filename.

      + +
      +
      + +

      ◆ locate()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      scope_t clutchlog::locate (const levelstage,
      const std::string & file,
      const std::string & func,
      const size_t line 
      ) const
      +
      +inline
      +
      + +

      Gather information on the current location of the call.

      + +

      Definition at line 1154 of file clutchlog.h.

      + +

      References _in_file, _in_func, _in_line, _stage, _strip_calls, file(), func(), line(), clutchlog::scope_t::matches, clutchlog::scope_t::stage, and clutchlog::scope_t::there.

      + +

      Referenced by dump(), and log().

      + +
      +
      + +

      ◆ replace() [1/2]

      @@ -618,12 +1234,938 @@ template<class ... FMT>

      Replace mark by tag in form.

      -
      log.replace("{greet} {world}", "\\{greet\\}", "hello");
      +
      log.replace("{greet} {world}", "\\{greet\\}", "hello");
      // returns "hello {world}"
      -

      Definition at line 1203 of file clutchlog.h.

      +

      Definition at line 1205 of file clutchlog.h.

      -

      Referenced by dump(), format(), and replace().

      +

      Referenced by dump(), format(), and replace().

      + +
      +
      + +

      ◆ replace() [2/2]

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      std::string clutchlog::replace (const std::string & form,
      const std::string & mark,
      const size_t tag 
      ) const
      +
      +inline
      +
      + +

      Replace mark by tag in form, converting tag to its string representation first.

      + +

      Definition at line 1270 of file clutchlog.h.

      + +

      References replace().

      + +
      +
      + +

      ◆ format() [3/3]

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      std::string clutchlog::format (std::string row,
      const std::string & what,
      const levelstage,
      const std::string & file,
      const std::string & func,
      const size_t line 
      ) const
      +
      +inline
      +
      + +

      Substitute all tags in the format string with the corresponding information and apply the style corresponding to the log level.

      + +

      Definition at line 1281 of file clutchlog.h.

      + +

      References _filehash_fmts, _filename, _funchash_fmts, _level_fmt, _level_short, _level_word, _strip_calls, file(), func(), line(), and replace().

      + +
      +
      + +

      ◆ log()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      void clutchlog::log (const levelstage,
      const std::string & what,
      const std::string & file,
      const std::string & func,
      const size_t line,
      const size_t depth_delta = 0 
      ) const
      +
      +inline
      +
      + +

      Print a log message IF the location matches the given one.

      + +

      Definition at line 1413 of file clutchlog.h.

      + +

      References _format_log, _out, file(), format(), func(), line(), locate(), and clutchlog::scope_t::matches.

      + +
      +
      + +

      ◆ dump()

      + +
      +
      +
      +template<class In >
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      void clutchlog::dump (const levelstage,
      const In container_begin,
      const In container_end,
      const std::string & file,
      const std::string & func,
      const size_t line,
      const std::string & filename_template = "dump_{n}.dat",
      const std::string sep = dump_default_sep 
      ) const
      +
      +inline
      +
      + +

      Dump a serializable container after a comment line with log information.

      + +

      Definition at line 1438 of file clutchlog.h.

      + +

      References _format_dump, file(), format(), func(), line(), locate(), clutchlog::scope_t::matches, and replace().

      + +
      +
      +

      Member Data Documentation

      + +

      ◆ default_format

      + +
      +
      + + + + + +
      + + + + +
      std::string clutchlog::default_format = CLUTCHLOG_DEFAULT_FORMAT
      +
      +inlinestaticprotected
      +
      + +

      Default format of the messages.

      + +

      Definition at line 224 of file clutchlog.h.

      + +
      +
      + +

      ◆ dump_default_format

      + +
      +
      + + + + + +
      + + + + +
      std::string clutchlog::dump_default_format = CLUTCHDUMP_DEFAULT_FORMAT
      +
      +inlinestaticprotected
      +
      + +

      Default format of the comment line in file dump.

      + +

      Definition at line 246 of file clutchlog.h.

      + +
      +
      + +

      ◆ dump_default_sep

      + +
      +
      + + + + + +
      + + + + +
      std::string clutchlog::dump_default_sep = CLUTCHDUMP_DEFAULT_SEP
      +
      +inlinestaticprotected
      +
      + +

      Default item separator for dump.

      + +

      Definition at line 253 of file clutchlog.h.

      + +
      +
      + +

      ◆ default_depth_mark

      + +
      +
      + + + + + +
      + + + + +
      std::string clutchlog::default_depth_mark = CLUTCHLOG_DEFAULT_DEPTH_MARK
      +
      +inlinestaticprotected
      +
      + +

      Default mark for stack depth.

      + +

      Definition at line 260 of file clutchlog.h.

      + +
      +
      + +

      ◆ default_strip_calls

      + +
      +
      + + + + + +
      + + + + +
      unsigned int clutchlog::default_strip_calls = CLUTCHLOG_STRIP_CALLS
      +
      +inlinestaticprotected
      +
      + +

      Number of call stack levels to remove from depth display by default.

      + +

      Definition at line 267 of file clutchlog.h.

      + +
      +
      + +

      ◆ default_hfill_char

      + +
      +
      + + + + + +
      + + + + +
      char clutchlog::default_hfill_char = CLUTCHLOG_DEFAULT_HFILL_MARK
      +
      +inlinestaticprotected
      +
      + +

      Default character used as a filling for right-align the right part of messages with "{hfill}".

      + +

      Definition at line 274 of file clutchlog.h.

      + +
      +
      + +

      ◆ default_hfill_max

      + +
      +
      + + + + + +
      + + + + +
      size_t clutchlog::default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX
      +
      +inlinestaticprotected
      +
      + +

      Default maximum width (number of characters) for which to fill for right-aligning the right part of messages (using "{hfill}").

      + +

      Definition at line 286 of file clutchlog.h.

      + +
      +
      + +

      ◆ default_hfill_min

      + +
      +
      + + + + + +
      + + + + +
      size_t clutchlog::default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN
      +
      +inlinestaticprotected
      +
      + +

      Default minimum width (number of characters) at which to fill for right-aligning the right part of messages (using "{hfill}").

      + +

      Definition at line 288 of file clutchlog.h.

      + +
      +
      + +

      ◆ _strip_calls

      + +
      +
      + + + + + +
      + + + + +
      size_t clutchlog::_strip_calls
      +
      +protected
      +
      + +

      Current number of call stack levels to remove from depth display.

      + +

      Definition at line 919 of file clutchlog.h.

      + +

      Referenced by format(), and locate().

      + +
      +
      + +

      ◆ _level_word

      + +
      +
      + + + + + +
      + + + + +
      const std::map<level,std::string> clutchlog::_level_word
      +
      +protected
      +
      + +

      Dictionary of level identifier to their string representation.

      + +

      Definition at line 921 of file clutchlog.h.

      + +

      Referenced by format().

      + +
      +
      + +

      ◆ _word_level

      + +
      +
      + + + + + +
      + + + + +
      std::map<std::string,level> clutchlog::_word_level
      +
      +protected
      +
      + +

      Dictionary of level string to their identifier.

      + +

      Definition at line 923 of file clutchlog.h.

      + +

      Referenced by level_of(), and levels().

      + +
      +
      + +

      ◆ _level_short

      + +
      +
      + + + + + +
      + + + + +
      std::map<level,std::string> clutchlog::_level_short
      +
      +protected
      +
      + +

      dictionary of level identifier to their 4-letters representation.

      + +

      Definition at line 925 of file clutchlog.h.

      + +

      Referenced by format().

      + +
      +
      + +

      ◆ _level_fmt

      + +
      +
      + + + + + +
      + + + + +
      std::map<level,fmt> clutchlog::_level_fmt
      +
      +protected
      +
      + +

      Dictionary of level identifier to their format.

      + +

      Definition at line 927 of file clutchlog.h.

      + +

      Referenced by format(), and style().

      + +
      +
      + +

      ◆ _format_log

      + +
      +
      + + + + + +
      + + + + +
      std::string clutchlog::_format_log
      +
      +protected
      +
      + +

      Current format of the standard output.

      + +

      Definition at line 929 of file clutchlog.h.

      + +

      Referenced by format(), and log().

      + +
      +
      + +

      ◆ _format_dump

      + +
      +
      + + + + + +
      + + + + +
      std::string clutchlog::_format_dump
      +
      +protected
      +
      + +

      Current format of the file output.

      + +

      Definition at line 931 of file clutchlog.h.

      + +

      Referenced by dump(), and format_comment().

      + +
      +
      + +

      ◆ _out

      + +
      +
      + + + + + +
      + + + + +
      std::ostream* clutchlog::_out
      +
      +protected
      +
      + +

      Standard output.

      + +

      Definition at line 943 of file clutchlog.h.

      + +

      Referenced by log(), and out().

      + +
      +
      + +

      ◆ _stage

      + +
      +
      + + + + + +
      + + + + +
      level clutchlog::_stage
      +
      +protected
      +
      + +

      Current log level.

      + +

      Definition at line 951 of file clutchlog.h.

      + +

      Referenced by locate(), and threshold().

      + +
      +
      + +

      ◆ _in_file

      + +
      +
      + + + + + +
      + + + + +
      std::regex clutchlog::_in_file
      +
      +protected
      +
      + +

      Current file location filter.

      + +

      Definition at line 953 of file clutchlog.h.

      + +

      Referenced by file(), and locate().

      + +
      +
      + +

      ◆ _in_func

      + +
      +
      + + + + + +
      + + + + +
      std::regex clutchlog::_in_func
      +
      +protected
      +
      + +

      Current function location filter.

      + +

      Definition at line 955 of file clutchlog.h.

      + +

      Referenced by func(), and locate().

      + +
      +
      + +

      ◆ _in_line

      + +
      +
      + + + + + +
      + + + + +
      std::regex clutchlog::_in_line
      +
      +protected
      +
      + +

      Current line location filter.

      + +

      Definition at line 957 of file clutchlog.h.

      + +

      Referenced by line(), and locate().

      + +
      +
      + +

      ◆ _filehash_fmts

      + +
      +
      + + + + + +
      + + + + +
      std::vector<fmt> clutchlog::_filehash_fmts
      +
      +protected
      +
      + +

      List of candidate format objects for value-dependant file name styling.

      + +

      Definition at line 960 of file clutchlog.h.

      + +

      Referenced by filehash_styles(), and format().

      + +
      +
      + +

      ◆ _funchash_fmts

      + +
      +
      + + + + + +
      + + + + +
      std::vector<fmt> clutchlog::_funchash_fmts
      +
      +protected
      +
      + +

      List of candidate format objects for value-dependant function name styling.

      + +

      Definition at line 962 of file clutchlog.h.

      + +

      Referenced by format(), and funchash_styles().

      + +
      +
      + +

      ◆ _filename

      + +
      +
      + + + + + +
      + + + + +
      filename clutchlog::_filename
      +
      +protected
      +
      + +

      Filename rendering method.

      + +

      Definition at line 977 of file clutchlog.h.

      + +

      Referenced by filename(), and format().

      + +
      +
      +

      Member Enumeration Documentation

      + +

      ◆ level

      + +
      +
      + + + + +
      enum clutchlog::level
      +
      + +

      Available log levels.

      + +

      Definition at line 314 of file clutchlog.h.

      + +
      +
      + +

      ◆ filename

      + +
      +
      + + + + +
      enum clutchlog::filename
      +
      + +

      Available filename rendering methods.

      + +

      Definition at line 317 of file clutchlog.h.

      @@ -632,15 +2174,11 @@ template<class ... FMT> -
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
      Print a log message IF the location matches the given one.
      Definition: clutchlog.h:1412
      diff --git a/docs/classclutchlog.js b/docs/classclutchlog.js index b0b820d..46fd783 100644 --- a/docs/classclutchlog.js +++ b/docs/classclutchlog.js @@ -1,23 +1,20 @@ var classclutchlog = [ [ "scope_t", "structclutchlog_1_1scope__t.html", "structclutchlog_1_1scope__t" ], - [ "clutchlog", "classclutchlog.html#a0906d74275cedcd403da94879764815e", null ], - [ "clutchlog", "classclutchlog.html#a03b145e36f15435a640bb5a885d9f642", null ], - [ "logger", "classclutchlog.html#acfaceb77da01503b432644a3efaee4fa", null ], - [ "operator=", "classclutchlog.html#aef653a9744a72a889ca8163269bb781e", null ], + [ "logger", "classclutchlog.html#a6e2a5e98fa9f722d90ba6515895543ac", null ], [ "format", "classclutchlog.html#a656c277e074b64728cca871f2b484d1c", null ], [ "format", "classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80", null ], [ "format_comment", "classclutchlog.html#a2144abe4ec6f630126b6490908b5f924", null ], [ "format_comment", "classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5", null ], [ "out", "classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d", null ], - [ "out", "classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266", null ], + [ "out", "classclutchlog.html#ab7773f031a00a05b8c83c1936406cb98", null ], [ "filehash_styles", "classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf", null ], [ "funchash_styles", "classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416", null ], [ "depth_styles", "classclutchlog.html#a08310b92e86687349e70f56f9ac1d656", null ], [ "threshold", "classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4", null ], [ "threshold", "classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9", null ], [ "threshold", "classclutchlog.html#ab45287cc9c14217904a13aff49573732", null ], - [ "levels", "classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a", null ], + [ "levels", "classclutchlog.html#a8d206443dea964f77965450a83693d98", null ], [ "level_of", "classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd", null ], [ "file", "classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c", null ], [ "func", "classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447", null ], diff --git a/docs/classclutchlog_1_1fmt-members.html b/docs/classclutchlog_1_1fmt-members.html index 9e3d430..4fb22b6 100644 --- a/docs/classclutchlog_1_1fmt-members.html +++ b/docs/classclutchlog_1_1fmt-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,58 +84,56 @@ $(document).ready(function(){initNavTree('classclutchlog_1_1fmt.html',''); initR
      -
      -
      clutchlog::fmt Member List
      +
      clutchlog::fmt Member List

      This is the complete list of members for clutchlog::fmt, including all inherited members.

      - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ansi enum nameclutchlog::fmt
      backclutchlog::fmt
      backclutchlog::fmt
      back_16Mclutchlog::fmtprotected
      back_256clutchlog::fmtprotected
      back_256clutchlog::fmtprotected
      bg enum nameclutchlog::fmt
      fg enum nameclutchlog::fmt
      fg enum nameclutchlog::fmt
      fmt()clutchlog::fmtinline
      fmt(fg f, bg b=bg::none, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(fg f, typo s, bg b=bg::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(bg b, fg f=fg::none, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(bg b, typo s, fg f=fg::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(typo s, fg f=fg::none, bg b=bg::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(typo s, bg b, fg f=fg::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(fg_256 f, bg_256 b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(fg_256 f, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(fg, bg_256 b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(const short fr, const short fg, const short fb, const short gr, const short gg, const short gb, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(fg, const short gr, const short gg, const short gb, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(const short fr, const short fg, const short fb, bg, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(const short fr, const short fg, const short fb, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(const std::string &f, const std::string &b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(fg, const std::string &b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(const std::string &f, bg, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      fmt(const std::string &f, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinline
      foreclutchlog::fmt
      fore_16Mclutchlog::fmtprotected
      fore_256clutchlog::fmtprotected
      hash(const std::string &str, const std::vector< fmt > domain={}) (defined in clutchlog::fmt)clutchlog::fmtinlinestatic
      modeclutchlog::fmt
      operator()(const std::string &msg) constclutchlog::fmtinline
      operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)clutchlog::fmtfriend
      operator<<(std::ostream &os, const typo &s)clutchlog::fmtfriend
      operator<<(std::ostream &os, const fmt &fmt)clutchlog::fmtfriend
      print_on(std::ostream &os) constclutchlog::fmtinlineprotected
      str() constclutchlog::fmtinline
      styleclutchlog::fmt
      typo enum nameclutchlog::fmt
      fmt(fg f, bg b=bg::none, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(fg f, typo s, bg b=bg::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(bg b, fg f=fg::none, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(bg b, typo s, fg f=fg::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(typo s, fg f=fg::none, bg b=bg::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(typo s, bg b, fg f=fg::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const short f, const short b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const short f, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(fg, const short b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const short f, bg, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const short fr, const short fg, const short fb, const short gr, const short gg, const short gb, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(fg, const short gr, const short gg, const short gb, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const short fr, const short fg, const short fb, bg, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const short fr, const short fg, const short fb, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const std::string &f, const std::string &b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(fg, const std::string &b, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const std::string &f, bg, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      fmt(const std::string &f, typo s=typo::none) (defined in clutchlog::fmt)clutchlog::fmtinlineexplicit
      foreclutchlog::fmt
      fore_16Mclutchlog::fmtprotected
      fore_256clutchlog::fmtprotected
      hash(const std::string &str, const std::vector< fmt > domain={}) (defined in clutchlog::fmt)clutchlog::fmtinlinestatic
      modeclutchlog::fmt
      operator()(const std::string &msg) constclutchlog::fmtinline
      operator<<clutchlog::fmtfriend
      operator<<clutchlog::fmtfriend
      operator<<clutchlog::fmtfriend
      print_on(std::ostream &os) constclutchlog::fmtinlineprotected
      str() constclutchlog::fmtinline
      styleclutchlog::fmt
      typo enum nameclutchlog::fmt
      diff --git a/docs/classclutchlog_1_1fmt.html b/docs/classclutchlog_1_1fmt.html index 55ecbbd..f949dfc 100644 --- a/docs/classclutchlog_1_1fmt.html +++ b/docs/classclutchlog_1_1fmt.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt Class Reference @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -94,8 +94,7 @@ $(document).ready(function(){initNavTree('classclutchlog_1_1fmt.html',''); initR Public Types | Friends | List of all members -
      -
      clutchlog::fmt Class Reference
      +
      clutchlog::fmt Class Reference
      @@ -111,14 +110,14 @@ $(document).ready(function(){initNavTree('classclutchlog_1_1fmt.html',''); initR
      [legend]

      Detailed Description

      -

      Color and style formatter for ANSI terminal escape sequences.

      -

      The formatter supports typographic "styles" and colors. Typographic styles are available as named tag in fmt::typo.

      -

      The formatter supports the three ANSI modes, which are automatically selected depending the argument types:

        +

        Color and style formatter for ANSI terminal escape sequences.

        +

        The formatter supports typographic "styles" and colors. Typographic styles are available as named tag in fmt::typo.

        +

        The formatter supports the three ANSI modes, which are automatically selected depending the argument types:

        • 16 colors (using named tags),
        • 256 colors (using integers),
        • 16 millions ("true") colors (using RGB integer triplets or web hex strings).
        -

        For 16-colors mode, colors are named tag in:

          +

          For 16-colors mode, colors are named tag in:

          @@ -154,128 +153,109 @@ $(document).ready(function(){initNavTree('classclutchlog_1_1fmt.html',''); initR
          All styles may not be supported by a given terminal/operating system.
          -

          Definition at line 379 of file clutchlog.h.

          +

          Definition at line 380 of file clutchlog.h.

        - - - + + - - + + - + - + - + - + - + - + - - - - - - + + + + + + + + - + - + - + - + - + - + - + - +

        +

        Public Member Functions

        fmt ()
         Empty constructor, only useful for a no-op formatter.
         fmt ()
         Empty constructor, only useful for a no-op formatter. More...
         
        std::string operator() (const std::string &msg) const
         Format the given string with the currently encoded format. More...
         
        -std::string str () const
         Return the formatting code as a string.
        std::string str () const
         Return the formatting code as a string. More...
         
        All combination of 16-colors mode constructors with different parameters orders.
        fmt (fg f, bg b=bg::none, typo s=typo::none)
         fmt (fg f, bg b=bg::none, typo s=typo::none)
         
        fmt (fg f, typo s, bg b=bg::none)
         fmt (fg f, typo s, bg b=bg::none)
         
        fmt (bg b, fg f=fg::none, typo s=typo::none)
         fmt (bg b, fg f=fg::none, typo s=typo::none)
         
        fmt (bg b, typo s, fg f=fg::none)
         fmt (bg b, typo s, fg f=fg::none)
         
        fmt (typo s, fg f=fg::none, bg b=bg::none)
         fmt (typo s, fg f=fg::none, bg b=bg::none)
         
        fmt (typo s, bg b, fg f=fg::none)
         fmt (typo s, bg b, fg f=fg::none)
         
        All combination of 256-colors mode constructors with different parameters orders.
        fmt (fg_256 f, bg_256 b, typo s=typo::none)
         
        fmt (fg_256 f, typo s=typo::none)
         
        fmt (fg, bg_256 b, typo s=typo::none)
         
         fmt (const short f, const short b, typo s=typo::none)
         
         fmt (const short f, typo s=typo::none)
         
         fmt (fg, const short b, typo s=typo::none)
         
         fmt (const short f, bg, typo s=typo::none)
         
        All combination of 16M-colors mode constructors with different parameters orders.
        fmt (const short fr, const short fg, const short fb, const short gr, const short gg, const short gb, typo s=typo::none)
         fmt (const short fr, const short fg, const short fb, const short gr, const short gg, const short gb, typo s=typo::none)
         
        fmt (fg, const short gr, const short gg, const short gb, typo s=typo::none)
         fmt (fg, const short gr, const short gg, const short gb, typo s=typo::none)
         
        fmt (const short fr, const short fg, const short fb, bg, typo s=typo::none)
         fmt (const short fr, const short fg, const short fb, bg, typo s=typo::none)
         
        fmt (const short fr, const short fg, const short fb, typo s=typo::none)
         fmt (const short fr, const short fg, const short fb, typo s=typo::none)
         
        fmt (const std::string &f, const std::string &b, typo s=typo::none)
         fmt (const std::string &f, const std::string &b, typo s=typo::none)
         
        fmt (fg, const std::string &b, typo s=typo::none)
         fmt (fg, const std::string &b, typo s=typo::none)
         
        fmt (const std::string &f, bg, typo s=typo::none)
         fmt (const std::string &f, bg, typo s=typo::none)
         
        fmt (const std::string &f, typo s=typo::none)
         fmt (const std::string &f, typo s=typo::none)
         
        - - +

        +

        Static Public Member Functions

        -static fmt hash (const std::string &str, const std::vector< fmt > domain={})
        static fmt hash (const std::string &str, const std::vector< fmt > domain={})
         
        - - + - + +enum clutchlog::fmt::fg  +enum clutchlog::fmt::bg 

        +

        Public Attributes

        -enum clutchlog::fmt::ansi mode
        +enum clutchlog::fmt::ansi mode
         Current ANSI color mode.
         
        -enum clutchlog::fmt::typo style
        +enum clutchlog::fmt::typo style
         Typographic style.
         
        -enum clutchlog::fmt::fg fore
        fore
         Foreground color.
         
        -enum clutchlog::fmt::bg back
        back
         Background color.
         
        - - - - + + +

        +

        Protected Member Functions

        -std::ostream & print_on (std::ostream &os) const
         Print the currently encoded format escape code on the given output stream.
         
        std::ostream & print_on (std::ostream &os) const
         Print the currently encoded format escape code on the given output stream. More...
         
        - +clutchlog::fmt::fg_256  +clutchlog::fmt::bg_256  +clutchlog::fmt::fg_16M  +clutchlog::fmt::bg_16M 

        +

        Protected Attributes

        -clutchlog::fmt::fg_256 fore_256
        fore_256
         Current foreground in 256-colors mode.
         
        -clutchlog::fmt::bg_256 back_256
        back_256
         Current background in 256-colors mode.
         
        -clutchlog::fmt::fg_16M fore_16M
        fore_16M
         Current foreground in 16M-colors mode.
         
        -clutchlog::fmt::bg_16M back_16M
        back_16M
         Current background in 16M-colors mode.
         
        - @@ -299,94 +279,990 @@ Classes

        +

        Classes

        struct  bg_16M
         background in 256-colors mode. More...
         Foreground in 256-colors mode. More...
         
        - - - - + - - + - - +

        +

        Public Types

        enum  ansi { ansi::colors_16 = -1, -ansi::colors_256 = 5, -ansi::colors_16M = 2 +
        enum class  ansi { colors_16 = -1 +, colors_256 = 5 +, colors_16M = 2 }
         ANSI code configuring the available number of colors. More...
         
        enum  typo {
        -  reset = 0, -bold = 1, -underline = 4, -inverse = 7, -
        +
        enum class  typo {
        +  reset = 0 +, bold = 1 +, underline = 4 +, inverse = 7 +,
          none = -1
        }
         Typographic style codes.
         Typographic style codes. More...
         
        enum  fg {
        -  black = 30, -red = 31, -green = 32, -yellow = 33, -
        -  blue = 34, -magenta = 35, -cyan = 36, -white = 37, -
        -  bright_black = 90, -bright_red = 91, -bright_green = 92, -bright_yellow = 93, -
        -  bright_blue = 94, -bright_magenta = 95, -bright_cyan = 96, -bright_white = 97, -
        +
        enum class  fg {
        +  black = 30 +, red = 31 +, green = 32 +, yellow = 33 +,
        +  blue = 34 +, magenta = 35 +, cyan = 36 +, white = 37 +,
        +  bright_black = 90 +, bright_red = 91 +, bright_green = 92 +, bright_yellow = 93 +,
        +  bright_blue = 94 +, bright_magenta = 95 +, bright_cyan = 96 +, bright_white = 97 +,
          none = -1
        }
         Foreground color codes.
         Foreground color codes. More...
         
        enum  bg {
        -  black = 40, -red = 41, -green = 42, -yellow = 43, -
        -  blue = 44, -magenta = 45, -cyan = 46, -white = 47, -
        -  bright_black = 100, -bright_red = 101, -bright_green = 102, -bright_yellow = 103, -
        -  bright_blue = 104, -bright_magenta = 105, -bright_cyan = 106, -bright_white = 107, -
        +
        enum class  bg {
        +  black = 40 +, red = 41 +, green = 42 +, yellow = 43 +,
        +  blue = 44 +, magenta = 45 +, cyan = 46 +, white = 47 +,
        +  bright_black = 100 +, bright_red = 101 +, bright_green = 102 +, bright_yellow = 103 +,
        +  bright_blue = 104 +, bright_magenta = 105 +, bright_cyan = 106 +, bright_white = 107 +,
          none = -1
        }
         Background color codes.
         Background color codes. More...
         
        - - - - - - - - - - + + + + + + + + +

        +

        Friends

        -std::ostream & operator<< (std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
         Output stream operator for a 3-tuple of 16-colors mode tags.
         
        -std::ostream & operator<< (std::ostream &os, const typo &s)
         Output stream operator for a typo tag alone, in 16-colors mode.
         
        std::ostream & operator<< (std::ostream &os, const fmt &fmt)
         Output stream overload. More...
         
        std::ostream & operator<< (std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
         Output stream operator for a 3-tuple of 16-colors mode tags. More...
         
        std::ostream & operator<< (std::ostream &os, const typo &s)
         Output stream operator for a typo tag alone, in 16-colors mode. More...
         
        std::ostream & operator<< (std::ostream &os, const fmt &fmt)
         Output stream overload. More...
         
        +

        Constructor & Destructor Documentation

        + +

        ◆ fmt() [1/19]

        + +
        +
        + + + + + +
        + + + + + + + +
        clutchlog::fmt::fmt ()
        +
        +inline
        +
        + +

        Empty constructor, only useful for a no-op formatter.

        + +

        Definition at line 711 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [2/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (fg f,
        bg b = bg::none,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 715 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [3/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (fg f,
        typo s,
        bg b = bg::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 716 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [4/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (bg b,
        fg f = fg::none,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 717 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [5/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (bg b,
        typo s,
        fg f = fg::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 718 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [6/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (typo s,
        fg f = fg::none,
        bg b = bg::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 719 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [7/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (typo s,
        bg b,
        fg f = fg::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 720 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [8/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const short f,
        const short b,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 725 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [9/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const short f,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 726 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [10/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (fg ,
        const short b,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 727 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [11/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const short f,
        bg ,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 728 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [12/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const short fr,
        const short fg,
        const short fb,
        const short gr,
        const short gg,
        const short gb,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 733 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [13/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (fg ,
        const short gr,
        const short gg,
        const short gb,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 737 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [14/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const short fr,
        const short fg,
        const short fb,
        bg ,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 741 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [15/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const short fr,
        const short fg,
        const short fb,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 744 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [16/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const std::string & f,
        const std::string & b,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 748 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [17/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (fg ,
        const std::string & b,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 750 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [18/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const std::string & f,
        bg ,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 752 of file clutchlog.h.

        + +
        +
        + +

        ◆ fmt() [19/19]

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + + + +
        clutchlog::fmt::fmt (const std::string & f,
        typo s = typo::none 
        )
        +
        +inlineexplicit
        +
        + +

        Definition at line 754 of file clutchlog.h.

        + +
        +

        Member Function Documentation

        - + +

        ◆ print_on()

        + +
        +
        + + + + + +
        + + + + + + + + +
        std::ostream & clutchlog::fmt::print_on (std::ostream & os) const
        +
        +inlineprotected
        +
        + +

        Print the currently encoded format escape code on the given output stream.

        + +

        Definition at line 761 of file clutchlog.h.

        + +

        References back, back_16M, back_256, colors_16, colors_16M, colors_256, fore, fore_16M, fore_256, mode, and style.

        + +

        Referenced by operator()(), and str().

        + +
        +
        +

        ◆ operator()()

        @@ -411,19 +1287,19 @@ std::ostream & 

      Format the given string with the currently encoded format.

      -

      Allow to use a formatter as a function:

      clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
      +

      Allow to use a formatter as a function:

      clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
      std::cout << error("ERROR") << std::endl;
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:380
      Note
      A formatter called this way WILL output a reset escape code at the end.
      -

      Definition at line 808 of file clutchlog.h.

      +

      Definition at line 810 of file clutchlog.h.

      -

      References print_on().

      +

      References print_on().

      -

      Friends And Related Function Documentation

      - -

      ◆ operator<<

      + +

      ◆ str()

      @@ -432,7 +1308,77 @@ std::ostream & 
      - + + + + + +
      std::ostream& operator<< std::string clutchlog::fmt::str () const
      +
      +inline
      +
      + +

      Return the formatting code as a string.

      + +

      Definition at line 822 of file clutchlog.h.

      + +

      References print_on().

      + +
      + + +

      ◆ hash()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      static fmt clutchlog::fmt::hash (const std::string & str,
      const std::vector< fmtdomain = {} 
      )
      +
      +inlinestatic
      +
      + +

      Definition at line 829 of file clutchlog.h.

      + +
      +
      +

      Friends And Related Function Documentation

      + +

      ◆ operator<<

      + +
      +
      + + + diff --git a/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.js b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.js new file mode 100644 index 0000000..3a7dc2e --- /dev/null +++ b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.js @@ -0,0 +1,4 @@ +var dir_c318bd5cf14aaa5601e6029e0b5b4048 = +[ + [ "clutchlog.h", "clutchlog_8h.html", "clutchlog_8h" ] +]; \ No newline at end of file diff --git a/docs/doxygen.css b/docs/doxygen.css index 73ecbb2..2010785 100644 --- a/docs/doxygen.css +++ b/docs/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.8.17 */ +/* The standard CSS for doxygen 1.9.4 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; @@ -66,7 +66,7 @@ p.startli, p.startdd { margin-top: 2px; } -th p.starttd, p.intertd, p.endtd { +th p.starttd, th p.intertd, th p.endtd { font-size: 100%; font-weight: 700; } @@ -103,30 +103,96 @@ caption { } span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; + font-size: 70%; text-align: center; } -div.qindex, div.navpath { - width: 100%; - line-height: 140%; +h3.version { + font-size: 90%; + text-align: center; } div.navtab { - margin-right: 15px; + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; } +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + /* @group Link Styling */ a { @@ -143,17 +209,6 @@ a:hover { text-decoration: underline; } -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #FFFFFF; - border: 1px double #869DCA; -} - .contents a.qindexHL:visited { color: #FFFFFF; } @@ -173,6 +228,33 @@ a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { color: #4665A2; } +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + /* @end */ dl.el { @@ -180,7 +262,7 @@ dl.el { } ul { - overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ + overflow: visible; } #side-nav ul { @@ -258,6 +340,7 @@ div.line.glow { span.lineno { padding-right: 4px; + margin-right: 9px; text-align: right; border-right: 2px solid #0F0; background-color: #E8E8E8; @@ -384,6 +467,12 @@ img.footer { vertical-align: middle; } +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + /* @group Code Colorization */ span.keyword { @@ -1267,6 +1356,11 @@ dl.section dd { } +#projectrow +{ + height: 56px; +} + #projectlogo { text-align: center; @@ -1282,18 +1376,19 @@ dl.section dd { #projectalign { vertical-align: middle; + padding-left: 0.5em; } #projectname { - font: 300% Tahoma, Arial,sans-serif; + font: 200% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { - font: 120% Tahoma, Arial,sans-serif; + font: 90% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } @@ -1358,10 +1453,12 @@ dl.citelist dt { font-weight:bold; margin-right:10px; padding:5px; + text-align:right; + width:52px; } dl.citelist dd { - margin:2px 0; + margin:2px 0 2px 72px; padding:5px 0; } @@ -1424,6 +1521,16 @@ div.toc li.level4 { margin-left: 45px; } +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + .PageDocRTL-title div.toc li.level1 { margin-left: 0 !important; margin-right: 0; @@ -1478,7 +1585,7 @@ tr.heading h2 { #powerTip { cursor: default; - white-space: nowrap; + /*white-space: nowrap;*/ background-color: white; border: 1px solid gray; border-radius: 4px 4px 4px 4px; @@ -1661,47 +1768,6 @@ tr.heading h2 { /* @group Markdown */ -/* -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.markdownTableHead tr { -} - -table.markdownTableBodyLeft td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft { - text-align: left -} - -th.markdownTableHeadRight { - text-align: right -} - -th.markdownTableHeadCenter { - text-align: center -} -*/ - table.markdownTable { border-collapse:collapse; margin-top: 4px; @@ -1758,6 +1824,10 @@ table.DocNodeLTR { margin-left: 0; } +code.JavaDocCode { + direction:ltr; +} + tt, code, kbd, samp { display: inline-block; diff --git a/docs/doxygen.svg b/docs/doxygen.svg new file mode 100644 index 0000000..d42dad5 --- /dev/null +++ b/docs/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dynsections.js b/docs/dynsections.js index c8e84aa..7906639 100644 --- a/docs/dynsections.js +++ b/docs/dynsections.js @@ -1,25 +1,26 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. - Copyright (C) 1997-2017 by Dimitri van Heesch + The MIT License (MIT) - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + Copyright (C) 1997-2020 by Dimitri van Heesch - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. - @licend The above is the entire license notice - for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ function toggleVisibility(linkObj) { @@ -118,10 +119,10 @@ function toggleInherit(id) } } /* @license-end */ - $(document).ready(function() { $('.code,.codeRef').each(function() { $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); + $.fn.powerTip.smartPlacementLists.s = [ 's', 'n', 'ne', 'se' ]; $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true }); }); }); diff --git a/docs/files.html b/docs/files.html index db04910..bcafe0e 100644 --- a/docs/files.html +++ b/docs/files.html @@ -2,8 +2,8 @@ - - + +clutchlog: File List @@ -24,11 +24,10 @@
      + + + @@ -457,17 +1403,17 @@ std::ostream &  @@ -489,15 +1435,41 @@ std::ostream &  - -
      std::ostream & operator<< ( std::ostream &  os,

      Output stream overload.

      -

      Allow to use a formatter as a tag within a stream:

      clutchlog::fmt end(clutchlog::fmt::typo::reset);
      -
      clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
      +

      Allow to use a formatter as a tag within a stream:

      clutchlog::fmt end(clutchlog::fmt::typo::reset);
      +
      clutchlog::fmt error(clutchlog::fmt::fg::red, clutchlog::fmt::typo::bold);
      std::cout << error << "ERROR" << end << std::endl;
      Note
      An formatter called this way will NOT output a reset escape code.
      -

      Definition at line 793 of file clutchlog.h.

      +

      Definition at line 795 of file clutchlog.h.

      Member Enumeration Documentation

      - +

      ◆ ansi

      @@ -477,7 +1423,7 @@ std::ostream & 
      - +
      enum clutchlog::fmt::ansienum class clutchlog::fmt::ansi
      -
      Enumerator
      colors_16 

      16 colors mode.

      +
      Enumerator
      colors_16 

      16 colors mode.

      colors_256 

      256 colors mode.

      +
      colors_256 

      256 colors mode.

      colors_16M 

      16 millions ("true") colors mode.

      +
      colors_16M 

      16 millions ("true") colors mode.

      -

      Definition at line 382 of file clutchlog.h.

      +

      Definition at line 383 of file clutchlog.h.

      + + + + +

      ◆ typo

      + +
      +
      + + + + + +
      + + + + +
      enum class clutchlog::fmt::typo
      +
      +strong
      +
      + +

      Typographic style codes.

      + +

      Definition at line 393 of file clutchlog.h.

      @@ -506,14 +1478,11 @@ std::ostream & 
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      diff --git a/docs/classes.html b/docs/classes.html index 535d19e..5a229d0 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Index @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,48 +84,30 @@ $(document).ready(function(){initNavTree('classes.html',''); initResizable(); })
      -
      -
      Class Index
      +
      Class Index
      diff --git a/docs/clutchlog_8h.html b/docs/clutchlog_8h.html index 1dc3cd5..ed21ecf 100644 --- a/docs/clutchlog_8h.html +++ b/docs/clutchlog_8h.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog.h File Reference @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -87,12 +87,12 @@ $(document).ready(function(){initNavTree('clutchlog_8h.html',''); initResizable( -
      -
      clutchlog.h File Reference
      +
      clutchlog.h File Reference
      #include <ciso646>
      #include <filesystem>
      +#include <iterator>
      #include <iostream>
      #include <sstream>
      #include <fstream>
      @@ -119,7 +119,7 @@ $(document).ready(function(){initNavTree('clutchlog_8h.html',''); initResizable(

      Go to the source code of this file.

      - @@ -152,38 +152,31 @@ Classes

      +

      Classes

      class  clutchlog
       The single class which holds everything. More...
       Structure holding a location matching. More...
       
      - - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -195,40 +188,104 @@ Macros - - + - - + + - - + + - - + + - - + + - - + +

      +

      Macros

      -#define CLUTCHLOG_H
       Header guard.
      #define CLUTCHLOG_H
       Header guard. More...
       
      -#define CLUTCHLOG_HAVE_UNIX_SYSINFO   0
       True if POSIX headers necessary for stack depth management are available.
      #define CLUTCHLOG_HAVE_UNIX_SYSINFO   0
       True if POSIX headers necessary for stack depth management are available. More...
       
      -#define CLUTCHLOG_HAVE_UNIX_SYSIOCTL   0
       True if the system can handle the hfill feature.
      #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL   0
       True if the system can handle the hfill feature. More...
       
      -#define WITH_CLUTCHLOG
       Actually enable clutchlog features.
      #define WITH_CLUTCHLOG
       Actually enable clutchlog features. More...
       
      -#define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG   clutchlog::level::progress
       Default level over which calls to the logger are optimized out when NDEBUG is defined.
      #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG   clutchlog::level::progress
       Default level over which calls to the logger are optimized out when NDEBUG is defined. More...
       
      -#define CLUTCHLOC   __FILE__, __FUNCTION__, __LINE__
       Handy shortcuts to location.
      #define CLUTCHLOC   __FILE__, __FUNCTION__, __LINE__
       Handy shortcuts to location. More...
       
      #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
       Log a message at the given level and with a given depth delta. More...
       
      -#define CLUTCHLOG(LEVEL, WHAT)   CLUTCHLOGD(LEVEL, WHAT, 0)
       Log a message at the given level.
      #define CLUTCHLOG(LEVEL, WHAT)    CLUTCHLOGD(LEVEL, WHAT, 0)
       Log a message at the given level. More...
       
      #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
       Dump the given container. More...
       Run any code if the scope matches. More...
       
      Default configuration members
      -#define CLUTCHLOG_DEFAULT_FORMAT   "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
       Compile-time default format of the messages (debug mode: with absolute location).
      #define CLUTCHLOG_DEFAULT_FORMAT   "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
       
      -#define CLUTCHDUMP_DEFAULT_FORMAT   "# {level} in {func} @ {file}:{line}"
       Compile-time default format of the comment line in file dump.
      #define CLUTCHDUMP_DEFAULT_FORMAT   "# {level} in {func} @ {file}:{line}"
       Compile-time default format of the comment line in file dump. More...
       
      -#define CLUTCHDUMP_DEFAULT_SEP   "\n"
       Compile-time default item separator for dump.
      #define CLUTCHDUMP_DEFAULT_SEP   "\n"
       Compile-time default item separator for dump. More...
       
      -#define CLUTCHLOG_DEFAULT_DEPTH_MARK   ">"
       Compile-time default mark for stack depth.
      #define CLUTCHLOG_DEFAULT_DEPTH_MARK   ">"
       Compile-time default mark for stack depth. More...
       
      -#define CLUTCHLOG_STRIP_CALLS   5
       Compile-time number of call stack levels to remove from depth display by default.
      #define CLUTCHLOG_STRIP_CALLS   5
       Compile-time number of call stack levels to remove from depth display by default. More...
       
      -#define CLUTCHLOG_DEFAULT_HFILL_MARK   '.'
       Character used as a filling for right-align the right part of messages with "{hfill}".
      #define CLUTCHLOG_DEFAULT_HFILL_MARK   '.'
       Character used as a filling for right-align the right part of messages with "{hfill}". More...
       
      +

      Macro Definition Documentation

      + +

      ◆ CLUTCHLOG_H

      + +
      +
      + + + + +
      #define CLUTCHLOG_H
      +
      + +

      Header guard.

      + +

      Definition at line 4 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHLOG_HAVE_UNIX_SYSINFO

      + +
      +
      + + + + +
      #define CLUTCHLOG_HAVE_UNIX_SYSINFO   0
      +
      + +

      True if POSIX headers necessary for stack depth management are available.

      + +

      Definition at line 34 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHLOG_HAVE_UNIX_SYSIOCTL

      + +
      +
      + + + + +
      #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL   0
      +
      + +

      True if the system can handle the hfill feature.

      + +

      Definition at line 44 of file clutchlog.h.

      + +
      +
      + +

      ◆ WITH_CLUTCHLOG

      + +
      +
      + + + + +
      #define WITH_CLUTCHLOG
      +
      + +

      Actually enable clutchlog features.

      + +

      Definition at line 54 of file clutchlog.h.

      + +
      +
      diff --git a/docs/clutchlog_8h.js b/docs/clutchlog_8h.js index bf6872c..cfcd61b 100644 --- a/docs/clutchlog_8h.js +++ b/docs/clutchlog_8h.js @@ -1,6 +1,6 @@ var clutchlog_8h = [ - [ "scope_t", "structclutchlog_1_1scope__t.html", "structclutchlog_1_1scope__t" ], + [ "clutchlog::scope_t", "structclutchlog_1_1scope__t.html", "structclutchlog_1_1scope__t" ], [ "CLUTCHLOG_H", "clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16", null ], [ "CLUTCHLOG_HAVE_UNIX_SYSINFO", "clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb", null ], [ "CLUTCHLOG_HAVE_UNIX_SYSIOCTL", "clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817", null ], diff --git a/docs/clutchlog_8h__dep__incl.map b/docs/clutchlog_8h__dep__incl.map index 8180ccb..e10fd2c 100644 --- a/docs/clutchlog_8h__dep__incl.map +++ b/docs/clutchlog_8h__dep__incl.map @@ -1,16 +1,16 @@ - + - - - - - - - - - + + + + + + + + + diff --git a/docs/clutchlog_8h__dep__incl.md5 b/docs/clutchlog_8h__dep__incl.md5 index 80b393d..015ab32 100644 --- a/docs/clutchlog_8h__dep__incl.md5 +++ b/docs/clutchlog_8h__dep__incl.md5 @@ -1 +1 @@ -a81a51c1f045be087627e35d5e6b32ef \ No newline at end of file +550462ca9e6ab61c5ef8a484a81dbeed \ No newline at end of file diff --git a/docs/clutchlog_8h__dep__incl.svg b/docs/clutchlog_8h__dep__incl.svg index e4f4e4c..aa0df7a 100644 --- a/docs/clutchlog_8h__dep__incl.svg +++ b/docs/clutchlog_8h__dep__incl.svg @@ -46,7 +46,7 @@ if (edges && edges.length) { @@ -54,13 +54,13 @@ var sectionId = 'dynsection-1'; clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -76,8 +76,8 @@ var sectionId = 'dynsection-1'; Node1->Node2 - - + + @@ -91,8 +91,8 @@ var sectionId = 'dynsection-1'; Node1->Node3 - - + + @@ -106,8 +106,8 @@ var sectionId = 'dynsection-1'; Node1->Node4 - - + + @@ -121,143 +121,143 @@ var sectionId = 'dynsection-1'; Node1->Node5 - - + + Node6 - - -t-demo-extravagant.cpp + + +t-demo.cpp Node1->Node6 - - + + Node7 - - -t-demo.cpp + + +t-depth-delta.cpp Node1->Node7 - - + + Node8 - - -t-depth-delta.cpp + + +t-dump.cpp Node1->Node8 - - + + Node9 - - -t-dump.cpp + + +t-extra.cpp Node1->Node9 - - + + Node10 - -t-filename.cpp + +t-filename.cpp Node1->Node10 - - + + Node11 - -t-fmt-constructors.cpp + +t-fmt-constructors.cpp Node1->Node11 - - + + Node12 - -t-hash-color.cpp + +t-hash-color.cpp Node1->Node12 - - + + Node13 - -t-log.cpp + +t-log.cpp Node1->Node13 - - + + Node14 - -t-one-line-if.cpp + +t-one-line-if.cpp Node1->Node14 - - + + diff --git a/docs/clutchlog_8h__dep__incl_org.svg b/docs/clutchlog_8h__dep__incl_org.svg index bcf3f63..3ac13a5 100644 --- a/docs/clutchlog_8h__dep__incl_org.svg +++ b/docs/clutchlog_8h__dep__incl_org.svg @@ -4,17 +4,17 @@ - + clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -30,8 +30,8 @@ Node1->Node2 - - + + @@ -45,8 +45,8 @@ Node1->Node3 - - + + @@ -60,8 +60,8 @@ Node1->Node4 - - + + @@ -75,143 +75,143 @@ Node1->Node5 - - + + Node6 - - -t-demo-extravagant.cpp + + +t-demo.cpp Node1->Node6 - - + + Node7 - - -t-demo.cpp + + +t-depth-delta.cpp Node1->Node7 - - + + Node8 - - -t-depth-delta.cpp + + +t-dump.cpp Node1->Node8 - - + + Node9 - - -t-dump.cpp + + +t-extra.cpp Node1->Node9 - - + + Node10 - -t-filename.cpp + +t-filename.cpp Node1->Node10 - - + + Node11 - -t-fmt-constructors.cpp + +t-fmt-constructors.cpp Node1->Node11 - - + + Node12 - -t-hash-color.cpp + +t-hash-color.cpp Node1->Node12 - - + + Node13 - -t-log.cpp + +t-log.cpp Node1->Node13 - - + + Node14 - -t-one-line-if.cpp + +t-one-line-if.cpp Node1->Node14 - - + + diff --git a/docs/clutchlog_8h__incl.map b/docs/clutchlog_8h__incl.map index 528ccc6..36226b5 100644 --- a/docs/clutchlog_8h__incl.map +++ b/docs/clutchlog_8h__incl.map @@ -1,14 +1,15 @@ - + - - - - - - - - - + + + + + + + + + + diff --git a/docs/clutchlog_8h__incl.md5 b/docs/clutchlog_8h__incl.md5 index 8672821..3f79c82 100644 --- a/docs/clutchlog_8h__incl.md5 +++ b/docs/clutchlog_8h__incl.md5 @@ -1 +1 @@ -128ca966338fdda6dfe848c977a3a290 \ No newline at end of file +abe9435b0abe9059d00d25f6afdb3928 \ No newline at end of file diff --git a/docs/clutchlog_8h__incl.svg b/docs/clutchlog_8h__incl.svg index 40ad16e..57ecb9c 100644 --- a/docs/clutchlog_8h__incl.svg +++ b/docs/clutchlog_8h__incl.svg @@ -46,7 +46,7 @@ if (edges && edges.length) { @@ -54,13 +54,13 @@ var sectionId = 'dynsection-0'; clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -76,8 +76,8 @@ var sectionId = 'dynsection-0'; Node1->Node2 - - + + @@ -91,143 +91,158 @@ var sectionId = 'dynsection-0'; Node1->Node3 - - + + Node4 - -iostream + +iterator Node1->Node4 - - + + Node5 - -sstream + +iostream Node1->Node5 - - + + Node6 - -fstream + +sstream Node1->Node6 - - + + Node7 - -cassert + +fstream Node1->Node7 - - + + Node8 - -cstdlib + +cassert Node1->Node8 - - + + Node9 - -string + +cstdlib Node1->Node9 - - + + Node10 - -limits + +string Node1->Node10 - - + + Node11 - -regex + +limits Node1->Node11 - - + + Node12 - -map + +regex Node1->Node12 - - + + + + + +Node13 + + +map + + + + + +Node1->Node13 + + diff --git a/docs/clutchlog_8h__incl_org.svg b/docs/clutchlog_8h__incl_org.svg index bd41c98..c1dffb0 100644 --- a/docs/clutchlog_8h__incl_org.svg +++ b/docs/clutchlog_8h__incl_org.svg @@ -4,17 +4,17 @@ - + clutchlog.h - + Node1 - -clutchlog.h + +clutchlog.h @@ -30,8 +30,8 @@ Node1->Node2 - - + + @@ -45,143 +45,158 @@ Node1->Node3 - - + + Node4 - -iostream + +iterator Node1->Node4 - - + + Node5 - -sstream + +iostream Node1->Node5 - - + + Node6 - -fstream + +sstream Node1->Node6 - - + + Node7 - -cassert + +fstream Node1->Node7 - - + + Node8 - -cstdlib + +cassert Node1->Node8 - - + + Node9 - -string + +cstdlib Node1->Node9 - - + + Node10 - -limits + +string Node1->Node10 - - + + Node11 - -regex + +limits Node1->Node11 - - + + Node12 - -map + +regex Node1->Node12 - - + + + + + +Node13 + + +map + + + + + +Node1->Node13 + + diff --git a/docs/clutchlog_8h_source.html b/docs/clutchlog_8h_source.html index fe6753b..3e17425 100644 --- a/docs/clutchlog_8h_source.html +++ b/docs/clutchlog_8h_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog.h Source File @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,1483 +84,1477 @@ $(document).ready(function(){initNavTree('clutchlog_8h_source.html',''); initRes
      -
      -
      clutchlog.h
      +
      clutchlog.h
      -Go to the documentation of this file.
      1 #pragma once
      -
      2 #ifndef CLUTCHLOG_H
      -
      3 #define CLUTCHLOG_H
      -
      5 
      -
      7 #include <ciso646>
      -
      8  #ifdef FSEXPERIMENTAL
      -
      9  #include <experimental/filesystem>
      -
      10  namespace fs = std::experimental::filesystem;
      -
      11 #else
      -
      12  #include <filesystem>
      -
      13  namespace fs = std::filesystem;
      -
      14 #endif
      -
      15 
      -
      16 #include <iostream>
      -
      17 #include <sstream>
      -
      18 #include <fstream>
      -
      19 #include <cassert>
      -
      20 #include <cstdlib>
      -
      21 #include <string>
      -
      22 #include <limits>
      -
      23 #include <regex>
      -
      24 #include <map>
      -
      25 
      -
      27 #if __has_include(<execinfo.h>) && __has_include(<stdlib.h>) && __has_include(<libgen.h>)
      -
      28  #include <execinfo.h> // execinfo
      -
      29  #include <stdlib.h> // getenv
      -
      30  #include <libgen.h> // basename
      -
      31  #define CLUTCHLOG_HAVE_UNIX_SYSINFO 1
      -
      32 #else
      -
      33  #define CLUTCHLOG_HAVE_UNIX_SYSINFO 0
      -
      34 #endif
      -
      35 
      -
      37 #if __has_include(<sys/ioctl.h>) && __has_include(<stdio.h>) && __has_include(<unistd.h>)
      -
      38  #include <sys/ioctl.h>
      -
      39  #include <stdio.h>
      -
      40  #include <unistd.h>
      -
      41  #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 1
      -
      42 #else
      -
      43  #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 0
      -
      44 #endif
      -
      45 
      -
      46 
      -
      47 /**********************************************************************
      -
      48  * Enable by default in Debug builds.
      -
      49  **********************************************************************/
      -
      50 #ifndef WITH_CLUTCHLOG
      -
      51  #ifndef NDEBUG
      -
      52  #define WITH_CLUTCHLOG
      -
      54  #endif
      -
      55 #endif
      -
      56 
      -
      57 /**********************************************************************
      -
      58  * Macros definitions
      -
      59  **********************************************************************/
      -
      60 #ifdef WITH_CLUTCHLOG
      -
      61 
      -
      65 #ifndef CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG
      -
      66  #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::progress
      -
      68 #endif // CLUTCHLOG_DEFAULT_DEPTH_BUILT
      -
      69 
      -
      76 #define CLUTCHLOC __FILE__, __FUNCTION__, __LINE__
      -
      78 
      -
      80 #ifndef NDEBUG
      -
      81  #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \
      -
      82  auto& clutchlog__logger = clutchlog::logger(); \
      -
      83  std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
      -
      84  clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
      -
      85  } while(0)
      -
      86 #else // not Debug build.
      -
      87  #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \
      -
      88  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      -
      89  auto& clutchlog__logger = clutchlog::logger(); \
      -
      90  std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
      -
      91  clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
      -
      92  } \
      -
      93  } while(0)
      -
      94 #endif // NDEBUG
      -
      95 
      -
      97 #ifndef NDEBUG
      -
      98  #define CLUTCHLOG( LEVEL, WHAT ) \
      -
      99  CLUTCHLOGD(LEVEL, WHAT, 0)
      -
      100 #else // not Debug build.
      -
      101  #define CLUTCHLOG( LEVEL, WHAT ) \
      -
      102  CLUTCHLOGD(LEVEL, WHAT, 0)
      -
      103 #endif // NDEBUG
      -
      104 
      -
      106 #ifndef NDEBUG
      -
      107  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
      -
      108  auto& clutchlog__logger = clutchlog::logger(); \
      -
      109  clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
      -
      110  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
      -
      111  } while(0)
      -
      112 #else // not Debug build.
      -
      113  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
      -
      114  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      -
      115  auto& clutchlog__logger = clutchlog::logger(); \
      -
      116  clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
      -
      117  CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
      -
      118  } \
      -
      119  } while(0)
      -
      120 #endif // NDEBUG
      -
      121 
      -
      123 #ifndef NDEBUG
      -
      124  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
      -
      125  auto& clutchlog__logger = clutchlog::logger(); \
      -
      126  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      -
      127  if(clutchlog__scope.matches) { \
      -
      128  FUNC(__VA_ARGS__); \
      -
      129  } \
      -
      130  } while(0)
      -
      131 #else // not Debug build.
      -
      132  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
      -
      133  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      -
      134  auto& clutchlog__logger = clutchlog::logger(); \
      -
      135  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      -
      136  if(clutchlog__scope.matches) { \
      -
      137  FUNC(__VA_ARGS__); \
      -
      138  } \
      -
      139  } \
      -
      140  } while(0)
      -
      141 #endif // NDEBUG
      -
      142 
      -
      144 #ifndef NDEBUG
      -
      145  #define CLUTCHCODE( LEVEL, ... ) do { \
      -
      146  auto& clutchlog__logger = clutchlog::logger(); \
      -
      147  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      -
      148  if(clutchlog__scope.matches) { \
      -
      149  __VA_ARGS__ \
      -
      150  } \
      -
      151  } while(0)
      -
      152 #else // not Debug build.
      -
      153  #define CLUTCHCODE( LEVEL, CODE ) do { \
      -
      154  if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      -
      155  auto& clutchlog__logger = clutchlog::logger(); \
      -
      156  clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      -
      157  if(clutchlog__scope.matches) { \
      -
      158  CODE \
      -
      159  } \
      -
      160  } \
      -
      161  } while(0)
      -
      162 #endif // NDEBUG
      -
      163 
      -
      166 #else // not WITH_CLUTCHLOG
      -
      167  // Disabled macros can still be called in Release builds.
      -
      168  #define CLUTCHLOG( LEVEL, WHAT ) do {/*nothing*/} while(0)
      -
      169  #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do {/*nothing*/} while(0)
      -
      170  #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {/*nothing*/} while(0)
      -
      171  #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {/*nothing*/} while(0)
      -
      172  #define CLUTCHCODE( LEVEL, CODE ) do {/*nothing*/} while(0)
      -
      173 #endif // WITH_CLUTCHLOG
      -
      174 
      -
      175 /**********************************************************************
      -
      176  * Implementation
      -
      177  **********************************************************************/
      -
      178 
      -
      179 #ifdef WITH_CLUTCHLOG
      -
      180 
      - -
      188 {
      -
      189  protected:
      -
      190 
      -
      195  #ifndef NDEBUG
      -
      196  #ifndef CLUTCHLOG_DEFAULT_FORMAT
      -
      197  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 // Enables: name, depth and depth_marks
      -
      199  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1 // Enables: hfill
      -
      200  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n"
      -
      201  #else
      -
      202  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
      -
      203  #endif
      -
      204  #else
      -
      205  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      -
      206  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg} {hfill} {func} @ {file}:{line}\n"
      -
      207  #else
      -
      208  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
      -
      209  #endif
      -
      210  #endif
      -
      211  #endif
      -
      212  #else
      -
      213  #ifndef CLUTCHLOG_DEFAULT_FORMAT
      -
      214  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      216  #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func}\n"
      -
      217  #else
      -
      218  #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func}\n"
      -
      219  #endif
      -
      220  #endif
      -
      221  #endif
      -
      222  static inline std::string default_format = CLUTCHLOG_DEFAULT_FORMAT;
      -
      224 
      -
      225  #ifndef NDEBUG
      -
      226  #ifndef CLUTCHDUMP_DEFAULT_FORMAT
      -
      227  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      229  #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}"
      -
      230  #else
      -
      231  #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func} @ {file}:{line}"
      -
      232  #endif
      -
      233  #endif // CLUTCHDUMP_DEFAULT_FORMAT
      -
      234  #else
      -
      235  #ifndef CLUTCHDUMP_DEFAULT_FORMAT
      -
      236  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      238  #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth})"
      -
      239  #else
      -
      240  #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func}"
      -
      241  #endif
      -
      242  #endif // CLUTCHDUMP_DEFAULT_FORMAT
      -
      243  #endif
      -
      244  static inline std::string dump_default_format = CLUTCHDUMP_DEFAULT_FORMAT;
      -
      246 
      -
      247  #ifndef CLUTCHDUMP_DEFAULT_SEP
      -
      248  #define CLUTCHDUMP_DEFAULT_SEP "\n"
      -
      250  #endif // CLUTCHDUMP_DEFAULT_SEP
      -
      251  static inline std::string dump_default_sep = CLUTCHDUMP_DEFAULT_SEP;
      -
      253 
      -
      254  #ifndef CLUTCHLOG_DEFAULT_DEPTH_MARK
      -
      255  #define CLUTCHLOG_DEFAULT_DEPTH_MARK ">"
      -
      257  #endif // CLUTCHLOG_DEFAULT_DEPTH_MARK
      -
      258  static inline std::string default_depth_mark = CLUTCHLOG_DEFAULT_DEPTH_MARK;
      -
      260 
      -
      261  #ifndef CLUTCHLOG_STRIP_CALLS
      -
      262  #define CLUTCHLOG_STRIP_CALLS 5
      -
      264  #endif // CLUTCHLOG_STRIP_CALLS
      -
      265  static inline unsigned int default_strip_calls = CLUTCHLOG_STRIP_CALLS;
      -
      267 
      -
      268  #ifndef CLUTCHLOG_DEFAULT_HFILL_MARK
      -
      269  #define CLUTCHLOG_DEFAULT_HFILL_MARK '.'
      -
      271  #endif // CLUTCHLOG_DEFAULT_HFILL_MARK
      - -
      274 
      -
      275 
      -
      276  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      -
      277  #ifndef CLUTCHLOG_DEFAULT_HFILL_MAX
      -
      278  #define CLUTCHLOG_DEFAULT_HFILL_MAX 300
      -
      279  #endif
      -
      280  #ifndef CLUTCHLOG_DEFAULT_HFILL_MIN
      -
      281  #define CLUTCHLOG_DEFAULT_HFILL_MIN 150
      -
      282  #endif
      -
      283  #endif
      -
      284  static inline size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX;
      -
      287  static inline size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN;
      -
      288 
      -
      289  // NOTE: there is no CLUTCHLOG_HFILL_STYLE for defaulting,
      -
      290  // but you can still set `hfill_style(...)` on the logger singleton.
      -
      291  /* @} DefaultConfig */
      -
      292  /* @} */
      -
      293 
      -
      294 
      -
      295  public:
      -
      296 
      -
      306  static clutchlog& logger()
      -
      307  {
      -
      308  static clutchlog instance;
      -
      309  return instance;
      -
      310  }
      -
      311 
      -
      313  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
      -
      314 
      -
      316  enum filename {path, base, dir, dirbase, stem, dirstem};
      -
      317 
      -
      379  class fmt {
      -
      380  public:
      -
      382  enum class ansi {
      -
      384  colors_16 = -1, // Not supposed to be casted.
      -
      386  colors_256 = 5, // Casted as short in color::operator<<.
      -
      388  colors_16M = 2 // Casted as short in color::operator<<
      -
      389  } mode;
      -
      390 
      -
      392  enum class typo {
      -
      393  reset = 0,
      -
      394  bold = 1,
      -
      395  underline = 4,
      -
      396  inverse = 7,
      -
      397  none = -1
      -
      398  } style;
      -
      399 
      -
      402  enum class fg {
      -
      404  black = 30,
      -
      405  red = 31,
      -
      406  green = 32,
      -
      407  yellow = 33,
      -
      408  blue = 34,
      -
      409  magenta = 35,
      -
      410  cyan = 36,
      -
      411  white = 37,
      -
      412  bright_black = 90,
      -
      413  bright_red = 91,
      -
      414  bright_green = 92,
      -
      415  bright_yellow = 93,
      -
      416  bright_blue = 94,
      -
      417  bright_magenta = 95,
      -
      418  bright_cyan = 96,
      -
      419  bright_white = 97,
      -
      420  none = -1
      -
      421  } fore;
      -
      422 
      -
      424  enum class bg {
      -
      425  black = 40,
      -
      426  red = 41,
      -
      427  green = 42,
      -
      428  yellow = 43,
      -
      429  blue = 44,
      -
      430  magenta = 45,
      -
      431  cyan = 46,
      -
      432  white = 47,
      -
      433  bright_black = 100,
      -
      434  bright_red = 101,
      -
      435  bright_green = 102,
      -
      436  bright_yellow = 103,
      -
      437  bright_blue = 104,
      -
      438  bright_magenta = 105,
      -
      439  bright_cyan = 106,
      -
      440  bright_white = 107,
      -
      441  none = -1
      -
      442  } back;
      -
      443 
      -
      444  protected:
      -
      446  friend std::ostream& operator<<(std::ostream& os, const std::tuple<fg,bg,typo>& fbs)
      -
      447  {
      -
      448  auto [f,b,s] = fbs;
      -
      449  std::vector<short> codes; codes.reserve(3);
      -
      450  if(f != fg::none) { codes.push_back(static_cast<short>(f));}
      -
      451  if(b != bg::none) { codes.push_back(static_cast<short>(b));}
      -
      452  if(s != typo::none) { codes.push_back(static_cast<short>(s));}
      -
      453  if(codes.size() == 0) {
      -
      454  return os;
      -
      455 
      -
      456  } else {
      -
      457  os << "\033[";
      -
      458  os << codes[0];
      -
      459  for(size_t i=1; i < codes.size(); ++i) {
      -
      460  os << ";" << codes[i];
      -
      461  }
      -
      462  os << "m";
      -
      463  }
      -
      464  return os;
      -
      465  }
      -
      466 
      -
      468  friend std::ostream& operator<<(std::ostream& os, const typo& s)
      -
      469  {
      -
      470  if(s != typo::none) {
      -
      471  os << "\033[" << static_cast<short>(s) << "m";
      -
      472  }
      -
      473  return os;
      -
      474  }
      -
      475 
      -
      478  protected:
      -
      483  struct color {
      -
      484  ansi mode; // Not const to allow for the implicit copy assignemnt operator.
      -
      485 
      -
      487  enum class ground { // idem.
      -
      488  fore = 38,
      -
      489  back = 48
      -
      490  } type;
      -
      491 
      -
      497  color(ansi a, ground g) : mode(a), type(g) {}
      -
      498 
      -
      500  virtual bool is_set() const = 0;
      -
      501 
      -
      503  virtual std::ostream& print_on( std::ostream& os) const = 0;
      -
      504 
      -
      506  friend std::ostream& operator<<(std::ostream& os, const color& c)
      -
      507  {
      -
      508  if(c.is_set()) {
      -
      509  os << "\033[" << static_cast<short>(c.type) << ";" << static_cast<short>(c.mode) << ";";
      -
      510  c.print_on(os);
      -
      511  os << "m";
      -
      512  }
      -
      513  return os;
      -
      514  }
      -
      515  };
      -
      516 
      -
      517  // There is no color_16 because it would be the same as color_256, only with different indices,
      -
      518  // hence making it more complicated for the user to select the right constructor.
      -
      519  // Here, we just use enum for 16 colors, and indices for 256 colors.
      -
      520 
      -
      522  struct color_256 : public color {
      -
      526  short index;
      -
      527 
      -
      531  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
      -
      532 
      -
      538  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {assert(-1 <= i and i <= 255);}
      -
      539 
      -
      541  bool is_set() const {return index > -1;}
      -
      542 
      -
      544  std::ostream& print_on( std::ostream& os) const
      -
      545  {
      -
      546  os << index;
      -
      547  return os;
      -
      548  }
      -
      549  };
      -
      550 
      -
      552  struct fg_256 : public color_256 {
      -
      554  fg_256() : color_256(ground::fore) {}
      -
      555 
      -
      559  fg_256(const short f) : color_256(ground::fore, f) {}
      -
      560 
      -
      564  fg_256(const fg&) : color_256(ground::fore, -1) {}
      -
      565 
      -
      566  } fore_256;
      -
      567 
      -
      569  struct bg_256 : public color_256 {
      -
      571  bg_256() : color_256(ground::back) {}
      -
      572 
      -
      576  bg_256(const short b) : color_256(ground::back, b) {}
      -
      577 
      -
      581  bg_256(const bg&) : color_256(ground::back, -1) {}
      -
      582 
      -
      583  } back_256;
      -
      584 
      -
      586  struct color_16M : public color {
      -
      590  short red, green, blue;
      -
      591 
      -
      595  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
      -
      596 
      -
      604  color_16M(ground t, short r, short g, short b)
      -
      605  : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
      -
      606 
      -
      614  color_16M(ground t, const std::string& srgb) : color(ansi::colors_16M, t)
      -
      615  {
      -
      616  assert(srgb.size() == 7);
      -
      617  if(srgb.size() != 7) {
      -
      618  red = -1;
      -
      619  green = -1;
      -
      620  blue = -1;
      -
      621  } else {
      -
      622  char i = 0;
      -
      623  if(srgb.at(0) == '#') {
      -
      624  i = 1;
      -
      625  }
      -
      626  std::istringstream(srgb.substr(0+i,2)) >> std::hex >> red;
      -
      627  std::istringstream(srgb.substr(2+i,2)) >> std::hex >> green;
      -
      628  std::istringstream(srgb.substr(4+i,2)) >> std::hex >> blue;
      -
      629  }
      -
      630  assert(-1 <= red and red <= 255);
      -
      631  assert(-1 <= green and green <= 255);
      -
      632  assert(-1 <= blue and blue <= 255);
      -
      633  }
      -
      634 
      -
      636  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
      -
      637 
      -
      639  std::ostream& print_on( std::ostream& os) const
      -
      640  {
      -
      641  os << red << ";" << green << ";" << blue;
      -
      642  return os;
      -
      643  }
      -
      644  };
      -
      645 
      -
      647  struct fg_16M : public color_16M {
      -
      649  fg_16M() : color_16M(ground::fore) {}
      -
      650 
      -
      659  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
      -
      660 
      -
      667  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
      -
      668 
      -
      672  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
      -
      673 
      -
      674  } fore_16M;
      -
      675 
      -
      677  struct bg_16M : public color_16M {
      -
      679  bg_16M() : color_16M(ground::back) {}
      -
      680 
      -
      689  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
      -
      690 
      -
      697  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
      -
      698 
      -
      702  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
      -
      703 
      -
      704  } back_16M;
      -
      705 
      -
      708  public:
      -
      710  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
      -
      711 
      -
      714  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      715  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      716  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      717  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      718  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      719  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      724  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
      -
      725  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
      -
      726  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
      -
      731  fmt(const short fr, const short fg, const short fb,
      -
      732  const short gr, const short gg, const short gb,
      -
      733  typo s = typo::none)
      -
      734  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
      -
      735  fmt(fg,
      -
      736  const short gr, const short gg, const short gb,
      -
      737  typo s = typo::none)
      -
      738  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
      -
      739  fmt(const short fr, const short fg, const short fb,
      -
      740  bg, typo s = typo::none)
      -
      741  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      -
      742  fmt(const short fr, const short fg, const short fb,
      -
      743  typo s = typo::none)
      -
      744  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      -
      745 
      -
      746  fmt(const std::string& f, const std::string& b, typo s = typo::none)
      -
      747  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
      -
      748  fmt(fg, const std::string& b, typo s = typo::none)
      -
      749  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
      -
      750  fmt(const std::string& f, bg, typo s = typo::none)
      -
      751  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      -
      752  fmt(const std::string& f, typo s = typo::none)
      -
      753  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      -
      756  protected:
      -
      757 
      -
      759  std::ostream& print_on( std::ostream& os) const
      -
      760  {
      -
      761  if(mode == ansi::colors_16) {
      -
      762  // Print all in a single escape.
      -
      763  os << std::make_tuple(fore,back,style);
      -
      764 
      -
      765  } else {
      -
      766  // 256 or 16M: always print separated escapes for foreground/background.
      -
      767  if(mode == ansi::colors_256) {
      -
      768  os << fore_256;
      -
      769  os << back_256;
      -
      770 
      -
      771  } else if(mode == ansi::colors_16M) {
      -
      772  os << fore_16M;
      -
      773  os << back_16M;
      -
      774  }
      -
      775  // In any case, print the style separately.
      -
      776  os << style;
      -
      777  }
      -
      778  return os;
      -
      779  }
      -
      780 
      -
      781  public:
      -
      793  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
      -
      794  {
      -
      795  return fmt.print_on(os);
      -
      796  }
      -
      797 
      -
      808  std::string operator()( const std::string& msg ) const
      -
      809  {
      -
      810  std::ostringstream os;
      -
      811  this->print_on(os);
      -
      812  fmt reset(fmt::typo::reset);
      -
      813  os << msg;
      -
      814  reset.print_on(os);
      -
      815  return os.str();
      -
      816  }
      -
      817 
      -
      820  std::string str() const
      -
      821  {
      -
      822  std::ostringstream os;
      -
      823  this->print_on(os);
      -
      824  return os.str();
      -
      825  }
      -
      826 
      -
      827  static fmt hash( const std::string& str, const std::vector<fmt> domain = {})
      -
      828  {
      -
      829  size_t h = std::hash<std::string>{}(str);
      -
      830  if(domain.size() == 0) {
      -
      831  return fmt(static_cast<short>(h % 256));
      -
      832  } else {
      -
      833  return fmt(domain[h % domain.size()]);
      -
      834  }
      -
      835  }
      -
      836  }; // fmt class
      -
      837 
      -
      843  public:
      -
      844  clutchlog(clutchlog const&) = delete;
      -
      845  void operator=(clutchlog const&) = delete;
      -
      846 
      -
      847  private:
      -
      848  clutchlog() :
      -
      849  // system, main, log
      - -
      851  _level_word({
      -
      852  {level::critical,"Critical"},
      -
      853  {level::error ,"Error"},
      -
      854  {level::warning ,"Warning"},
      -
      855  {level::progress,"Progress"},
      -
      856  {level::note ,"Note"},
      -
      857  {level::info ,"Info"},
      -
      858  {level::debug ,"Debug"},
      -
      859  {level::xdebug ,"XDebug"}
      -
      860  }),
      -
      861  _level_short({
      -
      862  {level::critical, "Crit"},
      -
      863  {level::error , "Erro"},
      -
      864  {level::warning , "Warn"},
      -
      865  {level::progress, "Prog"},
      -
      866  {level::note , "Note"},
      -
      867  {level::info , "Info"},
      -
      868  {level::debug , "Dbug"},
      -
      869  {level::xdebug , "XDbg"}
      -
      870  }),
      -
      871  _level_fmt({
      -
      872  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
      -
      873  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
      -
      874  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
      -
      875  {level::progress,fmt()},
      -
      876  {level::note ,fmt()},
      -
      877  {level::info ,fmt()},
      -
      878  {level::debug ,fmt()},
      -
      879  {level::xdebug ,fmt()}
      -
      880  }),
      - - -
      883  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      -
      884  _hfill_char(clutchlog::default_hfill_char),
      -
      885  _hfill_fmt(fmt::fg::none),
      -
      886  _hfill_max(clutchlog::default_hfill_max),
      -
      887  _hfill_min(clutchlog::default_hfill_min),
      -
      888  #endif
      -
      889  _out(&std::clog),
      -
      890  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      891  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
      -
      892  _depth_mark(clutchlog::default_depth_mark),
      -
      893  #endif
      -
      894  _stage(level::error),
      -
      895  _in_file(".*"),
      -
      896  _in_func(".*"),
      -
      897  _in_line(".*"),
      -
      898  // Empty vectors by default:
      -
      899  // _filehash_fmts
      -
      900  // _funchash_fmts
      -
      901  // _depth_fmts
      -
      902  _filename(filename::path)
      -
      903  {
      -
      904  // Reverse the level->word map into a word->level map.
      -
      905  for(auto& lw : _level_word) {
      -
      906  _word_level[lw.second] = lw.first;
      -
      907  }
      -
      908 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      -
      909  struct winsize w;
      -
      910  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
      -
      911  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
      -
      912 #endif
      -
      913  }
      -
      914 
      -
      915  protected:
      -
      917  size_t _strip_calls;
      -
      919  const std::map<level,std::string> _level_word;
      -
      921  std::map<std::string,level> _word_level;
      -
      923  std::map<level,std::string> _level_short;
      -
      925  std::map<level,fmt> _level_fmt;
      -
      927  std::string _format_log;
      -
      929  std::string _format_dump;
      -
      930  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      -
      931 
      -
      932  char _hfill_char;
      -
      934  fmt _hfill_fmt;
      -
      936  size_t _hfill_max;
      -
      938  size_t _hfill_min;
      -
      939  #endif
      -
      940 
      -
      941  std::ostream* _out;
      -
      942  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      943 
      -
      944  size_t _depth;
      -
      946  std::string _depth_mark;
      -
      947  #endif
      -
      948 
      - -
      951  std::regex _in_file;
      -
      953  std::regex _in_func;
      -
      955  std::regex _in_line;
      -
      956 
      -
      958  std::vector<fmt> _filehash_fmts;
      -
      960  std::vector<fmt> _funchash_fmts;
      -
      961 
      -
      962 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      963 
      -
      964  static const size_t _max_buffer = 4096;
      -
      966  std::vector<fmt> _depth_fmts;
      -
      967 #endif
      -
      968 
      -
      969 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      -
      970 
      -
      971  size_t _nb_columns;
      -
      972 #endif
      -
      973 
      - -
      978  public:
      -
      979 
      -
      983  void format(const std::string& format) {_format_log = format;}
      -
      986  std::string format() const {return _format_log;}
      -
      987 
      -
      989  void format_comment(const std::string& format) {_format_dump = format;}
      -
      991  std::string format_comment() const {return _format_dump;}
      -
      992 
      -
      994  void out(std::ostream& out) {_out = &out;}
      -
      996  std::ostream& out() {return *_out;}
      -
      997 
      -
      998 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      999  void depth(size_t d) {_depth = d;}
      -
      1002  size_t depth() const {return _depth;}
      -
      1003 
      -
      1005  void depth_mark(const std::string mark) {_depth_mark = mark;}
      -
      1007  std::string depth_mark() const {return _depth_mark;}
      -
      1008 
      -
      1010  void strip_calls(const size_t n) {_strip_calls = n;}
      -
      1012  size_t strip_calls() const {return _strip_calls;}
      -
      1013 #endif
      -
      1014 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      -
      1015  void hfill_mark(const char mark) {_hfill_char = mark;}
      -
      1018  char hfill_mark() const {return _hfill_char;}
      -
      1020  void hfill_style(fmt style) {_hfill_fmt = style;}
      -
      1025  template<class ... FMT>
      -
      1026  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
      -
      1028  fmt hfill_style() const {return _hfill_fmt;}
      -
      1030  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
      -
      1032  size_t hfill_max() {return _hfill_max;}
      -
      1034  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
      -
      1036  size_t hfill_min() {return _hfill_min;}
      -
      1037 #endif
      -
      1038 
      -
      1045  void filehash_styles(std::vector<fmt> styles) {_filehash_fmts = styles;}
      -
      1053  void funchash_styles(std::vector<fmt> styles) {_funchash_fmts = styles;}
      -
      1062  void depth_styles(std::vector<fmt> styles) {_depth_fmts = styles;}
      -
      1063 
      -
      1065  void threshold(level l) {_stage = l;}
      -
      1067  void threshold(const std::string& l) {_stage = this->level_of(l);}
      -
      1069  level threshold() const {return _stage;}
      -
      1071  const std::map<std::string,level>& levels() const { return _word_level;}
      -
      1072 
      -
      1077  level level_of(const std::string name)
      -
      1078  {
      -
      1079  const auto ilevel = _word_level.find(name);
      -
      1080  if( ilevel != std::end(_word_level)) {
      -
      1081  return ilevel->second;
      -
      1082  } else {
      -
      1083  throw std::out_of_range("'" + name + "' is not a valid log level name");
      -
      1084  }
      -
      1085  }
      -
      1086 
      -
      1088  void file(std::string file) {_in_file = file;}
      -
      1090  void func(std::string func) {_in_func = func;}
      -
      1092  void line(std::string line) {_in_line = line;}
      -
      1093 
      -
      1095  void location(
      -
      1096  const std::string& in_file,
      -
      1097  const std::string& in_function=".*",
      -
      1098  const std::string& in_line=".*"
      -
      1099  )
      -
      1100  {
      -
      1101  file(in_file);
      -
      1102  func(in_function);
      -
      1103  line(in_line);
      -
      1104  }
      -
      1105 
      -
      1110  template<class ... FMT>
      -
      1111  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
      -
      1113  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
      -
      1115  fmt style(level stage) const { return _level_fmt.at(stage); }
      -
      1116 
      -
      1118  void filename(filename f) {_filename = f;}
      -
      1119 
      -
      1122  public:
      -
      1123 
      -
      1127  struct scope_t {
      -
      1130  bool matches;
      - -
      1133 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      1134 
      -
      1135  size_t depth;
      -
      1136 #endif
      -
      1137 
      -
      1138  bool there;
      - -
      1141  matches(false),
      -
      1142  stage(level::xdebug),
      - -
      1144  depth(0),
      -
      1145 #endif
      -
      1146  there(false)
      -
      1147  {}
      -
      1148  }; // scope_t
      -
      1149 
      -
      1150 
      - -
      1153  const level& stage,
      -
      1154  const std::string& file,
      -
      1155  const std::string& func,
      -
      1156  const size_t line
      -
      1157  ) const
      -
      1158  {
      -
      1159  scope_t scope; // False scope by default.
      -
      1160 
      -
      1161  /***** Log level stage *****/
      -
      1162  // Test stage first, because it's fastest.
      -
      1163  scope.stage = stage;
      -
      1164  if(not (scope.stage <= _stage)) {
      -
      1165  // Bypass useless computations if no match
      -
      1166  // because of the stage.
      -
      1167  return scope;
      -
      1168  }
      -
      1169 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      1170  /***** Stack depth *****/
      -
      1171  // Backtrace in second, quite fast.
      -
      1172  size_t stack_depth;
      -
      1173  void *buffer[_max_buffer];
      -
      1174  stack_depth = backtrace(buffer, _max_buffer);
      -
      1175  scope.depth = stack_depth;
      -
      1176  if(not (scope.depth <= _depth + _strip_calls)) {
      -
      1177  // Bypass if no match.
      -
      1178  return scope;
      -
      1179  }
      -
      1180 #endif
      -
      1181 
      -
      1182  /***** Location *****/
      -
      1183  // Location last, slowest.
      -
      1184  std::ostringstream sline; sline << line;
      -
      1185  scope.there =
      -
      1186  std::regex_search(file, _in_file)
      -
      1187  and std::regex_search(func, _in_func)
      -
      1188  and std::regex_search(sline.str(), _in_line);
      -
      1189 
      -
      1190  // No need to retest stage and depth, which are true here.
      -
      1191  scope.matches = scope.there;
      -
      1192 
      -
      1193  return scope;
      -
      1194  } // locate
      -
      1195 
      -
      1203  std::string replace(
      -
      1204  const std::string& form,
      -
      1205  const std::string& mark,
      -
      1206  const std::string& tag
      -
      1207  ) const
      -
      1208  {
      -
      1209  // Useless debug code, unless something fancy would be done with name tags.
      -
      1210  // std::regex re;
      -
      1211  // try {
      -
      1212  // re = std::regex(mark);
      -
      1213  //
      -
      1214  // } catch(const std::regex_error& e) {
      -
      1215  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
      -
      1216  // switch(e.code()) {
      -
      1217  // case std::regex_constants::error_collate:
      -
      1218  // std::cerr << "the expression contains an invalid collating element name";
      -
      1219  // break;
      -
      1220  // case std::regex_constants::error_ctype:
      -
      1221  // std::cerr << "the expression contains an invalid character class name";
      -
      1222  // break;
      -
      1223  // case std::regex_constants::error_escape:
      -
      1224  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
      -
      1225  // break;
      -
      1226  // case std::regex_constants::error_backref:
      -
      1227  // std::cerr << "the expression contains an invalid back reference";
      -
      1228  // break;
      -
      1229  // case std::regex_constants::error_brack:
      -
      1230  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
      -
      1231  // break;
      -
      1232  // case std::regex_constants::error_paren:
      -
      1233  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
      -
      1234  // break;
      -
      1235  // case std::regex_constants::error_brace:
      -
      1236  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
      -
      1237  // break;
      -
      1238  // case std::regex_constants::error_badbrace:
      -
      1239  // std::cerr << "the expression contains an invalid range in a {} expression";
      -
      1240  // break;
      -
      1241  // case std::regex_constants::error_range:
      -
      1242  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
      -
      1243  // break;
      -
      1244  // case std::regex_constants::error_space:
      -
      1245  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
      -
      1246  // break;
      -
      1247  // case std::regex_constants::error_badrepeat:
      -
      1248  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
      -
      1249  // break;
      -
      1250  // case std::regex_constants::error_complexity:
      -
      1251  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
      -
      1252  // break;
      -
      1253  // case std::regex_constants::error_stack:
      -
      1254  // std::cerr << "there was not enough memory to perform a match";
      -
      1255  // break;
      -
      1256  // default:
      -
      1257  // std::cerr << "unknown error";
      -
      1258  // }
      -
      1259  // std::cerr << std::endl;
      -
      1260  // throw;
      -
      1261  // } // catch
      -
      1262 
      -
      1263  const std::regex re(mark);
      -
      1264  return std::regex_replace(form, re, tag);
      -
      1265  }
      -
      1266 
      -
      1268  std::string replace(
      -
      1269  const std::string& form,
      -
      1270  const std::string& mark,
      -
      1271  const size_t tag
      -
      1272  ) const
      -
      1273  {
      -
      1274  std::ostringstream stag; stag << tag;
      -
      1275  return replace(form, mark, stag.str());
      -
      1276  }
      -
      1277 
      -
      1279  std::string format(
      -
      1280  std::string row,
      -
      1281  const std::string& what,
      - -
      1283  const std::string& name,
      -
      1284 #endif
      -
      1285  const level& stage,
      -
      1286  const std::string& file,
      -
      1287  const std::string& func,
      -
      1288  const size_t line
      - -
      1290  ,
      -
      1291  const size_t depth
      -
      1292 #endif
      -
      1293  ) const
      -
      1294  {
      -
      1295  row = replace(row, "\\{msg\\}", what);
      -
      1296 
      -
      1297  const std::filesystem::path filepath(file);
      -
      1298  assert(filepath.is_absolute());
      -
      1299  std::string filename;
      -
      1300  std::filesystem::path::iterator ip = filepath.end();
      -
      1301  std::advance(ip, -2);
      -
      1302  switch(_filename) {
      -
      1303  case filename::base:
      -
      1304  filename = filepath.filename().string();
      -
      1305  break;
      -
      1306  case filename::dir:
      -
      1307  filename = ip->string();
      -
      1308  break;
      -
      1309  case filename::dirbase:
      -
      1310  filename = (*ip / filepath.filename()).string();
      -
      1311  break;
      -
      1312  case filename::stem:
      -
      1313  filename = filepath.stem().string();
      -
      1314  break;
      -
      1315  case filename::dirstem:
      -
      1316  filename = (*ip / filepath.stem()).string();
      -
      1317  break;
      -
      1318  case filename::path:
      -
      1319  default:
      -
      1320  filename = file;
      -
      1321  break;
      -
      1322  }
      -
      1323  row = replace(row, "\\{file\\}", filename);
      -
      1324 
      -
      1325 
      -
      1326  row = replace(row, "\\{func\\}", func);
      -
      1327  row = replace(row, "\\{line\\}", line);
      -
      1328 
      -
      1329  row = replace(row, "\\{level\\}", _level_word.at(stage));
      -
      1330  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
      -
      1331  row = replace(row, "\\{level_letter\\}", letter);
      -
      1332  row = replace(row, "\\{level_short\\}", _level_short.at(stage));
      -
      1333 
      -
      1334 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      1335  size_t actual_depth = depth - _strip_calls;
      -
      1336  row = replace(row, "\\{name\\}", name);
      -
      1337  row = replace(row, "\\{depth\\}", actual_depth);
      -
      1338 
      -
      1339  if(_depth_fmts.size() == 0) {
      -
      1340  row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() );
      -
      1341 
      -
      1342  std::ostringstream chevrons;
      -
      1343  for(size_t i = 0; i < actual_depth; ++i) {
      -
      1344  chevrons << _depth_mark;
      -
      1345  }
      -
      1346  row = replace(row, "\\{depth_marks\\}", chevrons.str());
      -
      1347 
      -
      1348  } else {
      -
      1349  row = replace(row, "\\{depth_fmt\\}",
      -
      1350  _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() );
      -
      1351 
      -
      1352  std::ostringstream chevrons;
      -
      1353  for(size_t i = 0; i < actual_depth; ++i) {
      -
      1354  chevrons << _depth_fmts[std::min(i+1,_depth_fmts.size()-1)].str()
      -
      1355  << _depth_mark;
      -
      1356  }
      -
      1357  row = replace(row, "\\{depth_marks\\}", chevrons.str());
      -
      1358  }
      -
      1359 #endif
      -
      1360  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
      -
      1361  row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() );
      -
      1362  row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() );
      -
      1363 
      -
      1364 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      -
      1365  // hfill is replaced last to allow for correct line width estimation.
      -
      1366  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
      -
      1367  const std::string hfill_tag = "{hfill}";
      -
      1368  const size_t hfill_pos = row.find(hfill_tag);
      -
      1369  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
      -
      1370  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
      -
      1371  if(hfill_pos != std::string::npos) {
      -
      1372  assert(raw_hfill_pos != std::string::npos);
      -
      1373  if(nb_columns > 0) {
      -
      1374  const size_t left_len = raw_hfill_pos;
      -
      1375  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
      -
      1376  if(right_len+left_len > nb_columns) {
      -
      1377  // The right part would go over the terminal width: add a new row.
      -
      1378  if(right_len < nb_columns) {
      -
      1379  // There is room for the right part on a new line.
      -
      1380  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
      -
      1381  const std::string hfill_styled = _hfill_fmt(hfill);
      -
      1382  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
      -
      1383  } else {
      -
      1384  // Right part still goes over columns: let it go.
      -
      1385  const std::string hfill(1, _hfill_char);
      -
      1386  const std::string hfill_styled = _hfill_fmt(hfill);
      -
      1387  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
      -
      1388  }
      -
      1389  } else {
      -
      1390  // There is some space in between left and right parts.
      -
      1391  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
      -
      1392  const std::string hfill_styled = _hfill_fmt(hfill);
      -
      1393  row = replace(row, "\\{hfill\\}", hfill_styled);
      -
      1394  }
      -
      1395  } else {
      -
      1396  // We don't know the terminal width.
      -
      1397  const std::string hfill(1, _hfill_char);
      -
      1398  const std::string hfill_styled = _hfill_fmt(hfill);
      -
      1399  row = replace(row, "\\{hfill\\}", hfill_styled);
      -
      1400  }
      -
      1401  }
      -
      1402 #else
      -
      1403  // We cannot know the terminal width.
      -
      1404  const std::string hfill(1, _hfill_char);
      -
      1405  const std::string hfill_styled = _hfill_fmt(hfill);
      -
      1406  row = replace(row, "\\{hfill\\}", hfill_styled);
      -
      1407 #endif
      -
      1408  return _level_fmt.at(stage)(row);
      -
      1409  }
      -
      1410 
      -
      1412  void log(
      -
      1413  const level& stage,
      -
      1414  const std::string& what,
      -
      1415  const std::string& file, const std::string& func, const size_t line,
      -
      1416  const size_t depth_delta = 0
      -
      1417  ) const
      -
      1418  {
      -
      1419  scope_t scope = locate(stage, file, func, line);
      -
      1420 
      -
      1421  if(scope.matches) {
      -
      1422 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      1423  *_out << format(_format_log, what, basename(getenv("_")),
      -
      1424  stage, file, func,
      -
      1425  line, scope.depth + depth_delta );
      -
      1426 #else
      -
      1427  *_out << format(_format_log, what,
      -
      1428  stage, file, func,
      -
      1429  line );
      -
      1430 #endif
      -
      1431  _out->flush();
      -
      1432  } // if scopes.matches
      -
      1433  }
      -
      1434 
      -
      1436  template<class In>
      -
      1437  void dump(
      -
      1438  const level& stage,
      -
      1439  const In container_begin, const In container_end,
      -
      1440  const std::string& file, const std::string& func, const size_t line,
      -
      1441  const std::string& filename_template = "dump_{n}.dat",
      -
      1442  const std::string sep = dump_default_sep
      -
      1443  ) const
      -
      1444  {
      -
      1445  scope_t scope = locate(stage, file, func, line);
      -
      1446 
      -
      1447  if(scope.matches) {
      -
      1448  const std::string tag = "\\{n\\}";
      -
      1449  const std::regex re(tag);
      -
      1450  std::string outfile = "";
      -
      1451 
      -
      1452  // If the file name template has the {n} tag.
      -
      1453  if(std::regex_search(filename_template, re)) {
      -
      1454  // Increment n until a free one is found.
      -
      1455  size_t n = 0;
      -
      1456  do {
      -
      1457  outfile = replace(filename_template, tag, n);
      -
      1458  n++;
      -
      1459  } while( fs::exists( outfile ) );
      -
      1460 
      -
      1461  } else {
      -
      1462  // Use the parameter as is.
      -
      1463  outfile = filename_template;
      -
      1464  }
      -
      1465 
      -
      1466  std::ofstream fd(outfile);
      -
      1467 
      -
      1468  if(_format_dump.size() > 0) {
      -
      1469 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      1470  fd << format(_format_dump, "", basename(getenv("_")),
      -
      1471  stage, file, func,
      -
      1472  line, scope.depth );
      -
      1473 #else
      -
      1474  fd << format(_format_dump, "",
      -
      1475  stage, file, func,
      -
      1476  line );
      -
      1477 #endif
      -
      1478  fd << sep; // sep after comment line.
      -
      1479  }
      -
      1480 
      -
      1481  std::copy(container_begin, container_end,
      -
      1482  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
      -
      1483 
      -
      1484  fd.close();
      -
      1485  } // if scopes.matches
      -
      1486  }
      -
      1487 
      -
      1489 };
      -
      1490 
      -
      1493 #else // not WITH_CLUTCHLOG
      -
      1494 
      -
      1495 
      -
      1496 /**********************************************************************
      -
      1497  * Fake implementation
      -
      1498  **********************************************************************/
      -
      1499 
      -
      1500 // Equivalent class with empty methods, will be optimized out
      -
      1501 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
      -
      1502 #pragma GCC diagnostic push
      -
      1503 #pragma GCC diagnostic ignored "-Wreturn-type"
      -
      1504 class clutchlog
      -
      1505 {
      -
      1506  public:
      -
      1507  static clutchlog& logger() {}
      -
      1508  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
      -
      1509  enum filename {path, base, dir, dirbase, stem, dirstem};
      -
      1510  class fmt {
      -
      1511  public:
      -
      1512  enum class ansi { colors_16, colors_256, colors_16M} mode;
      -
      1513  enum class typo { reset, bold, underline, inverse, none} style;
      -
      1514  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
      -
      1515  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
      -
      1516  protected:
      -
      1517  friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
      -
      1518  friend std::ostream& operator<<(std::ostream&, const typo&) {}
      -
      1519  protected:
      -
      1520  struct color {
      -
      1521  ansi mode;
      -
      1522  enum class ground { fore, back } type;
      -
      1523  color(ansi a, ground g) : mode(a), type(g) {}
      -
      1524  virtual bool is_set() const = 0;
      -
      1525  virtual std::ostream& print_on( std::ostream&) const = 0;
      -
      1526  friend std::ostream& operator<<(std::ostream&, const color&) {}
      -
      1527  };
      -
      1528  struct color_256 : public color {
      -
      1529  short index;
      -
      1530  color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
      -
      1531  color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
      -
      1532  bool is_set() const {}
      -
      1533  std::ostream& print_on( std::ostream&) const {}
      -
      1534  };
      -
      1535  struct fg_256 : public color_256 {
      -
      1536  fg_256() : color_256(ground::fore) {}
      -
      1537  fg_256(const short f) : color_256(ground::fore, f) {}
      -
      1538  fg_256(const fg&) : color_256(ground::fore, -1) {}
      -
      1539  } fore_256;
      -
      1540  struct bg_256 : public color_256 {
      -
      1541  bg_256() : color_256(ground::back) {}
      -
      1542  bg_256(const short b) : color_256(ground::back, b) {}
      -
      1543  bg_256(const bg&) : color_256(ground::back, -1) {}
      -
      1544  } back_256;
      -
      1545  struct color_16M : public color {
      -
      1546  short red, green, blue;
      -
      1547  color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
      -
      1548  color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
      -
      1549  color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
      -
      1550  bool is_set() const {return red > -1 and green > -1 and blue > -1;}
      -
      1551  std::ostream& print_on( std::ostream&) const {}
      -
      1552  };
      -
      1553  struct fg_16M : public color_16M {
      -
      1554  fg_16M() : color_16M(ground::fore) {}
      -
      1555  fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
      -
      1556  fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
      -
      1557  fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
      -
      1558  } fore_16M;
      -
      1559  struct bg_16M : public color_16M {
      -
      1560  bg_16M() : color_16M(ground::back) {}
      -
      1561  bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
      -
      1562  bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
      -
      1563  bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
      -
      1564  } back_16M;
      -
      1565  public:
      -
      1566  fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
      -
      1567  fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      1568  fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      1569  fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      1570  fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      1571  fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      1572  fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      -
      1573  fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
      -
      1574  fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
      -
      1575  fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
      -
      1576  fmt(const short fr, const short fg, const short fb,
      -
      1577  const short gr, const short gg, const short gb,
      -
      1578  typo s = typo::none)
      -
      1579  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
      -
      1580  fmt(fg,
      -
      1581  const short gr, const short gg, const short gb,
      -
      1582  typo s = typo::none)
      -
      1583  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
      -
      1584  fmt(const short fr, const short fg, const short fb,
      -
      1585  bg, typo s = typo::none)
      -
      1586  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      -
      1587  fmt(const short fr, const short fg, const short fb,
      -
      1588  typo s = typo::none)
      -
      1589  : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      -
      1590 
      -
      1591  fmt(const std::string& f, const std::string& b, typo s = typo::none)
      -
      1592  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
      -
      1593  fmt(fg, const std::string& b, typo s = typo::none)
      -
      1594  : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
      -
      1595  fmt(const std::string& f, bg, typo s = typo::none)
      -
      1596  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      -
      1597  fmt(const std::string& f, typo s = typo::none)
      -
      1598  : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      -
      1599  protected:
      -
      1600  std::ostream& print_on( std::ostream&) const {}
      -
      1601  public:
      -
      1602  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
      -
      1603  std::string operator()( const std::string&) const {}
      -
      1604  std::string str() const {}
      -
      1605  static fmt hash( const std::string&, const std::vector<fmt>) {}
      -
      1606  };
      -
      1607  public:
      -
      1608  clutchlog(clutchlog const&) = delete;
      -
      1609  void operator=(clutchlog const&) = delete;
      -
      1610  private:
      -
      1611  clutchlog() {}
      -
      1612  protected:
      -
      1613  struct scope_t {};
      -
      1614  scope_t locate(
      -
      1615  const level&,
      -
      1616  const std::string&,
      -
      1617  const std::string&,
      -
      1618  const size_t
      -
      1619  ) const
      -
      1620  {}
      -
      1621  public:
      -
      1622  void format(const std::string&) {}
      -
      1623  std::string format() const {}
      -
      1624 
      -
      1625  void format_comment(const std::string&) {}
      -
      1626  std::string format_comment() const {}
      -
      1627 
      -
      1628  void out(std::ostream&) {}
      -
      1629  std::ostream& out() {}
      -
      1630 
      -
      1631 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      -
      1632  void depth(size_t) {}
      -
      1633  size_t depth() const {}
      -
      1634 
      -
      1635  void depth_mark(const std::string) {}
      -
      1636  std::string depth_mark() const {}
      -
      1637  void strip_calls(const size_t) {}
      -
      1638  size_t strip_calls() const {}
      -
      1639 #endif
      -
      1640 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      -
      1641  void hfill_mark(const char) {}
      -
      1642  char hfill_mark() const {}
      -
      1643  void hfill_fmt(fmt) {}
      -
      1644  fmt hfill_fmt() const {}
      -
      1645  void hfill_min(const size_t) {}
      -
      1646  size_t hfill_min() {}
      -
      1647  void hfill_max(const size_t) {}
      -
      1648  size_t hfill_max() {}
      -
      1649 #endif
      -
      1650  void filehash_styles(std::vector<fmt> ) {}
      -
      1651  void funchash_styles(std::vector<fmt> ) {}
      -
      1652  void depth_styles(std::vector<fmt>) {}
      -
      1653 
      -
      1654  void threshold(level) {}
      -
      1655  void threshold(const std::string&) {}
      -
      1656  level threshold() const {}
      -
      1657  const std::map<std::string,level> levels() const {}
      -
      1658  level level_of(const std::string) {}
      -
      1659 
      -
      1660  void file(std::string) {}
      -
      1661  void func(std::string) {}
      -
      1662  void line(std::string) {}
      -
      1663 
      -
      1664 #pragma GCC diagnostic push
      -
      1665 #pragma GCC diagnostic ignored "-Wunused-parameter"
      -
      1666  void location(
      -
      1667  const std::string&,
      -
      1668  const std::string& in_function=".*",
      -
      1669  const std::string& in_line=".*"
      -
      1670  )
      -
      1671  {}
      -
      1672 #pragma GCC diagnostic pop
      -
      1673  template<class ... FMT>
      -
      1674  void style(level, FMT...) {}
      -
      1675  void style(level, fmt) {}
      -
      1676  fmt style(level) const {}
      -
      1677  void filename(filename) {}
      -
      1678  public:
      -
      1679  std::string replace(
      -
      1680  const std::string&,
      -
      1681  const std::string&,
      -
      1682  const std::string&
      -
      1683  ) const
      -
      1684  {}
      -
      1685 
      -
      1686  std::string replace(
      -
      1687  const std::string&,
      -
      1688  const std::string&,
      -
      1689  const size_t
      -
      1690  ) const
      -
      1691  {}
      -
      1692 
      -
      1693  std::string format(
      -
      1694  std::string,
      -
      1695  const std::string&,
      - -
      1697  const std::string&,
      -
      1698 #endif
      -
      1699  const level&,
      -
      1700  const std::string&,
      -
      1701  const std::string&,
      -
      1702  const size_t
      - -
      1704  ,
      -
      1705  const size_t
      -
      1706 #endif
      -
      1707  ) const
      -
      1708  {}
      -
      1709 
      -
      1710  void log(
      -
      1711  const level&,
      -
      1712  const std::string&,
      -
      1713  const std::string&, const std::string&, size_t
      -
      1714  ) const
      -
      1715  {}
      -
      1716 
      -
      1717  template<class In>
      -
      1718  void dump(
      -
      1719  const level&,
      -
      1720  const In, const In,
      -
      1721  const std::string&, const std::string&, size_t,
      -
      1722  const std::string&,
      -
      1723  const std::string
      -
      1724  ) const
      -
      1725  {}
      -
      1726 };
      -
      1727 #pragma GCC diagnostic pop
      -
      1728 #endif // WITH_CLUTCHLOG
      -
      1729 
      -
      1730 #endif // CLUTCHLOG_H
      +Go to the documentation of this file.
      1#pragma once
      +
      2#ifndef CLUTCHLOG_H
      +
      4#define CLUTCHLOG_H
      +
      5
      +
      7#include <ciso646>
      +
      8 #ifdef FSEXPERIMENTAL
      +
      9 #include <experimental/filesystem>
      +
      10 namespace fs = std::experimental::filesystem;
      +
      11#else
      +
      12 #include <filesystem>
      +
      13 namespace fs = std::filesystem;
      +
      14#endif
      +
      15
      +
      16#include <iterator>
      +
      17#include <iostream>
      +
      18#include <sstream>
      +
      19#include <fstream>
      +
      20#include <cassert>
      +
      21#include <cstdlib>
      +
      22#include <string>
      +
      23#include <limits>
      +
      24#include <regex>
      +
      25#include <map>
      +
      26
      +
      28#if __has_include(<execinfo.h>) && __has_include(<stdlib.h>) && __has_include(<libgen.h>)
      +
      29 #include <execinfo.h> // execinfo
      +
      30 #include <stdlib.h> // getenv
      +
      31 #include <libgen.h> // basename
      +
      32 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 1
      +
      33#else
      +
      34 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 0
      +
      35#endif
      +
      36
      +
      38#if __has_include(<sys/ioctl.h>) && __has_include(<stdio.h>) && __has_include(<unistd.h>)
      +
      39 #include <sys/ioctl.h>
      +
      40 #include <stdio.h>
      +
      41 #include <unistd.h>
      +
      42 #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 1
      +
      43#else
      +
      44 #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 0
      +
      45#endif
      +
      46
      +
      47
      +
      48/**********************************************************************
      +
      49 * Enable by default in Debug builds.
      +
      50 **********************************************************************/
      +
      51#ifndef WITH_CLUTCHLOG
      +
      52 #ifndef NDEBUG
      +
      54 #define WITH_CLUTCHLOG
      +
      55 #endif
      +
      56#endif
      +
      57
      +
      58/**********************************************************************
      +
      59 * Macros definitions
      +
      60 **********************************************************************/
      +
      61#ifdef WITH_CLUTCHLOG
      +
      62
      +
      66#ifndef CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG
      +
      68 #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::progress
      +
      69#endif // CLUTCHLOG_DEFAULT_DEPTH_BUILT
      +
      70
      +
      78#define CLUTCHLOC __FILE__, __FUNCTION__, __LINE__
      +
      79
      +
      81#ifndef NDEBUG
      +
      82 #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \
      +
      83 auto& clutchlog__logger = clutchlog::logger(); \
      +
      84 std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
      +
      85 clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
      +
      86 } while(0)
      +
      87#else // not Debug build.
      +
      88 #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do { \
      +
      89 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      +
      90 auto& clutchlog__logger = clutchlog::logger(); \
      +
      91 std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
      +
      92 clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
      +
      93 } \
      +
      94 } while(0)
      +
      95#endif // NDEBUG
      +
      96
      +
      98#ifndef NDEBUG
      +
      99 #define CLUTCHLOG( LEVEL, WHAT ) \
      +
      100 CLUTCHLOGD(LEVEL, WHAT, 0)
      +
      101#else // not Debug build.
      +
      102 #define CLUTCHLOG( LEVEL, WHAT ) \
      +
      103 CLUTCHLOGD(LEVEL, WHAT, 0)
      +
      104#endif // NDEBUG
      +
      105
      +
      107#ifndef NDEBUG
      +
      108 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
      +
      109 auto& clutchlog__logger = clutchlog::logger(); \
      +
      110 clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
      +
      111 CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
      +
      112 } while(0)
      +
      113#else // not Debug build.
      +
      114 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
      +
      115 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      +
      116 auto& clutchlog__logger = clutchlog::logger(); \
      +
      117 clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
      +
      118 CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
      +
      119 } \
      +
      120 } while(0)
      +
      121#endif // NDEBUG
      +
      122
      +
      124#ifndef NDEBUG
      +
      125 #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
      +
      126 auto& clutchlog__logger = clutchlog::logger(); \
      +
      127 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      +
      128 if(clutchlog__scope.matches) { \
      +
      129 FUNC(__VA_ARGS__); \
      +
      130 } \
      +
      131 } while(0)
      +
      132#else // not Debug build.
      +
      133 #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
      +
      134 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      +
      135 auto& clutchlog__logger = clutchlog::logger(); \
      +
      136 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      +
      137 if(clutchlog__scope.matches) { \
      +
      138 FUNC(__VA_ARGS__); \
      +
      139 } \
      +
      140 } \
      +
      141 } while(0)
      +
      142#endif // NDEBUG
      +
      143
      +
      145#ifndef NDEBUG
      +
      146 #define CLUTCHCODE( LEVEL, ... ) do { \
      +
      147 auto& clutchlog__logger = clutchlog::logger(); \
      +
      148 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      +
      149 if(clutchlog__scope.matches) { \
      +
      150 __VA_ARGS__ \
      +
      151 } \
      +
      152 } while(0)
      +
      153#else // not Debug build.
      +
      154 #define CLUTCHCODE( LEVEL, CODE ) do { \
      +
      155 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
      +
      156 auto& clutchlog__logger = clutchlog::logger(); \
      +
      157 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      +
      158 if(clutchlog__scope.matches) { \
      +
      159 CODE \
      +
      160 } \
      +
      161 } \
      +
      162 } while(0)
      +
      163#endif // NDEBUG
      +
      164
      +
      167#else // not WITH_CLUTCHLOG
      +
      168 // Disabled macros can still be called in Release builds.
      +
      169 #define CLUTCHLOG( LEVEL, WHAT ) do {/*nothing*/} while(0)
      +
      170 #define CLUTCHLOGD( LEVEL, WHAT, DEPTH_DELTA ) do {/*nothing*/} while(0)
      +
      171 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {/*nothing*/} while(0)
      +
      172 #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {/*nothing*/} while(0)
      +
      173 #define CLUTCHCODE( LEVEL, CODE ) do {/*nothing*/} while(0)
      +
      174#endif // WITH_CLUTCHLOG
      +
      175
      +
      176/**********************************************************************
      +
      177 * Implementation
      +
      178 **********************************************************************/
      +
      179
      +
      180#ifdef WITH_CLUTCHLOG
      + +
      189{
      +
      190 protected:
      +
      191
      +
      196 #ifndef NDEBUG
      +
      197 #ifndef CLUTCHLOG_DEFAULT_FORMAT
      +
      199 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 // Enables: name, depth and depth_marks
      +
      200 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1 // Enables: hfill
      +
      201 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n"
      +
      202 #else
      +
      203 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
      +
      204 #endif
      +
      205 #else
      +
      206 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      +
      207 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg} {hfill} {func} @ {file}:{line}\n"
      +
      208 #else
      +
      209 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
      +
      210 #endif
      +
      211 #endif
      +
      212 #endif
      +
      213 #else
      +
      214 #ifndef CLUTCHLOG_DEFAULT_FORMAT
      +
      216 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      217 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func}\n"
      +
      218 #else
      +
      219 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func}\n"
      +
      220 #endif
      +
      221 #endif
      +
      222 #endif
      +
      224 static inline std::string default_format = CLUTCHLOG_DEFAULT_FORMAT;
      +
      225
      +
      226 #ifndef NDEBUG
      +
      227 #ifndef CLUTCHDUMP_DEFAULT_FORMAT
      +
      229 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      230 #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}"
      +
      231 #else
      +
      232 #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func} @ {file}:{line}"
      +
      233 #endif
      +
      234 #endif // CLUTCHDUMP_DEFAULT_FORMAT
      +
      235 #else
      +
      236 #ifndef CLUTCHDUMP_DEFAULT_FORMAT
      +
      238 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      239 #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth})"
      +
      240 #else
      +
      241 #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func}"
      +
      242 #endif
      +
      243 #endif // CLUTCHDUMP_DEFAULT_FORMAT
      +
      244 #endif
      + +
      247
      +
      248 #ifndef CLUTCHDUMP_DEFAULT_SEP
      +
      250 #define CLUTCHDUMP_DEFAULT_SEP "\n"
      +
      251 #endif // CLUTCHDUMP_DEFAULT_SEP
      +
      253 static inline std::string dump_default_sep = CLUTCHDUMP_DEFAULT_SEP;
      +
      254
      +
      255 #ifndef CLUTCHLOG_DEFAULT_DEPTH_MARK
      +
      257 #define CLUTCHLOG_DEFAULT_DEPTH_MARK ">"
      +
      258 #endif // CLUTCHLOG_DEFAULT_DEPTH_MARK
      +
      260 static inline std::string default_depth_mark = CLUTCHLOG_DEFAULT_DEPTH_MARK;
      +
      261
      +
      262 #ifndef CLUTCHLOG_STRIP_CALLS
      +
      264 #define CLUTCHLOG_STRIP_CALLS 5
      +
      265 #endif // CLUTCHLOG_STRIP_CALLS
      +
      267 static inline unsigned int default_strip_calls = CLUTCHLOG_STRIP_CALLS;
      +
      268
      +
      269 #ifndef CLUTCHLOG_DEFAULT_HFILL_MARK
      +
      271 #define CLUTCHLOG_DEFAULT_HFILL_MARK '.'
      +
      272 #endif // CLUTCHLOG_DEFAULT_HFILL_MARK
      +
      274 static inline char default_hfill_char = CLUTCHLOG_DEFAULT_HFILL_MARK;
      +
      275
      +
      276
      +
      277 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      +
      278 #ifndef CLUTCHLOG_DEFAULT_HFILL_MAX
      +
      279 #define CLUTCHLOG_DEFAULT_HFILL_MAX 300
      +
      280 #endif
      +
      281 #ifndef CLUTCHLOG_DEFAULT_HFILL_MIN
      +
      282 #define CLUTCHLOG_DEFAULT_HFILL_MIN 150
      +
      283 #endif
      +
      284 #endif
      +
      286 static inline size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX;
      +
      288 static inline size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN;
      +
      289
      +
      290 // NOTE: there is no CLUTCHLOG_HFILL_STYLE for defaulting,
      +
      291 // but you can still set `hfill_style(...)` on the logger singleton.
      +
      292 /* @} DefaultConfig */
      +
      293 /* @} */
      +
      294
      +
      295
      +
      296 public:
      +
      297
      + +
      308 {
      +
      309 static clutchlog instance;
      +
      310 return instance;
      +
      311 }
      +
      312
      +
      314 enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
      +
      315
      +
      317 enum filename {path, base, dir, dirbase, stem, dirstem};
      +
      318
      +
      380 class fmt {
      +
      381 public:
      +
      383 enum class ansi {
      +
      385 colors_16 = -1, // Not supposed to be casted.
      +
      387 colors_256 = 5, // Casted as short in color::operator<<.
      +
      389 colors_16M = 2 // Casted as short in color::operator<<
      + +
      391
      +
      393 enum class typo {
      +
      394 reset = 0,
      +
      395 bold = 1,
      +
      396 underline = 4,
      +
      397 inverse = 7,
      +
      398 none = -1
      + +
      400
      +
      404 enum class fg {
      +
      405 black = 30,
      +
      406 red = 31,
      +
      407 green = 32,
      +
      408 yellow = 33,
      +
      409 blue = 34,
      +
      410 magenta = 35,
      +
      411 cyan = 36,
      +
      412 white = 37,
      +
      413 bright_black = 90,
      +
      414 bright_red = 91,
      +
      415 bright_green = 92,
      +
      416 bright_yellow = 93,
      +
      417 bright_blue = 94,
      +
      418 bright_magenta = 95,
      +
      419 bright_cyan = 96,
      +
      420 bright_white = 97,
      +
      421 none = -1
      + +
      423
      +
      425 enum class bg {
      +
      426 black = 40,
      +
      427 red = 41,
      +
      428 green = 42,
      +
      429 yellow = 43,
      +
      430 blue = 44,
      +
      431 magenta = 45,
      +
      432 cyan = 46,
      +
      433 white = 47,
      +
      434 bright_black = 100,
      +
      435 bright_red = 101,
      +
      436 bright_green = 102,
      +
      437 bright_yellow = 103,
      +
      438 bright_blue = 104,
      +
      439 bright_magenta = 105,
      +
      440 bright_cyan = 106,
      +
      441 bright_white = 107,
      +
      442 none = -1
      + +
      444
      +
      445 protected:
      +
      447 friend std::ostream& operator<<(std::ostream& os, const std::tuple<fg,bg,typo>& fbs)
      +
      448 {
      +
      449 auto [f,b,s] = fbs;
      +
      450 std::vector<short> codes; codes.reserve(3);
      +
      451 if(f != fg::none) { codes.push_back(static_cast<short>(f));}
      +
      452 if(b != bg::none) { codes.push_back(static_cast<short>(b));}
      +
      453 if(s != typo::none) { codes.push_back(static_cast<short>(s));}
      +
      454 if(codes.size() == 0) {
      +
      455 return os;
      +
      456
      +
      457 } else {
      +
      458 os << "\033[";
      +
      459 os << codes[0];
      +
      460 for(size_t i=1; i < codes.size(); ++i) {
      +
      461 os << ";" << codes[i];
      +
      462 }
      +
      463 os << "m";
      +
      464 }
      +
      465 return os;
      +
      466 }
      +
      467
      +
      469 friend std::ostream& operator<<(std::ostream& os, const typo& s)
      +
      470 {
      +
      471 if(s != typo::none) {
      +
      472 os << "\033[" << static_cast<short>(s) << "m";
      +
      473 }
      +
      474 return os;
      +
      475 }
      +
      476
      +
      479 protected:
      +
      484 struct color {
      +
      485 ansi mode; // Not const to allow for the implicit copy assignemnt operator.
      +
      486
      +
      488 enum class ground { // idem.
      +
      489 fore = 38,
      +
      490 back = 48
      + +
      492
      +
      498 color(ansi a, ground g) : mode(a), type(g) {}
      +
      499
      +
      501 virtual bool is_set() const = 0;
      +
      502
      +
      504 virtual std::ostream& print_on( std::ostream& os) const = 0;
      +
      505
      +
      507 friend std::ostream& operator<<(std::ostream& os, const color& c)
      +
      508 {
      +
      509 if(c.is_set()) {
      +
      510 os << "\033[" << static_cast<short>(c.type) << ";" << static_cast<short>(c.mode) << ";";
      +
      511 c.print_on(os);
      +
      512 os << "m";
      +
      513 }
      +
      514 return os;
      +
      515 }
      +
      516 };
      +
      517
      +
      518 // There is no color_16 because it would be the same as color_256, only with different indices,
      +
      519 // hence making it more complicated for the user to select the right constructor.
      +
      520 // Here, we just use enum for 16 colors, and indices for 256 colors.
      +
      521
      +
      523 struct color_256 : public color {
      +
      527 short index;
      +
      528
      +
      532 color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
      +
      533
      +
      539 color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {assert(-1 <= i and i <= 255);}
      +
      540
      +
      542 bool is_set() const {return index > -1;}
      +
      543
      +
      545 std::ostream& print_on( std::ostream& os) const
      +
      546 {
      +
      547 os << index;
      +
      548 return os;
      +
      549 }
      +
      550 };
      +
      551
      +
      553 struct fg_256 : public color_256 {
      +
      555 fg_256() : color_256(ground::fore) {}
      +
      556
      +
      560 fg_256(const short f) : color_256(ground::fore, f) {}
      +
      561
      +
      565 fg_256(const fg&) : color_256(ground::fore, -1) {}
      +
      566
      + +
      568
      +
      570 struct bg_256 : public color_256 {
      +
      572 bg_256() : color_256(ground::back) {}
      +
      573
      +
      577 bg_256(const short b) : color_256(ground::back, b) {}
      +
      578
      +
      582 bg_256(const bg&) : color_256(ground::back, -1) {}
      +
      583
      + +
      585
      +
      587 struct color_16M : public color {
      +
      591 short red, green, blue;
      +
      592
      +
      596 color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
      +
      597
      +
      605 color_16M(ground t, short r, short g, short b)
      +
      606 : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
      +
      607
      +
      615 color_16M(ground t, const std::string& srgb) : color(ansi::colors_16M, t)
      +
      616 {
      +
      617 assert(srgb.size() == 7);
      +
      618 if(srgb.size() != 7) {
      +
      619 red = -1;
      +
      620 green = -1;
      +
      621 blue = -1;
      +
      622 } else {
      +
      623 char i = 0;
      +
      624 if(srgb.at(0) == '#') {
      +
      625 i = 1;
      +
      626 }
      +
      627 std::istringstream(srgb.substr(0+i,2)) >> std::hex >> red;
      +
      628 std::istringstream(srgb.substr(2+i,2)) >> std::hex >> green;
      +
      629 std::istringstream(srgb.substr(4+i,2)) >> std::hex >> blue;
      +
      630 }
      +
      631 assert(-1 <= red and red <= 255);
      +
      632 assert(-1 <= green and green <= 255);
      +
      633 assert(-1 <= blue and blue <= 255);
      +
      634 }
      +
      635
      +
      637 bool is_set() const {return red > -1 and green > -1 and blue > -1;}
      +
      638
      +
      640 std::ostream& print_on( std::ostream& os) const
      +
      641 {
      +
      642 os << red << ";" << green << ";" << blue;
      +
      643 return os;
      +
      644 }
      +
      645 };
      +
      646
      +
      648 struct fg_16M : public color_16M {
      +
      650 fg_16M() : color_16M(ground::fore) {}
      +
      651
      +
      660 fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
      +
      661
      +
      668 fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
      +
      669
      +
      673 fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
      +
      674
      + +
      676
      +
      678 struct bg_16M : public color_16M {
      +
      680 bg_16M() : color_16M(ground::back) {}
      +
      681
      +
      690 bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
      +
      691
      +
      698 bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
      +
      699
      +
      703 bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
      +
      704
      + +
      706
      +
      709 public:
      +
      711 fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
      +
      712
      +
      715 explicit fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      716 explicit fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      717 explicit fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      718 explicit fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      719 explicit fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      720 explicit fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      725 explicit fmt(const short f, const short b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
      +
      726 explicit fmt(const short f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
      +
      727 explicit fmt(fg, const short b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
      +
      728 explicit fmt(const short f, bg, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
      +
      733 explicit fmt(const short fr, const short fg, const short fb,
      +
      734 const short gr, const short gg, const short gb,
      +
      735 typo s = typo::none)
      +
      736 : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
      +
      737 explicit fmt(fg,
      +
      738 const short gr, const short gg, const short gb,
      +
      739 typo s = typo::none)
      +
      740 : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
      +
      741 explicit fmt(const short fr, const short fg, const short fb,
      +
      742 bg, typo s = typo::none)
      +
      743 : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      +
      744 explicit fmt(const short fr, const short fg, const short fb,
      +
      745 typo s = typo::none)
      +
      746 : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      +
      747
      +
      748 explicit fmt(const std::string& f, const std::string& b, typo s = typo::none)
      +
      749 : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
      +
      750 explicit fmt(fg, const std::string& b, typo s = typo::none)
      +
      751 : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
      +
      752 explicit fmt(const std::string& f, bg, typo s = typo::none)
      +
      753 : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      +
      754 explicit fmt(const std::string& f, typo s = typo::none)
      +
      755 : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      +
      758 protected:
      +
      759
      +
      761 std::ostream& print_on( std::ostream& os) const
      +
      762 {
      +
      763 if(mode == ansi::colors_16) {
      +
      764 // Print all in a single escape.
      +
      765 os << std::make_tuple(fore,back,style);
      +
      766
      +
      767 } else {
      +
      768 // 256 or 16M: always print separated escapes for foreground/background.
      +
      769 if(mode == ansi::colors_256) {
      +
      770 os << fore_256;
      +
      771 os << back_256;
      +
      772
      +
      773 } else if(mode == ansi::colors_16M) {
      +
      774 os << fore_16M;
      +
      775 os << back_16M;
      +
      776 }
      +
      777 // In any case, print the style separately.
      +
      778 os << style;
      +
      779 }
      +
      780 return os;
      +
      781 }
      +
      782
      +
      783 public:
      +
      795 friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
      +
      796 {
      +
      797 return fmt.print_on(os);
      +
      798 }
      +
      799
      +
      810 std::string operator()( const std::string& msg ) const
      +
      811 {
      +
      812 std::ostringstream os;
      +
      813 this->print_on(os);
      +
      814 fmt reset(fmt::typo::reset);
      +
      815 os << msg;
      +
      816 reset.print_on(os);
      +
      817 return os.str();
      +
      818 }
      +
      819
      +
      822 std::string str() const
      +
      823 {
      +
      824 std::ostringstream os;
      +
      825 this->print_on(os);
      +
      826 return os.str();
      +
      827 }
      +
      828
      +
      829 static fmt hash( const std::string& str, const std::vector<fmt> domain = {})
      +
      830 {
      +
      831 size_t h = std::hash<std::string>{}(str);
      +
      832 if(domain.size() == 0) {
      +
      833 return fmt(static_cast<short>(h % 256));
      +
      834 } else {
      +
      835 return domain[h % domain.size()];
      +
      836 }
      +
      837 }
      +
      838 }; // fmt class
      +
      839
      +
      845 public:
      +
      846 clutchlog(clutchlog const&) = delete;
      +
      847 void operator=(clutchlog const&) = delete;
      +
      848
      +
      849 private:
      +
      850 clutchlog() :
      +
      851 // system, main, log
      + + +
      854 {level::critical,"Critical"},
      +
      855 {level::error ,"Error"},
      +
      856 {level::warning ,"Warning"},
      +
      857 {level::progress,"Progress"},
      +
      858 {level::note ,"Note"},
      +
      859 {level::info ,"Info"},
      +
      860 {level::debug ,"Debug"},
      +
      861 {level::xdebug ,"XDebug"}
      +
      862 }),
      + +
      864 {level::critical, "Crit"},
      +
      865 {level::error , "Erro"},
      +
      866 {level::warning , "Warn"},
      +
      867 {level::progress, "Prog"},
      +
      868 {level::note , "Note"},
      +
      869 {level::info , "Info"},
      +
      870 {level::debug , "Dbug"},
      +
      871 {level::xdebug , "XDbg"}
      +
      872 }),
      +
      873 _level_fmt({
      +
      874 {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
      +
      875 {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
      +
      876 {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
      +
      877 {level::progress,fmt()},
      +
      878 {level::note ,fmt()},
      +
      879 {level::info ,fmt()},
      +
      880 {level::debug ,fmt()},
      +
      881 {level::xdebug ,fmt()}
      +
      882 }),
      + + +
      885 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      + +
      887 _hfill_fmt(fmt::fg::none),
      + + +
      890 #endif
      +
      891 _out(&std::clog),
      +
      892 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      893 _depth(std::numeric_limits<size_t>::max() - _strip_calls),
      + +
      895 #endif
      +
      896 _stage(level::error),
      +
      897 _in_file(".*"),
      +
      898 _in_func(".*"),
      +
      899 _in_line(".*"),
      +
      900 // Empty vectors by default:
      +
      901 // _filehash_fmts
      +
      902 // _funchash_fmts
      +
      903 // _depth_fmts
      +
      904 _filename(filename::path)
      +
      905 {
      +
      906 // Reverse the level->word map into a word->level map.
      +
      907 for(auto& lw : _level_word) {
      +
      908 _word_level[lw.second] = lw.first;
      +
      909 }
      +
      910#if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      +
      911 struct winsize w;
      +
      912 ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
      +
      913 _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
      +
      914#endif
      +
      915 }
      +
      916
      +
      917 protected:
      + +
      921 const std::map<level,std::string> _level_word;
      +
      923 std::map<std::string,level> _word_level;
      +
      925 std::map<level,std::string> _level_short;
      +
      927 std::map<level,fmt> _level_fmt;
      +
      929 std::string _format_log;
      +
      931 std::string _format_dump;
      +
      932 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      +
      934 char _hfill_char;
      +
      936 fmt _hfill_fmt;
      +
      938 size_t _hfill_max;
      +
      940 size_t _hfill_min;
      +
      941 #endif
      +
      943 std::ostream* _out;
      +
      944 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      946 size_t _depth;
      +
      948 std::string _depth_mark;
      +
      949 #endif
      + +
      953 std::regex _in_file;
      +
      955 std::regex _in_func;
      +
      957 std::regex _in_line;
      +
      958
      +
      960 std::vector<fmt> _filehash_fmts;
      +
      962 std::vector<fmt> _funchash_fmts;
      +
      963
      +
      964#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      966 static const size_t _max_buffer = 4096;
      +
      968 std::vector<fmt> _depth_fmts;
      +
      969#endif
      +
      970
      +
      971#if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      +
      973 size_t _nb_columns;
      +
      974#endif
      +
      975
      + +
      980 public:
      +
      981
      +
      986 void format(const std::string& format) {_format_log = format;}
      +
      988 std::string format() const {return _format_log;}
      +
      989
      +
      991 void format_comment(const std::string& format) {_format_dump = format;}
      +
      993 std::string format_comment() const {return _format_dump;}
      +
      994
      +
      996 void out(std::ostream& out) {_out = &out;}
      +
      998 std::ostream& out() {return *_out;}
      +
      999
      +
      1000#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      1002 void depth(size_t d) {_depth = d;}
      +
      1004 size_t depth() const {return _depth;}
      +
      1005
      +
      1007 void depth_mark(const std::string mark) {_depth_mark = mark;}
      +
      1009 std::string depth_mark() const {return _depth_mark;}
      +
      1010
      +
      1012 void strip_calls(const size_t n) {_strip_calls = n;}
      +
      1014 size_t strip_calls() const {return _strip_calls;}
      +
      1015#endif
      +
      1016#if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      +
      1018 void hfill_mark(const char mark) {_hfill_char = mark;}
      +
      1020 char hfill_mark() const {return _hfill_char;}
      +
      1022 void hfill_style(fmt style) {_hfill_fmt = style;}
      +
      1027 template<class ... FMT>
      +
      1028 void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
      +
      1030 fmt hfill_style() const {return _hfill_fmt;}
      +
      1032 void hfill_max(const size_t nmax) {_hfill_max = nmax;}
      +
      1034 size_t hfill_max() {return _hfill_max;}
      +
      1036 void hfill_min(const size_t nmin) {_hfill_min = nmin;}
      +
      1038 size_t hfill_min() {return _hfill_min;}
      +
      1039#endif
      +
      1047 void filehash_styles(std::vector<fmt> styles) {_filehash_fmts = styles;}
      +
      1055 void funchash_styles(std::vector<fmt> styles) {_funchash_fmts = styles;}
      +
      1064 void depth_styles(std::vector<fmt> styles) {_depth_fmts = styles;}
      +
      1065
      +
      1067 void threshold(level l) {_stage = l;}
      +
      1069 void threshold(const std::string& l) {_stage = this->level_of(l);}
      +
      1071 level threshold() const {return _stage;}
      +
      1073 const std::map<std::string,level>& levels() const { return _word_level;}
      +
      1074
      +
      1079 level level_of(const std::string name)
      +
      1080 {
      +
      1081 const auto ilevel = _word_level.find(name);
      +
      1082 if( ilevel != std::end(_word_level)) {
      +
      1083 return ilevel->second;
      +
      1084 } else {
      +
      1085 throw std::out_of_range("'" + name + "' is not a valid log level name");
      +
      1086 }
      +
      1087 }
      +
      1088
      +
      1090 void file(std::string file) {_in_file = file;}
      +
      1092 void func(std::string func) {_in_func = func;}
      +
      1094 void line(std::string line) {_in_line = line;}
      +
      1095
      + +
      1098 const std::string& in_file,
      +
      1099 const std::string& in_function=".*",
      +
      1100 const std::string& in_line=".*"
      +
      1101 )
      +
      1102 {
      +
      1103 file(in_file);
      +
      1104 func(in_function);
      +
      1105 line(in_line);
      +
      1106 }
      +
      1107
      +
      1112 template<class ... FMT>
      +
      1113 void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
      +
      1115 void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
      +
      1117 fmt style(level stage) const { return _level_fmt.at(stage); }
      +
      1118
      + +
      1121
      +
      1124 public:
      +
      1125
      +
      1130 struct scope_t {
      + + +
      1135#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      1137 size_t depth;
      +
      1138#endif
      +
      1140 bool there;
      + +
      1143 matches(false),
      +
      1144 stage(level::xdebug),
      + +
      1146 depth(0),
      +
      1147#endif
      +
      1148 there(false)
      +
      1149 {}
      +
      1150 }; // scope_t
      +
      1151
      +
      1152
      + +
      1155 const level& stage,
      +
      1156 const std::string& file,
      +
      1157 const std::string& func,
      +
      1158 const size_t line
      +
      1159 ) const
      +
      1160 {
      +
      1161 scope_t scope; // False scope by default.
      +
      1162
      +
      1163 /***** Log level stage *****/
      +
      1164 // Test stage first, because it's fastest.
      +
      1165 scope.stage = stage;
      +
      1166 if(not (scope.stage <= _stage)) {
      +
      1167 // Bypass useless computations if no match
      +
      1168 // because of the stage.
      +
      1169 return scope;
      +
      1170 }
      +
      1171#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      1172 /***** Stack depth *****/
      +
      1173 // Backtrace in second, quite fast.
      +
      1174 size_t stack_depth;
      +
      1175 void *buffer[_max_buffer];
      +
      1176 stack_depth = backtrace(buffer, _max_buffer);
      +
      1177 scope.depth = stack_depth;
      +
      1178 if(not (scope.depth <= _depth + _strip_calls)) {
      +
      1179 // Bypass if no match.
      +
      1180 return scope;
      +
      1181 }
      +
      1182#endif
      +
      1183
      +
      1184 /***** Location *****/
      +
      1185 // Location last, slowest.
      +
      1186 std::ostringstream sline; sline << line;
      +
      1187 scope.there =
      +
      1188 std::regex_search(file, _in_file)
      +
      1189 and std::regex_search(func, _in_func)
      +
      1190 and std::regex_search(sline.str(), _in_line);
      +
      1191
      +
      1192 // No need to retest stage and depth, which are true here.
      +
      1193 scope.matches = scope.there;
      +
      1194
      +
      1195 return scope;
      +
      1196 } // locate
      +
      1197
      +
      1205 std::string replace(
      +
      1206 const std::string& form,
      +
      1207 const std::string& mark,
      +
      1208 const std::string& tag
      +
      1209 ) const
      +
      1210 {
      +
      1211 // Useless debug code, unless something fancy would be done with name tags.
      +
      1212 // std::regex re;
      +
      1213 // try {
      +
      1214 // re = std::regex(mark);
      +
      1215 //
      +
      1216 // } catch(const std::regex_error& e) {
      +
      1217 // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
      +
      1218 // switch(e.code()) {
      +
      1219 // case std::regex_constants::error_collate:
      +
      1220 // std::cerr << "the expression contains an invalid collating element name";
      +
      1221 // break;
      +
      1222 // case std::regex_constants::error_ctype:
      +
      1223 // std::cerr << "the expression contains an invalid character class name";
      +
      1224 // break;
      +
      1225 // case std::regex_constants::error_escape:
      +
      1226 // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
      +
      1227 // break;
      +
      1228 // case std::regex_constants::error_backref:
      +
      1229 // std::cerr << "the expression contains an invalid back reference";
      +
      1230 // break;
      +
      1231 // case std::regex_constants::error_brack:
      +
      1232 // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
      +
      1233 // break;
      +
      1234 // case std::regex_constants::error_paren:
      +
      1235 // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
      +
      1236 // break;
      +
      1237 // case std::regex_constants::error_brace:
      +
      1238 // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
      +
      1239 // break;
      +
      1240 // case std::regex_constants::error_badbrace:
      +
      1241 // std::cerr << "the expression contains an invalid range in a {} expression";
      +
      1242 // break;
      +
      1243 // case std::regex_constants::error_range:
      +
      1244 // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
      +
      1245 // break;
      +
      1246 // case std::regex_constants::error_space:
      +
      1247 // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
      +
      1248 // break;
      +
      1249 // case std::regex_constants::error_badrepeat:
      +
      1250 // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
      +
      1251 // break;
      +
      1252 // case std::regex_constants::error_complexity:
      +
      1253 // std::cerr << "the complexity of an attempted match exceeded a predefined level";
      +
      1254 // break;
      +
      1255 // case std::regex_constants::error_stack:
      +
      1256 // std::cerr << "there was not enough memory to perform a match";
      +
      1257 // break;
      +
      1258 // default:
      +
      1259 // std::cerr << "unknown error";
      +
      1260 // }
      +
      1261 // std::cerr << std::endl;
      +
      1262 // throw;
      +
      1263 // } // catch
      +
      1264
      +
      1265 const std::regex re(mark);
      +
      1266 return std::regex_replace(form, re, tag);
      +
      1267 }
      +
      1268
      +
      1270 std::string replace(
      +
      1271 const std::string& form,
      +
      1272 const std::string& mark,
      +
      1273 const size_t tag
      +
      1274 ) const
      +
      1275 {
      +
      1276 std::ostringstream stag; stag << tag;
      +
      1277 return replace(form, mark, stag.str());
      +
      1278 }
      +
      1279
      +
      1281 std::string format(
      +
      1282 std::string row,
      +
      1283 const std::string& what,
      + +
      1285 const std::string& name,
      +
      1286#endif
      +
      1287 const level& stage,
      +
      1288 const std::string& file,
      +
      1289 const std::string& func,
      +
      1290 const size_t line
      + +
      1292 ,
      +
      1293 const size_t depth
      +
      1294#endif
      +
      1295 ) const
      +
      1296 {
      +
      1297 row = replace(row, "\\{msg\\}", what);
      +
      1298
      +
      1299 const std::filesystem::path filepath(file);
      +
      1300 std::string filename;
      +
      1301 std::filesystem::path::iterator ip = filepath.end();
      +
      1302 std::advance(ip, -2);
      +
      1303 switch(_filename) {
      +
      1304 case filename::base:
      +
      1305 filename = filepath.filename().string();
      +
      1306 break;
      +
      1307 case filename::dir:
      +
      1308 filename = ip->string();
      +
      1309 break;
      +
      1310 case filename::dirbase:
      +
      1311 filename = (*ip / filepath.filename()).string();
      +
      1312 break;
      +
      1313 case filename::stem:
      +
      1314 filename = filepath.stem().string();
      +
      1315 break;
      +
      1316 case filename::dirstem:
      +
      1317 filename = (*ip / filepath.stem()).string();
      +
      1318 break;
      +
      1319 case filename::path:
      +
      1320 default:
      +
      1321 filename = file;
      +
      1322 break;
      +
      1323 }
      +
      1324 row = replace(row, "\\{file\\}", filename);
      +
      1325
      +
      1326
      +
      1327 row = replace(row, "\\{func\\}", func);
      +
      1328 row = replace(row, "\\{line\\}", line);
      +
      1329
      +
      1330 row = replace(row, "\\{level\\}", _level_word.at(stage));
      +
      1331 std::string letter(1, _level_word.at(stage).at(0)); // char -> string
      +
      1332 row = replace(row, "\\{level_letter\\}", letter);
      +
      1333 row = replace(row, "\\{level_short\\}", _level_short.at(stage));
      +
      1334
      +
      1335#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      1336 size_t actual_depth = depth - _strip_calls;
      +
      1337 row = replace(row, "\\{name\\}", name);
      +
      1338 row = replace(row, "\\{depth\\}", actual_depth);
      +
      1339
      +
      1340 if(_depth_fmts.size() == 0) {
      +
      1341 row = replace(row, "\\{depth_fmt\\}", fmt(actual_depth % 256).str() );
      +
      1342
      +
      1343 std::ostringstream chevrons;
      +
      1344 for(size_t i = 0; i < actual_depth; ++i) {
      +
      1345 chevrons << _depth_mark;
      +
      1346 }
      +
      1347 row = replace(row, "\\{depth_marks\\}", chevrons.str());
      +
      1348
      +
      1349 } else {
      +
      1350 row = replace(row, "\\{depth_fmt\\}",
      +
      1351 _depth_fmts[std::min(actual_depth,_depth_fmts.size()-1)].str() );
      +
      1352
      +
      1353 std::ostringstream chevrons;
      +
      1354 for(size_t i = 0; i < actual_depth; ++i) {
      +
      1355 chevrons << _depth_fmts[std::min(i+1,_depth_fmts.size()-1)].str()
      +
      1356 << _depth_mark;
      +
      1357 }
      +
      1358 row = replace(row, "\\{depth_marks\\}", chevrons.str());
      +
      1359 }
      +
      1360#endif
      +
      1361 row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
      +
      1362 row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() );
      +
      1363 row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() );
      +
      1364
      +
      1365#if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
      +
      1366 // hfill is replaced last to allow for correct line width estimation.
      +
      1367 const std::string raw_row = replace(row, "(\\x9B|\\x1B\\[)[0-?]*[ -\\/]*[@-~]", "");
      +
      1368 const std::string hfill_tag = "{hfill}";
      +
      1369 const size_t hfill_pos = row.find(hfill_tag);
      +
      1370 const size_t raw_hfill_pos = raw_row.find(hfill_tag);
      +
      1371 const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
      +
      1372 if(hfill_pos != std::string::npos) {
      +
      1373 assert(raw_hfill_pos != std::string::npos);
      +
      1374 if(nb_columns > 0) {
      +
      1375 const size_t left_len = raw_hfill_pos;
      +
      1376 const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
      +
      1377 if(right_len+left_len > nb_columns) {
      +
      1378 // The right part would go over the terminal width: add a new row.
      +
      1379 if(right_len < nb_columns) {
      +
      1380 // There is room for the right part on a new line.
      +
      1381 const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
      +
      1382 const std::string hfill_styled = _hfill_fmt(hfill);
      +
      1383 row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
      +
      1384 } else {
      +
      1385 // Right part still goes over columns: let it go.
      +
      1386 const std::string hfill(1, _hfill_char);
      +
      1387 const std::string hfill_styled = _hfill_fmt(hfill);
      +
      1388 row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
      +
      1389 }
      +
      1390 } else {
      +
      1391 // There is some space in between left and right parts.
      +
      1392 const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
      +
      1393 const std::string hfill_styled = _hfill_fmt(hfill);
      +
      1394 row = replace(row, "\\{hfill\\}", hfill_styled);
      +
      1395 }
      +
      1396 } else {
      +
      1397 // We don't know the terminal width.
      +
      1398 const std::string hfill(1, _hfill_char);
      +
      1399 const std::string hfill_styled = _hfill_fmt(hfill);
      +
      1400 row = replace(row, "\\{hfill\\}", hfill_styled);
      +
      1401 }
      +
      1402 }
      +
      1403#else
      +
      1404 // We cannot know the terminal width.
      +
      1405 const std::string hfill(1, _hfill_char);
      +
      1406 const std::string hfill_styled = _hfill_fmt(hfill);
      +
      1407 row = replace(row, "\\{hfill\\}", hfill_styled);
      +
      1408#endif
      +
      1409 return _level_fmt.at(stage)(row);
      +
      1410 }
      +
      1411
      +
      1413 void log(
      +
      1414 const level& stage,
      +
      1415 const std::string& what,
      +
      1416 const std::string& file, const std::string& func, const size_t line,
      +
      1417 const size_t depth_delta = 0
      +
      1418 ) const
      +
      1419 {
      +
      1420 scope_t scope = locate(stage, file, func, line);
      +
      1421
      +
      1422 if(scope.matches) {
      +
      1423#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      1424 *_out << format(_format_log, what, basename(getenv("_")),
      +
      1425 stage, file, func,
      +
      1426 line, scope.depth + depth_delta );
      +
      1427#else
      +
      1428 *_out << format(_format_log, what,
      +
      1429 stage, file, func,
      +
      1430 line );
      +
      1431#endif
      +
      1432 _out->flush();
      +
      1433 } // if scopes.matches
      +
      1434 }
      +
      1435
      +
      1437 template<class In>
      +
      1438 void dump(
      +
      1439 const level& stage,
      +
      1440 const In container_begin, const In container_end,
      +
      1441 const std::string& file, const std::string& func, const size_t line,
      +
      1442 const std::string& filename_template = "dump_{n}.dat",
      +
      1443 const std::string sep = dump_default_sep
      +
      1444 ) const
      +
      1445 {
      +
      1446 scope_t scope = locate(stage, file, func, line);
      +
      1447
      +
      1448 if(scope.matches) {
      +
      1449 const std::string tag = "\\{n\\}";
      +
      1450 const std::regex re(tag);
      +
      1451 std::string outfile = "";
      +
      1452
      +
      1453 // If the file name template has the {n} tag.
      +
      1454 if(std::regex_search(filename_template, re)) {
      +
      1455 // Increment n until a free one is found.
      +
      1456 size_t n = 0;
      +
      1457 do {
      +
      1458 outfile = replace(filename_template, tag, n);
      +
      1459 n++;
      +
      1460 } while( fs::exists( outfile ) );
      +
      1461
      +
      1462 } else {
      +
      1463 // Use the parameter as is.
      +
      1464 outfile = filename_template;
      +
      1465 }
      +
      1466
      +
      1467 std::ofstream fd(outfile);
      +
      1468
      +
      1469 if(_format_dump.size() > 0) {
      +
      1470#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      1471 fd << format(_format_dump, "", basename(getenv("_")),
      +
      1472 stage, file, func,
      +
      1473 line, scope.depth );
      +
      1474#else
      +
      1475 fd << format(_format_dump, "",
      +
      1476 stage, file, func,
      +
      1477 line );
      +
      1478#endif
      +
      1479 fd << sep; // sep after comment line.
      +
      1480 }
      +
      1481
      +
      1482 std::copy(container_begin, container_end,
      +
      1483 std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
      +
      1484
      +
      1485 fd.close();
      +
      1486 } // if scopes.matches
      +
      1487 }
      +
      1488
      +
      1490};
      +
      1491
      +
      1494#else // not WITH_CLUTCHLOG
      +
      1495
      +
      1496
      +
      1497/**********************************************************************
      +
      1498 * Fake implementation
      +
      1499 **********************************************************************/
      +
      1500
      +
      1501// Equivalent class with empty methods, will be optimized out
      +
      1502// while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
      +
      1503#pragma GCC diagnostic push
      +
      1504#pragma GCC diagnostic ignored "-Wreturn-type"
      +
      1505class clutchlog
      +
      1506{
      +
      1507 public:
      +
      1508 static clutchlog& logger() {
      +
      1509 static clutchlog instance;
      +
      1510 return instance;
      +
      1511 }
      +
      1512 enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
      +
      1513 enum filename {path, base, dir, dirbase, stem, dirstem};
      +
      1514 class fmt {
      +
      1515 public:
      +
      1516 enum class ansi { colors_16, colors_256, colors_16M} mode;
      +
      1517 enum class typo { reset, bold, underline, inverse, none} style;
      +
      1518 enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none} fore;
      +
      1519 enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none } back;
      +
      1520 protected:
      +
      1521 friend std::ostream& operator<<(std::ostream&, const std::tuple<fg,bg,typo>&) {}
      +
      1522 friend std::ostream& operator<<(std::ostream&, const typo&) {}
      +
      1523 protected:
      +
      1524 struct color {
      +
      1525 ansi mode;
      +
      1526 enum class ground { fore, back } type;
      +
      1527 color(ansi a, ground g) : mode(a), type(g) {}
      +
      1528 virtual bool is_set() const = 0;
      +
      1529 virtual std::ostream& print_on( std::ostream&) const = 0;
      +
      1530 friend std::ostream& operator<<(std::ostream&, const color&) {}
      +
      1531 };
      +
      1532 struct color_256 : public color {
      +
      1533 short index;
      +
      1534 color_256(ground t) : color(ansi::colors_256, t), index(-1) {}
      +
      1535 color_256(ground t, const short i) : color(ansi::colors_256, t), index(i) {}
      +
      1536 bool is_set() const {}
      +
      1537 std::ostream& print_on( std::ostream&) const {}
      +
      1538 };
      +
      1539 struct fg_256 : public color_256 {
      +
      1540 fg_256() : color_256(ground::fore) {}
      +
      1541 fg_256(const short f) : color_256(ground::fore, f) {}
      +
      1542 fg_256(const fg&) : color_256(ground::fore, -1) {}
      +
      1543 } fore_256;
      +
      1544 struct bg_256 : public color_256 {
      +
      1545 bg_256() : color_256(ground::back) {}
      +
      1546 bg_256(const short b) : color_256(ground::back, b) {}
      +
      1547 bg_256(const bg&) : color_256(ground::back, -1) {}
      +
      1548 } back_256;
      +
      1549 struct color_16M : public color {
      +
      1550 short red, green, blue;
      +
      1551 color_16M(ground t) : color(ansi::colors_16M, t), red(-1), green(-1), blue(-1) {}
      +
      1552 color_16M(ground t, short r, short g, short b) : color(ansi::colors_16M, t), red(r), green(g), blue(b) {}
      +
      1553 color_16M(ground t, const std::string&) : color(ansi::colors_16M, t) {}
      +
      1554 bool is_set() const {return red > -1 and green > -1 and blue > -1;}
      +
      1555 std::ostream& print_on( std::ostream&) const {}
      +
      1556 };
      +
      1557 struct fg_16M : public color_16M {
      +
      1558 fg_16M() : color_16M(ground::fore) {}
      +
      1559 fg_16M(short r, short g, short b) : color_16M(ground::fore, r,g,b) {}
      +
      1560 fg_16M(const std::string& srgb) : color_16M(ground::fore, srgb) {}
      +
      1561 fg_16M(const fg&) : color_16M(ground::fore, -1,-1,-1) {}
      +
      1562 } fore_16M;
      +
      1563 struct bg_16M : public color_16M {
      +
      1564 bg_16M() : color_16M(ground::back) {}
      +
      1565 bg_16M(short r, short g, short b) : color_16M(ground::back, r,g,b) {}
      +
      1566 bg_16M(const std::string& srgb) : color_16M(ground::back, srgb) {}
      +
      1567 bg_16M(const bg&) : color_16M(ground::back, -1,-1,-1) {}
      +
      1568 } back_16M;
      +
      1569 public:
      +
      1570 fmt() : mode(ansi::colors_16), style(typo::none), fore(fg::none), back(bg::none) {}
      +
      1571 fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      1572 fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      1573 fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      1574 fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      1575 fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      1576 fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {}
      +
      1577 fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {}
      +
      1578 fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {}
      +
      1579 fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {}
      +
      1580 fmt(const short fr, const short fg, const short fb,
      +
      1581 const short gr, const short gg, const short gb,
      +
      1582 typo s = typo::none)
      +
      1583 : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {}
      +
      1584 fmt(fg,
      +
      1585 const short gr, const short gg, const short gb,
      +
      1586 typo s = typo::none)
      +
      1587 : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {}
      +
      1588 fmt(const short fr, const short fg, const short fb,
      +
      1589 bg, typo s = typo::none)
      +
      1590 : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      +
      1591 fmt(const short fr, const short fg, const short fb,
      +
      1592 typo s = typo::none)
      +
      1593 : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {}
      +
      1594
      +
      1595 fmt(const std::string& f, const std::string& b, typo s = typo::none)
      +
      1596 : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {}
      +
      1597 fmt(fg, const std::string& b, typo s = typo::none)
      +
      1598 : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {}
      +
      1599 fmt(const std::string& f, bg, typo s = typo::none)
      +
      1600 : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      +
      1601 fmt(const std::string& f, typo s = typo::none)
      +
      1602 : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {}
      +
      1603 protected:
      +
      1604 std::ostream& print_on( std::ostream&) const {}
      +
      1605 public:
      +
      1606 friend std::ostream& operator<<(std::ostream& os, const fmt&) { return os; }
      +
      1607 std::string operator()( const std::string& msg) const { return msg; }
      +
      1608 std::string str() const { return ""; }
      +
      1609 static fmt hash( const std::string&, const std::vector<fmt>) {}
      +
      1610 };
      +
      1611 public:
      +
      1612 clutchlog(clutchlog const&) = delete;
      +
      1613 void operator=(clutchlog const&) = delete;
      +
      1614 private:
      +
      1615 clutchlog() {}
      +
      1616 protected:
      +
      1617 struct scope_t {};
      +
      1618 scope_t locate(
      +
      1619 const level&,
      +
      1620 const std::string&,
      +
      1621 const std::string&,
      +
      1622 const size_t
      +
      1623 ) const
      +
      1624 {}
      +
      1625 public:
      +
      1626 void format(const std::string&) {}
      +
      1627 std::string format() const { return ""; }
      +
      1628
      +
      1629 void format_comment(const std::string&) {}
      +
      1630 std::string format_comment() const { return ""; }
      +
      1631
      +
      1632 void out(std::ostream&) {}
      +
      1633 std::ostream& out() {}
      +
      1634
      +
      1635#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
      +
      1636 void depth(size_t) {}
      +
      1637 size_t depth() const { return 0; }
      +
      1638
      +
      1639 void depth_mark(const std::string) {}
      +
      1640 std::string depth_mark() const { return ""; }
      +
      1641 void strip_calls(const size_t) {}
      +
      1642 size_t strip_calls() const { return 0; }
      +
      1643#endif
      +
      1644#if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
      +
      1645 void hfill_mark(const char) {}
      +
      1646 char hfill_mark() const { return '\0'; }
      +
      1647 void hfill_fmt(fmt) {}
      +
      1648 fmt hfill_fmt() const { return fmt(); }
      +
      1649 void hfill_min(const size_t) {}
      +
      1650 size_t hfill_min() { return 0; }
      +
      1651 void hfill_max(const size_t) {}
      +
      1652 size_t hfill_max() { return 0; }
      +
      1653#endif
      +
      1654 void filehash_styles(std::vector<fmt> ) {}
      +
      1655 void funchash_styles(std::vector<fmt> ) {}
      +
      1656 void depth_styles(std::vector<fmt>) {}
      +
      1657
      +
      1658 void threshold(level) {}
      +
      1659 void threshold(const std::string&) {}
      +
      1660 level threshold() const { return level::error; }
      +
      1661 const std::map<std::string,level> levels() const {}
      +
      1662 level level_of(const std::string) { return level::error; }
      +
      1663
      +
      1664 void file(std::string) {}
      +
      1665 void func(std::string) {}
      +
      1666 void line(std::string) {}
      +
      1667
      +
      1668#pragma GCC diagnostic push
      +
      1669#pragma GCC diagnostic ignored "-Wunused-parameter"
      +
      1670 void location(
      +
      1671 const std::string&,
      +
      1672 const std::string& in_function=".*",
      +
      1673 const std::string& in_line=".*"
      +
      1674 )
      +
      1675 {}
      +
      1676#pragma GCC diagnostic pop
      +
      1677 template<class ... FMT>
      +
      1678 void style(level, FMT...) {}
      +
      1679 void style(level, fmt) {}
      +
      1680 fmt style(level) const { return fmt(); }
      +
      1681 void filename(filename) {}
      +
      1682 public:
      +
      1683 std::string replace(
      +
      1684 const std::string& form,
      +
      1685 const std::string&,
      +
      1686 const std::string&
      +
      1687 ) const
      +
      1688 {
      +
      1689 return form;
      +
      1690 }
      +
      1691
      +
      1692 std::string replace(
      +
      1693 const std::string& form,
      +
      1694 const std::string&,
      +
      1695 const size_t
      +
      1696 ) const
      +
      1697 {
      +
      1698 return form;
      +
      1699 }
      +
      1700
      +
      1701 std::string format(
      +
      1702 std::string row,
      +
      1703 const std::string&,
      + +
      1705 const std::string&,
      +
      1706#endif
      +
      1707 const level&,
      +
      1708 const std::string&,
      +
      1709 const std::string&,
      +
      1710 const size_t
      + +
      1712 ,
      +
      1713 const size_t
      +
      1714#endif
      +
      1715 ) const
      +
      1716 {
      +
      1717 return row;
      +
      1718 }
      +
      1719
      +
      1720 void log(
      +
      1721 const level&,
      +
      1722 const std::string&,
      +
      1723 const std::string&, const std::string&, size_t
      +
      1724 ) const
      +
      1725 {}
      +
      1726
      +
      1727 template<class In>
      +
      1728 void dump(
      +
      1729 const level&,
      +
      1730 const In, const In,
      +
      1731 const std::string&, const std::string&, size_t,
      +
      1732 const std::string&,
      +
      1733 const std::string
      +
      1734 ) const
      +
      1735 {}
      +
      1736};
      +
      1737#pragma GCC diagnostic pop
      +
      1738#endif // WITH_CLUTCHLOG
      +
      1739
      +
      1740#endif // CLUTCHLOG_H
      +
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:380
      +
      enum clutchlog::fmt::ansi mode
      Current ANSI color mode.
      +
      friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
      Output stream overload.
      Definition: clutchlog.h:795
      +
      enum clutchlog::fmt::typo style
      Typographic style.
      +
      fmt()
      Empty constructor, only useful for a no-op formatter.
      Definition: clutchlog.h:711
      +
      ansi
      ANSI code configuring the available number of colors.
      Definition: clutchlog.h:383
      +
      @ colors_16M
      16 millions ("true") colors mode.
      +
      @ colors_16
      16 colors mode.
      +
      @ colors_256
      256 colors mode.
      +
      typo
      Typographic style codes.
      Definition: clutchlog.h:393
      +
      std::string str() const
      Return the formatting code as a string.
      Definition: clutchlog.h:822
      +
      std::ostream & print_on(std::ostream &os) const
      Print the currently encoded format escape code on the given output stream.
      Definition: clutchlog.h:761
      +
      std::string operator()(const std::string &msg) const
      Format the given string with the currently encoded format.
      Definition: clutchlog.h:810
      +
      The single class which holds everything.
      Definition: clutchlog.h:189
      +
      filename _filename
      Filename rendering method.
      Definition: clutchlog.h:977
      +
      void depth_styles(std::vector< fmt > styles)
      Set the styles for value-dependant depth formatting.
      Definition: clutchlog.h:1064
      +
      std::map< level, std::string > _level_short
      dictionary of level identifier to their 4-letters representation.
      Definition: clutchlog.h:925
      +
      std::vector< fmt > _funchash_fmts
      List of candidate format objects for value-dependant function name styling.
      Definition: clutchlog.h:962
      +
      static std::string default_format
      Default format of the messages.
      Definition: clutchlog.h:224
      +
      void file(std::string file)
      Set the regular expression filtering the file location.
      Definition: clutchlog.h:1090
      +
      level
      Available log levels.
      Definition: clutchlog.h:314
      +
      std::regex _in_func
      Current function location filter.
      Definition: clutchlog.h:955
      +
      void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
      Print a log message IF the location matches the given one.
      Definition: clutchlog.h:1413
      +
      std::ostream * _out
      Standard output.
      Definition: clutchlog.h:943
      +
      static unsigned int default_strip_calls
      Number of call stack levels to remove from depth display by default.
      Definition: clutchlog.h:267
      +
      void format_comment(const std::string &format)
      Set the template string for dumps.
      Definition: clutchlog.h:991
      +
      static std::string default_depth_mark
      Default mark for stack depth.
      Definition: clutchlog.h:260
      +
      std::vector< fmt > _filehash_fmts
      List of candidate format objects for value-dependant file name styling.
      Definition: clutchlog.h:960
      +
      size_t _strip_calls
      Current number of call stack levels to remove from depth display.
      Definition: clutchlog.h:919
      +
      void threshold(level l)
      Set the log level (below which logs are not printed) with an identifier.
      Definition: clutchlog.h:1067
      +
      std::regex _in_line
      Current line location filter.
      Definition: clutchlog.h:957
      +
      fmt style(level stage) const
      Get the configured fmt instance of the given log level.
      Definition: clutchlog.h:1117
      +
      scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
      Gather information on the current location of the call.
      Definition: clutchlog.h:1154
      +
      static size_t default_hfill_min
      Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
      Definition: clutchlog.h:288
      +
      std::string _format_dump
      Current format of the file output.
      Definition: clutchlog.h:931
      +
      void format(const std::string &format)
      Set the template string.
      Definition: clutchlog.h:986
      +
      void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
      Set the regular expressions filtering the location.
      Definition: clutchlog.h:1097
      +
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:307
      +
      static char default_hfill_char
      Default character used as a filling for right-align the right part of messages with "{hfill}".
      Definition: clutchlog.h:274
      +
      void threshold(const std::string &l)
      Set the log level (below which logs are not printed) with a string.
      Definition: clutchlog.h:1069
      +
      std::string _format_log
      Current format of the standard output.
      Definition: clutchlog.h:929
      +
      void out(std::ostream &out)
      Set the output stream on which to print.
      Definition: clutchlog.h:996
      +
      filename
      Available filename rendering methods.
      Definition: clutchlog.h:317
      +
      void filename(filename f)
      Sets the file naming scheme. *‍/.
      Definition: clutchlog.h:1120
      +
      const std::map< std::string, level > & levels() const
      Get the map of available log levels string representations toward their identifier....
      Definition: clutchlog.h:1073
      +
      std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
      Replace mark by tag in form.
      Definition: clutchlog.h:1205
      +
      void line(std::string line)
      Set the regular expression filtering the line location.
      Definition: clutchlog.h:1094
      +
      std::string format_comment() const
      Get the template string for dumps.
      Definition: clutchlog.h:993
      +
      const std::map< level, std::string > _level_word
      Dictionary of level identifier to their string representation.
      Definition: clutchlog.h:921
      +
      level threshold() const
      Get the log level below which logs are not printed.
      Definition: clutchlog.h:1071
      +
      void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
      Dump a serializable container after a comment line with log information.
      Definition: clutchlog.h:1438
      +
      std::ostream & out()
      Get the output stream on which to print.
      Definition: clutchlog.h:998
      +
      std::map< level, fmt > _level_fmt
      Dictionary of level identifier to their format.
      Definition: clutchlog.h:927
      +
      std::map< std::string, level > _word_level
      Dictionary of level string to their identifier.
      Definition: clutchlog.h:923
      +
      std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
      Substitute all tags in the format string with the corresponding information and apply the style corre...
      Definition: clutchlog.h:1281
      +
      void style(level stage, FMT... styles)
      Set the style (color and typo) of the given log level.
      Definition: clutchlog.h:1113
      +
      static size_t default_hfill_max
      Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
      Definition: clutchlog.h:286
      +
      void funchash_styles(std::vector< fmt > styles)
      Set the candidate styles for value-dependant function name formatting.
      Definition: clutchlog.h:1055
      +
      static std::string dump_default_format
      Default format of the comment line in file dump.
      Definition: clutchlog.h:246
      +
      level level_of(const std::string name)
      Return the log level tag corresponding to the given pre-configured name.
      Definition: clutchlog.h:1079
      +
      void style(level stage, fmt style)
      Set the style (color and typo) of the given log level, passing a fmt instance.
      Definition: clutchlog.h:1115
      +
      void func(std::string func)
      Set the regular expression filtering the function location.
      Definition: clutchlog.h:1092
      +
      std::regex _in_file
      Current file location filter.
      Definition: clutchlog.h:953
      +
      void filehash_styles(std::vector< fmt > styles)
      Set the candidate styles for value-dependant file name formatting.
      Definition: clutchlog.h:1047
      +
      std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
      Replace mark by tag in form, converting tag to its string representation first.
      Definition: clutchlog.h:1270
      +
      level _stage
      Current log level.
      Definition: clutchlog.h:951
      +
      static std::string dump_default_sep
      Default item separator for dump.
      Definition: clutchlog.h:253
      +
      std::string format() const
      Get the template string.
      Definition: clutchlog.h:988
      +
      #define CLUTCHLOG_HAVE_UNIX_SYSINFO
      True if POSIX headers necessary for stack depth management are available.
      Definition: clutchlog.h:34
      +
      #define CLUTCHDUMP_DEFAULT_FORMAT
      Compile-time default format of the comment line in file dump.
      Definition: clutchlog.h:232
      +
      #define CLUTCHLOG_DEFAULT_FORMAT
      Definition: clutchlog.h:209
      +
      bg
      Background color codes.
      Definition: clutchlog.h:425
      +
      fg
      Foreground color codes.
      Definition: clutchlog.h:404
      +
      enum clutchlog::fmt::fg fore
      Foreground color.
      +
      enum clutchlog::fmt::bg back
      Background color.
      +
      friend std::ostream & operator<<(std::ostream &os, const typo &s)
      Output stream operator for a typo tag alone, in 16-colors mode.
      Definition: clutchlog.h:469
      +
      friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
      Output stream operator for a 3-tuple of 16-colors mode tags.
      Definition: clutchlog.h:447
      +
      clutchlog::fmt::bg_256 back_256
      Current background in 256-colors mode.
      +
      clutchlog::fmt::fg_16M fore_16M
      Current foreground in 16M-colors mode.
      +
      clutchlog::fmt::bg_16M back_16M
      Current background in 16M-colors mode.
      +
      clutchlog::fmt::fg_256 fore_256
      Current foreground in 256-colors mode.
      +
      background in 256-colors mode.
      Definition: clutchlog.h:678
      +
      bg_16M()
      Empty constructor: no color.
      Definition: clutchlog.h:680
      +
      bg_16M(const bg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:703
      +
      bg_16M(short r, short g, short b)
      Numeric triplet constructor.
      Definition: clutchlog.h:690
      +
      bg_16M(const std::string &srgb)
      Hex triplet string constructor.
      Definition: clutchlog.h:698
      +
      Background in 256-colors mode.
      Definition: clutchlog.h:570
      +
      bg_256(const bg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:582
      +
      bg_256()
      Empty constructor: no color.
      Definition: clutchlog.h:572
      +
      bg_256(const short b)
      Constructor.
      Definition: clutchlog.h:577
      +
      Abstract base class for 16M colors objects (24-bits ANSI).
      Definition: clutchlog.h:587
      +
      short red
      The encoded RGB indices.
      Definition: clutchlog.h:591
      +
      color_16M(ground t, short r, short g, short b)
      Numeric triplet constructor.
      Definition: clutchlog.h:605
      +
      color_16M(ground t, const std::string &srgb)
      Hex triplet string constructor.
      Definition: clutchlog.h:615
      +
      bool is_set() const
      Returns true if the underying representation encodes an existing color.
      Definition: clutchlog.h:637
      +
      std::ostream & print_on(std::ostream &os) const
      Print the color RGB triplet on the given stream.
      Definition: clutchlog.h:640
      +
      color_16M(ground t)
      Constructor.
      Definition: clutchlog.h:596
      +
      Abstract base class for 256 colors objects (8-bits ANSI).
      Definition: clutchlog.h:523
      +
      color_256(ground t)
      Constructor.
      Definition: clutchlog.h:532
      +
      color_256(ground t, const short i)
      Constructor.
      Definition: clutchlog.h:539
      +
      short index
      The encoded color index in 4-bits ANSI.
      Definition: clutchlog.h:527
      +
      std::ostream & print_on(std::ostream &os) const
      Print the color index on the given stream.
      Definition: clutchlog.h:545
      +
      bool is_set() const
      Returns true if the underying representation encodes an existing color.
      Definition: clutchlog.h:542
      +
      Interface class for colors representation.
      Definition: clutchlog.h:484
      +
      virtual std::ostream & print_on(std::ostream &os) const =0
      Should print the underlying representation on the given stream.
      +
      enum clutchlog::fmt::color::ground type
      Type of color (foreground or background).
      +
      friend std::ostream & operator<<(std::ostream &os, const color &c)
      Print the actually encoded escaped color sequence on the given stream.
      Definition: clutchlog.h:507
      +
      color(ansi a, ground g)
      Constructor.
      Definition: clutchlog.h:498
      +
      virtual bool is_set() const =0
      Should return true if the underying representation encodes an existing color.
      +
      ground
      Codes for representing foreground or background.
      Definition: clutchlog.h:488
      +
      Foreground in 256-colors mode.
      Definition: clutchlog.h:648
      +
      fg_16M(short r, short g, short b)
      Numeric triplet constructor.
      Definition: clutchlog.h:660
      +
      fg_16M()
      Empty constructor: no color.
      Definition: clutchlog.h:650
      +
      fg_16M(const fg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:673
      +
      fg_16M(const std::string &srgb)
      Hex triplet string constructor.
      Definition: clutchlog.h:668
      +
      Foreground in 256-colors mode.
      Definition: clutchlog.h:553
      +
      fg_256(const fg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:565
      +
      fg_256(const short f)
      Constructor.
      Definition: clutchlog.h:560
      +
      fg_256()
      Empty constructor: no color.
      Definition: clutchlog.h:555
      +
      Structure holding a location matching.
      Definition: clutchlog.h:1130
      +
      scope_t()
      Constructor.
      Definition: clutchlog.h:1142
      +
      bool there
      Location is compatible.
      Definition: clutchlog.h:1140
      +
      level stage
      Current log level.
      Definition: clutchlog.h:1134
      +
      bool matches
      Everything is compatible.
      Definition: clutchlog.h:1132
      -
      friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
      Output stream operator for a 3-tuple of 16-colors mode tags.
      Definition: clutchlog.h:446
      -
      static std::string default_depth_mark
      Default mark for stack depth.
      Definition: clutchlog.h:259
      -
      std::string _format_log
      Current format of the standard output.
      Definition: clutchlog.h:927
      -
      color_16M(ground t, const std::string &srgb)
      Hex triplet string constructor.
      Definition: clutchlog.h:614
      -
      void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, const size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
      Dump a serializable container after a comment line with log information.
      Definition: clutchlog.h:1437
      -
      void depth_styles(std::vector< fmt > styles)
      Set the styles for value-dependant depth formatting.
      Definition: clutchlog.h:1062
      -
      std::map< level, fmt > _level_fmt
      Dictionary of level identifier to their format.
      Definition: clutchlog.h:925
      -
      enum clutchlog::fmt::bg back
      Background color.
      -
      std::vector< fmt > _funchash_fmts
      List of candidate format objects for value-dependant function name styling.
      Definition: clutchlog.h:960
      -
      std::string str() const
      Return the formatting code as a string.
      Definition: clutchlog.h:820
      -
      Foreground in 256-colors mode.
      Definition: clutchlog.h:552
      -
      void line(std::string line)
      Set the regular expression filtering the line location.
      Definition: clutchlog.h:1092
      -
      friend std::ostream & operator<<(std::ostream &os, const color &c)
      Print the actually encoded escaped color sequence on the given stream.
      Definition: clutchlog.h:506
      -
      friend std::ostream & operator<<(std::ostream &os, const typo &s)
      Output stream operator for a typo tag alone, in 16-colors mode.
      Definition: clutchlog.h:468
      -
      static std::string dump_default_format
      Default format of the comment line in file dump.
      Definition: clutchlog.h:245
      -
      filename _filename
      Filename rendering method.
      Definition: clutchlog.h:975
      -
      void out(std::ostream &out)
      Set the output stream on which to print.
      Definition: clutchlog.h:994
      -
      bool is_set() const
      Returns true if the underying representation encodes an existing color.
      Definition: clutchlog.h:636
      -
      fg_16M(const fg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:672
      -
      static std::string dump_default_sep
      Default item separator for dump.
      Definition: clutchlog.h:252
      -
      std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
      Substitute all tags in the format string with the corresponding information and apply the style corre...
      Definition: clutchlog.h:1279
      -
      Background in 256-colors mode.
      Definition: clutchlog.h:569
      -
      #define CLUTCHLOG_DEFAULT_DEPTH_MARK
      Compile-time default mark for stack depth.
      Definition: clutchlog.h:256
      -
      static unsigned int default_strip_calls
      Number of call stack levels to remove from depth display by default.
      Definition: clutchlog.h:266
      -
      static size_t default_hfill_min
      Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
      Definition: clutchlog.h:287
      -
      std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
      Replace mark by tag in form.
      Definition: clutchlog.h:1203
      -
      color_256(ground t)
      Constructor.
      Definition: clutchlog.h:531
      -
      clutchlog::fmt::bg_16M back_16M
      Current background in 16M-colors mode.
      -
      Interface class for colors representation.
      Definition: clutchlog.h:483
      -
      @ colors_16
      16 colors mode.
      -
      background in 256-colors mode.
      Definition: clutchlog.h:677
      -
      static char default_hfill_char
      Default character used as a filling for right-align the right part of messages with "{hfill}".
      Definition: clutchlog.h:273
      -
      bool matches
      Everything is compatible.
      Definition: clutchlog.h:1130
      -
      enum clutchlog::fmt::typo style
      Typographic style.
      -
      Abstract base class for 16M colors objects (24-bits ANSI).
      Definition: clutchlog.h:586
      -
      fg_256(const fg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:564
      -
      void format_comment(const std::string &format)
      Set the template string for dumps.
      Definition: clutchlog.h:989
      -
      bg_16M(const std::string &srgb)
      Hex triplet string constructor.
      Definition: clutchlog.h:697
      -
      void file(std::string file)
      Set the regular expression filtering the file location.
      Definition: clutchlog.h:1088
      -
      scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
      Gather information on the current location of the call.
      Definition: clutchlog.h:1152
      -
      clutchlog::fmt::fg_16M fore_16M
      Current foreground in 16M-colors mode.
      -
      Abstract base class for 256 colors objects (8-bits ANSI).
      Definition: clutchlog.h:522
      -
      fmt()
      Empty constructor, only useful for a no-op formatter.
      Definition: clutchlog.h:710
      -
      void style(level stage, fmt style)
      Set the style (color and typo) of the given log level, passing a fmt instance.
      Definition: clutchlog.h:1113
      -
      void threshold(level l)
      Set the log level (below which logs are not printed) with an identifier.
      Definition: clutchlog.h:1065
      -
      level threshold() const
      Get the log level below which logs are not printed.
      Definition: clutchlog.h:1069
      -
      virtual bool is_set() const =0
      Should return true if the underying representation encodes an existing color.
      -
      std::map< level, std::string > _level_short
      dictionary of level identifier to their 4-letters representation.
      Definition: clutchlog.h:923
      -
      level
      Available log levels.
      Definition: clutchlog.h:313
      -
      color_256(ground t, const short i)
      Constructor.
      Definition: clutchlog.h:538
      -
      std::ostream & print_on(std::ostream &os) const
      Print the color index on the given stream.
      Definition: clutchlog.h:544
      -
      color_16M(ground t)
      Constructor.
      Definition: clutchlog.h:595
      -
      static size_t default_hfill_max
      Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
      Definition: clutchlog.h:285
      -
      void funchash_styles(std::vector< fmt > styles)
      Set the candidate styles for value-dependant function name formatting.
      Definition: clutchlog.h:1053
      -
      scope_t()
      Constructor.
      Definition: clutchlog.h:1140
      -
      std::regex _in_func
      Current function location filter.
      Definition: clutchlog.h:953
      -
      static std::string default_format
      Default format of the messages.
      Definition: clutchlog.h:223
      -
      bg_16M(short r, short g, short b)
      Numeric triplet constructor.
      Definition: clutchlog.h:689
      -
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      Foreground in 256-colors mode.
      Definition: clutchlog.h:647
      -
      clutchlog::fmt::fg_256 fore_256
      Current foreground in 256-colors mode.
      -
      enum clutchlog::fmt::fg fore
      Foreground color.
      -
      void filehash_styles(std::vector< fmt > styles)
      Set the candidate styles for value-dependant file name formatting.
      Definition: clutchlog.h:1045
      -
      enum clutchlog::fmt::color::ground type
      Type of color (foreground or background).
      -
      Color and style formatter for ANSI terminal escape sequences.
      Definition: clutchlog.h:379
      -
      short index
      The encoded color index in 4-bits ANSI.
      Definition: clutchlog.h:526
      -
      bg_256()
      Empty constructor: no color.
      Definition: clutchlog.h:571
      -
      void func(std::string func)
      Set the regular expression filtering the function location.
      Definition: clutchlog.h:1090
      -
      std::string format() const
      Get the template string.
      Definition: clutchlog.h:986
      -
      std::regex _in_file
      Current file location filter.
      Definition: clutchlog.h:951
      -
      void style(level stage, FMT... styles)
      Set the style (color and typo) of the given log level.
      Definition: clutchlog.h:1111
      -
      bg_256(const bg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:581
      -
      fg_16M()
      Empty constructor: no color.
      Definition: clutchlog.h:649
      -
      level level_of(const std::string name)
      Return the log level tag corresponding to the given pre-configured name.
      Definition: clutchlog.h:1077
      -
      void filename(filename f)
      Sets the file naming scheme. *‍/.
      Definition: clutchlog.h:1118
      -
      const std::map< level, std::string > _level_word
      Dictionary of level identifier to their string representation.
      Definition: clutchlog.h:919
      -
      std::string operator()(const std::string &msg) const
      Format the given string with the currently encoded format.
      Definition: clutchlog.h:808
      -
      color_16M(ground t, short r, short g, short b)
      Numeric triplet constructor.
      Definition: clutchlog.h:604
      -
      std::ostream & print_on(std::ostream &os) const
      Print the color RGB triplet on the given stream.
      Definition: clutchlog.h:639
      -
      bg
      Background color codes.
      Definition: clutchlog.h:424
      -
      #define CLUTCHLOG_DEFAULT_FORMAT
      Compile-time default format of the messages (debug mode: with absolute location).
      Definition: clutchlog.h:208
      -
      std::regex _in_line
      Current line location filter.
      Definition: clutchlog.h:955
      -
      fg_256(const short f)
      Constructor.
      Definition: clutchlog.h:559
      -
      @ colors_256
      256 colors mode.
      -
      enum clutchlog::fmt::ansi mode
      Current ANSI color mode.
      -
      std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
      Replace mark by tag in form, converting tag to its string representation first.
      Definition: clutchlog.h:1268
      -
      std::string format_comment() const
      Get the template string for dumps.
      Definition: clutchlog.h:991
      -
      fg_256()
      Empty constructor: no color.
      Definition: clutchlog.h:554
      -
      @ colors_16M
      16 millions ("true") colors mode.
      -
      std::string _format_dump
      Current format of the file output.
      Definition: clutchlog.h:929
      -
      #define CLUTCHDUMP_DEFAULT_SEP
      Compile-time default item separator for dump.
      Definition: clutchlog.h:249
      -
      bg_256(const short b)
      Constructor.
      Definition: clutchlog.h:576
      -
      ground
      Codes for representing foreground or background.
      Definition: clutchlog.h:487
      -
      filename
      Available filename rendering methods.
      Definition: clutchlog.h:316
      -
      Structure holding a location matching.
      Definition: clutchlog.h:1128
      -
      #define CLUTCHLOG_DEFAULT_HFILL_MARK
      Character used as a filling for right-align the right part of messages with "{hfill}".
      Definition: clutchlog.h:270
      -
      std::ostream & print_on(std::ostream &os) const
      Print the currently encoded format escape code on the given output stream.
      Definition: clutchlog.h:759
      -
      bool is_set() const
      Returns true if the underying representation encodes an existing color.
      Definition: clutchlog.h:541
      -
      std::ostream * _out
      Standard output.
      Definition: clutchlog.h:941
      -
      std::ostream & out()
      Get the output stream on which to print.
      Definition: clutchlog.h:996
      -
      void threshold(const std::string &l)
      Set the log level (below which logs are not printed) with a string.
      Definition: clutchlog.h:1067
      -
      virtual std::ostream & print_on(std::ostream &os) const =0
      Should print the underlying representation on the given stream.
      -
      const std::map< std::string, level > & levels() const
      Get the map of available log levels string representations toward their identifier....
      Definition: clutchlog.h:1071
      -
      size_t _strip_calls
      Current number of call stack levels to remove from depth display.
      Definition: clutchlog.h:917
      -
      level stage
      Current log level.
      Definition: clutchlog.h:1132
      -
      bool there
      Location is compatible.
      Definition: clutchlog.h:1138
      -
      fg_16M(const std::string &srgb)
      Hex triplet string constructor.
      Definition: clutchlog.h:667
      -
      #define CLUTCHLOG_STRIP_CALLS
      Compile-time number of call stack levels to remove from depth display by default.
      Definition: clutchlog.h:263
      -
      friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
      Output stream overload.
      Definition: clutchlog.h:793
      -
      void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, const size_t line, const size_t depth_delta=0) const
      Print a log message IF the location matches the given one.
      Definition: clutchlog.h:1412
      -
      bg_16M(const bg &)
      Conversion constructor from 16-colors mode.
      Definition: clutchlog.h:702
      -
      bg_16M()
      Empty constructor: no color.
      Definition: clutchlog.h:679
      -
      std::map< std::string, level > _word_level
      Dictionary of level string to their identifier.
      Definition: clutchlog.h:921
      -
      level _stage
      Current log level.
      Definition: clutchlog.h:949
      -
      fmt style(level stage) const
      Get the configured fmt instance of the given log level.
      Definition: clutchlog.h:1115
      -
      typo
      Typographic style codes.
      Definition: clutchlog.h:392
      -
      void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
      Set the regular expressions filtering the location.
      Definition: clutchlog.h:1095
      -
      #define CLUTCHLOG_HAVE_UNIX_SYSINFO
      True if POSIX headers necessary for stack depth management are available.
      Definition: clutchlog.h:33
      -
      std::vector< fmt > _filehash_fmts
      List of candidate format objects for value-dependant file name styling.
      Definition: clutchlog.h:958
      -
      The single class which holds everything.
      Definition: clutchlog.h:187
      -
      ansi
      ANSI code configuring the available number of colors.
      Definition: clutchlog.h:382
      -
      fg_16M(short r, short g, short b)
      Numeric triplet constructor.
      Definition: clutchlog.h:659
      -
      fg
      Foreground color codes.
      Definition: clutchlog.h:403
      -
      short red
      The encoded RGB indices.
      Definition: clutchlog.h:590
      -
      #define CLUTCHDUMP_DEFAULT_FORMAT
      Compile-time default format of the comment line in file dump.
      Definition: clutchlog.h:231
      -
      color(ansi a, ground g)
      Constructor.
      Definition: clutchlog.h:497
      -
      clutchlog::fmt::bg_256 back_256
      Current background in 256-colors mode.
      diff --git a/docs/dir_000001_000000.html b/docs/dir_000001_000000.html index 113f8b7..6a4b997 100644 --- a/docs/dir_000001_000000.html +++ b/docs/dir_000001_000000.html @@ -2,8 +2,8 @@ - - + + clutchlog: tests -> clutchlog Relation @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,15 +84,13 @@ $(document).ready(function(){initNavTree('dir_59425e443f801f1f2fd8bbe4959a3ccf.h
      -

      tests → clutchlog Relation

      File in testsIncludes file in clutchlog
      t-assert.cppclutchlog.h
      t-color.cppclutchlog.h
      t-color16M.cppclutchlog.h
      t-color256.cppclutchlog.h
      t-demo-extravagant.cppclutchlog.h
      t-demo.cppclutchlog.h
      t-depth-delta.cppclutchlog.h
      t-dump.cppclutchlog.h
      t-filename.cppclutchlog.h
      t-fmt-constructors.cppclutchlog.h
      t-hash-color.cppclutchlog.h
      t-log.cppclutchlog.h
      t-one-line-if.cppclutchlog.h
      +

      tests → clutchlog Relation

      File in testsIncludes file in clutchlog
      t-assert.cppclutchlog.h
      t-color.cppclutchlog.h
      t-color16M.cppclutchlog.h
      t-color256.cppclutchlog.h
      t-demo.cppclutchlog.h
      t-depth-delta.cppclutchlog.h
      t-dump.cppclutchlog.h
      t-extra.cppclutchlog.h
      t-filename.cppclutchlog.h
      t-fmt-constructors.cppclutchlog.h
      t-hash-color.cppclutchlog.h
      t-log.cppclutchlog.h
      t-one-line-if.cppclutchlog.h
      diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf.html b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf.html index c02b493..aed8097 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf.html +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf.html @@ -2,8 +2,8 @@ - - + + clutchlog: tests Directory Reference @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,8 +84,7 @@ $(document).ready(function(){initNavTree('dir_59425e443f801f1f2fd8bbe4959a3ccf.h
      -
      -
      tests Directory Reference
      +
      tests Directory Reference
      @@ -95,15 +94,43 @@ $(document).ready(function(){initNavTree('dir_59425e443f801f1f2fd8bbe4959a3ccf.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Files

      file  t-assert.cpp [code]
       
      file  t-color.cpp [code]
       
      file  t-color16M.cpp [code]
       
      file  t-color256.cpp [code]
       
      file  t-demo.cpp [code]
       
      file  t-depth-delta.cpp [code]
       
      file  t-dump.cpp [code]
       
      file  t-extra.cpp [code]
       
      file  t-filename.cpp [code]
       
      file  t-fmt-constructors.cpp [code]
       
      file  t-hash-color.cpp [code]
       
      file  t-log.cpp [code]
       
      file  t-one-line-if.cpp [code]
       
      diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf.js b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf.js new file mode 100644 index 0000000..d9ec44d --- /dev/null +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf.js @@ -0,0 +1,16 @@ +var dir_59425e443f801f1f2fd8bbe4959a3ccf = +[ + [ "t-assert.cpp", "t-assert_8cpp_source.html", null ], + [ "t-color.cpp", "t-color_8cpp_source.html", null ], + [ "t-color16M.cpp", "t-color16_m_8cpp_source.html", null ], + [ "t-color256.cpp", "t-color256_8cpp_source.html", null ], + [ "t-demo.cpp", "t-demo_8cpp_source.html", null ], + [ "t-depth-delta.cpp", "t-depth-delta_8cpp_source.html", null ], + [ "t-dump.cpp", "t-dump_8cpp_source.html", null ], + [ "t-extra.cpp", "t-extra_8cpp_source.html", null ], + [ "t-filename.cpp", "t-filename_8cpp_source.html", null ], + [ "t-fmt-constructors.cpp", "t-fmt-constructors_8cpp_source.html", null ], + [ "t-hash-color.cpp", "t-hash-color_8cpp_source.html", null ], + [ "t-log.cpp", "t-log_8cpp_source.html", null ], + [ "t-one-line-if.cpp", "t-one-line-if_8cpp_source.html", null ] +]; \ No newline at end of file diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 index 5227a64..a315169 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.md5 @@ -1 +1 @@ -d51cb20523a13c3d778061471eb435e2 \ No newline at end of file +bdf89988b998d4aeafd5521fdb410fa7 \ No newline at end of file diff --git a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg index b3e2837..b0bf5e9 100644 --- a/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg +++ b/docs/dir_59425e443f801f1f2fd8bbe4959a3ccf_dep.svg @@ -13,7 +13,7 @@ dir_59425e443f801f1f2fd8bbe4959a3ccf - + tests @@ -22,7 +22,7 @@ dir_c318bd5cf14aaa5601e6029e0b5b4048 - + clutchlog diff --git a/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html index ad328b8..8af587f 100644 --- a/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html +++ b/docs/dir_c318bd5cf14aaa5601e6029e0b5b4048.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog Directory Reference @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,14 +84,13 @@ $(document).ready(function(){initNavTree('dir_c318bd5cf14aaa5601e6029e0b5b4048.h
      -
      -
      clutchlog Directory Reference
      +
      clutchlog Directory Reference
      - - +

      +

      Files

      file  clutchlog.h [code]
      file  clutchlog.h [code]
       
      @@ -100,9 +99,7 @@ Files
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,26 +84,27 @@ $(document).ready(function(){initNavTree('files.html',''); initResizable(); });
      -
      -
      File List
      +
      File List
      Here is a list of all documented files with brief descriptions:
      - - - - - - - - - - - - - - - +
      [detail level 12]
       clutchlog.h
       t-assert.cpp
       t-color.cpp
       t-color16M.cpp
       t-color256.cpp
       t-demo-extravagant.cpp
       t-demo.cpp
       t-depth-delta.cpp
       t-dump.cpp
       t-filename.cpp
       t-fmt-constructors.cpp
       t-hash-color.cpp
       t-log.cpp
       t-one-line-if.cpp
      + + + + + + + + + + + + + + + +
        clutchlog
       clutchlog.h
        tests
       t-assert.cpp
       t-color.cpp
       t-color16M.cpp
       t-color256.cpp
       t-demo.cpp
       t-depth-delta.cpp
       t-dump.cpp
       t-extra.cpp
       t-filename.cpp
       t-fmt-constructors.cpp
       t-hash-color.cpp
       t-log.cpp
       t-one-line-if.cpp
      @@ -111,9 +112,7 @@ $(document).ready(function(){initNavTree('files.html',''); initResizable(); }); diff --git a/docs/files_dup.js b/docs/files_dup.js index e4d1828..214fd05 100644 --- a/docs/files_dup.js +++ b/docs/files_dup.js @@ -1,17 +1,5 @@ var files_dup = [ - [ "clutchlog.h", "clutchlog_8h.html", "clutchlog_8h" ], - [ "t-assert.cpp", "t-assert_8cpp_source.html", null ], - [ "t-color.cpp", "t-color_8cpp_source.html", null ], - [ "t-color16M.cpp", "t-color16_m_8cpp_source.html", null ], - [ "t-color256.cpp", "t-color256_8cpp_source.html", null ], - [ "t-demo-extravagant.cpp", "t-demo-extravagant_8cpp_source.html", null ], - [ "t-demo.cpp", "t-demo_8cpp_source.html", null ], - [ "t-depth-delta.cpp", "t-depth-delta_8cpp_source.html", null ], - [ "t-dump.cpp", "t-dump_8cpp_source.html", null ], - [ "t-filename.cpp", "t-filename_8cpp_source.html", null ], - [ "t-fmt-constructors.cpp", "t-fmt-constructors_8cpp_source.html", null ], - [ "t-hash-color.cpp", "t-hash-color_8cpp_source.html", null ], - [ "t-log.cpp", "t-log_8cpp_source.html", null ], - [ "t-one-line-if.cpp", "t-one-line-if_8cpp_source.html", null ] + [ "clutchlog", "dir_c318bd5cf14aaa5601e6029e0b5b4048.html", "dir_c318bd5cf14aaa5601e6029e0b5b4048" ], + [ "tests", "dir_59425e443f801f1f2fd8bbe4959a3ccf.html", "dir_59425e443f801f1f2fd8bbe4959a3ccf" ] ]; \ No newline at end of file diff --git a/docs/functions.html b/docs/functions.html index 31320a1..2780889 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Members @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -86,307 +86,146 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
      Here is a list of all documented class members with links to the class documentation for each member:
      -

      - _ -

      diff --git a/docs/functions_enum.html b/docs/functions_enum.html index f965338..9f32d21 100644 --- a/docs/functions_enum.html +++ b/docs/functions_enum.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Members - Enumerations @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -85,36 +85,20 @@ $(document).ready(function(){initNavTree('functions_enum.html',''); initResizabl
       
      diff --git a/docs/functions_func.html b/docs/functions_func.html index 64f0a99..5039945 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Members - Functions @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -86,160 +86,87 @@ $(document).ready(function(){initNavTree('functions_func.html',''); initResizabl
        -

      - b -

      diff --git a/docs/functions_rela.html b/docs/functions_rela.html index 035e264..039fac1 100644 --- a/docs/functions_rela.html +++ b/docs/functions_rela.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Members - Related Functions @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -85,19 +85,14 @@ $(document).ready(function(){initNavTree('functions_rela.html',''); initResizabl diff --git a/docs/functions_vars.html b/docs/functions_vars.html index 5f74176..90d9e8a 100644 --- a/docs/functions_vars.html +++ b/docs/functions_vars.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Members - Variables @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -86,159 +86,83 @@ $(document).ready(function(){initNavTree('functions_vars.html',''); initResizabl
        -

      - _ -

      diff --git a/docs/globals.html b/docs/globals.html index 7584db1..4216408 100644 --- a/docs/globals.html +++ b/docs/globals.html @@ -2,8 +2,8 @@ - - + + clutchlog: File Members @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -85,66 +85,30 @@ $(document).ready(function(){initNavTree('globals.html',''); initResizable(); })
      Here is a list of all documented file members with links to the documentation:
      diff --git a/docs/globals_defs.html b/docs/globals_defs.html index 01b28ff..b68e55e 100644 --- a/docs/globals_defs.html +++ b/docs/globals_defs.html @@ -2,8 +2,8 @@ - - + + clutchlog: File Members @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -85,66 +85,30 @@ $(document).ready(function(){initNavTree('globals_defs.html',''); initResizable(
       
      diff --git a/docs/graph_legend.html b/docs/graph_legend.html index 003b89f..16bcdc0 100644 --- a/docs/graph_legend.html +++ b/docs/graph_legend.html @@ -2,8 +2,8 @@ - - + + clutchlog: Graph Legend @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,12 +84,11 @@ $(document).ready(function(){initNavTree('graph_legend.html',''); initResizable(
      -
      -
      Graph Legend
      +
      Graph Legend
      -

      This page explains how to interpret the graphs that are generated by doxygen.

      -

      Consider the following example:

      /*! Invisible class because of truncation */
      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      class Invisible { };
      /*! Truncated class, inheritance relation is hidden */
      @@ -124,7 +123,7 @@ $(document).ready(function(){initNavTree('graph_legend.html',''); initResizable(
      Used *m_usedClass;
      };

      This will result in the following graph:

      -

      The boxes in the above graph have the following meaning:

      +

      The boxes in the above graph have the following meaning:

      • A filled gray box represents the struct or class for which the graph is generated.
      • @@ -135,7 +134,7 @@ A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -

      The arrows have the following meaning:

      +

      The arrows have the following meaning:

      • A dark blue arrow is used to visualize a public inheritance relation between two classes.
      • @@ -153,9 +152,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem diff --git a/docs/group___default_config.html b/docs/group___default_config.html index a06d5bb..c5e3bb9 100644 --- a/docs/group___default_config.html +++ b/docs/group___default_config.html @@ -2,8 +2,8 @@ - - + + clutchlog: Default configuration management @@ -24,11 +24,10 @@
        - + - @@ -36,21 +35,22 @@
        -
        clutchlog -  0.16 +
        +
        clutchlog 0.17
        - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -86,54 +86,168 @@ $(document).ready(function(){initNavTree('group___default_config.html',''); init
      -
      -
      Default configuration management
      +
      Default configuration management

      Detailed Description

      - - - + +

      +

      Macros

      -#define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG   clutchlog::level::progress
       Default level over which calls to the logger are optimized out when NDEBUG is defined.
      #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG   clutchlog::level::progress
       Default level over which calls to the logger are optimized out when NDEBUG is defined. More...
       
      - - - + + - - + + - - + + - - + + - - + + - - + +

      -Default configuration members

      -#define CLUTCHLOG_DEFAULT_FORMAT   "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
       Compile-time default format of the messages (debug mode: with absolute location).

      Default configuration members

      #define CLUTCHLOG_DEFAULT_FORMAT   "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
       
      -#define CLUTCHDUMP_DEFAULT_FORMAT   "# {level} in {func} @ {file}:{line}"
       Compile-time default format of the comment line in file dump.
      #define CLUTCHDUMP_DEFAULT_FORMAT   "# {level} in {func} @ {file}:{line}"
       Compile-time default format of the comment line in file dump. More...
       
      -#define CLUTCHDUMP_DEFAULT_SEP   "\n"
       Compile-time default item separator for dump.
      #define CLUTCHDUMP_DEFAULT_SEP   "\n"
       Compile-time default item separator for dump. More...
       
      -#define CLUTCHLOG_DEFAULT_DEPTH_MARK   ">"
       Compile-time default mark for stack depth.
      #define CLUTCHLOG_DEFAULT_DEPTH_MARK   ">"
       Compile-time default mark for stack depth. More...
       
      -#define CLUTCHLOG_STRIP_CALLS   5
       Compile-time number of call stack levels to remove from depth display by default.
      #define CLUTCHLOG_STRIP_CALLS   5
       Compile-time number of call stack levels to remove from depth display by default. More...
       
      -#define CLUTCHLOG_DEFAULT_HFILL_MARK   '.'
       Character used as a filling for right-align the right part of messages with "{hfill}".
      #define CLUTCHLOG_DEFAULT_HFILL_MARK   '.'
       Character used as a filling for right-align the right part of messages with "{hfill}". More...
       
      +

      Macro Definition Documentation

      + +

      ◆ CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG

      + +
      +
      + + + + +
      #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG   clutchlog::level::progress
      +
      + +

      Default level over which calls to the logger are optimized out when NDEBUG is defined.

      + +

      Definition at line 68 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHLOG_DEFAULT_FORMAT

      + +
      +
      + + + + +
      #define CLUTCHLOG_DEFAULT_FORMAT   "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
      +
      +

      Compile-time default format of the messages (debug mode: with absolute location).

      + +

      Definition at line 209 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHDUMP_DEFAULT_FORMAT

      + +
      +
      + + + + +
      #define CLUTCHDUMP_DEFAULT_FORMAT   "# {level} in {func} @ {file}:{line}"
      +
      + +

      Compile-time default format of the comment line in file dump.

      + +

      Definition at line 232 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHDUMP_DEFAULT_SEP

      + +
      +
      + + + + +
      #define CLUTCHDUMP_DEFAULT_SEP   "\n"
      +
      + +

      Compile-time default item separator for dump.

      + +

      Definition at line 250 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHLOG_DEFAULT_DEPTH_MARK

      + +
      +
      + + + + +
      #define CLUTCHLOG_DEFAULT_DEPTH_MARK   ">"
      +
      + +

      Compile-time default mark for stack depth.

      + +

      Definition at line 257 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHLOG_STRIP_CALLS

      + +
      +
      + + + + +
      #define CLUTCHLOG_STRIP_CALLS   5
      +
      + +

      Compile-time number of call stack levels to remove from depth display by default.

      + +

      Definition at line 264 of file clutchlog.h.

      + +
      +
      + +

      ◆ CLUTCHLOG_DEFAULT_HFILL_MARK

      + +
      +
      + + + + +
      #define CLUTCHLOG_DEFAULT_HFILL_MARK   '.'
      +
      + +

      Character used as a filling for right-align the right part of messages with "{hfill}".

      + +

      Definition at line 271 of file clutchlog.h.

      + +
      +
      diff --git a/docs/group___formating.html b/docs/group___formating.html index 2a6ff4e..693e752 100644 --- a/docs/group___formating.html +++ b/docs/group___formating.html @@ -2,8 +2,8 @@ - - + + clutchlog: Formating tools @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -86,13 +86,12 @@ $(document).ready(function(){initNavTree('group___formating.html',''); initResiz
      -
      -
      Formating tools
      +
      Formating tools

      Detailed Description

      - @@ -103,9 +102,7 @@ Classes diff --git a/docs/group___formating.js b/docs/group___formating.js index 36c42da..0226961 100644 --- a/docs/group___formating.js +++ b/docs/group___formating.js @@ -1,31 +1,13 @@ var group___formating = [ - [ "fmt", "classclutchlog_1_1fmt.html", [ + [ "clutchlog::fmt", "classclutchlog_1_1fmt.html", [ [ "fmt", "classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a6cc6126d113fc0647ed3acbf29cdc425", null ], - [ "fmt", "classclutchlog_1_1fmt.html#ac69e6d3b7ddaec908c429ac61f354267", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a13453c0b5dbc19d9b510dcdc0352b443", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a65856874070ec0865b3a5b9aeb0e4f3d", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a99b3a05ddf6fa341cee6cb1e5dffc159", null ], - [ "fmt", "classclutchlog_1_1fmt.html#aeea73b0239bf73ebc8ee84c1e6d278e2", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a04f3ba5f6fe81955dca4492a6d259f1c", null ], - [ "fmt", "classclutchlog_1_1fmt.html#ac49c883e3dd17832749cc092b74a9f56", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a194201eb8a400ef13df3e833b8788cdc", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a00feba2b1539529df70e39d615a05941", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a357c93593867f67d9fef562ca07c7dcc", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a2df8f77f58dc9272c94982c4d2275581", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a63b29eb5862a30a194b0256f2ee554a6", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a9458703ab8a3c9fbc6b801011b43f16d", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a0923d7d400f6753d4dae124b71eb5023", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a506718883842dbce3659f42cdf79e52c", null ], - [ "fmt", "classclutchlog_1_1fmt.html#a6d1cc4abe822a569a2624b0829de5dd0", null ], - [ "print_on", "classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0", null ], + [ "print_on", "classclutchlog_1_1fmt.html#ad754c64eb6fd8730a616d113cb9f9129", null ], [ "operator()", "classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c", null ], [ "str", "classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b", null ], - [ "hash", "classclutchlog_1_1fmt.html#a822ded10ae1b0c82f7330481aa4bb64f", null ], - [ "operator<<", "group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7", null ], - [ "operator<<", "group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33", null ], - [ "operator<<", "classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da", null ], + [ "operator<<", "group__colors16.html#gac00a2f504f5308207f7a94915fe9a9c5", null ], + [ "operator<<", "group__colors16.html#ga93d498671d8dc2e796978c4f4de51241", null ], + [ "operator<<", "classclutchlog_1_1fmt.html#a24568f7a157d50e3075a74a619719c84", null ], [ "mode", "classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205", null ], [ "style", "classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b", null ], [ "fore", "group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401", null ], diff --git a/docs/group___main.html b/docs/group___main.html index 1ae3900..0840712 100644 --- a/docs/group___main.html +++ b/docs/group___main.html @@ -2,8 +2,8 @@ - - + +clutchlog: Main class @@ -24,11 +24,10 @@

      +

      Classes

      class  clutchlog::fmt
       Color and style formatter for ANSI terminal escape sequences. More...
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -86,13 +86,12 @@ $(document).ready(function(){initNavTree('group___main.html',''); initResizable(
      -
      -
      Main class
      +
      Main class

      Detailed Description

      - @@ -103,9 +102,7 @@ Classes diff --git a/docs/group___main.js b/docs/group___main.js index 5fc80f3..b5fa18d 100644 --- a/docs/group___main.js +++ b/docs/group___main.js @@ -1,34 +1,26 @@ var group___main = [ [ "clutchlog", "classclutchlog.html", [ - [ "System-dependent stack depth", "index.html#autotoc_md27", null ], - [ "System-dependent horizontal fill", "index.html#autotoc_md28", null ], - [ "Dependencies", "index.html#autotoc_md29", null ], - [ "Variable names within the CLUTCHLOG macro", "index.html#autotoc_md30", null ], - [ "Features", "index.html#autotoc_md31", null ], [ "scope_t", "structclutchlog_1_1scope__t.html", [ [ "scope_t", "structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572", null ], [ "matches", "structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9", null ], [ "stage", "structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744", null ], [ "there", "structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff", null ] ] ], - [ "clutchlog", "classclutchlog.html#a0906d74275cedcd403da94879764815e", null ], - [ "clutchlog", "classclutchlog.html#a03b145e36f15435a640bb5a885d9f642", null ], - [ "logger", "classclutchlog.html#acfaceb77da01503b432644a3efaee4fa", null ], - [ "operator=", "classclutchlog.html#aef653a9744a72a889ca8163269bb781e", null ], + [ "logger", "classclutchlog.html#a6e2a5e98fa9f722d90ba6515895543ac", null ], [ "format", "classclutchlog.html#a656c277e074b64728cca871f2b484d1c", null ], [ "format", "classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80", null ], [ "format_comment", "classclutchlog.html#a2144abe4ec6f630126b6490908b5f924", null ], [ "format_comment", "classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5", null ], [ "out", "classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d", null ], - [ "out", "classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266", null ], + [ "out", "classclutchlog.html#ab7773f031a00a05b8c83c1936406cb98", null ], [ "filehash_styles", "classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf", null ], [ "funchash_styles", "classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416", null ], [ "depth_styles", "classclutchlog.html#a08310b92e86687349e70f56f9ac1d656", null ], [ "threshold", "classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4", null ], [ "threshold", "classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9", null ], [ "threshold", "classclutchlog.html#ab45287cc9c14217904a13aff49573732", null ], - [ "levels", "classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a", null ], + [ "levels", "classclutchlog.html#a8d206443dea964f77965450a83693d98", null ], [ "level_of", "classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd", null ], [ "file", "classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c", null ], [ "func", "classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447", null ], diff --git a/docs/group___use_macros.html b/docs/group___use_macros.html index 9b21266..43410bc 100644 --- a/docs/group___use_macros.html +++ b/docs/group___use_macros.html @@ -2,8 +2,8 @@ - - + +clutchlog: High-level API macros @@ -24,11 +24,10 @@

      +

      Classes

      class  clutchlog
       The single class which holds everything. More...
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -86,24 +86,21 @@ $(document).ready(function(){initNavTree('group___use_macros.html',''); initResi
      -
      -
      High-level API macros
      +
      High-level API macros

      Detailed Description

      - - - + + - - + + @@ -116,7 +113,25 @@ Macros

      +

      Macros

      -#define CLUTCHLOC   __FILE__, __FUNCTION__, __LINE__
       Handy shortcuts to location.
      #define CLUTCHLOC   __FILE__, __FUNCTION__, __LINE__
       Handy shortcuts to location. More...
       
      #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
       Log a message at the given level and with a given depth delta. More...
       
      -#define CLUTCHLOG(LEVEL, WHAT)   CLUTCHLOGD(LEVEL, WHAT, 0)
       Log a message at the given level.
      #define CLUTCHLOG(LEVEL, WHAT)    CLUTCHLOGD(LEVEL, WHAT, 0)
       Log a message at the given level. More...
       
      #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
       Dump the given container. More...
       

      Macro Definition Documentation

      - + +

      ◆ CLUTCHLOC

      + +
      +
      + + + + +
      #define CLUTCHLOC   __FILE__, __FUNCTION__, __LINE__
      +
      + +

      Handy shortcuts to location.

      + +

      Definition at line 78 of file clutchlog.h.

      + +
      +
      +

      ◆ CLUTCHLOGD

      @@ -148,18 +163,52 @@ Macros
      Value:
      do { \
      -
      auto& clutchlog__logger = clutchlog::logger(); \
      +
      auto& clutchlog__logger = clutchlog::logger(); \
      std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
      -
      clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
      +
      clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC, DEPTH_DELTA); \
      } while(0)
      +
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:307
      +
      #define CLUTCHLOC
      Handy shortcuts to location.
      Definition: clutchlog.h:78

      Log a message at the given level and with a given depth delta.

      -

      Definition at line 81 of file clutchlog.h.

      +

      Definition at line 82 of file clutchlog.h.

      - + +

      ◆ CLUTCHLOG

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define CLUTCHLOG( LEVEL,
       WHAT 
      )    CLUTCHLOGD(LEVEL, WHAT, 0)
      +
      + +

      Log a message at the given level.

      + +

      Definition at line 99 of file clutchlog.h.

      + +
      +
      +

      ◆ CLUTCHDUMP

      @@ -191,18 +240,19 @@ Macros
      Value:
      do { \
      -
      auto& clutchlog__logger = clutchlog::logger(); \
      +
      auto& clutchlog__logger = clutchlog::logger(); \
      clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
      - +
      } while(0)
      +
      #define CLUTCHDUMP_DEFAULT_SEP
      Compile-time default item separator for dump.
      Definition: clutchlog.h:250

      Dump the given container.

      -

      Definition at line 107 of file clutchlog.h.

      +

      Definition at line 108 of file clutchlog.h.

      - +

      ◆ CLUTCHFUNC

      @@ -234,8 +284,8 @@ Macros
      Value:
      do { \
      -
      auto& clutchlog__logger = clutchlog::logger(); \
      -
      clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      +
      auto& clutchlog__logger = clutchlog::logger(); \
      +
      clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      if(clutchlog__scope.matches) { \
      FUNC(__VA_ARGS__); \
      } \
      @@ -243,11 +293,11 @@ Macros

      Call any function if the scope matches.

      -

      Definition at line 124 of file clutchlog.h.

      +

      Definition at line 125 of file clutchlog.h.

      - +

      ◆ CLUTCHCODE

      @@ -273,8 +323,8 @@ Macros
      Value:
      do { \
      -
      auto& clutchlog__logger = clutchlog::logger(); \
      -
      clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      +
      auto& clutchlog__logger = clutchlog::logger(); \
      +
      clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
      if(clutchlog__scope.matches) { \
      __VA_ARGS__ \
      } \
      @@ -282,21 +332,16 @@ Macros

      Run any code if the scope matches.

      -

      Definition at line 145 of file clutchlog.h.

      +

      Definition at line 146 of file clutchlog.h.

      -
      static clutchlog & logger()
      Get the logger instance.
      Definition: clutchlog.h:306
      -
      #define CLUTCHLOC
      Handy shortcuts to location.
      Definition: clutchlog.h:77
      -
      #define CLUTCHDUMP_DEFAULT_SEP
      Compile-time default item separator for dump.
      Definition: clutchlog.h:249
      diff --git a/docs/group__colors16.html b/docs/group__colors16.html index 0dcd958..f8df5c5 100644 --- a/docs/group__colors16.html +++ b/docs/group__colors16.html @@ -2,8 +2,8 @@ - - + + clutchlog: Colors management in 16 colors mode (4-bits ANSI). @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -88,97 +88,226 @@ $(document).ready(function(){initNavTree('group__colors16.html',''); initResizab Enumerations | Variables | Friends -
      -
      Colors management in 16 colors mode (4-bits ANSI).
      +
      Colors management in 16 colors mode (4-bits ANSI).

      Detailed Description

      - - - + - - +

      +

      Enumerations

      enum  clutchlog::fmt::fg {
      -  black = 30, -red = 31, -green = 32, -yellow = 33, -
      -  blue = 34, -magenta = 35, -cyan = 36, -white = 37, -
      -  bright_black = 90, -bright_red = 91, -bright_green = 92, -bright_yellow = 93, -
      -  bright_blue = 94, -bright_magenta = 95, -bright_cyan = 96, -bright_white = 97, -
      +
      enum class  clutchlog::fmt::fg {
      +  black = 30 +, red = 31 +, green = 32 +, yellow = 33 +,
      +  blue = 34 +, magenta = 35 +, cyan = 36 +, white = 37 +,
      +  bright_black = 90 +, bright_red = 91 +, bright_green = 92 +, bright_yellow = 93 +,
      +  bright_blue = 94 +, bright_magenta = 95 +, bright_cyan = 96 +, bright_white = 97 +,
        none = -1
      }
       Foreground color codes.
       Foreground color codes. More...
       
      enum  clutchlog::fmt::bg {
      -  black = 40, -red = 41, -green = 42, -yellow = 43, -
      -  blue = 44, -magenta = 45, -cyan = 46, -white = 47, -
      -  bright_black = 100, -bright_red = 101, -bright_green = 102, -bright_yellow = 103, -
      -  bright_blue = 104, -bright_magenta = 105, -bright_cyan = 106, -bright_white = 107, -
      +
      enum class  clutchlog::fmt::bg {
      +  black = 40 +, red = 41 +, green = 42 +, yellow = 43 +,
      +  blue = 44 +, magenta = 45 +, cyan = 46 +, white = 47 +,
      +  bright_black = 100 +, bright_red = 101 +, bright_green = 102 +, bright_yellow = 103 +,
      +  bright_blue = 104 +, bright_magenta = 105 +, bright_cyan = 106 +, bright_white = 107 +,
        none = -1
      }
       Background color codes.
       Background color codes. More...
       
      - - + - +

      +

      Variables

      -enum clutchlog::fmt::fg clutchlog::fmt::fore
      +enum clutchlog::fmt::fg clutchlog::fmt::fore
       Foreground color.
       
      -enum clutchlog::fmt::bg clutchlog::fmt::back
      +enum clutchlog::fmt::bg clutchlog::fmt::back
       Background color.
       
      - - - - - - - + + + + + +

      +

      Friends

      -std::ostream & clutchlog::fmt::operator<< (std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
       Output stream operator for a 3-tuple of 16-colors mode tags.
       
      -std::ostream & clutchlog::fmt::operator<< (std::ostream &os, const typo &s)
       Output stream operator for a typo tag alone, in 16-colors mode.
       
      std::ostream & clutchlog::fmt::operator<< (std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
       Output stream operator for a 3-tuple of 16-colors mode tags. More...
       
      std::ostream & clutchlog::fmt::operator<< (std::ostream &os, const typo &s)
       Output stream operator for a typo tag alone, in 16-colors mode. More...
       
      +

      Enumeration Type Documentation

      + +

      ◆ fg

      + +
      +
      + + + + + +
      + + + + +
      enum class clutchlog::fmt::fg
      +
      +strong
      +
      + +

      Foreground color codes.

      + +

      Definition at line 404 of file clutchlog.h.

      + +
      +
      + +

      ◆ bg

      + +
      +
      + + + + + +
      + + + + +
      enum class clutchlog::fmt::bg
      +
      +strong
      +
      + +

      Background color codes.

      + +

      Definition at line 425 of file clutchlog.h.

      + +
      +
      +

      Friends

      + +

      ◆ operator<< [1/2]

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      std::ostream & operator<< (std::ostream & os,
      const std::tuple< fg, bg, typo > & fbs 
      )
      +
      +friend
      +
      + +

      Output stream operator for a 3-tuple of 16-colors mode tags.

      + +

      Definition at line 447 of file clutchlog.h.

      + +
      +
      + +

      ◆ operator<< [2/2]

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      std::ostream & operator<< (std::ostream & os,
      const typos 
      )
      +
      +friend
      +
      + +

      Output stream operator for a typo tag alone, in 16-colors mode.

      + +

      Definition at line 469 of file clutchlog.h.

      + +
      +
      diff --git a/docs/group__colors16.js b/docs/group__colors16.js index e5f762e..61ae8aa 100644 --- a/docs/group__colors16.js +++ b/docs/group__colors16.js @@ -1,9 +1,9 @@ var group__colors16 = [ - [ "fg", "group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0", null ], - [ "bg", "group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e", null ], - [ "fore", "group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401", null ], - [ "back", "group__colors16.html#ga86696b20e5b31c96ba592926efb324f3", null ], - [ "operator<<", "group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7", null ], - [ "operator<<", "group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33", null ] + [ "clutchlog::fmt::fg", "group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0", null ], + [ "clutchlog::fmt::bg", "group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e", null ], + [ "clutchlog::fmt::fore", "group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401", null ], + [ "clutchlog::fmt::back", "group__colors16.html#ga86696b20e5b31c96ba592926efb324f3", null ], + [ "clutchlog::fmt::operator<<", "group__colors16.html#gac00a2f504f5308207f7a94915fe9a9c5", null ], + [ "clutchlog::fmt::operator<<", "group__colors16.html#ga93d498671d8dc2e796978c4f4de51241", null ] ]; \ No newline at end of file diff --git a/docs/group__colors256__16_m.html b/docs/group__colors256__16_m.html index 8f5793f..1e99eb5 100644 --- a/docs/group__colors256__16_m.html +++ b/docs/group__colors256__16_m.html @@ -2,8 +2,8 @@ - - + + clutchlog: Internal colors management in 256 and 16M colors modes. @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -87,13 +87,12 @@ $(document).ready(function(){initNavTree('group__colors256__16_m.html',''); init -
      -
      Internal colors management in 256 and 16M colors modes.
      +
      Internal colors management in 256 and 16M colors modes.

      Detailed Description

      - @@ -117,22 +116,22 @@ Classes

      +

      Classes

      struct  clutchlog::fmt::color
       Interface class for colors representation. More...
       background in 256-colors mode. More...
       
      - - + - + - + - +

      +

      Variables

      -clutchlog::fmt::fg_256 clutchlog::fmt::fore_256
      +clutchlog::fmt::fg_256 clutchlog::fmt::fore_256
       Current foreground in 256-colors mode.
       
      -clutchlog::fmt::bg_256 clutchlog::fmt::back_256
      +clutchlog::fmt::bg_256 clutchlog::fmt::back_256
       Current background in 256-colors mode.
       
      -clutchlog::fmt::fg_16M clutchlog::fmt::fore_16M
      +clutchlog::fmt::fg_16M clutchlog::fmt::fore_16M
       Current foreground in 16M-colors mode.
       
      -clutchlog::fmt::bg_16M clutchlog::fmt::back_16M
      +clutchlog::fmt::bg_16M clutchlog::fmt::back_16M
       Current background in 16M-colors mode.
       
      @@ -141,9 +140,7 @@ Variables diff --git a/docs/group__colors256__16_m.js b/docs/group__colors256__16_m.js index 1eda342..bc1dc38 100644 --- a/docs/group__colors256__16_m.js +++ b/docs/group__colors256__16_m.js @@ -1,58 +1,55 @@ var group__colors256__16_m = [ - [ "color", "structclutchlog_1_1fmt_1_1color.html", [ + [ "clutchlog::fmt::color", "structclutchlog_1_1fmt_1_1color.html", [ [ "color", "structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac", null ], [ "is_set", "structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603", null ], - [ "print_on", "structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f", null ], - [ "operator<<", "structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6", null ], - [ "mode", "structclutchlog_1_1fmt_1_1color.html#aacbc3cd9447fdb7d51e02b29b5028a6b", null ], + [ "print_on", "structclutchlog_1_1fmt_1_1color.html#a121619a01bf48e53b3478d23989c0c59", null ], + [ "operator<<", "structclutchlog_1_1fmt_1_1color.html#a4860c13958d21118a564920fa78e6720", null ], [ "type", "structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae", null ], [ "ground", "structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0", [ [ "fore", "structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0ae64e4c4fee28f9ca7301e4c7ff598e67", null ], [ "back", "structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0a469bba0a564235dfceede42db14f17b0", null ] ] ] ] ], - [ "color_256", "structclutchlog_1_1fmt_1_1color__256.html", [ + [ "clutchlog::fmt::color_256", "structclutchlog_1_1fmt_1_1color__256.html", [ [ "color_256", "structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c", null ], [ "color_256", "structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726", null ], [ "is_set", "structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111", null ], - [ "print_on", "structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68", null ], + [ "print_on", "structclutchlog_1_1fmt_1_1color__256.html#ad4e941accf566378e0007ec881096fb0", null ], [ "index", "structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988", null ] ] ], - [ "fg_256", "structclutchlog_1_1fmt_1_1fg__256.html", [ + [ "clutchlog::fmt::fg_256", "structclutchlog_1_1fmt_1_1fg__256.html", [ [ "fg_256", "structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a", null ], [ "fg_256", "structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59", null ], [ "fg_256", "structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23", null ] ] ], - [ "bg_256", "structclutchlog_1_1fmt_1_1bg__256.html", [ + [ "clutchlog::fmt::bg_256", "structclutchlog_1_1fmt_1_1bg__256.html", [ [ "bg_256", "structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90", null ], [ "bg_256", "structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad", null ], [ "bg_256", "structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd", null ] ] ], - [ "color_16M", "structclutchlog_1_1fmt_1_1color__16_m.html", [ + [ "clutchlog::fmt::color_16M", "structclutchlog_1_1fmt_1_1color__16_m.html", [ [ "color_16M", "structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282", null ], [ "color_16M", "structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3", null ], [ "color_16M", "structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c", null ], [ "is_set", "structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d", null ], - [ "print_on", "structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e", null ], - [ "red", "structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61", null ], - [ "green", "structclutchlog_1_1fmt_1_1color__16_m.html#ac94eaa04e4f5de4ca6cfe7105ec1c4d4", null ], - [ "blue", "structclutchlog_1_1fmt_1_1color__16_m.html#aedcfa3e0597d9dd883b1783e931bb9af", null ] + [ "print_on", "structclutchlog_1_1fmt_1_1color__16_m.html#ac6a4b8650ea7e9171fc76d6226015005", null ], + [ "red", "structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61", null ] ] ], - [ "fg_16M", "structclutchlog_1_1fmt_1_1fg__16_m.html", [ + [ "clutchlog::fmt::fg_16M", "structclutchlog_1_1fmt_1_1fg__16_m.html", [ [ "fg_16M", "structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194", null ], [ "fg_16M", "structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5", null ], [ "fg_16M", "structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3", null ], [ "fg_16M", "structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8", null ] ] ], - [ "bg_16M", "structclutchlog_1_1fmt_1_1bg__16_m.html", [ + [ "clutchlog::fmt::bg_16M", "structclutchlog_1_1fmt_1_1bg__16_m.html", [ [ "bg_16M", "structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0", null ], [ "bg_16M", "structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501", null ], [ "bg_16M", "structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97", null ], [ "bg_16M", "structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d", null ] ] ], - [ "fore_256", "group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c", null ], - [ "back_256", "group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0", null ], - [ "fore_16M", "group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de", null ], - [ "back_16M", "group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0", null ] + [ "clutchlog::fmt::fore_256", "group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c", null ], + [ "clutchlog::fmt::back_256", "group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0", null ], + [ "clutchlog::fmt::fore_16M", "group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de", null ], + [ "clutchlog::fmt::back_16M", "group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0", null ] ]; \ No newline at end of file diff --git a/docs/hierarchy.html b/docs/hierarchy.html index a9d01bd..1f30351 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Hierarchy @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -84,8 +84,7 @@ $(document).ready(function(){initNavTree('hierarchy.html',''); initResizable();
      -
      -
      Class Hierarchy
      +
      Class Hierarchy
      @@ -109,9 +108,7 @@ This inheritance list is sorted roughly, but not completely, alphabetically: diff --git a/docs/index.html b/docs/index.html index 5f42249..74a91a2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,8 +2,8 @@ - - + + clutchlog: Clutchlog — versatile (de)clutchable spatial logging @@ -24,11 +24,10 @@
      - + - @@ -36,21 +35,22 @@
      -
      clutchlog -  0.16 +
      +
      clutchlog 0.17
      - + +/* @license-end */ +
      @@ -64,7 +64,7 @@ $(function() {
      @@ -83,9 +83,8 @@ $(document).ready(function(){initNavTree('index.html',''); initResizable(); }); -
      -
      -
      Clutchlog — versatile (de)clutchable spatial logging
      +
      +
      Clutchlog — versatile (de)clutchable spatial logging

      Table of Contents

      @@ -129,76 +128,81 @@ $(document).ready(function(){initNavTree('index.html',''); initResizable(); });
  • Build and tests
  • +
  • Usage as a Git submodule
  • -

    Clutchlog is a spatial logging system that targets versatile debugging. It allows to (de)clutch messages for a given: log level, source code location or call stack depth.

    +

    +

    Clutchlog is a spatial logging system that targets versatile debugging. It allows to (de)clutch messages for a given: log level, source code location or call stack depth.

    -

    -

    <img alt"Clutchlog logo" src="https://raw.githubusercontent.com/nojhan/clutchlog/master/docs/clutchlog_logo.svg" width="400" />

    +

    +

    <img alt"Clutchlog logo" src="https://raw.githubusercontent.com/nojhan/clutchlog/master/docs/clutchlog_logo.svg" width="400" />

    Features

    -

    Clutchlog allows to select which log messages will be displayed, based on their locations:

    +

    Clutchlog allows to select which log messages will be displayed, based on their locations:

    • Classical log levels: each message has a given detail level and it is displayed if you ask for a at least the same one.
    • Call stack depth: you can ask to display messages within functions that are called up to a given stack depth.
    • Source code location: you can ask to display messages called from given files, functions and line number, all based on regular expressions.
    -

    Additionally, Clutchlog will do its best to allow the compiler to optimize out calls, for instance debug messages in "Release" builds.

    -

    Additional features:

    +

    Additionally, Clutchlog will do its best to allow the compiler to optimize out calls, for instance debug messages in "Release" builds.

    +

    Additional features:

    • Templated log format, to easily design your own format.
    • -
    • Colored log. By default only important ones are colored (critical and error in red, warning in magenta).
    • +
    • Powerful Styling. Clutchlog comes with many options to color its output, for example by using colors with a semantic meaning, so that visually parse the logs is easy.
    • Macro to dump the content of a container in a file with automatic naming (yes, it is useful for fast debugging).
    • Generic clutching wrapper, to wrap any function call. Useful to (de)clutch asserts for example.

    Example

    -

    Adding a message is a simple as calling a macro (which is declutched in Debug build type, when NDEBUG is not defined):

    CLUTCHLOG(info, "matrix size: " << m << "x" << n);
    -

    To configure the display, you indicate the three types of locations, for example in your main function:

    auto& log = clutchlog::logger();
    +

    Adding a message is a simple as calling a macro (which is declutched in Debug build type, when NDEBUG is not defined):

    CLUTCHLOG(info, "matrix size: " << m << "x" << n);
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    +

    To configure the display, you indicate the three types of locations, for example in your main function:

    auto& log = clutchlog::logger();
    log.depth(2); // Log functions called from "main" but not below.
    log.threshold("Info"); // Log only "info", "warning", "error" or "critical" messages.
    log.file("algebra/.*"); // Will match any file in the "algebra" directory.
    log.func("(mul|add|sub|div)"); // Will match "multiply", for instance.
    -

    Example of a real-life log session (as seen in the frictionlesser software):

    -

    A log screen capture with full details, showing colored messages and location.

    -

    Demo showing fancy styling:

    -

    A log screen capture showing fancy coloring of text lines.

    -

    For more detailled examples, see the "Usage" sections below and the tests directory.

    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +

    Example of a real-life log session (as seen in the frictionlesser software):

    +

    A log screen capture with full details, showing colored messages and location.

    +

    Demo showing fancy styling:

    +

    A log screen capture showing fancy coloring of text lines.

    +

    For more detailled examples, see the "Usage" sections below and the tests directory.

    Rationale

    -

    Most of existing logging systems targets service events storage, like fast queuing of transactions in a round-robin database. Their aim is to provide a simple interface to efficiently store messages somewhere, which is appropriated when you have a well known service running and you want to be able to trace complex users interactions across its states.

    -

    Clutchlog, however, targets the debugging of a (typically single-run) program. While you develop your software, it's common practice to output several detailled informations on the internal states around the feature you are currently programming. However, once the feature is up and running, those detailled informations are only useful if you encounter a bug traversing this specific part.

    -

    While tracing a bug, it is tedious to uncomment old debugging code (and go on the build-test cycle) or to set up a full debugger session that displays all appropriate data (with ad-hoc fancy hooks).

    -

    To solve this problem, Clutchlog allows to disengage at runtime your debug log messages in various parts of the program, allowing for the fast tracking of a bug across the execution.

    +

    Most of existing logging systems targets service events storage, like fast queuing of transactions in a round-robin database. Their aim is to provide a simple interface to efficiently store messages somewhere, which is appropriated when you have a well known service running and you want to be able to trace complex users interactions across its states.

    +

    Clutchlog, however, targets the debugging of a (typically single-run) program. While you develop your software, it's common practice to output several detailled informations on the internal states around the feature you are currently programming. However, once the feature is up and running, those detailled informations are only useful if you encounter a bug traversing this specific part.

    +

    While tracing a bug, it is tedious to uncomment old debugging code (and go on the build-test cycle) or to set up a full debugger session that displays all appropriate data (with ad-hoc fancy hooks).

    +

    To solve this problem, Clutchlog allows to disengage at runtime your debug log messages in various parts of the program, allowing for the fast tracking of a bug across the execution.

    Basic Usage

    Calls

    -

    The main entrypoint is the CLUTCHLOG macro, which takes the desired log level and message. The message can be anything that can be output in an ostringstream.

    // Simple string:
    -
    CLUTCHLOG(info, "hello world");
    +

    The main entrypoint is the CLUTCHLOG macro, which takes the desired log level and message. The message can be anything that can be output in an ostringstream.

    // Simple string:
    +
    CLUTCHLOG(info, "hello world");
    // Serialisable variable:
    double value = 0;
    -
    CLUTCHLOG(error, value);
    +
    CLUTCHLOG(error, value);
    // passed using inline output stream operators:
    -
    CLUTCHLOG(debug, "hello " << value << " world");
    -

    There is also a macro to dump the content of an iterable within a separate file: CLUTCHDUMP. This function takes care of incrementing a numeric suffix in the file name, if an existing file with this name exists.

    std::vector<int> v(10);
    +
    CLUTCHLOG(debug, "hello " << value << " world");
    +

    There is also a macro to dump the content of an iterable within a separate file: CLUTCHDUMP. This function takes care of incrementing a numeric suffix in the file name, if an existing file with this name exists.

    std::vector<int> v(10);
    std::generate(v.begin(), v.end(), std::rand);
    -
    CLUTCHDUMP(debug, vec, "test_{n}.dat");
    +
    CLUTCHDUMP(debug, vec, "test_{n}.dat");
    /* Will output in cat "rand_0.dat"
    * # [t-dump] Info in main (at depth 5) @ /home/nojhan/code/clutchlog/tests/t-dump.cpp:22
    * 1804289383
    * 846930886
    * 1681692777
    */
    -

    Note that if you pass a file name without the {n} tag, the file will be overwritten as is.

    +
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:108
    +

    Note that if you pass a file name without the {n} tag, the file will be overwritten as is.

    Log level semantics

    -

    Log levels use a classical semantics for a human skilled in the art, in decreasing order of importance:

    +

    Log levels use a classical semantics for a human skilled in the art, in decreasing order of importance:

    • Critical: an error that cannot be recovered. For instance, something which will make a server stop right here.
    • Error: an error that invalidates a function, but may still be recovered. For example, a bad user input that will make a server reset its state, but not crash.
    • @@ -209,24 +213,24 @@ Log level semantics
    • Debug: data that would help debugging the program if there was a bug later on.
    • XDebug: debugging information that would be heavy to read.
    -

    Note: the log levels constants are lower case (for example: clutchlog::level::xdebug), but their string representation is not (e.g. "XDebug", this should be taken into account when using clutchlog::threshold or clutchlog::level_of).

    +

    Note: the log levels constants are lower case (for example: clutchlog::level::xdebug), but their string representation is not (e.g. "XDebug", this should be taken into account when using clutchlog::threshold or clutchlog::level_of).

    Location filtering

    -

    To configure the global behaviour of the logger, you must first get a reference on its (singleton) instance:

    auto& log = clutchlog::logger();
    -

    One can configure the location(s) at which messages should actually be logged:

    log.depth(3); // Depth of the call stack, defaults to the maximum possible value.
    +

    To configure the global behaviour of the logger, you must first get a reference on its (singleton) instance:

    auto& log = clutchlog::logger();
    +

    One can configure the location(s) at which messages should actually be logged:

    log.depth(3); // Depth of the call stack, defaults to the maximum possible value.
    log.threshold(clutchlog::level::error); // Log level, defaults to error.
    -

    Current levels are defined in an enumeration as clutchlog::level:

    enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    -

    File, function and line filters are indicated using (ECMAScript) regular expressions:

    log.file(".*"); // File location, defaults to any.
    +

    Current levels are defined in an enumeration as clutchlog::level:

    enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
    +

    File, function and line filters are indicated using (ECMAScript) regular expressions:

    log.file(".*"); // File location, defaults to any.
    log.func(".*"); // Function location, defaults to any.
    log.line(".*"); // Line location, defaults to any.
    -

    A shortcut function can be used to filter all at once:

    log.location(file, func, line); // Defaults to any, second and last parameters being optional.
    -

    Strings may be used to set up the threshold:

    log.threshold("Error"); // You have to know the exact —case sensitive— string.
    -

    Note that the case of the log levels strings matters (see below).

    +

    A shortcut function can be used to filter all at once:

    log.location(file, func, line); // Defaults to any, second and last parameters being optional.
    +

    Strings may be used to set up the threshold:

    log.threshold("Error"); // You have to know the exact —case sensitive— string.
    +

    Note that the case of the log levels strings matters (see below).

    Output Configuration

    -

    The output stream can be configured using the clutchlog::out method:

    log.out(std::clog); // Defaults to clog.
    -

    The format of the messages can be defined with the clutchlog::format method, passing a string with standardized tags surrounded by {}:

    log.format("{msg}");
    -

    Available tags are:

    +

    The output stream can be configured using the clutchlog::out method:

    log.out(std::clog); // Defaults to clog.
    +

    The format of the messages can be defined with the clutchlog::format method, passing a string with standardized tags surrounded by {}:

    log.format("{msg}");
    +

    Available tags are:

    • {msg}: the logged message,
    • {level}: the current log level (i.e. Critical, Error, Warning, Progress, Note, Info, Debug or XDebug),
    • @@ -239,7 +243,7 @@ Output Configuration
    • {filehash_fmt}: a style for file names, which is value-dependant (see clutchlog::filehash_styles),
    • {funchash_fmt}: a style for function names, which is value-dependant (see clutchlog::funchash_styles).
    -

    Some tags are only available on POSIX operating systems as of now:

      +

      Some tags are only available on POSIX operating systems as of now:

      • {name}: the name of the current binary,
      • {depth}: the current depth of the call stack,
      • {depth_marks}: as many chevrons > as there is calls in the stack,
      • @@ -248,27 +252,28 @@ Output Configuration

      Log Format

      -

      The default log format is "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n", it can be overriden at compile time by defining the CLUTCHLOG_DEFAULT_FORMAT macro.

      -

      By default, and if CLUTCHLOG_DEFAULT_FORMAT is not defined, clutchlog will not put the location-related tags in the message formats (i.e. {name}, {func}, and {line}) when not in Debug builds.

      +

      The default log format is "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n", it can be overriden at compile time by defining the CLUTCHLOG_DEFAULT_FORMAT macro.

      +

      By default, and if CLUTCHLOG_DEFAULT_FORMAT is not defined, clutchlog will not put the location-related tags in the message formats (i.e. {name}, {func}, and {line}) when not in Debug builds.

      Output Styling

      -

      Output lines can be styled differently depending on their content.

      -

      For example, output lines can be colored differently depending on the log level.

      // Print error messages in bold red:
      +

      Output lines can be styled differently depending on their content.

      +

      For example, output lines can be colored differently depending on the log level.

      // Print error messages in bold red:
      log.style(level::error, // First, the log level.
      fmt::fg::red, // Then the styles, in any order...
      fmt::typo::bold);
      -

      Or, if you want to declare some semantics beforehand:

      // Print warning messages in bold magenta:
      -
      using fmt = clutchlog::fmt;
      +

      Or, if you want to declare some semantics beforehand:

      // Print warning messages in bold magenta:
      +
      using fmt = clutchlog::fmt;
      fmt warn(fmt::fg::magenta, fmt::typo::bold);
      log.style(level::warning, warn);
      -

      Note: this inserts a style marker at the very beginning of the line. If you add other styles later on the line, they will take precedence.

      -

      Colors can be specified in several different ways. The ANSI color mode will be automatically detected, depending on the types of arguments passed to styling functions:

      Note: this inserts a style marker at the very beginning of the line. If you add other styles later on the line, they will take precedence.

      +

      Colors can be specified in several different ways. The ANSI color mode will be automatically detected, depending on the types of arguments passed to styling functions:

      • named tags from clutchlog::fmt::fg or clutchlog::fmt::bg will encode a 16-colors mode,
      • integers will encode a 256-colors mode,
      • numeric triplets or web hex strings will encode a 16 million ("true") colors mode,
      • clutchlog::fg::none and clutchlog::bg::none can be passed in all modes.
      -

      For example, all the following lines encode a bright red foreground for the critical level (see the "Colors" section below):

      log.style(level:critical,
      +

      For example, all the following lines encode a bright red foreground for the critical level (see the "Colors" section below):

      log.style(level:critical,
      fmt::fg::red); // 16-colors mode.
      log.style(level:critical,
      255); // 256-colors mode.
      @@ -276,7 +281,7 @@ Output Styling
      255,0,0); // 16M-colors mode.
      log.style(level:critical,
      "#ff0000"); // 16M-colors mode again.
      -

      You may use styling within the format message template itself, to add even more colors:

      using fmt = clutchlog::fmt;
      +

      You may use styling within the format message template itself, to add even more colors:

      using fmt = clutchlog::fmt;
      std::ostringstream format;
      fmt discreet(fmt::fg::blue);
      format << "{level}: "
      @@ -284,12 +289,12 @@ Output Styling
      << fmt(fmt::fg::yellow) << "{line}" // Used as a tag (no reset inserted).
      << fmt(fmt::typo::reset) << " {msg}" << std::endl; // This is a reset.
      log.format(format.str());
      -

      Note: messages at the "critical", "error" and "warning" log levels are colored by default. You may want to set their style to none if you want to stay in control of inserted colors in the format template.

      -

      The horizontal filling line (the {hfill} tag) can be configured separately with clutchlog::hfill_style, for example:

      log.hfill_style(fmt::fg::black);
      -

      Note: this will actually reset any styling after the hfill, disabling any style you would have set for the whole message using clutchlog::format for the remaining of the message.

      +

      Note: messages at the "critical", "error" and "warning" log levels are colored by default. You may want to set their style to none if you want to stay in control of inserted colors in the format template.

      +

      The horizontal filling line (the {hfill} tag) can be configured separately with clutchlog::hfill_style, for example:

      log.hfill_style(fmt::fg::black);
      +

      Note: this will actually reset any styling after the hfill, disabling any style you would have set for the whole message using clutchlog::format for the remaining of the message.

      Typographic Style

      -

      Available typographies:

      +

      Available typographies:

      • reset (remove any style),
      • bold,
      • @@ -297,17 +302,17 @@ Typographic Style
      • inverse,
      • none.
      -

      Typographic styles are always passed with the named tag (see clutchlog::fmt::typo), whatever the color mode.

      +

      Typographic styles are always passed with the named tag (see clutchlog::fmt::typo), whatever the color mode.

      Colors

      16-colors mode

      -

      Using the clutchlog::fmt class, you can style:

      +

      Using the clutchlog::fmt class, you can style:

      -

      In 16-colors mode, any of the arguments may be passed, in any order, if an argument is omitted, it defaults to no color/style.

      -

      Available colors are:

      +

      In 16-colors mode, any of the arguments may be passed, in any order, if an argument is omitted, it defaults to no color/style.

      +

      Available colors are:

      • black,
      • red,
      • @@ -327,60 +332,63 @@ Colors
      • bright_white,
      • none.
      -

      Note: some terminals allow the user to configure the actual encoding of those colors. You may thus notice some difference with the expected rendering of the same colors encoded in the other modes. Use the other color modes if you want to fully control the actual color rendering.

      +

      Note: some terminals allow the user to configure the actual encoding of those colors. You may thus notice some difference with the expected rendering of the same colors encoded in the other modes. Use the other color modes if you want to fully control the actual color rendering.

      256-colors mode

      -

      For 256-colors mode, colors are expected to be passed as integers in [-1,255] or the fg::none and bg::none tags.

      -

      In 256-colors mode, if you want to only encode the background color, you cannot just omit the foreground color, you have to bass a fg::none tag as first argument.

      +

      For 256-colors mode, colors are expected to be passed as integers in [-1,255] or the fg::none and bg::none tags.

      +

      In 256-colors mode, if you want to only encode the background color, you cannot just omit the foreground color, you have to bass a fg::none tag as first argument.

      log.style(level::info, fg::none, 52); // No color over dark red.
      log.style(level::info, fg::none, 52, typo::bold); // No color over bold dark red.

      16 million colors mode (RGB)

      -

      For 16M-colors mode, colors can be encoded as:

        +

        For 16M-colors mode, colors can be encoded as:

        • three integer arguments,
        • a "web color" hexadecimal triplet string, starting with a leading number sign (e.g. "#0055ff").
        • the fg::none and bg::none tags.
        -

        In 16M-colors mode, if you want to only encode the background color, you cannot just omit the foreground color, you have to pass a fg::none tag as first argument.

        +

        In 16M-colors mode, if you want to only encode the background color, you cannot just omit the foreground color, you have to pass a fg::none tag as first argument.

        log.style(level::info, fg::none, 100,0,0); // No color over dark red.
        log.style(level::info, fg::none, 100,0,0, typo::bold); // No color over bold dark red.

        Value-dependant Format Tags

        -

        Some tags can be used to change the style of (part of) the output line,

        -

        depending on its content. The {filehash_fmt} and {funchash_fmt} will introduce a styling sequence which depends on the current file name, and function name respectively. The chosen style is chosen at random among the candidate ones, but will always be the same for each value.

        -

        The set of candidate styles can be configured with clutchlog::filehash_styles and clutchlog::funchash_styles, which both take a vector of clutchlog::fmt objects as argument:

        // Either one or the other color for filenames:
        +

        Some tags can be used to change the style of (part of) the output line,

        +

        depending on its content. The {filehash_fmt} and {funchash_fmt} will introduce a styling sequence which depends on the current file name, and function name respectively. The chosen style is chosen at random among the candidate ones, but will always be the same for each value.

        +

        The set of candidate styles can be configured with clutchlog::filehash_styles and clutchlog::funchash_styles, which both take a vector of clutchlog::fmt objects as argument:

        // Either one or the other color for filenames:
        log.filehash_styles( { fmt(fg::red), fmt(fg::yellow) } );
        // This would fix the function name style to a single one:
        log.funchash_styles( { fmt(typo::bold) } );
        // Works with any `fmt` constructor
        // (here, shades of blues in 256-colors mode):
        log.funchash_styles( { fmt(33), fmt(27), fmt(39), fmt(45) } );
        -

        The same idea applies to {depth_fmt}. However, if clutchlog::depth_styles is configured, then the styles are chosen in order. That is, a depth of 1 would lead to the first style being chosen. If the current depth of the stack is larger than the number of configured styles, then the last one is used. For example:

        // Increasingly darker depth level colors (using the 256-colors mode).
        +

        The same idea applies to {depth_fmt}. However, if clutchlog::depth_styles is configured, then the styles are chosen in order. That is, a depth of 1 would lead to the first style being chosen. If the current depth of the stack is larger than the number of configured styles, then the last one is used. For example:

        // Increasingly darker depth level colors (using the 256-colors mode).
        log.depth_styles({ fmt(255), fmt(250), fmt(245), fmt(240), fmt(235) });
        -

        If clutchlog::depth_styles is set, the {depth_marks} template tag will render with each mark having each own style corresponding to its depth. Note: a depth of zero showing no mark, the first style in the list is never applied to marks.

        +

        If clutchlog::depth_styles is set, the {depth_marks} template tag will render with each mark having each own style corresponding to its depth. Note: a depth of zero showing no mark, the first style in the list is never applied to marks.

        Advanced Usage

        More Output Configuration

        Dump Format

        -

        The default format of the first line of comment added with the dump macro is "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}". It can be edited with the format_comment method. If it is set to an empty string, then no comment line is added. The default can be modified at compile time with CLUTCHDUMP_DEFAULT_FORMAT.

        -

        By default, the separator between items in the container is a new line. To change this behaviour, you can change CLUTCHDUMP_DEFAULT_SEP or call the low-level dump method.

        -

        By default, and if CLUTCHDUMP_DEFAULT_FORMAT is not defined, clutchlog will not put the location-related tags in the message formats (i.e. {file} and {line}) when not in Debug builds.

        +

        The default format of the first line of comment added with the dump macro is "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}". It can be edited with the format_comment method. If it is set to an empty string, then no comment line is added. The default can be modified at compile time with CLUTCHDUMP_DEFAULT_FORMAT.

        +

        By default, the separator between items in the container is a new line. To change this behaviour, you can change CLUTCHDUMP_DEFAULT_SEP or call the low-level dump method.

        +

        By default, and if CLUTCHDUMP_DEFAULT_FORMAT is not defined, clutchlog will not put the location-related tags in the message formats (i.e. {file} and {line}) when not in Debug builds.

        Stack Depth Mark

        -

        The mark used with the {depth_marks} tag can be configured with the clutchlog::depth_mark method, and its default with the CLUTCHLOG_DEFAULT_DEPTH_MARK macro:

        log.depth_mark(CLUTCHLOG_DEFAULT_DEPTH_MARK); // Defaults to ">".
        +

        The mark used with the {depth_marks} tag can be configured with the clutchlog::depth_mark method, and its default with the CLUTCHLOG_DEFAULT_DEPTH_MARK macro:

        log.depth_mark(CLUTCHLOG_DEFAULT_DEPTH_MARK); // Defaults to ">".
        +
        #define CLUTCHLOG_DEFAULT_DEPTH_MARK
        Compile-time default mark for stack depth.
        Definition: clutchlog.h:257

        Horizontal Filling

        -

        The character used with the {hfill} tag can be configured wth the clutchlog::hfill_mark method, and its default with the CLUTCHLOG_DEFAULT_HFILL_MARK macro:

        log.hfill_mark(CLUTCHLOG_DEFAULT_HFILL_MARK); // Defaults to '.'.
        -

        Clutchlog measures the width of the standard error channel. If it is redirected, it may be measured as very large (or very small). Thus, the clutchlog::hfill_min clutchlog::hfill_max accessors allow to set a minimum and a maximum width (in number of characters).

        log.hfill_max(CLUTCHLOG_DEFAULT_HFILL_MAX); // Defaults to 300.
        +

        The character used with the {hfill} tag can be configured wth the clutchlog::hfill_mark method, and its default with the CLUTCHLOG_DEFAULT_HFILL_MARK macro:

        log.hfill_mark(CLUTCHLOG_DEFAULT_HFILL_MARK); // Defaults to '.'.
        +
        #define CLUTCHLOG_DEFAULT_HFILL_MARK
        Character used as a filling for right-align the right part of messages with "{hfill}".
        Definition: clutchlog.h:271
        +

        Clutchlog measures the width of the standard error channel. If it is redirected, it may be measured as very large (or very small). Thus, the clutchlog::hfill_min clutchlog::hfill_max accessors allow to set a minimum and a maximum width (in number of characters).

        log.hfill_max(CLUTCHLOG_DEFAULT_HFILL_MAX); // Defaults to 300.
        log.hfill_min(CLUTCHLOG_DEFAULT_HFILL_MIN); // Defaults to 150.
        -

        Note: clutchlog will use the measured width, unless it goes out of [clutchlog::hfill_min,clutchlog::hfill_max], in which case it will be caped to those bounds.

        +

        Note: clutchlog will use the measured width, unless it goes out of [clutchlog::hfill_min,clutchlog::hfill_max], in which case it will be caped to those bounds.

        Stack Depth

        -

        By default, clutchlog removes 5 levels of the calls stack, so that your main entrypoint corresponds to a depth of zero. You can change this behaviour by defining the CLUTCHLOG_STRIP_CALLS macro, or calling clutchlog::strip_calls.

        log.strip_calls(CLUTCHLOG_STRIP_CALLS); // Defaults to 5.
        +

        By default, clutchlog removes 5 levels of the calls stack, so that your main entrypoint corresponds to a depth of zero. You can change this behaviour by defining the CLUTCHLOG_STRIP_CALLS macro, or calling clutchlog::strip_calls.

        log.strip_calls(CLUTCHLOG_STRIP_CALLS); // Defaults to 5.
        +
        #define CLUTCHLOG_STRIP_CALLS
        Compile-time number of call stack levels to remove from depth display by default.
        Definition: clutchlog.h:264

        Filename

        -

        By default, the {file} template tag is rendered as the absolute path (which is usualy handy if your terminal detects paths and allows to run a command on click).

        -

        You can change this behavior to display shorter names, using clutchlog::filename, and passing one of the following the shortening method:

          +

          By default, the {file} template tag is rendered as the absolute path (which is usualy handy if your terminal detects paths and allows to run a command on click).

          +

          You can change this behavior to display shorter names, using clutchlog::filename, and passing one of the following the shortening method:

          • clutchlog::filename::base: the file name itself,
          • clutchlog::filename::dir: the name of the single last directory containing the file,
          • clutchlog::filename::dirbase: the last directory and the file names,
          • @@ -388,7 +396,7 @@ Filename
          • clutchlog::filename::dirstem: the last directory and the file without extension.
          • clutchlog::filename::path: the absolute path (the default).
          -

          Example:

          log.filename(clutchlog::filename::path) // /home/nojhan/code/clutchlog/tests/t-filename.cpp
          +

          Example:

          log.filename(clutchlog::filename::path) // /home/nojhan/code/clutchlog/tests/t-filename.cpp
          log.filename(clutchlog::filename::base) // t-filename.cpp
          log.filename(clutchlog::filename::dir) // tests
          log.filename(clutchlog::filename::dirbase) // tests/t-filename.cpp
          @@ -396,41 +404,44 @@ Filename
          log.filename(clutchlog::filename::dirstem) // tests/t-filename

          Disabled calls

          -

          By default, clutchlog is always enabled if the NDEBUG preprocessor variable is not defined (this variable is set by CMake in build types that differs from Debug).

          -

          You can however force clutchlog to be enabled in any build type by setting the WITH_CLUTCHLOG preprocessor variable.

          -

          When the NDEBUG preprocessor variable is set (e.g. in Release build), clutchlog will do its best to allow the compiler to optimize out any calls for log levels that are under progress.

          -

          You can change this behavior at compile time by setting the CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG preprocessor variable to the desired maximum log level, for example:

          // Will always allow to log everything even in Release mode.
          +

          By default, clutchlog is always enabled if the NDEBUG preprocessor variable is not defined (this variable is set by CMake in build types that differs from Debug).

          +

          You can however force clutchlog to be enabled in any build type by setting the WITH_CLUTCHLOG preprocessor variable.

          +

          When the NDEBUG preprocessor variable is set (e.g. in Release build), clutchlog will do its best to allow the compiler to optimize out any calls for log levels that are under progress.

          +

          You can change this behavior at compile time by setting the CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG preprocessor variable to the desired maximum log level, for example:

          // Will always allow to log everything even in Release mode.
          #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::xdebug
          -

          Note that allowing a log level does not mean that it will actually output something. If the configured log level at runtime is lower than the log level of the message, it will still not be printed.

          -

          This behavior intend to remove as many conditional statements as possible when not debugging, without having to use preprocessor guards around calls to clutchlog, thus saving run time at no readability cost.

          +

          Note that allowing a log level does not mean that it will actually output something. If the configured log level at runtime is lower than the log level of the message, it will still not be printed.

          +

          This behavior intend to remove as many conditional statements as possible when not debugging, without having to use preprocessor guards around calls to clutchlog, thus saving run time at no readability cost.

          Low-level API

          -

          All configuration setters have a getters counterpart, with the same name but taking no parameter, for example:

          std::string mark = log.depth_mark();
          -

          To control more precisely the logging, one can use the low-level clutchlog::log method:

          log.log(clutchlog::level::xdebug, "hello world", "main.cpp", "main", 122);
          -

          A helper macro can helps to fill in the location with the actual one, as seen by the compiler:

          log.log(clutchlog::level::xdebug, "hello world", CLUTCHLOC);
          -

          A similar dump method exists:

          log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), CLUTCHLOC, "dumped_{n}.dat", "\n");
          +

          All configuration setters have a getters counterpart, with the same name but taking no parameter, for example:

          std::string mark = log.depth_mark();
          +

          To control more precisely the logging, one can use the low-level clutchlog::log method:

          log.log(clutchlog::level::xdebug, "hello world", "main.cpp", "main", 122);
          +

          A helper macro can helps to fill in the location with the actual one, as seen by the compiler:

          log.log(clutchlog::level::xdebug, "hello world", CLUTCHLOC);
          +
          #define CLUTCHLOC
          Handy shortcuts to location.
          Definition: clutchlog.h:78
          +

          A similar dump method exists:

          log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), CLUTCHLOC, "dumped_{n}.dat", "\n");
          log.dump(clutchlog::level::xdebug, cont.begin(), cont.end(), "main.cpp", "main", 122, "dumped.dat", "\n\n");
          -

          You can access the identifier of log levels with clutchlog::level_of:

          log.threshold( log.level_of("XDebug") ); // You have to know the exact string.
          +

          You can access the identifier of log levels with clutchlog::level_of:

          log.threshold( log.level_of("XDebug") ); // You have to know the exact string.

          (De)clutch any function call

          -

          The CLUTHFUNC macro allows to wrap any function within the current logger.

          -

          For instance, this can be useful if you want to (de)clutch calls to asserts. To do that, just declare your own macro:

          #define ASSERT(...) { CLUTCHFUNC(error, assert, __VA_ARGS__) }
          -

          Thus, any call like ASSERT(x > 3); will be declutchable with the same configuration than a call to CLUTCHLOG.

          +

          The CLUTHFUNC macro allows to wrap any function within the current logger.

          +

          For instance, this can be useful if you want to (de)clutch calls to asserts. To do that, just declare your own macro:

          #define ASSERT(...) { CLUTCHFUNC(error, assert, __VA_ARGS__) }
          +

          Thus, any call like ASSERT(x > 3); will be declutchable with the same configuration than a call to CLUTCHLOG.

          (De)clutch any code section

          -

          The CLUTCHCODE macro allows to wrap any code within the current logger.

          -

          For instance:

          +

          The CLUTCHCODE macro allows to wrap any code within the current logger.

          +

          For instance:

          std::clog << "We are clutched!\n";
          );
          +
          #define CLUTCHCODE(LEVEL,...)
          Run any code if the scope matches.
          Definition: clutchlog.h:146

          Manually Increase Stack Depth

          -

          You may want to manually increase the stack depth for a given logging call, for instance to subdivise a single function in sections. To do so, you can use the CLUTCHLOGD macro, which take an additional argument, in the form of the number of additional (fake) stack depths you want:

          CLUTCHLOG( debug, "Call"); // Regular macro.
          -
          CLUTCHLOGD(debug, "Sub call", 1); // Adds an additional (fake) stack depth.
          -
          CLUTCHLOGD(debug, "Sub sub!", 2); // Adds two additional (fake) stack depths.
          -

          That way, the depth will be rendered to the actual depth, plus the additional depth delta. Note that the displayed function will stay the same. Any filtering on the stack depth will take into account the fake depth and not the real one.

          +

          You may want to manually increase the stack depth for a given logging call, for instance to subdivise a single function in sections. To do so, you can use the CLUTCHLOGD macro, which take an additional argument, in the form of the number of additional (fake) stack depths you want:

          CLUTCHLOG( debug, "Call"); // Regular macro.
          +
          CLUTCHLOGD(debug, "Sub call", 1); // Adds an additional (fake) stack depth.
          +
          CLUTCHLOGD(debug, "Sub sub!", 2); // Adds two additional (fake) stack depths.
          +
          #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
          Log a message at the given level and with a given depth delta.
          Definition: clutchlog.h:82
          +

          That way, the depth will be rendered to the actual depth, plus the additional depth delta. Note that the displayed function will stay the same. Any filtering on the stack depth will take into account the fake depth and not the real one.

          Examples

          -

          Here what you would do to setup clutchlog with the default configuration:

          auto& log = clutchlog::logger();
          +

          Here what you would do to setup clutchlog with the default configuration:

          auto& log = clutchlog::logger();
          log.out(std::clog);
          // Location filtering.
          log.depth(std::numeric_limits<size_t>::max());
          @@ -439,13 +450,13 @@ Examples
          log.func(".*");
          log.line(".*");
          // Colors of the 3 firsts levels.
          -
          log.style(clutchlog::level::critical, clutchlog::fmt(
          +
          log.style(clutchlog::level::critical, clutchlog::fmt(
          clutchlog::fmt::fg::red,
          clutchlog::fmt::typo::underline);
          -
          log.style(clutchlog::level::error, clutchlog::fmt(
          +
          log.style(clutchlog::level::error, clutchlog::fmt(
          clutchlog::fmt::fg::red,
          clutchlog::fmt::typo::bold);
          -
          log.style(clutchlog::level::warning, clutchlog::fmt(
          +
          log.style(clutchlog::level::warning, clutchlog::fmt(
          clutchlog::fmt::fg::magenta,
          clutchlog::fmt::typo::bold);
          // Assuming you are on a POSIX system.
          @@ -455,27 +466,29 @@ Examples
          log.hfill_char('.');
          log.hfill_max(300);
          log.hfill_style(clutchlog::fmt::fg::none);
          -

          And here are all the functions you may call to log something:

          // Basic message.
          -
          CLUTCHLOG(debug, "x = " << x);
          +
          enum clutchlog::fmt::typo style
          Typographic style.
          +

          And here are all the functions you may call to log something:

          // Basic message.
          +
          CLUTCHLOG(debug, "x = " << x);
          // Any code section.
          -
          CLUTCHCODE(xdebug,
          +
          CLUTCHCODE(xdebug,
          if(x < 0) std::cerr << "WTF?" << std::endl;
          );
          // Container to a file.
          -
          CLUTCHDUMP(note, my_vector, "my_vector.dat");
          +
          CLUTCHDUMP(note, my_vector, "my_vector.dat");
          // Container to a numbered file.
          -
          CLUTCHDUMP(note, my_list, "my_list_{n}.dat");
          +
          CLUTCHDUMP(note, my_list, "my_list_{n}.dat");
          // Function call.
          -
          CLUTCHFUNC(warning, my_check, x, y); // Calls: my_check(x,y);
          +
          CLUTCHFUNC(warning, my_check, x, y); // Calls: my_check(x,y);
          // Declutchable asserts.
          #define ASSERT(...) { CLUTCHFUNC(critical, assert, __VA_ARGS__) }
          -
          ASSERT(x>0);
          -

          Here what you would do to setup clutchlog with the default configuration using 16M-colors mode:

          auto& log = clutchlog::logger();
          +
          ASSERT(x>0);
          +
          #define CLUTCHFUNC(LEVEL, FUNC,...)
          Call any function if the scope matches.
          Definition: clutchlog.h:125
          +

          Here what you would do to setup clutchlog with the default configuration using 16M-colors mode:

          auto& log = clutchlog::logger();
          log.out(std::clog);
          // Location filtering.
          log.depth(std::numeric_limits<size_t>::max());
          @@ -484,13 +497,13 @@ Examples
          log.func(".*");
          log.line(".*");
          // Colors of the 3 firsts levels.
          -
          log.style(clutchlog::level::critical, clutchlog::fmt(
          +
          log.style(clutchlog::level::critical, clutchlog::fmt(
          "#ff0000",
          clutchlog::fmt::typo::underline);
          -
          log.style(clutchlog::level::error, clutchlog::fmt(
          +
          log.style(clutchlog::level::error, clutchlog::fmt(
          "#ff0000",
          clutchlog::fmt::typo::bold);
          -
          log.style(clutchlog::level::warning, clutchlog::fmt(
          +
          log.style(clutchlog::level::warning, clutchlog::fmt(
          "#ff00ff",
          clutchlog::fmt::typo::bold);
          // Assuming you are on a POSIX system.
          @@ -504,32 +517,32 @@ Examples Limitations

          System-dependent stack depth

          -

          Because access to the call stack depth and program name are system-dependent, the features relying on the depth of the call stack and the display of the program name are only available for operating systems having the following headers: execinfo.h, stdlib.h and libgen.h (so far, tested with Linux).

          -

          Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSINFO to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

          #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
          +

          Because access to the call stack depth and program name are system-dependent, the features relying on the depth of the call stack and the display of the program name are only available for operating systems having the following headers: execinfo.h, stdlib.h and libgen.h (so far, tested with Linux).

          +

          Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSINFO to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

          #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
          log.depth( x );
          #endif

          System-dependent horizontal fill

          -

          Because access to the current terminal width is system-dependent, the {hfill} format tag feature is only available for operating systems having the following headers: sys/ioctl.h, stdio.h and unistd.h (so far, tested with Linux).

          -

          Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSIOCTL to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

          #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
          +

          Because access to the current terminal width is system-dependent, the {hfill} format tag feature is only available for operating systems having the following headers: sys/ioctl.h, stdio.h and unistd.h (so far, tested with Linux).

          +

          Clutchlog sets the CLUTCHLOG_HAVE_UNIX_SYSIOCTL to 1 if the headers are available, and to 0 if they are not. You can make portable code using something like:

          #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
          log.hfill_mark( '_' );
          #endif
          -

          If you use unicode characters in your template, the horizontal width will not be computed properly, resulting in incorrectly right-aligned lines. Solving this would require the use of third-party libraries, making portability more difficult.

          +

          If you use unicode characters in your template, the horizontal width will not be computed properly, resulting in incorrectly right-aligned lines. Solving this would require the use of third-party libraries, making portability more difficult.

          Dependencies

          -

          Some colors/styles may not be supported by some exotic terminal emulators.

          -

          Clutchlog needs C++-17 with the filesystem feature. You may need to indicate -std=c++17 -lstdc++fs to some compilers.

          +

          Some colors/styles may not be supported by some exotic terminal emulators.

          +

          Clutchlog needs C++-17 with the filesystem feature. You may need to indicate -std=c++17 -lstdc++fs to some compilers.

          Variable names within the CLUTCHLOG macro

          -

          Calling the CLUTCHLOG macro with a message using a variable named clutchlog__msg will end in an error.

          +

          Calling the CLUTCHLOG macro with a message using a variable named clutchlog__msg will end in an error.

          Features

          -

          What Clutchlog do not provide at the moment (but may in a near future):

          +

          What Clutchlog do not provide at the moment (but may in a near future):

          • Super fast log writing.
          • Thread safety.
          -

          What Clutchlog will most certainly never provide:

          +

          What Clutchlog will most certainly never provide:

          • Round-robin log managers.
          • Duplicated messages management.
          • @@ -540,35 +553,28 @@ Features

          Build and tests

          -

          To use clutchlog, just include its header in your code and either ensure that the NDEBUG preprocessor variable is not set, either define the WITH_CLUTCHLOG preprocessor variable.

          -

          If you're using CMake (or another modern build system), it will unset NDEBUG —and thus enable clutchlog— only for the "Debug" build type, which is usually what you want if you use clutchlog, anyway.

          -

          To build and run the tests, just use a classical CMake workflow:

          mkdir build
          +

          To use clutchlog, just include its header in your code and either ensure that the NDEBUG preprocessor variable is not set, either define the WITH_CLUTCHLOG preprocessor variable.

          +

          If you're using CMake (or another modern build system), it will unset NDEBUG —and thus enable clutchlog— only for the "Debug" build type, which is usually what you want if you use clutchlog, anyway.

          +

          To build and run the tests, just use a classical CMake workflow:

          mkdir build
          cd build
          cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_CLUTCHLOG=ON ..
          make
          ctest
          -

          There's a script that tests all the build types combinations: ./build_all.sh.

          +

          There's a script that tests all the build types combinations: ./build_all.sh.

          +

          +Usage as a Git submodule

          +

          If you are using Git and CMake, it is easy to include Clutchlog as a dependency.

          +

          First, add Clutchlog as a submodule of your repository:

          git submodule add git@github.com:nojhan/clutchlog.git external/
          +
          git commit -m "Add clutchlog as a submodule dependency"
          +

          Then, in your CMakeLists.txt file, add:

          include_directories(external/clutchlog)
          +

          And that's it.

          -
          #define CLUTCHLOG_DEFAULT_DEPTH_MARK
          Compile-time default mark for stack depth.
          Definition: clutchlog.h:256
          -
          enum clutchlog::fmt::typo style
          Typographic style.
          -
          #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
          Log a message at the given level and with a given depth delta.
          Definition: clutchlog.h:81
          -
          #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
          Dump the given container.
          Definition: clutchlog.h:107
          -
          static clutchlog & logger()
          Get the logger instance.
          Definition: clutchlog.h:306
          -
          Color and style formatter for ANSI terminal escape sequences.
          Definition: clutchlog.h:379
          -
          #define CLUTCHLOC
          Handy shortcuts to location.
          Definition: clutchlog.h:77
          -
          #define CLUTCHLOG_DEFAULT_HFILL_MARK
          Character used as a filling for right-align the right part of messages with "{hfill}".
          Definition: clutchlog.h:270
          -
          #define CLUTCHLOG(LEVEL, WHAT)
          Log a message at the given level.
          Definition: clutchlog.h:98
          -
          #define CLUTCHFUNC(LEVEL, FUNC,...)
          Call any function if the scope matches.
          Definition: clutchlog.h:124
          -
          #define CLUTCHLOG_STRIP_CALLS
          Compile-time number of call stack levels to remove from depth display by default.
          Definition: clutchlog.h:263
          -
          #define CLUTCHCODE(LEVEL,...)
          Run any code if the scope matches.
          Definition: clutchlog.h:145
          diff --git a/docs/inherits.html b/docs/inherits.html index 7d1cca4..edf74a2 100644 --- a/docs/inherits.html +++ b/docs/inherits.html @@ -2,8 +2,8 @@ - - + + clutchlog: Class Hierarchy @@ -24,11 +24,10 @@
          - + - @@ -36,21 +35,22 @@
          -
          clutchlog -  0.16 +
          +
          clutchlog 0.17
          - + +/* @license-end */ +
          @@ -64,7 +64,7 @@ $(function() {
          @@ -84,8 +84,7 @@ $(document).ready(function(){initNavTree('hierarchy.html',''); initResizable();
        -
        -
        Class Hierarchy
        +
        Class Hierarchy
        @@ -101,9 +100,7 @@ $(document).ready(function(){initNavTree('hierarchy.html',''); initResizable(); diff --git a/docs/jquery.js b/docs/jquery.js index 103c32d..c9ed3d9 100644 --- a/docs/jquery.js +++ b/docs/jquery.js @@ -1,5 +1,5 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
        ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
        ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0'+ + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
      • '+ data.children[i].text+''+ makeTree(data.children[i],relPath)+'
      • '; } @@ -35,16 +44,92 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { } return result; } - - $('#main-nav').append(makeTree(menudata,relPath)); - $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + var searchBox; if (searchEnabled) { if (serverSide) { - $('#main-menu').append('
      • '); + searchBox='
        '+ + '
        '+ + '
        '+ + ''+ + '
        '+ + '
        '+ + '
        '+ + '
        '; } else { - $('#main-menu').append('
      • '); + searchBox='
        '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + '' + '
        '; } } + + $('#main-nav').before('
        '+ + ''+ + ''+ + '
        '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBox) { + $('#main-menu').append('
      • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBox); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBox); + $('#searchBoxPos2').show(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } $('#main-menu').smartmenus(); } /* @license-end */ diff --git a/docs/menudata.js b/docs/menudata.js index 5970b76..31d3754 100644 --- a/docs/menudata.js +++ b/docs/menudata.js @@ -1,24 +1,26 @@ /* -@licstart The following is the entire license notice for the -JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. -Copyright (C) 1997-2019 by Dimitri van Heesch + The MIT License (MIT) -This program is free software; you can redistribute it and/or modify -it under the terms of version 2 of the GNU General Public License as published by -the Free Software Foundation + Copyright (C) 1997-2020 by Dimitri van Heesch -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. -@licend The above is the entire license notice -for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ var menudata={children:[ {text:"Main Page",url:"index.html"}, diff --git a/docs/modules.html b/docs/modules.html index 2174db0..2b45905 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -2,8 +2,8 @@ - - + + clutchlog: Modules @@ -24,11 +24,10 @@
        - + - @@ -36,21 +35,22 @@
        -
        clutchlog -  0.16 +
        +
        clutchlog 0.17
        - + +/* @license-end */ +
        @@ -64,7 +64,7 @@ $(function() {
        @@ -84,8 +84,7 @@ $(document).ready(function(){initNavTree('modules.html',''); initResizable(); })
        -
        -
        Modules
        +
        Modules
        Here is a list of all modules:
        @@ -103,9 +102,7 @@ $(document).ready(function(){initNavTree('modules.html',''); initResizable(); }) diff --git a/docs/navtree.css b/docs/navtree.css index 33341a6..d8a311a 100644 --- a/docs/navtree.css +++ b/docs/navtree.css @@ -87,6 +87,7 @@ position: absolute; left: 0px; width: 250px; + overflow : hidden; } .ui-resizable .ui-resizable-handle { diff --git a/docs/navtree.js b/docs/navtree.js index edc31ef..2798368 100644 --- a/docs/navtree.js +++ b/docs/navtree.js @@ -1,24 +1,26 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. - Copyright (C) 1997-2019 by Dimitri van Heesch + The MIT License (MIT) - This program is free software; you can redistribute it and/or modify - it under the terms of version 2 of the GNU General Public License as - published by the Free Software Foundation. + Copyright (C) 1997-2020 by Dimitri van Heesch - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. - @licend The above is the entire license notice - for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ var navTreeSubIndices = new Array(); var arrowDown = '▼'; @@ -323,11 +325,14 @@ function selectAndHighlight(hash,n) $(n.itemDiv).addClass('selected'); $(n.itemDiv).attr('id','selected'); } - if ($('#nav-tree-contents .item:first').hasClass('selected')) { - $('#nav-sync').css('top','30px'); - } else { - $('#nav-sync').css('top','5px'); + var topOffset=5; + if (typeof page_layout!=='undefined' && page_layout==1) { + topOffset+=$('#top').outerHeight(); } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); showRoot(); } diff --git a/docs/navtreedata.js b/docs/navtreedata.js index b21b8d8..9313055 100644 --- a/docs/navtreedata.js +++ b/docs/navtreedata.js @@ -1,24 +1,26 @@ /* -@licstart The following is the entire license notice for the -JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. -Copyright (C) 1997-2019 by Dimitri van Heesch + The MIT License (MIT) -This program is free software; you can redistribute it and/or modify -it under the terms of version 2 of the GNU General Public License as published by -the Free Software Foundation + Copyright (C) 1997-2020 by Dimitri van Heesch -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. -@licend The above is the entire license notice -for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ var NAVTREE = [ @@ -56,7 +58,8 @@ var NAVTREE = ] ], [ "Examples", "index.html#autotoc_md25", null ], [ "Limitations", "index.html#autotoc_md26", null ], - [ "Build and tests", "index.html#autotoc_md32", null ] + [ "Build and tests", "index.html#autotoc_md32", null ], + [ "Usage as a Git submodule", "index.html#autotoc_md33", null ] ] ], [ "Modules", "modules.html", "modules" ], [ "Classes", "annotated.html", [ @@ -83,8 +86,7 @@ var NAVTREE = var NAVTREEINDEX = [ -"annotated.html", -"structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d" +"annotated.html" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/docs/navtreeindex0.js b/docs/navtreeindex0.js index 8df93de..eda67d6 100644 --- a/docs/navtreeindex0.js +++ b/docs/navtreeindex0.js @@ -2,120 +2,101 @@ var NAVTREEINDEX0 = { "annotated.html":[2,0], "classclutchlog.html":[1,2,0], -"classclutchlog.html#a03b145e36f15435a640bb5a885d9f642":[1,2,0,7], -"classclutchlog.html#a0431616914dbbecb908a794f5b46dada":[1,2,0,60], -"classclutchlog.html#a08310b92e86687349e70f56f9ac1d656":[1,2,0,18], -"classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae":[1,2,0,49], -"classclutchlog.html#a0906d74275cedcd403da94879764815e":[1,2,0,6], -"classclutchlog.html#a095e1545a2085ac623e4af19364fea7f":[1,2,0,59], -"classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc":[1,2,0,38], -"classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c":[1,2,0,24], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928":[1,2,0,61], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9":[1,2,0,61,1], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a6efd7b28f876c0473c6dfeae82fc8e05":[1,2,0,61,3], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a911f5ef324f37061f68a239577e0d0bd":[1,2,0,61,6], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aa1ea607f2bfe5db06f1cf2bd991f7dc1":[1,2,0,61,5], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aab4ce1a501f9cbe27666659d3b19534c":[1,2,0,61,2], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928abba74b810831c7753777e6dcc0c0f4e2":[1,2,0,61,7], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701":[1,2,0,61,0], -"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af89a12aab2a73ea31e19b04ecadbdc0d":[1,2,0,61,4], -"classclutchlog.html#a130c4f12eacbd2028102838fe16b734e":[1,2,0,56], -"classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a":[1,2,0,36], -"classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167":[1,2,0,53], -"classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468":[1,2,0,42], -"classclutchlog.html#a2144abe4ec6f630126b6490908b5f924":[1,2,0,12], -"classclutchlog.html#a229fd61519f1245282440120f2d45fb5":[1,2,0,41], -"classclutchlog.html#a2a334e009533744b52f01ef240a59e9d":[1,2,0,58], -"classclutchlog.html#a356df86455409193792b6ed550dfd09e":[1,2,0,46], -"classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4":[1,2,0,19], -"classclutchlog.html#a41757198b29862832a14472a9e5e24c6":[1,2,0,57], -"classclutchlog.html#a4831f44fd5ade102e57320632095934d":[1,2,0,30], -"classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96":[1,2,0,32], -"classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7":[1,2,0,45], -"classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5":[1,2,0,52], -"classclutchlog.html#a656c277e074b64728cca871f2b484d1c":[1,2,0,10], -"classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3":[1,2,0,27], -"classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266":[1,2,0,15], -"classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6":[1,2,0,43], -"classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9":[1,2,0,20], -"classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e":[1,2,0,51], -"classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d":[1,2,0,14], -"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e":[1,2,0,62], -"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea04548b133168127416623d51dd3b9338":[1,2,0,62,4], -"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea19ebb39c0f117afbe6658bbc9bea68a4":[1,2,0,62,0], -"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea35cf5f272267d9656cfcfe52243f4841":[1,2,0,62,2], -"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea5b96778dd84a50c1b288b31a5200df4d":[1,2,0,62,5], -"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea9534ecbf6a632833ca32ea5bb33f7eea":[1,2,0,62,3], -"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ead79ddc78294d362c22ba917cba2cd3ef":[1,2,0,62,1], -"classclutchlog.html#a82b9375728af2d962831a743d95f4ae7":[1,2,0,31], -"classclutchlog.html#a972f895c70edc335f3018a2c8971d59e":[1,2,0,33], -"classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9":[1,2,0,26], -"classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5":[1,2,0,13], -"classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f":[1,2,0,47], -"classclutchlog.html#ab45287cc9c14217904a13aff49573732":[1,2,0,21], -"classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb":[1,2,0,37], -"classclutchlog.html#ab805ac5c33885459f9f752518a4aa735":[1,2,0,50], -"classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888":[1,2,0,48], -"classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761":[1,2,0,35], -"classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591":[1,2,0,28], -"classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1":[1,2,0,44], -"classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416":[1,2,0,17], -"classclutchlog.html#ace879554298e6e6e36dafef330c27be8":[1,2,0,39], -"classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd":[1,2,0,23], -"classclutchlog.html#acfaceb77da01503b432644a3efaee4fa":[1,2,0,8], -"classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6":[1,2,0,29], -"classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447":[1,2,0,25], -"classclutchlog.html#aded03528f34d9000f618419c482c5042":[1,2,0,55], -"classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf":[1,2,0,16], -"classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2":[1,2,0,34], -"classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993":[1,2,0,54], -"classclutchlog.html#aef653a9744a72a889ca8163269bb781e":[1,2,0,9], -"classclutchlog.html#af898bffe23b125245e338d7495c76d45":[1,2,0,40], -"classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80":[1,2,0,11], -"classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a":[1,2,0,22], +"classclutchlog.html#a0431616914dbbecb908a794f5b46dada":[1,2,0,52], +"classclutchlog.html#a08310b92e86687349e70f56f9ac1d656":[1,2,0,10], +"classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae":[1,2,0,41], +"classclutchlog.html#a095e1545a2085ac623e4af19364fea7f":[1,2,0,51], +"classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc":[1,2,0,30], +"classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c":[1,2,0,16], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928":[1,2,0,53], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a023c3e8a55ddfd140d3e3268dd6221e9":[1,2,0,53,1], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a6efd7b28f876c0473c6dfeae82fc8e05":[1,2,0,53,3], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928a911f5ef324f37061f68a239577e0d0bd":[1,2,0,53,6], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aa1ea607f2bfe5db06f1cf2bd991f7dc1":[1,2,0,53,5], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928aab4ce1a501f9cbe27666659d3b19534c":[1,2,0,53,2], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928abba74b810831c7753777e6dcc0c0f4e2":[1,2,0,53,7], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af332f31a368c931f79b9b64d55fc7701":[1,2,0,53,0], +"classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928af89a12aab2a73ea31e19b04ecadbdc0d":[1,2,0,53,4], +"classclutchlog.html#a130c4f12eacbd2028102838fe16b734e":[1,2,0,48], +"classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a":[1,2,0,28], +"classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167":[1,2,0,45], +"classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468":[1,2,0,34], +"classclutchlog.html#a2144abe4ec6f630126b6490908b5f924":[1,2,0,4], +"classclutchlog.html#a229fd61519f1245282440120f2d45fb5":[1,2,0,33], +"classclutchlog.html#a2a334e009533744b52f01ef240a59e9d":[1,2,0,50], +"classclutchlog.html#a356df86455409193792b6ed550dfd09e":[1,2,0,38], +"classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4":[1,2,0,11], +"classclutchlog.html#a41757198b29862832a14472a9e5e24c6":[1,2,0,49], +"classclutchlog.html#a4831f44fd5ade102e57320632095934d":[1,2,0,22], +"classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96":[1,2,0,24], +"classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7":[1,2,0,37], +"classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5":[1,2,0,44], +"classclutchlog.html#a656c277e074b64728cca871f2b484d1c":[1,2,0,2], +"classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3":[1,2,0,19], +"classclutchlog.html#a6e2a5e98fa9f722d90ba6515895543ac":[1,2,0,1], +"classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6":[1,2,0,35], +"classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9":[1,2,0,12], +"classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e":[1,2,0,43], +"classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d":[1,2,0,6], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e":[1,2,0,54], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea04548b133168127416623d51dd3b9338":[1,2,0,54,4], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea19ebb39c0f117afbe6658bbc9bea68a4":[1,2,0,54,0], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea35cf5f272267d9656cfcfe52243f4841":[1,2,0,54,2], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea5b96778dd84a50c1b288b31a5200df4d":[1,2,0,54,5], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ea9534ecbf6a632833ca32ea5bb33f7eea":[1,2,0,54,3], +"classclutchlog.html#a822062ffa857bd16ff488f9c749ff20ead79ddc78294d362c22ba917cba2cd3ef":[1,2,0,54,1], +"classclutchlog.html#a82b9375728af2d962831a743d95f4ae7":[1,2,0,23], +"classclutchlog.html#a8d206443dea964f77965450a83693d98":[1,2,0,14], +"classclutchlog.html#a972f895c70edc335f3018a2c8971d59e":[1,2,0,25], +"classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9":[1,2,0,18], +"classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5":[1,2,0,5], +"classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f":[1,2,0,39], +"classclutchlog.html#ab45287cc9c14217904a13aff49573732":[1,2,0,13], +"classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb":[1,2,0,29], +"classclutchlog.html#ab7773f031a00a05b8c83c1936406cb98":[1,2,0,7], +"classclutchlog.html#ab805ac5c33885459f9f752518a4aa735":[1,2,0,42], +"classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888":[1,2,0,40], +"classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761":[1,2,0,27], +"classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591":[1,2,0,20], +"classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1":[1,2,0,36], +"classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416":[1,2,0,9], +"classclutchlog.html#ace879554298e6e6e36dafef330c27be8":[1,2,0,31], +"classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd":[1,2,0,15], +"classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6":[1,2,0,21], +"classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447":[1,2,0,17], +"classclutchlog.html#aded03528f34d9000f618419c482c5042":[1,2,0,47], +"classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf":[1,2,0,8], +"classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2":[1,2,0,26], +"classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993":[1,2,0,46], +"classclutchlog.html#af898bffe23b125245e338d7495c76d45":[1,2,0,32], +"classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80":[1,2,0,3], "classclutchlog_1_1fmt.html":[1,3,0], -"classclutchlog_1_1fmt.html#a00feba2b1539529df70e39d615a05941":[1,3,0,10], -"classclutchlog_1_1fmt.html#a04f3ba5f6fe81955dca4492a6d259f1c":[1,3,0,7], -"classclutchlog_1_1fmt.html#a0923d7d400f6753d4dae124b71eb5023":[1,3,0,15], -"classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205":[1,3,0,25], -"classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0":[1,3,0,18], -"classclutchlog_1_1fmt.html#a13453c0b5dbc19d9b510dcdc0352b443":[1,3,0,3], -"classclutchlog_1_1fmt.html#a194201eb8a400ef13df3e833b8788cdc":[1,3,0,9], -"classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b":[1,3,0,26], -"classclutchlog_1_1fmt.html#a2df8f77f58dc9272c94982c4d2275581":[1,3,0,12], -"classclutchlog_1_1fmt.html#a357c93593867f67d9fef562ca07c7dcc":[1,3,0,11], +"classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205":[1,3,0,7], +"classclutchlog_1_1fmt.html#a24568f7a157d50e3075a74a619719c84":[1,3,0,6], +"classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b":[1,3,0,8], "classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959":[1,3,0,0], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502":[1,3,0,33], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa":[1,3,0,33,2], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e":[1,3,0,33,0], -"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749":[1,3,0,33,1], -"classclutchlog_1_1fmt.html#a506718883842dbce3659f42cdf79e52c":[1,3,0,16], -"classclutchlog_1_1fmt.html#a63b29eb5862a30a194b0256f2ee554a6":[1,3,0,13], -"classclutchlog_1_1fmt.html#a65856874070ec0865b3a5b9aeb0e4f3d":[1,3,0,4], -"classclutchlog_1_1fmt.html#a6cc6126d113fc0647ed3acbf29cdc425":[1,3,0,1], -"classclutchlog_1_1fmt.html#a6d1cc4abe822a569a2624b0829de5dd0":[1,3,0,17], -"classclutchlog_1_1fmt.html#a822ded10ae1b0c82f7330481aa4bb64f":[1,3,0,21], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89":[1,3,0,34], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,34,4], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a69dcab4a73aeec2113f69b61e6263da8":[1,3,0,34,1], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a6dc7b4483f8c2c701a48e42db552806d":[1,3,0,34,2], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a86266ee937d97f812a8e57d22b62ee29":[1,3,0,34,0], -"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89aa91c78e040f7b9d158f381e197f8beb4":[1,3,0,34,3], -"classclutchlog_1_1fmt.html#a9458703ab8a3c9fbc6b801011b43f16d":[1,3,0,14], -"classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da":[1,3,0,24], -"classclutchlog_1_1fmt.html#a99b3a05ddf6fa341cee6cb1e5dffc159":[1,3,0,5], -"classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b":[1,3,0,20], -"classclutchlog_1_1fmt.html#ac49c883e3dd17832749cc092b74a9f56":[1,3,0,8], -"classclutchlog_1_1fmt.html#ac69e6d3b7ddaec908c429ac61f354267":[1,3,0,2], -"classclutchlog_1_1fmt.html#aeea73b0239bf73ebc8ee84c1e6d278e2":[1,3,0,6], -"classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c":[1,3,0,19], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502":[1,3,0,15], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa":[1,3,0,15,2], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e":[1,3,0,15,0], +"classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749":[1,3,0,15,1], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89":[1,3,0,16], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,16,4], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a69dcab4a73aeec2113f69b61e6263da8":[1,3,0,16,1], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a6dc7b4483f8c2c701a48e42db552806d":[1,3,0,16,2], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89a86266ee937d97f812a8e57d22b62ee29":[1,3,0,16,0], +"classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89aa91c78e040f7b9d158f381e197f8beb4":[1,3,0,16,3], +"classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b":[1,3,0,3], +"classclutchlog_1_1fmt.html#ad754c64eb6fd8730a616d113cb9f9129":[1,3,0,1], +"classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c":[1,3,0,2], "classes.html":[2,1], -"clutchlog_8h.html":[3,0,0], -"clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16":[3,0,0,1], -"clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4":[3,0,0,4], -"clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb":[3,0,0,2], -"clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817":[3,0,0,3], -"clutchlog_8h_source.html":[3,0,0], +"clutchlog_8h.html":[3,0,0,0], +"clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16":[3,0,0,0,1], +"clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4":[3,0,0,0,4], +"clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb":[3,0,0,0,2], +"clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817":[3,0,0,0,3], +"clutchlog_8h_source.html":[3,0,0,0], +"dir_59425e443f801f1f2fd8bbe4959a3ccf.html":[3,0,1], +"dir_c318bd5cf14aaa5601e6029e0b5b4048.html":[3,0,0], "files.html":[3,0], "functions.html":[2,3,0], "functions_enum.html":[2,3,3], @@ -125,94 +106,37 @@ var NAVTREEINDEX0 = "globals.html":[3,1,0], "globals_defs.html":[3,1,1], "group___default_config.html":[1,0], -"group___default_config.html#ga27b613c6727857a7cbcd0165d862034e":[3,0,0,13], "group___default_config.html#ga27b613c6727857a7cbcd0165d862034e":[1,0,2], -"group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9":[3,0,0,15], "group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9":[1,0,4], "group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805":[1,0,6], -"group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805":[3,0,0,17], -"group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa":[3,0,0,12], "group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa":[1,0,1], -"group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[3,0,0,14], "group___default_config.html#ga54d29e956575e1c731eab5406135c5df":[1,0,3], -"group___default_config.html#ga8564be479b948ee3052b61783c66d415":[3,0,0,5], "group___default_config.html#ga8564be479b948ee3052b61783c66d415":[1,0,0], "group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf":[1,0,5], -"group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf":[3,0,0,16], "group___formating.html":[1,3], "group___main.html":[1,2], "group___use_macros.html":[1,1], "group___use_macros.html#ga369d365b7c25ec270596c3ca6839cf2c":[1,1,1], -"group___use_macros.html#ga369d365b7c25ec270596c3ca6839cf2c":[3,0,0,7], -"group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2":[3,0,0,9], "group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2":[1,1,3], "group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d":[1,1,2], -"group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d":[3,0,0,8], -"group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae":[3,0,0,10], "group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae":[1,1,4], "group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73":[1,1,5], -"group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73":[3,0,0,11], "group___use_macros.html#gae8911119d726a43b77f5781cb5a72813":[1,1,0], -"group___use_macros.html#gae8911119d726a43b77f5781cb5a72813":[3,0,0,6], "group__colors16.html":[1,4], -"group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e":[1,3,0,36], "group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e":[1,4,1], -"group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33":[1,3,0,23], -"group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33":[1,4,5], -"group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0":[1,3,0,35], "group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0":[1,4,0], -"group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,3,0,22], -"group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7":[1,4,4], -"group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,3,0,27], "group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401":[1,4,2], "group__colors16.html#ga86696b20e5b31c96ba592926efb324f3":[1,4,3], -"group__colors16.html#ga86696b20e5b31c96ba592926efb324f3":[1,3,0,28], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea1ffd9e753c8054cc61456ac7fac1ac89":[1,3,0,36,0], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,36,16], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea37553b57ad1d7f61b0c51f5a535f72bf":[1,3,0,36,13], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea48d6215903dff56238e52e8891380c8f":[1,3,0,36,4], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea4c2a4a7078da0ac6733464eacfd00f86":[1,3,0,36,5], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea6411532ba4971f378391776a9db629d3":[1,3,0,36,6], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea74474ae20bf3ef3bce6fd679194ce383":[1,3,0,36,8], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea75dd76d162b9554ec8b63736bc22d93e":[1,3,0,36,11], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea8b84c6e788e91a3a45b9dabedb160590":[1,3,0,36,9], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ea9f27410725ab8cc8854a2769c7a516b8":[1,3,0,36,2], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eabd5b4652dffd84bab66529361d0c4974":[1,3,0,36,10], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eabda9643ac6601722a28f238714274da4":[1,3,0,36,1], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eac5b47880b4b2ec37179078d63a85def3":[1,3,0,36,12], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eacc69f9955c2bf916bb9a83f38141432f":[1,3,0,36,14], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ead487dd0b55dfcacdd920ccbdaeafa351":[1,3,0,36,3], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1ead508fe45cecaf653904a0e774084bb5c":[1,3,0,36,7], -"group__colors16.html#gga1cf3e27e4041250ffea0a6d58010da1eada7527acf78cb4e7b582e8163a1f642a":[1,3,0,36,15], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a1ffd9e753c8054cc61456ac7fac1ac89":[1,3,0,35,0], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a334c4a4c42fdb79d7ebc3e73b517e6f8":[1,3,0,35,16], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a37553b57ad1d7f61b0c51f5a535f72bf":[1,3,0,35,13], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a48d6215903dff56238e52e8891380c8f":[1,3,0,35,4], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a4c2a4a7078da0ac6733464eacfd00f86":[1,3,0,35,5], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a6411532ba4971f378391776a9db629d3":[1,3,0,35,6], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a74474ae20bf3ef3bce6fd679194ce383":[1,3,0,35,8], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a75dd76d162b9554ec8b63736bc22d93e":[1,3,0,35,11], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a8b84c6e788e91a3a45b9dabedb160590":[1,3,0,35,9], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0a9f27410725ab8cc8854a2769c7a516b8":[1,3,0,35,2], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0abd5b4652dffd84bab66529361d0c4974":[1,3,0,35,10], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0abda9643ac6601722a28f238714274da4":[1,3,0,35,1], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ac5b47880b4b2ec37179078d63a85def3":[1,3,0,35,12], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0acc69f9955c2bf916bb9a83f38141432f":[1,3,0,35,14], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ad487dd0b55dfcacdd920ccbdaeafa351":[1,3,0,35,3], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ad508fe45cecaf653904a0e774084bb5c":[1,3,0,35,7], -"group__colors16.html#gga4662a3ec3577c6a575a2c734636ed8a0ada7527acf78cb4e7b582e8163a1f642a":[1,3,0,35,15], +"group__colors16.html#ga93d498671d8dc2e796978c4f4de51241":[1,4,5], +"group__colors16.html#gac00a2f504f5308207f7a94915fe9a9c5":[1,4,4], "group__colors256__16_m.html":[1,5], "group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,5,8], -"group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0":[1,3,0,30], -"group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de":[1,3,0,31], "group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de":[1,5,9], "group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0":[1,5,10], -"group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0":[1,3,0,32], "group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,5,7], -"group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c":[1,3,0,29], "hierarchy.html":[2,2], -"index.html":[], "index.html":[0], +"index.html":[], "index.html#autotoc_md0":[0,0], "index.html#autotoc_md1":[0,1], "index.html#autotoc_md10":[0,3,4,0], @@ -233,13 +157,9 @@ var NAVTREEINDEX0 = "index.html#autotoc_md24":[0,4,5], "index.html#autotoc_md25":[0,5], "index.html#autotoc_md26":[0,6], -"index.html#autotoc_md27":[0], -"index.html#autotoc_md28":[1], -"index.html#autotoc_md29":[2], "index.html#autotoc_md3":[0,3], -"index.html#autotoc_md30":[3], -"index.html#autotoc_md31":[4], "index.html#autotoc_md32":[0,7], +"index.html#autotoc_md33":[0,8], "index.html#autotoc_md4":[0,3,0], "index.html#autotoc_md5":[0,3,1], "index.html#autotoc_md6":[0,3,2], @@ -249,5 +169,61 @@ var NAVTREEINDEX0 = "modules.html":[1], "pages.html":[], "structclutchlog_1_1fmt_1_1bg__16_m.html":[1,5,6], -"structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0":[1,5,6,0] +"structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0":[1,5,6,0], +"structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d":[1,5,6,3], +"structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501":[1,5,6,1], +"structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97":[1,5,6,2], +"structclutchlog_1_1fmt_1_1bg__256.html":[1,5,3], +"structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd":[1,5,3,2], +"structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90":[1,5,3,0], +"structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad":[1,5,3,1], +"structclutchlog_1_1fmt_1_1color.html":[1,5,0], +"structclutchlog_1_1fmt_1_1color.html#a121619a01bf48e53b3478d23989c0c59":[1,5,0,2], +"structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae":[1,5,0,4], +"structclutchlog_1_1fmt_1_1color.html#a4860c13958d21118a564920fa78e6720":[1,5,0,3], +"structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac":[1,5,0,0], +"structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603":[1,5,0,1], +"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0":[1,5,0,5], +"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0a469bba0a564235dfceede42db14f17b0":[1,5,0,5,1], +"structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0ae64e4c4fee28f9ca7301e4c7ff598e67":[1,5,0,5,0], +"structclutchlog_1_1fmt_1_1color__16_m.html":[1,5,4], +"structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61":[1,5,4,5], +"structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3":[1,5,4,1], +"structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c":[1,5,4,2], +"structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d":[1,5,4,3], +"structclutchlog_1_1fmt_1_1color__16_m.html#ac6a4b8650ea7e9171fc76d6226015005":[1,5,4,4], +"structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282":[1,5,4,0], +"structclutchlog_1_1fmt_1_1color__256.html":[1,5,1], +"structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c":[1,5,1,0], +"structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726":[1,5,1,1], +"structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988":[1,5,1,4], +"structclutchlog_1_1fmt_1_1color__256.html#ad4e941accf566378e0007ec881096fb0":[1,5,1,3], +"structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111":[1,5,1,2], +"structclutchlog_1_1fmt_1_1fg__16_m.html":[1,5,5], +"structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5":[1,5,5,1], +"structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194":[1,5,5,0], +"structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8":[1,5,5,3], +"structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3":[1,5,5,2], +"structclutchlog_1_1fmt_1_1fg__256.html":[1,5,2], +"structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23":[1,5,2,2], +"structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59":[1,5,2,1], +"structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a":[1,5,2,0], +"structclutchlog_1_1scope__t.html":[1,2,0,0], +"structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572":[1,2,0,0,0], +"structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff":[1,2,0,0,3], +"structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744":[1,2,0,0,2], +"structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9":[1,2,0,0,1], +"t-assert_8cpp_source.html":[3,0,1,0], +"t-color16_m_8cpp_source.html":[3,0,1,2], +"t-color256_8cpp_source.html":[3,0,1,3], +"t-color_8cpp_source.html":[3,0,1,1], +"t-demo_8cpp_source.html":[3,0,1,4], +"t-depth-delta_8cpp_source.html":[3,0,1,5], +"t-dump_8cpp_source.html":[3,0,1,6], +"t-extra_8cpp_source.html":[3,0,1,7], +"t-filename_8cpp_source.html":[3,0,1,8], +"t-fmt-constructors_8cpp_source.html":[3,0,1,9], +"t-hash-color_8cpp_source.html":[3,0,1,10], +"t-log_8cpp_source.html":[3,0,1,11], +"t-one-line-if_8cpp_source.html":[3,0,1,12] }; diff --git a/docs/resize.js b/docs/resize.js index a0bb5f4..7fe30d1 100644 --- a/docs/resize.js +++ b/docs/resize.js @@ -1,25 +1,26 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. - Copyright (C) 1997-2017 by Dimitri van Heesch + The MIT License (MIT) - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + Copyright (C) 1997-2020 by Dimitri van Heesch - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. - @licend The above is the entire license notice - for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ function initResizable() { @@ -52,7 +53,7 @@ function initResizable() date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week expiration = date.toGMTString(); } - document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/"; } function resizeWidth() @@ -74,10 +75,20 @@ function initResizable() { var headerHeight = header.outerHeight(); var footerHeight = footer.outerHeight(); - var windowHeight = $(window).height() - headerHeight - footerHeight; - content.css({height:windowHeight + "px"}); - navtree.css({height:windowHeight + "px"}); - sidenav.css({height:windowHeight + "px"}); + var windowHeight = $(window).height(); + var contentHeight,navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + content.css({height:contentHeight + "px"}); + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); var width=$(window).width(); if (width!=collapsedWidth) { if (width=desktop_vp) { @@ -91,7 +102,9 @@ function initResizable() } collapsedWidth=width; } - (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } } function collapseExpand() diff --git a/docs/search/all_0.html b/docs/search/all_0.html index 26dd244..bb9e364 100644 --- a/docs/search/all_0.html +++ b/docs/search/all_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_1.html b/docs/search/all_1.html index 8eb215b..8989416 100644 --- a/docs/search/all_1.html +++ b/docs/search/all_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_1.js b/docs/search/all_1.js index 2aa49b3..ab5d8c9 100644 --- a/docs/search/all_1.js +++ b/docs/search/all_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['ansi_15',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] + ['ansi_0',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/all_10.html b/docs/search/all_10.html index 6fd3a4a..a7c1f9c 100644 --- a/docs/search/all_10.html +++ b/docs/search/all_10.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_10.js b/docs/search/all_10.js index 3ad80e3..7298532 100644 --- a/docs/search/all_10.js +++ b/docs/search/all_10.js @@ -1,4 +1,4 @@ var searchData= [ - ['with_5fclutchlog_103',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] + ['with_5fclutchlog_0',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] ]; diff --git a/docs/search/all_2.html b/docs/search/all_2.html index b26d916..98e648c 100644 --- a/docs/search/all_2.html +++ b/docs/search/all_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_2.js b/docs/search/all_2.js index bb2aa6d..1e2731f 100644 --- a/docs/search/all_2.js +++ b/docs/search/all_2.js @@ -1,9 +1,9 @@ var searchData= [ - ['back_16',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], - ['back_5f16m_17',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], - ['back_5f256_18',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]], - ['bg_19',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]], - ['bg_5f16m_20',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt::bg_16M'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], - ['bg_5f256_21',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt::bg_256'],['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] + ['back_0',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], + ['back_5f16m_1',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], + ['back_5f256_2',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]], + ['bg_3',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]], + ['bg_5f16m_4',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt::bg_16M']]], + ['bg_5f256_5',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)'],['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt::bg_256']]] ]; diff --git a/docs/search/all_3.html b/docs/search/all_3.html index b61b96f..f4e8da7 100644 --- a/docs/search/all_3.html +++ b/docs/search/all_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_3.js b/docs/search/all_3.js index 00ceeae..388a551 100644 --- a/docs/search/all_3.js +++ b/docs/search/all_3.js @@ -1,28 +1,29 @@ var searchData= [ - ['clutchcode_22',['CLUTCHCODE',['../group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73',1,'clutchlog.h']]], - ['clutchdump_23',['CLUTCHDUMP',['../group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2',1,'clutchlog.h']]], - ['clutchdump_5fdefault_5fformat_24',['CLUTCHDUMP_DEFAULT_FORMAT',['../group___default_config.html#ga27b613c6727857a7cbcd0165d862034e',1,'clutchlog.h']]], - ['clutchdump_5fdefault_5fsep_25',['CLUTCHDUMP_DEFAULT_SEP',['../group___default_config.html#ga54d29e956575e1c731eab5406135c5df',1,'clutchlog.h']]], - ['clutchfunc_26',['CLUTCHFUNC',['../group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae',1,'clutchlog.h']]], - ['clutchloc_27',['CLUTCHLOC',['../group___use_macros.html#gae8911119d726a43b77f5781cb5a72813',1,'clutchlog.h']]], - ['clutchlog_28',['clutchlog',['../classclutchlog.html',1,'clutchlog'],['../group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d',1,'CLUTCHLOG(): clutchlog.h']]], - ['clutchlog_2eh_29',['clutchlog.h',['../clutchlog_8h.html',1,'']]], - ['clutchlog_5fdefault_5fdepth_5fbuilt_5fnodebug_30',['CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG',['../group___default_config.html#ga8564be479b948ee3052b61783c66d415',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fdepth_5fmark_31',['CLUTCHLOG_DEFAULT_DEPTH_MARK',['../group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fformat_32',['CLUTCHLOG_DEFAULT_FORMAT',['../group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa',1,'clutchlog.h']]], - ['clutchlog_5fdefault_5fhfill_5fmark_33',['CLUTCHLOG_DEFAULT_HFILL_MARK',['../group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805',1,'clutchlog.h']]], - ['clutchlog_5fh_34',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysinfo_35',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysioctl_36',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]], - ['clutchlog_5fstrip_5fcalls_37',['CLUTCHLOG_STRIP_CALLS',['../group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf',1,'clutchlog.h']]], - ['clutchlogd_38',['CLUTCHLOGD',['../group___use_macros.html#ga369d365b7c25ec270596c3ca6839cf2c',1,'clutchlog.h']]], - ['color_39',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt::color'],['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color::color()']]], - ['color_5f16m_40',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt::color_16M'],['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], - ['color_5f256_41',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt::color_256'],['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]], - ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_42',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]], - ['colors_5f16_43',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], - ['colors_5f16m_44',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], - ['colors_5f256_45',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]], - ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_46',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] + ['clutchcode_0',['CLUTCHCODE',['../group___use_macros.html#gaaf2e85e1153e6c88b458dd49e3c37c73',1,'clutchlog.h']]], + ['clutchdump_1',['CLUTCHDUMP',['../group___use_macros.html#ga572e3aa19d8b39e3ed0b9e91961104c2',1,'clutchlog.h']]], + ['clutchdump_5fdefault_5fformat_2',['CLUTCHDUMP_DEFAULT_FORMAT',['../group___default_config.html#ga27b613c6727857a7cbcd0165d862034e',1,'clutchlog.h']]], + ['clutchdump_5fdefault_5fsep_3',['CLUTCHDUMP_DEFAULT_SEP',['../group___default_config.html#ga54d29e956575e1c731eab5406135c5df',1,'clutchlog.h']]], + ['clutchfunc_4',['CLUTCHFUNC',['../group___use_macros.html#ga9f77cee4f853e582262930c9c17f90ae',1,'clutchlog.h']]], + ['clutchloc_5',['CLUTCHLOC',['../group___use_macros.html#gae8911119d726a43b77f5781cb5a72813',1,'clutchlog.h']]], + ['clutchlog_6',['clutchlog',['../classclutchlog.html',1,'']]], + ['clutchlog_7',['CLUTCHLOG',['../group___use_macros.html#ga6f86187e2b35e7e1907d688f504a197d',1,'clutchlog.h']]], + ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_8',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]], + ['clutchlog_2eh_9',['clutchlog.h',['../clutchlog_8h.html',1,'']]], + ['clutchlog_5fdefault_5fdepth_5fbuilt_5fnodebug_10',['CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG',['../group___default_config.html#ga8564be479b948ee3052b61783c66d415',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fdepth_5fmark_11',['CLUTCHLOG_DEFAULT_DEPTH_MARK',['../group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fformat_12',['CLUTCHLOG_DEFAULT_FORMAT',['../group___default_config.html#ga524c16f280d92ee8ab683162c9ce01fa',1,'clutchlog.h']]], + ['clutchlog_5fdefault_5fhfill_5fmark_13',['CLUTCHLOG_DEFAULT_HFILL_MARK',['../group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805',1,'clutchlog.h']]], + ['clutchlog_5fh_14',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysinfo_15',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysioctl_16',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]], + ['clutchlog_5fstrip_5fcalls_17',['CLUTCHLOG_STRIP_CALLS',['../group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf',1,'clutchlog.h']]], + ['clutchlogd_18',['CLUTCHLOGD',['../group___use_macros.html#ga369d365b7c25ec270596c3ca6839cf2c',1,'clutchlog.h']]], + ['color_19',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt::color'],['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color::color()']]], + ['color_5f16m_20',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt::color_16M'],['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], + ['color_5f256_21',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt::color_256'],['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]], + ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_22',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]], + ['colors_5f16_23',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], + ['colors_5f16m_24',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], + ['colors_5f256_25',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/all_4.html b/docs/search/all_4.html index 06de155..678d3a2 100644 --- a/docs/search/all_4.html +++ b/docs/search/all_4.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_4.js b/docs/search/all_4.js index 3f03f41..ea749bf 100644 --- a/docs/search/all_4.js +++ b/docs/search/all_4.js @@ -1,14 +1,14 @@ var searchData= [ - ['default_5fdepth_5fmark_47',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], - ['default_5fformat_48',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], - ['default_5fhfill_5fchar_49',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], - ['default_5fhfill_5fmax_50',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], - ['default_5fhfill_5fmin_51',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], - ['default_5fstrip_5fcalls_52',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], - ['default_20configuration_20management_53',['Default configuration management',['../group___default_config.html',1,'']]], - ['depth_5fstyles_54',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], - ['dump_55',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]], - ['dump_5fdefault_5fformat_56',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], - ['dump_5fdefault_5fsep_57',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] + ['default_20configuration_20management_0',['Default configuration management',['../group___default_config.html',1,'']]], + ['default_5fdepth_5fmark_1',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], + ['default_5fformat_2',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], + ['default_5fhfill_5fchar_3',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], + ['default_5fhfill_5fmax_4',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], + ['default_5fhfill_5fmin_5',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], + ['default_5fstrip_5fcalls_6',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], + ['depth_5fstyles_7',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], + ['dump_8',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]], + ['dump_5fdefault_5fformat_9',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], + ['dump_5fdefault_5fsep_10',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] ]; diff --git a/docs/search/all_5.html b/docs/search/all_5.html index 2544c4e..aa9af78 100644 --- a/docs/search/all_5.html +++ b/docs/search/all_5.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_5.js b/docs/search/all_5.js index e1b533b..f91ba4b 100644 --- a/docs/search/all_5.js +++ b/docs/search/all_5.js @@ -1,18 +1,18 @@ var searchData= [ - ['fg_58',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], - ['fg_5f16m_59',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt::fg_16M'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], - ['fg_5f256_60',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt::fg_256'],['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], - ['file_61',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], - ['filehash_5fstyles_62',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], - ['filename_63',['filename',['../classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e',1,'clutchlog::filename()'],['../classclutchlog.html#a82b9375728af2d962831a743d95f4ae7',1,'clutchlog::filename(filename f)']]], - ['fmt_64',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog::fmt'],['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt::fmt()']]], - ['fore_65',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], - ['fore_5f16m_66',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], - ['fore_5f256_67',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]], - ['format_68',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], - ['format_5fcomment_69',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], - ['formating_20tools_70',['Formating tools',['../group___formating.html',1,'']]], - ['func_71',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], - ['funchash_5fstyles_72',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] + ['fg_0',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], + ['fg_5f16m_1',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt::fg_16M'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], + ['fg_5f256_2',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt::fg_256'],['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], + ['file_3',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], + ['filehash_5fstyles_4',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], + ['filename_5',['filename',['../classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e',1,'clutchlog::filename()'],['../classclutchlog.html#a82b9375728af2d962831a743d95f4ae7',1,'clutchlog::filename(filename f)']]], + ['fmt_6',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog::fmt'],['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt::fmt()']]], + ['fore_7',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], + ['fore_5f16m_8',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], + ['fore_5f256_9',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]], + ['format_10',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], + ['format_5fcomment_11',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], + ['formating_20tools_12',['Formating tools',['../group___formating.html',1,'']]], + ['func_13',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], + ['funchash_5fstyles_14',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] ]; diff --git a/docs/search/all_6.html b/docs/search/all_6.html index 43f14ea..d3026a7 100644 --- a/docs/search/all_6.html +++ b/docs/search/all_6.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_6.js b/docs/search/all_6.js index 7734da7..51dd231 100644 --- a/docs/search/all_6.js +++ b/docs/search/all_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['ground_73',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] + ['ground_0',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/search/all_7.html b/docs/search/all_7.html index af52f82..b2ee042 100644 --- a/docs/search/all_7.html +++ b/docs/search/all_7.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_7.js b/docs/search/all_7.js index 68cafeb..8c144e7 100644 --- a/docs/search/all_7.js +++ b/docs/search/all_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['high_2dlevel_20api_20macros_74',['High-level API macros',['../group___use_macros.html',1,'']]] + ['high_2dlevel_20api_20macros_0',['High-level API macros',['../group___use_macros.html',1,'']]] ]; diff --git a/docs/search/all_8.html b/docs/search/all_8.html index cf2b5df..40a0b3f 100644 --- a/docs/search/all_8.html +++ b/docs/search/all_8.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_8.js b/docs/search/all_8.js index 1de2bbd..f672c72 100644 --- a/docs/search/all_8.js +++ b/docs/search/all_8.js @@ -1,6 +1,6 @@ var searchData= [ - ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_75',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]], - ['index_76',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]], - ['is_5fset_77',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] + ['index_0',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]], + ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_1',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]], + ['is_5fset_2',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] ]; diff --git a/docs/search/all_9.html b/docs/search/all_9.html index 690785a..7c49144 100644 --- a/docs/search/all_9.html +++ b/docs/search/all_9.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_9.js b/docs/search/all_9.js index dfc3e8a..1b3652c 100644 --- a/docs/search/all_9.js +++ b/docs/search/all_9.js @@ -1,11 +1,11 @@ var searchData= [ - ['level_78',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]], - ['level_5fof_79',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], - ['levels_80',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], - ['line_81',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], - ['locate_82',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], - ['location_83',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], - ['log_84',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], - ['logger_85',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] + ['level_0',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]], + ['level_5fof_1',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], + ['levels_2',['levels',['../classclutchlog.html#a8d206443dea964f77965450a83693d98',1,'clutchlog']]], + ['line_3',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], + ['locate_4',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], + ['location_5',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], + ['log_6',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], + ['logger_7',['logger',['../classclutchlog.html#a6e2a5e98fa9f722d90ba6515895543ac',1,'clutchlog']]] ]; diff --git a/docs/search/all_a.html b/docs/search/all_a.html index f2f3d3a..fc9d79c 100644 --- a/docs/search/all_a.html +++ b/docs/search/all_a.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_a.js b/docs/search/all_a.js index 2972a6d..a8acf08 100644 --- a/docs/search/all_a.js +++ b/docs/search/all_a.js @@ -1,6 +1,6 @@ var searchData= [ - ['main_20class_86',['Main class',['../group___main.html',1,'']]], - ['matches_87',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], - ['mode_88',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] + ['main_20class_0',['Main class',['../group___main.html',1,'']]], + ['matches_1',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], + ['mode_2',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/all_b.html b/docs/search/all_b.html index 14f3403..dafb1fa 100644 --- a/docs/search/all_b.html +++ b/docs/search/all_b.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_b.js b/docs/search/all_b.js index d173001..d88c1e7 100644 --- a/docs/search/all_b.js +++ b/docs/search/all_b.js @@ -1,6 +1,6 @@ var searchData= [ - ['operator_28_29_89',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], - ['operator_3c_3c_90',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]], - ['out_91',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] + ['operator_28_29_0',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], + ['operator_3c_3c_1',['operator<<',['../group__colors16.html#gac00a2f504f5308207f7a94915fe9a9c5',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga93d498671d8dc2e796978c4f4de51241',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a4860c13958d21118a564920fa78e6720',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a24568f7a157d50e3075a74a619719c84',1,'clutchlog::fmt::operator<<()']]], + ['out_2',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#ab7773f031a00a05b8c83c1936406cb98',1,'clutchlog::out()']]] ]; diff --git a/docs/search/all_c.html b/docs/search/all_c.html index da60ab8..9df619d 100644 --- a/docs/search/all_c.html +++ b/docs/search/all_c.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_c.js b/docs/search/all_c.js index b7a232d..3b88170 100644 --- a/docs/search/all_c.js +++ b/docs/search/all_c.js @@ -1,4 +1,4 @@ var searchData= [ - ['print_5fon_92',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] + ['print_5fon_0',['print_on',['../structclutchlog_1_1fmt_1_1color.html#a121619a01bf48e53b3478d23989c0c59',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad4e941accf566378e0007ec881096fb0',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#ac6a4b8650ea7e9171fc76d6226015005',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#ad754c64eb6fd8730a616d113cb9f9129',1,'clutchlog::fmt::print_on()']]] ]; diff --git a/docs/search/all_d.html b/docs/search/all_d.html index bc376fe..95d8eec 100644 --- a/docs/search/all_d.html +++ b/docs/search/all_d.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_d.js b/docs/search/all_d.js index 16fdbcb..0a100cc 100644 --- a/docs/search/all_d.js +++ b/docs/search/all_d.js @@ -1,5 +1,5 @@ var searchData= [ - ['red_93',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]], - ['replace_94',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] + ['red_0',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]], + ['replace_1',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] ]; diff --git a/docs/search/all_e.html b/docs/search/all_e.html index 2e3c74d..a54e120 100644 --- a/docs/search/all_e.html +++ b/docs/search/all_e.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_e.js b/docs/search/all_e.js index e1f8b5a..e48732c 100644 --- a/docs/search/all_e.js +++ b/docs/search/all_e.js @@ -1,7 +1,7 @@ var searchData= [ - ['scope_5ft_95',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog::scope_t'],['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t::scope_t()']]], - ['stage_96',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], - ['str_97',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], - ['style_98',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt::style()'],['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] + ['scope_5ft_0',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog::scope_t'],['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t::scope_t()']]], + ['stage_1',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], + ['str_2',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], + ['style_3',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt::style()'],['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] ]; diff --git a/docs/search/all_f.html b/docs/search/all_f.html index 246f8ab..8d0aed3 100644 --- a/docs/search/all_f.html +++ b/docs/search/all_f.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/all_f.js b/docs/search/all_f.js index ab2b559..8415699 100644 --- a/docs/search/all_f.js +++ b/docs/search/all_f.js @@ -1,7 +1,7 @@ var searchData= [ - ['there_99',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], - ['threshold_100',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]], - ['type_101',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]], - ['typo_102',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] + ['there_0',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], + ['threshold_1',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]], + ['type_2',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]], + ['typo_3',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_0.html b/docs/search/classes_0.html index f7e4c14..9d4f871 100644 --- a/docs/search/classes_0.html +++ b/docs/search/classes_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/classes_0.js b/docs/search/classes_0.js index fdb2334..97e4769 100644 --- a/docs/search/classes_0.js +++ b/docs/search/classes_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['bg_5f16m_104',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt']]], - ['bg_5f256_105',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt']]] + ['bg_5f16m_0',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html',1,'clutchlog::fmt']]], + ['bg_5f256_1',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_1.html b/docs/search/classes_1.html index c7ff4b3..0557f9f 100644 --- a/docs/search/classes_1.html +++ b/docs/search/classes_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/classes_1.js b/docs/search/classes_1.js index 3894de8..7dda7a6 100644 --- a/docs/search/classes_1.js +++ b/docs/search/classes_1.js @@ -1,7 +1,7 @@ var searchData= [ - ['clutchlog_106',['clutchlog',['../classclutchlog.html',1,'']]], - ['color_107',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt']]], - ['color_5f16m_108',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt']]], - ['color_5f256_109',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt']]] + ['clutchlog_0',['clutchlog',['../classclutchlog.html',1,'']]], + ['color_1',['color',['../structclutchlog_1_1fmt_1_1color.html',1,'clutchlog::fmt']]], + ['color_5f16m_2',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html',1,'clutchlog::fmt']]], + ['color_5f256_3',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/classes_2.html b/docs/search/classes_2.html index 0d1e8a0..fa20861 100644 --- a/docs/search/classes_2.html +++ b/docs/search/classes_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/classes_2.js b/docs/search/classes_2.js index b6d5ae6..b04c1fa 100644 --- a/docs/search/classes_2.js +++ b/docs/search/classes_2.js @@ -1,6 +1,6 @@ var searchData= [ - ['fg_5f16m_110',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt']]], - ['fg_5f256_111',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt']]], - ['fmt_112',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog']]] + ['fg_5f16m_0',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html',1,'clutchlog::fmt']]], + ['fg_5f256_1',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html',1,'clutchlog::fmt']]], + ['fmt_2',['fmt',['../classclutchlog_1_1fmt.html',1,'clutchlog']]] ]; diff --git a/docs/search/classes_3.html b/docs/search/classes_3.html index 2102545..98fbc87 100644 --- a/docs/search/classes_3.html +++ b/docs/search/classes_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/classes_3.js b/docs/search/classes_3.js index 94d55bd..13d8ac2 100644 --- a/docs/search/classes_3.js +++ b/docs/search/classes_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['scope_5ft_113',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog']]] + ['scope_5ft_0',['scope_t',['../structclutchlog_1_1scope__t.html',1,'clutchlog']]] ]; diff --git a/docs/search/close.svg b/docs/search/close.svg new file mode 100644 index 0000000..a933eea --- /dev/null +++ b/docs/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/docs/search/defines_0.html b/docs/search/defines_0.html index 2deb369..d0cf633 100644 --- a/docs/search/defines_0.html +++ b/docs/search/defines_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/defines_0.js b/docs/search/defines_0.js index 0e94cd9..5b63def 100644 --- a/docs/search/defines_0.js +++ b/docs/search/defines_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['clutchlog_5fh_196',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysinfo_197',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], - ['clutchlog_5fhave_5funix_5fsysioctl_198',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]] + ['clutchlog_5fh_0',['CLUTCHLOG_H',['../clutchlog_8h.html#a0acf7d306292cdee864356f0b433cc16',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysinfo_1',['CLUTCHLOG_HAVE_UNIX_SYSINFO',['../clutchlog_8h.html#a6bbcf13504687db4dbe0474931d867fb',1,'clutchlog.h']]], + ['clutchlog_5fhave_5funix_5fsysioctl_2',['CLUTCHLOG_HAVE_UNIX_SYSIOCTL',['../clutchlog_8h.html#a6bddd1e1be320823da0d6b1d5cef7817',1,'clutchlog.h']]] ]; diff --git a/docs/search/defines_1.html b/docs/search/defines_1.html index e0d0b6d..4369011 100644 --- a/docs/search/defines_1.html +++ b/docs/search/defines_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/defines_1.js b/docs/search/defines_1.js index 0f8fb71..7298532 100644 --- a/docs/search/defines_1.js +++ b/docs/search/defines_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['with_5fclutchlog_199',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] + ['with_5fclutchlog_0',['WITH_CLUTCHLOG',['../clutchlog_8h.html#a5c126962abcc7a40e504a6fc3abdfcc4',1,'clutchlog.h']]] ]; diff --git a/docs/search/enums_0.html b/docs/search/enums_0.html index 9669700..ec25efd 100644 --- a/docs/search/enums_0.html +++ b/docs/search/enums_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/enums_0.js b/docs/search/enums_0.js index de05d1c..ab5d8c9 100644 --- a/docs/search/enums_0.js +++ b/docs/search/enums_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['ansi_185',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] + ['ansi_0',['ansi',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enums_1.html b/docs/search/enums_1.html index dfec174..cc99a33 100644 --- a/docs/search/enums_1.html +++ b/docs/search/enums_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/enums_1.js b/docs/search/enums_1.js index 38744d8..8e18bad 100644 --- a/docs/search/enums_1.js +++ b/docs/search/enums_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['bg_186',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]] + ['bg_0',['bg',['../group__colors16.html#ga1cf3e27e4041250ffea0a6d58010da1e',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enums_2.html b/docs/search/enums_2.html index db70c36..cd5e771 100644 --- a/docs/search/enums_2.html +++ b/docs/search/enums_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/enums_2.js b/docs/search/enums_2.js index c374900..0db86de 100644 --- a/docs/search/enums_2.js +++ b/docs/search/enums_2.js @@ -1,5 +1,5 @@ var searchData= [ - ['fg_187',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], - ['filename_188',['filename',['../classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e',1,'clutchlog']]] + ['fg_0',['fg',['../group__colors16.html#ga4662a3ec3577c6a575a2c734636ed8a0',1,'clutchlog::fmt']]], + ['filename_1',['filename',['../classclutchlog.html#a822062ffa857bd16ff488f9c749ff20e',1,'clutchlog']]] ]; diff --git a/docs/search/enums_3.html b/docs/search/enums_3.html index fb7ec17..007101d 100644 --- a/docs/search/enums_3.html +++ b/docs/search/enums_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/enums_3.js b/docs/search/enums_3.js index 4e146eb..51dd231 100644 --- a/docs/search/enums_3.js +++ b/docs/search/enums_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['ground_189',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] + ['ground_0',['ground',['../structclutchlog_1_1fmt_1_1color.html#ad4d10c015b3af3cc10d1cf40fe38e4f0',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/search/enums_4.html b/docs/search/enums_4.html index b8b51ef..b03e8b8 100644 --- a/docs/search/enums_4.html +++ b/docs/search/enums_4.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/enums_4.js b/docs/search/enums_4.js index c3daf46..1b85abd 100644 --- a/docs/search/enums_4.js +++ b/docs/search/enums_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['level_190',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]] + ['level_0',['level',['../classclutchlog.html#a10fd25a1b51c8c95bd6d876ce1b4b928',1,'clutchlog']]] ]; diff --git a/docs/search/enums_5.html b/docs/search/enums_5.html index d39b033..9807152 100644 --- a/docs/search/enums_5.html +++ b/docs/search/enums_5.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/enums_5.js b/docs/search/enums_5.js index 24bc40b..ec88639 100644 --- a/docs/search/enums_5.js +++ b/docs/search/enums_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['typo_191',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] + ['typo_0',['typo',['../classclutchlog_1_1fmt.html#a932f47b78fb7b10590d5613a1c4eab89',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/enumvalues_0.html b/docs/search/enumvalues_0.html index 9286248..71e9b7c 100644 --- a/docs/search/enumvalues_0.html +++ b/docs/search/enumvalues_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/enumvalues_0.js b/docs/search/enumvalues_0.js index a9f6d14..9b5419e 100644 --- a/docs/search/enumvalues_0.js +++ b/docs/search/enumvalues_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['colors_5f16_192',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], - ['colors_5f16m_193',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], - ['colors_5f256_194',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]] + ['colors_5f16_0',['colors_16',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1e7cced329549fc4c2393381f068062e',1,'clutchlog::fmt']]], + ['colors_5f16m_1',['colors_16M',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a1844e5aae3a3eefc500c545e3c35bcfa',1,'clutchlog::fmt']]], + ['colors_5f256_2',['colors_256',['../classclutchlog_1_1fmt.html#a4d0b3c87ba935addf3581b000c0d7502a7a3c32a8827eb17435511b4c7a429749',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/files_0.html b/docs/search/files_0.html index 737608e..2dbb4c2 100644 --- a/docs/search/files_0.html +++ b/docs/search/files_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/files_0.js b/docs/search/files_0.js index 712b4cc..8f6ceae 100644 --- a/docs/search/files_0.js +++ b/docs/search/files_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['clutchlog_2eh_114',['clutchlog.h',['../clutchlog_8h.html',1,'']]] + ['clutchlog_2eh_0',['clutchlog.h',['../clutchlog_8h.html',1,'']]] ]; diff --git a/docs/search/functions_0.html b/docs/search/functions_0.html index e17c711..3b739c7 100644 --- a/docs/search/functions_0.html +++ b/docs/search/functions_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_0.js b/docs/search/functions_0.js index 609cc2c..f14939e 100644 --- a/docs/search/functions_0.js +++ b/docs/search/functions_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['bg_5f16m_115',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], - ['bg_5f256_116',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] + ['bg_5f16m_0',['bg_16M',['../structclutchlog_1_1fmt_1_1bg__16_m.html#a363c314ab6a8aa22951b5500d7a78ad0',1,'clutchlog::fmt::bg_16M::bg_16M()'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#ace018922ae99f32b48bf5cacaec91501',1,'clutchlog::fmt::bg_16M::bg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#adcd5bd1e69e76e3b36015cf687693c97',1,'clutchlog::fmt::bg_16M::bg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1bg__16_m.html#a68f8cb4ab78a1cfb3b7b8e1e95bee11d',1,'clutchlog::fmt::bg_16M::bg_16M(const bg &)']]], + ['bg_5f256_1',['bg_256',['../structclutchlog_1_1fmt_1_1bg__256.html#a0d244a542b6b98a373f8b1f9e92a6a90',1,'clutchlog::fmt::bg_256::bg_256()'],['../structclutchlog_1_1fmt_1_1bg__256.html#a83c663b1a9f00ba7ba7649c9c5605fad',1,'clutchlog::fmt::bg_256::bg_256(const short b)'],['../structclutchlog_1_1fmt_1_1bg__256.html#a096d302be7373acaaf225644683408bd',1,'clutchlog::fmt::bg_256::bg_256(const bg &)']]] ]; diff --git a/docs/search/functions_1.html b/docs/search/functions_1.html index 0ddac0a..2cef5e3 100644 --- a/docs/search/functions_1.html +++ b/docs/search/functions_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_1.js b/docs/search/functions_1.js index f05ad1f..75f22f6 100644 --- a/docs/search/functions_1.js +++ b/docs/search/functions_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['color_117',['color',['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color']]], - ['color_5f16m_118',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], - ['color_5f256_119',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]] + ['color_0',['color',['../structclutchlog_1_1fmt_1_1color.html#a741d0165287350d8fcacb1f472ce5dac',1,'clutchlog::fmt::color']]], + ['color_5f16m_1',['color_16M',['../structclutchlog_1_1fmt_1_1color__16_m.html#aea10e881fb9b570267f5751fb67c4282',1,'clutchlog::fmt::color_16M::color_16M(ground t)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a36d9cf42044fec34b7858142d86137d3',1,'clutchlog::fmt::color_16M::color_16M(ground t, short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a55e39e7eb3ced3095c00914eff52470c',1,'clutchlog::fmt::color_16M::color_16M(ground t, const std::string &srgb)']]], + ['color_5f256_2',['color_256',['../structclutchlog_1_1fmt_1_1color__256.html#a12fdff3c5c4edbf952aaa31519f0171c',1,'clutchlog::fmt::color_256::color_256(ground t)'],['../structclutchlog_1_1fmt_1_1color__256.html#a1b68065b35141c018b33c3f2c45f5726',1,'clutchlog::fmt::color_256::color_256(ground t, const short i)']]] ]; diff --git a/docs/search/functions_2.html b/docs/search/functions_2.html index 2737c5a..3308c65 100644 --- a/docs/search/functions_2.html +++ b/docs/search/functions_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_2.js b/docs/search/functions_2.js index 10882d3..367ad58 100644 --- a/docs/search/functions_2.js +++ b/docs/search/functions_2.js @@ -1,5 +1,5 @@ var searchData= [ - ['depth_5fstyles_120',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], - ['dump_121',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]] + ['depth_5fstyles_0',['depth_styles',['../classclutchlog.html#a08310b92e86687349e70f56f9ac1d656',1,'clutchlog']]], + ['dump_1',['dump',['../classclutchlog.html#ab72a0adc9ff287270afe09c9da825fdb',1,'clutchlog']]] ]; diff --git a/docs/search/functions_3.html b/docs/search/functions_3.html index 6da86e7..43ac697 100644 --- a/docs/search/functions_3.html +++ b/docs/search/functions_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_3.js b/docs/search/functions_3.js index 9a3c384..895c337 100644 --- a/docs/search/functions_3.js +++ b/docs/search/functions_3.js @@ -1,13 +1,13 @@ var searchData= [ - ['fg_5f16m_122',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)']]], - ['fg_5f256_123',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], - ['file_124',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], - ['filehash_5fstyles_125',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], - ['filename_126',['filename',['../classclutchlog.html#a82b9375728af2d962831a743d95f4ae7',1,'clutchlog']]], - ['fmt_127',['fmt',['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt']]], - ['format_128',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], - ['format_5fcomment_129',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], - ['func_130',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], - ['funchash_5fstyles_131',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] + ['fg_5f16m_0',['fg_16M',['../structclutchlog_1_1fmt_1_1fg__16_m.html#a531b717b8d78a0a5929fa90d0a01d7e5',1,'clutchlog::fmt::fg_16M::fg_16M(short r, short g, short b)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#abc768d6b7c2139c14f210755108006d3',1,'clutchlog::fmt::fg_16M::fg_16M(const std::string &srgb)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a9da40a4a7ff3b80f028f26322f59eba8',1,'clutchlog::fmt::fg_16M::fg_16M(const fg &)'],['../structclutchlog_1_1fmt_1_1fg__16_m.html#a984525f33eb86b7f8b3e5d0874611194',1,'clutchlog::fmt::fg_16M::fg_16M()']]], + ['fg_5f256_1',['fg_256',['../structclutchlog_1_1fmt_1_1fg__256.html#a97c241e9f80c63d269953cc525a72c7a',1,'clutchlog::fmt::fg_256::fg_256()'],['../structclutchlog_1_1fmt_1_1fg__256.html#a6df3d848db0e55c79709fb4565cbfd59',1,'clutchlog::fmt::fg_256::fg_256(const short f)'],['../structclutchlog_1_1fmt_1_1fg__256.html#a501fff36520f20ba4973ba3848fb9c23',1,'clutchlog::fmt::fg_256::fg_256(const fg &)']]], + ['file_2',['file',['../classclutchlog.html#a10064493c22f5c03b502a42d814c5c5c',1,'clutchlog']]], + ['filehash_5fstyles_3',['filehash_styles',['../classclutchlog.html#ae17db5808155fbc6dc48b4727d0c3abf',1,'clutchlog']]], + ['filename_4',['filename',['../classclutchlog.html#a82b9375728af2d962831a743d95f4ae7',1,'clutchlog']]], + ['fmt_5',['fmt',['../classclutchlog_1_1fmt.html#a407506bc02ed3f91d88b3df630e54959',1,'clutchlog::fmt']]], + ['format_6',['format',['../classclutchlog.html#a656c277e074b64728cca871f2b484d1c',1,'clutchlog::format(const std::string &format)'],['../classclutchlog.html#afc53dbca51d0e2322a21899d0c571a80',1,'clutchlog::format() const'],['../classclutchlog.html#abd692cca9a2e772e7c9d6531bb3c7761',1,'clutchlog::format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const']]], + ['format_5fcomment_7',['format_comment',['../classclutchlog.html#a2144abe4ec6f630126b6490908b5f924',1,'clutchlog::format_comment(const std::string &format)'],['../classclutchlog.html#aa8d0a569ed3623ce36c5e567ec2d1ad5',1,'clutchlog::format_comment() const']]], + ['func_8',['func',['../classclutchlog.html#ad32b5a0274dc03ee0004f67ba58b2447',1,'clutchlog']]], + ['funchash_5fstyles_9',['funchash_styles',['../classclutchlog.html#acbb50f6306ebb3c8b0d1a52e7f327416',1,'clutchlog']]] ]; diff --git a/docs/search/functions_4.html b/docs/search/functions_4.html index 911304e..d12c2df 100644 --- a/docs/search/functions_4.html +++ b/docs/search/functions_4.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_4.js b/docs/search/functions_4.js index 94d08f7..0a6fb8a 100644 --- a/docs/search/functions_4.js +++ b/docs/search/functions_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['is_5fset_132',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] + ['is_5fset_0',['is_set',['../structclutchlog_1_1fmt_1_1color.html#a96d7161ef1e7cc631ae670cd3f364603',1,'clutchlog::fmt::color::is_set()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad79557682cec1c053dda258581972111',1,'clutchlog::fmt::color_256::is_set()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a780c11e42bb140732ffd37cf4eef9e1d',1,'clutchlog::fmt::color_16M::is_set()']]] ]; diff --git a/docs/search/functions_5.html b/docs/search/functions_5.html index 61b920d..7266236 100644 --- a/docs/search/functions_5.html +++ b/docs/search/functions_5.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_5.js b/docs/search/functions_5.js index 363dae5..f44f18a 100644 --- a/docs/search/functions_5.js +++ b/docs/search/functions_5.js @@ -1,10 +1,10 @@ var searchData= [ - ['level_5fof_133',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], - ['levels_134',['levels',['../classclutchlog.html#aff3aa09fb60f7d6dc688c028d3834d8a',1,'clutchlog']]], - ['line_135',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], - ['locate_136',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], - ['location_137',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], - ['log_138',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], - ['logger_139',['logger',['../classclutchlog.html#acfaceb77da01503b432644a3efaee4fa',1,'clutchlog']]] + ['level_5fof_0',['level_of',['../classclutchlog.html#acebed8c9df9204f22bf8488e62e1cedd',1,'clutchlog']]], + ['levels_1',['levels',['../classclutchlog.html#a8d206443dea964f77965450a83693d98',1,'clutchlog']]], + ['line_2',['line',['../classclutchlog.html#aa26c6b81ebaeb9e9daa3457e3a3d17c9',1,'clutchlog']]], + ['locate_3',['locate',['../classclutchlog.html#a4ebdfcded6c56262676bf6926d63fc96',1,'clutchlog']]], + ['location_4',['location',['../classclutchlog.html#a6666106b9e5c239b6ae5e0d1091648e3',1,'clutchlog']]], + ['log_5',['log',['../classclutchlog.html#a14c19e17c54d6353ba34c0dc3371094a',1,'clutchlog']]], + ['logger_6',['logger',['../classclutchlog.html#a6e2a5e98fa9f722d90ba6515895543ac',1,'clutchlog']]] ]; diff --git a/docs/search/functions_6.html b/docs/search/functions_6.html index dc70a4a..7f9fc45 100644 --- a/docs/search/functions_6.html +++ b/docs/search/functions_6.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_6.js b/docs/search/functions_6.js index 08fcb6f..75f87dd 100644 --- a/docs/search/functions_6.js +++ b/docs/search/functions_6.js @@ -1,5 +1,5 @@ var searchData= [ - ['operator_28_29_140',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], - ['out_141',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#a6c6ab42a1df147e6c2d115bc36ec8266',1,'clutchlog::out()']]] + ['operator_28_29_0',['operator()',['../classclutchlog_1_1fmt.html#afeaedd18298498d1dcfcc15f5f17ac3c',1,'clutchlog::fmt']]], + ['out_1',['out',['../classclutchlog.html#a7fd7c7bd3668c537061c314a619a336d',1,'clutchlog::out(std::ostream &out)'],['../classclutchlog.html#ab7773f031a00a05b8c83c1936406cb98',1,'clutchlog::out()']]] ]; diff --git a/docs/search/functions_7.html b/docs/search/functions_7.html index 7de3106..ad0f88b 100644 --- a/docs/search/functions_7.html +++ b/docs/search/functions_7.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_7.js b/docs/search/functions_7.js index 93b995b..3b88170 100644 --- a/docs/search/functions_7.js +++ b/docs/search/functions_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['print_5fon_142',['print_on',['../structclutchlog_1_1fmt_1_1color.html#aa75e958436afe333924b6db3e5f0821f',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#aaae6106a11eddade981172324a43df68',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#a674910195e7bb14d78f0cf56c308a47e',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#a0b607e343b6813b99eafca1fdfec9cd0',1,'clutchlog::fmt::print_on()']]] + ['print_5fon_0',['print_on',['../structclutchlog_1_1fmt_1_1color.html#a121619a01bf48e53b3478d23989c0c59',1,'clutchlog::fmt::color::print_on()'],['../structclutchlog_1_1fmt_1_1color__256.html#ad4e941accf566378e0007ec881096fb0',1,'clutchlog::fmt::color_256::print_on()'],['../structclutchlog_1_1fmt_1_1color__16_m.html#ac6a4b8650ea7e9171fc76d6226015005',1,'clutchlog::fmt::color_16M::print_on()'],['../classclutchlog_1_1fmt.html#ad754c64eb6fd8730a616d113cb9f9129',1,'clutchlog::fmt::print_on()']]] ]; diff --git a/docs/search/functions_8.html b/docs/search/functions_8.html index 7422be2..ea7fa74 100644 --- a/docs/search/functions_8.html +++ b/docs/search/functions_8.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_8.js b/docs/search/functions_8.js index bf04779..4ba282a 100644 --- a/docs/search/functions_8.js +++ b/docs/search/functions_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['replace_143',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] + ['replace_0',['replace',['../classclutchlog.html#a972f895c70edc335f3018a2c8971d59e',1,'clutchlog::replace(const std::string &form, const std::string &mark, const std::string &tag) const'],['../classclutchlog.html#ae90d5a1a428587ad67b38b2ea4ca9fa2',1,'clutchlog::replace(const std::string &form, const std::string &mark, const size_t tag) const']]] ]; diff --git a/docs/search/functions_9.html b/docs/search/functions_9.html index befd4fa..d831dc7 100644 --- a/docs/search/functions_9.html +++ b/docs/search/functions_9.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_9.js b/docs/search/functions_9.js index 2fa02c1..056f647 100644 --- a/docs/search/functions_9.js +++ b/docs/search/functions_9.js @@ -1,6 +1,6 @@ var searchData= [ - ['scope_5ft_144',['scope_t',['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t']]], - ['str_145',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], - ['style_146',['style',['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] + ['scope_5ft_0',['scope_t',['../structclutchlog_1_1scope__t.html#a0f1d865ffcf17f215e5559cdd2690572',1,'clutchlog::scope_t']]], + ['str_1',['str',['../classclutchlog_1_1fmt.html#ab588e04e982b0b26ec979773d51ad41b',1,'clutchlog::fmt']]], + ['style_2',['style',['../classclutchlog.html#ac3ec55057b9c734b66f169bf43dbd591',1,'clutchlog::style(level stage, FMT... styles)'],['../classclutchlog.html#ad1cfa9945c3f7f98fe8ce724c627d0d6',1,'clutchlog::style(level stage, fmt style)'],['../classclutchlog.html#a4831f44fd5ade102e57320632095934d',1,'clutchlog::style(level stage) const']]] ]; diff --git a/docs/search/functions_a.html b/docs/search/functions_a.html index a81e963..7018fc6 100644 --- a/docs/search/functions_a.html +++ b/docs/search/functions_a.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/functions_a.js b/docs/search/functions_a.js index 76e1c6c..5d57150 100644 --- a/docs/search/functions_a.js +++ b/docs/search/functions_a.js @@ -1,4 +1,4 @@ var searchData= [ - ['threshold_147',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]] + ['threshold_0',['threshold',['../classclutchlog.html#a3cb0e4f43a4cadf1966001ad7c9861f4',1,'clutchlog::threshold(level l)'],['../classclutchlog.html#a7a7738eaad114bfa870121412fe23ad9',1,'clutchlog::threshold(const std::string &l)'],['../classclutchlog.html#ab45287cc9c14217904a13aff49573732',1,'clutchlog::threshold() const']]] ]; diff --git a/docs/search/groups_0.html b/docs/search/groups_0.html index a2d9335..76e992a 100644 --- a/docs/search/groups_0.html +++ b/docs/search/groups_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/groups_0.js b/docs/search/groups_0.js index 14df792..2b60b56 100644 --- a/docs/search/groups_0.js +++ b/docs/search/groups_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_200',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]] + ['colors_20management_20in_2016_20colors_20mode_20_284_2dbits_20ansi_29_2e_0',['Colors management in 16 colors mode (4-bits ANSI).',['../group__colors16.html',1,'']]] ]; diff --git a/docs/search/groups_1.html b/docs/search/groups_1.html index aa06d65..38ad74b 100644 --- a/docs/search/groups_1.html +++ b/docs/search/groups_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/groups_1.js b/docs/search/groups_1.js index 18748e5..3f14de6 100644 --- a/docs/search/groups_1.js +++ b/docs/search/groups_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['default_20configuration_20management_201',['Default configuration management',['../group___default_config.html',1,'']]] + ['default_20configuration_20management_0',['Default configuration management',['../group___default_config.html',1,'']]] ]; diff --git a/docs/search/groups_2.html b/docs/search/groups_2.html index a205d30..8152426 100644 --- a/docs/search/groups_2.html +++ b/docs/search/groups_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/groups_2.js b/docs/search/groups_2.js index af09b20..ace62b7 100644 --- a/docs/search/groups_2.js +++ b/docs/search/groups_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['formating_20tools_202',['Formating tools',['../group___formating.html',1,'']]] + ['formating_20tools_0',['Formating tools',['../group___formating.html',1,'']]] ]; diff --git a/docs/search/groups_3.html b/docs/search/groups_3.html index 4255bed..c73a37c 100644 --- a/docs/search/groups_3.html +++ b/docs/search/groups_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/groups_3.js b/docs/search/groups_3.js index 0ffa1f2..8c144e7 100644 --- a/docs/search/groups_3.js +++ b/docs/search/groups_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['high_2dlevel_20api_20macros_203',['High-level API macros',['../group___use_macros.html',1,'']]] + ['high_2dlevel_20api_20macros_0',['High-level API macros',['../group___use_macros.html',1,'']]] ]; diff --git a/docs/search/groups_4.html b/docs/search/groups_4.html index 8644fbe..d42aefb 100644 --- a/docs/search/groups_4.html +++ b/docs/search/groups_4.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/groups_4.js b/docs/search/groups_4.js index d53afb4..785e536 100644 --- a/docs/search/groups_4.js +++ b/docs/search/groups_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_204',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]] + ['internal_20colors_20management_20in_20256_20and_2016m_20colors_20modes_2e_0',['Internal colors management in 256 and 16M colors modes.',['../group__colors256__16_m.html',1,'']]] ]; diff --git a/docs/search/groups_5.html b/docs/search/groups_5.html index 1e9ba85..cf1d61a 100644 --- a/docs/search/groups_5.html +++ b/docs/search/groups_5.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/groups_5.js b/docs/search/groups_5.js index ed6c036..050e0d2 100644 --- a/docs/search/groups_5.js +++ b/docs/search/groups_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['main_20class_205',['Main class',['../group___main.html',1,'']]] + ['main_20class_0',['Main class',['../group___main.html',1,'']]] ]; diff --git a/docs/search/mag_sel.svg b/docs/search/mag_sel.svg new file mode 100644 index 0000000..03626f6 --- /dev/null +++ b/docs/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/search/nomatches.html b/docs/search/nomatches.html index 4377320..2b9360b 100644 --- a/docs/search/nomatches.html +++ b/docs/search/nomatches.html @@ -1,5 +1,6 @@ - + + diff --git a/docs/search/pages_0.html b/docs/search/pages_0.html index 9a6a29a..1981712 100644 --- a/docs/search/pages_0.html +++ b/docs/search/pages_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/pages_0.js b/docs/search/pages_0.js index 1be2024..b139894 100644 --- a/docs/search/pages_0.js +++ b/docs/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_206',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] + ['clutchlog_20—_20versatile_20_28de_29clutchable_20spatial_20logging_0',['Clutchlog — versatile (de)clutchable spatial logging',['../index.html',1,'']]] ]; diff --git a/docs/search/related_0.html b/docs/search/related_0.html index bbe15fa..9ec0fae 100644 --- a/docs/search/related_0.html +++ b/docs/search/related_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/related_0.js b/docs/search/related_0.js index 1716d1d..9d76dc8 100644 --- a/docs/search/related_0.js +++ b/docs/search/related_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['operator_3c_3c_195',['operator<<',['../group__colors16.html#ga5a697f5ad3326ea25b139e25252b4cf7',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga379b0af834c7c561edc5c1e3a3427a33',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a826e3d3eba925608442439d6bc3a95a6',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a96849ba427feac3a2eeaa1165e3845da',1,'clutchlog::fmt::operator<<()']]] + ['operator_3c_3c_0',['operator<<',['../group__colors16.html#gac00a2f504f5308207f7a94915fe9a9c5',1,'clutchlog::fmt::operator<<()'],['../group__colors16.html#ga93d498671d8dc2e796978c4f4de51241',1,'clutchlog::fmt::operator<<()'],['../structclutchlog_1_1fmt_1_1color.html#a4860c13958d21118a564920fa78e6720',1,'clutchlog::fmt::color::operator<<()'],['../classclutchlog_1_1fmt.html#a24568f7a157d50e3075a74a619719c84',1,'clutchlog::fmt::operator<<()']]] ]; diff --git a/docs/search/search.css b/docs/search/search.css index 3cf9df9..648a792 100644 --- a/docs/search/search.css +++ b/docs/search/search.css @@ -1,98 +1,88 @@ /*---------------- Search Box */ -#FSearchBox { - float: left; -} - #MSearchBox { white-space : nowrap; - float: none; - margin-top: 8px; - right: 0px; - width: 170px; - height: 24px; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; z-index: 102; } -#MSearchBox .left -{ - display:block; - position:absolute; - left:10px; - width:20px; - height:19px; - background:url('search_l.png') no-repeat; - background-position:right; +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; } #MSearchSelect { - display:block; - position:absolute; - width:20px; - height:19px; -} - -.left #MSearchSelect { - left:4px; -} - -.right #MSearchSelect { - right:5px; + display: inline-block; + vertical-align: middle; + height: 19px; + padding: 0 0 0 0.3em; + margin: 0; } #MSearchField { - display:block; - position:absolute; - height:19px; - background:url('search_m.png') repeat-x; + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; border:none; - width:115px; - margin-left:20px; - padding-left:4px; color: #909090; outline: none; - font: 9pt Arial, Verdana, sans-serif; + font-family: Arial, Verdana, sans-serif; -webkit-border-radius: 0px; + border-radius: 0px; + background: none; } -#FSearchBox #MSearchField { - margin-left:15px; +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } } #MSearchBox .right { - display:block; - position:absolute; - right:10px; - top:8px; - width:20px; - height:19px; - background:url('search_r.png') no-repeat; - background-position:left; + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; } #MSearchClose { display: none; - position: absolute; - top: 4px; + font-size: inherit; background : none; border: none; - margin: 0px 4px 0px 0px; - padding: 0px 0px; + margin: 0; + padding: 0; outline: none; + } -.left #MSearchClose { - left: 6px; -} - -.right #MSearchClose { - right: 2px; +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; } .MSearchBoxActive #MSearchField { color: #000000; } +#main-menu > li:last-child { + /* This
      • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + /*---------------- Search filter selection */ #MSearchSelectWindow { @@ -154,7 +144,7 @@ a.SelectItem:hover { /*---------------- Search results window */ iframe#MSearchResults { - width: 60ex; + /*width: 60ex;*/ height: 15em; } @@ -220,19 +210,21 @@ a.SRScope:focus, a.SRScope:active { span.SRScope { padding-left: 4px; + font-family: Arial, Verdana, sans-serif; } .SRPage .SRStatus { padding: 2px 5px; font-size: 8pt; font-style: italic; + font-family: Arial, Verdana, sans-serif; } .SRResult { display: none; } -DIV.searchresults { +div.searchresults { margin-left: 10px; margin-right: 10px; } diff --git a/docs/search/search.js b/docs/search/search.js index a554ab9..607f4e1 100644 --- a/docs/search/search.js +++ b/docs/search/search.js @@ -1,25 +1,26 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. - Copyright (C) 1997-2017 by Dimitri van Heesch + The MIT License (MIT) - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + Copyright (C) 1997-2020 by Dimitri van Heesch - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. - @licend The above is the entire license notice - for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ function convertToId(search) { @@ -79,9 +80,10 @@ function getYPos(item) storing this instance. Is needed to be able to set timeouts. resultPath - path to use for external files */ -function SearchBox(name, resultsPath, inFrame, label) +function SearchBox(name, resultsPath, label, extension) { if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } // ---------- Instance variables this.name = name; @@ -94,8 +96,8 @@ function SearchBox(name, resultsPath, inFrame, label) this.hideTimeout = 0; this.searchIndex = 0; this.searchActive = false; - this.insideFrame = inFrame; this.searchLabel = label; + this.extension = extension; // ----------- DOM Elements @@ -133,30 +135,14 @@ function SearchBox(name, resultsPath, inFrame, label) var searchSelectWindow = this.DOMSearchSelectWindow(); var searchField = this.DOMSearchSelect(); - if (this.insideFrame) - { - var left = getXPos(searchField); - var top = getYPos(searchField); - left += searchField.offsetWidth + 6; - top += searchField.offsetHeight; + var left = getXPos(searchField); + var top = getYPos(searchField); + top += searchField.offsetHeight; - // show search selection popup - searchSelectWindow.style.display='block'; - left -= searchSelectWindow.offsetWidth; - searchSelectWindow.style.left = left + 'px'; - searchSelectWindow.style.top = top + 'px'; - } - else - { - var left = getXPos(searchField); - var top = getYPos(searchField); - top += searchField.offsetHeight; - - // show search selection popup - searchSelectWindow.style.display='block'; - searchSelectWindow.style.left = left + 'px'; - searchSelectWindow.style.top = top + 'px'; - } + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; // stop selection hide timer if (this.hideTimeout) @@ -200,10 +186,9 @@ function SearchBox(name, resultsPath, inFrame, label) } return; } - else if (window.frames.MSearchResults.searchResults) + else { - var elem = window.frames.MSearchResults.searchResults.NavNext(0); - if (elem) elem.focus(); + window.frames.MSearchResults.postMessage("take_focus", "*"); } } else if (e.keyCode==27) // Escape out of the search field @@ -347,13 +332,13 @@ function SearchBox(name, resultsPath, inFrame, label) if (idx!=-1) { var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; resultsPageWithSearch = resultsPage+'?'+escape(searchValue); hasResultsPage = true; } else // nothing available for this search term { - resultsPage = this.resultsPath + '/nomatches.html'; + resultsPage = this.resultsPath + '/nomatches' + this.extension; resultsPageWithSearch = resultsPage; hasResultsPage = false; } @@ -364,26 +349,19 @@ function SearchBox(name, resultsPath, inFrame, label) if (domPopupSearchResultsWindow.style.display!='block') { var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } + this.DOMSearchClose().style.display = 'inline-block'; + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var width = 400; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; } this.lastSearchValue = searchValue; @@ -439,12 +417,12 @@ function SearchResults(name) while (element && element!=parentElement) { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { return element; } - if (element.nodeName == 'DIV' && element.hasChildNodes()) + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { element = element.firstChild; } @@ -762,10 +740,15 @@ function createResults() if (searchData[e][1].length==2) // single result { srLink.setAttribute('href',searchData[e][1][1][0]); + srLink.setAttribute('onclick','parent.searchBox.CloseResultsWindow()'); if (searchData[e][1][1][1]) { srLink.setAttribute('target','_parent'); } + else + { + srLink.setAttribute('target','_blank'); + } var srScope = document.createElement('span'); setClassAttr(srScope,'SRScope'); srScope.innerHTML = searchData[e][1][1][2]; @@ -783,10 +766,15 @@ function createResults() setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')'); setClassAttr(srChild,'SRScope'); srChild.setAttribute('href',searchData[e][1][c+1][0]); + srChild.setAttribute('onclick','parent.searchBox.CloseResultsWindow()'); if (searchData[e][1][c+1][1]) { srChild.setAttribute('target','_parent'); } + else + { + srChild.setAttribute('target','_blank'); + } srChild.innerHTML = searchData[e][1][c+1][2]; srChildren.appendChild(srChild); } diff --git a/docs/search/variables_0.html b/docs/search/variables_0.html index bf3eba5..fd893a6 100644 --- a/docs/search/variables_0.html +++ b/docs/search/variables_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_0.js b/docs/search/variables_0.js index 1ece70e..4cb16ca 100644 --- a/docs/search/variables_0.js +++ b/docs/search/variables_0.js @@ -1,18 +1,18 @@ var searchData= [ - ['_5ffilehash_5ffmts_148',['_filehash_fmts',['../classclutchlog.html#a2a334e009533744b52f01ef240a59e9d',1,'clutchlog']]], - ['_5ffilename_149',['_filename',['../classclutchlog.html#a0431616914dbbecb908a794f5b46dada',1,'clutchlog']]], - ['_5fformat_5fdump_150',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], - ['_5fformat_5flog_151',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], - ['_5ffunchash_5ffmts_152',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], - ['_5fin_5ffile_153',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], - ['_5fin_5ffunc_154',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], - ['_5fin_5fline_155',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], - ['_5flevel_5ffmt_156',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], - ['_5flevel_5fshort_157',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], - ['_5flevel_5fword_158',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], - ['_5fout_159',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], - ['_5fstage_160',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], - ['_5fstrip_5fcalls_161',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], - ['_5fword_5flevel_162',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] + ['_5ffilehash_5ffmts_0',['_filehash_fmts',['../classclutchlog.html#a2a334e009533744b52f01ef240a59e9d',1,'clutchlog']]], + ['_5ffilename_1',['_filename',['../classclutchlog.html#a0431616914dbbecb908a794f5b46dada',1,'clutchlog']]], + ['_5fformat_5fdump_2',['_format_dump',['../classclutchlog.html#a5f4ddb57ce42e8be86a7c7d269f7bae5',1,'clutchlog']]], + ['_5fformat_5flog_3',['_format_log',['../classclutchlog.html#a7c6e3fc082bc6f55d50131ed2b32e81e',1,'clutchlog']]], + ['_5ffunchash_5ffmts_4',['_funchash_fmts',['../classclutchlog.html#a095e1545a2085ac623e4af19364fea7f',1,'clutchlog']]], + ['_5fin_5ffile_5',['_in_file',['../classclutchlog.html#aded03528f34d9000f618419c482c5042',1,'clutchlog']]], + ['_5fin_5ffunc_6',['_in_func',['../classclutchlog.html#a130c4f12eacbd2028102838fe16b734e',1,'clutchlog']]], + ['_5fin_5fline_7',['_in_line',['../classclutchlog.html#a41757198b29862832a14472a9e5e24c6',1,'clutchlog']]], + ['_5flevel_5ffmt_8',['_level_fmt',['../classclutchlog.html#ab805ac5c33885459f9f752518a4aa735',1,'clutchlog']]], + ['_5flevel_5fshort_9',['_level_short',['../classclutchlog.html#a08e8a817a75a4e9f0159231c941e0dae',1,'clutchlog']]], + ['_5flevel_5fword_10',['_level_word',['../classclutchlog.html#ab1c377a376e6772fe1746ff7147c125f',1,'clutchlog']]], + ['_5fout_11',['_out',['../classclutchlog.html#a1896f6c4b8597e3e76ff93970bd85167',1,'clutchlog']]], + ['_5fstage_12',['_stage',['../classclutchlog.html#aeb60684c89bcef5aa9273075c21cc993',1,'clutchlog']]], + ['_5fstrip_5fcalls_13',['_strip_calls',['../classclutchlog.html#a356df86455409193792b6ed550dfd09e',1,'clutchlog']]], + ['_5fword_5flevel_14',['_word_level',['../classclutchlog.html#abd4625bf211bfbaa30d9c126fa3d7888',1,'clutchlog']]] ]; diff --git a/docs/search/variables_1.html b/docs/search/variables_1.html index 49fe59a..5f8e440 100644 --- a/docs/search/variables_1.html +++ b/docs/search/variables_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_1.js b/docs/search/variables_1.js index 9c562a3..5979fe9 100644 --- a/docs/search/variables_1.js +++ b/docs/search/variables_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['back_163',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], - ['back_5f16m_164',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], - ['back_5f256_165',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]] + ['back_0',['back',['../group__colors16.html#ga86696b20e5b31c96ba592926efb324f3',1,'clutchlog::fmt']]], + ['back_5f16m_1',['back_16M',['../group__colors256__16_m.html#gaa2fcbb402dc2426d3720b8bc78a80ec0',1,'clutchlog::fmt']]], + ['back_5f256_2',['back_256',['../group__colors256__16_m.html#ga1d687af385957846034568c3a62d4ef0',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_2.html b/docs/search/variables_2.html index 0c8a18c..77a7f48 100644 --- a/docs/search/variables_2.html +++ b/docs/search/variables_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_2.js b/docs/search/variables_2.js index 51ce6d8..e3848a0 100644 --- a/docs/search/variables_2.js +++ b/docs/search/variables_2.js @@ -1,11 +1,11 @@ var searchData= [ - ['default_5fdepth_5fmark_166',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], - ['default_5fformat_167',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], - ['default_5fhfill_5fchar_168',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], - ['default_5fhfill_5fmax_169',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], - ['default_5fhfill_5fmin_170',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], - ['default_5fstrip_5fcalls_171',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], - ['dump_5fdefault_5fformat_172',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], - ['dump_5fdefault_5fsep_173',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] + ['default_5fdepth_5fmark_0',['default_depth_mark',['../classclutchlog.html#a229fd61519f1245282440120f2d45fb5',1,'clutchlog']]], + ['default_5fformat_1',['default_format',['../classclutchlog.html#a0c4ac57601e6f8d146fd5cc060968ecc',1,'clutchlog']]], + ['default_5fhfill_5fchar_2',['default_hfill_char',['../classclutchlog.html#a76eb34537b634aadb75e255f7887eeb6',1,'clutchlog']]], + ['default_5fhfill_5fmax_3',['default_hfill_max',['../classclutchlog.html#ac95630bfe9cf547d2b7c4b3430eaedc1',1,'clutchlog']]], + ['default_5fhfill_5fmin_4',['default_hfill_min',['../classclutchlog.html#a5a9a98c3528117223ceff22bc6bee5f7',1,'clutchlog']]], + ['default_5fstrip_5fcalls_5',['default_strip_calls',['../classclutchlog.html#a1a8cb6411726133208f5a2f2cb42d468',1,'clutchlog']]], + ['dump_5fdefault_5fformat_6',['dump_default_format',['../classclutchlog.html#ace879554298e6e6e36dafef330c27be8',1,'clutchlog']]], + ['dump_5fdefault_5fsep_7',['dump_default_sep',['../classclutchlog.html#af898bffe23b125245e338d7495c76d45',1,'clutchlog']]] ]; diff --git a/docs/search/variables_3.html b/docs/search/variables_3.html index 19a31fc..3ee62ba 100644 --- a/docs/search/variables_3.html +++ b/docs/search/variables_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_3.js b/docs/search/variables_3.js index b61972b..e57bf13 100644 --- a/docs/search/variables_3.js +++ b/docs/search/variables_3.js @@ -1,6 +1,6 @@ var searchData= [ - ['fore_174',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], - ['fore_5f16m_175',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], - ['fore_5f256_176',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]] + ['fore_0',['fore',['../group__colors16.html#ga8307a848fcf9ed929435b3e1f2b53401',1,'clutchlog::fmt']]], + ['fore_5f16m_1',['fore_16M',['../group__colors256__16_m.html#ga626c99eb11d1718d7a2a8bb3f079e6de',1,'clutchlog::fmt']]], + ['fore_5f256_2',['fore_256',['../group__colors256__16_m.html#gad98fbe84ef338ded8425d56955825a2c',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_4.html b/docs/search/variables_4.html index bdc37be..640713f 100644 --- a/docs/search/variables_4.html +++ b/docs/search/variables_4.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_4.js b/docs/search/variables_4.js index 0968584..b619a44 100644 --- a/docs/search/variables_4.js +++ b/docs/search/variables_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['index_177',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]] + ['index_0',['index',['../structclutchlog_1_1fmt_1_1color__256.html#a8e0b13d6bad87c83c3465524a5d33988',1,'clutchlog::fmt::color_256']]] ]; diff --git a/docs/search/variables_5.html b/docs/search/variables_5.html index 6aa2249..7b2ba97 100644 --- a/docs/search/variables_5.html +++ b/docs/search/variables_5.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_5.js b/docs/search/variables_5.js index d8a2af2..86c2ec6 100644 --- a/docs/search/variables_5.js +++ b/docs/search/variables_5.js @@ -1,5 +1,5 @@ var searchData= [ - ['matches_178',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], - ['mode_179',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] + ['matches_0',['matches',['../structclutchlog_1_1scope__t.html#ae6c0e4ed20db797124ed1e5faa033ad9',1,'clutchlog::scope_t']]], + ['mode_1',['mode',['../classclutchlog_1_1fmt.html#a0aa57cdd56ccc79c7750921ab534b205',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_6.html b/docs/search/variables_6.html index ce4a906..fb1de8f 100644 --- a/docs/search/variables_6.html +++ b/docs/search/variables_6.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_6.js b/docs/search/variables_6.js index 7fb85fc..b360764 100644 --- a/docs/search/variables_6.js +++ b/docs/search/variables_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['red_180',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]] + ['red_0',['red',['../structclutchlog_1_1fmt_1_1color__16_m.html#a19e1517a9afb75a4e6224f718ed11c61',1,'clutchlog::fmt::color_16M']]] ]; diff --git a/docs/search/variables_7.html b/docs/search/variables_7.html index 39ffd47..cf8dcf4 100644 --- a/docs/search/variables_7.html +++ b/docs/search/variables_7.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_7.js b/docs/search/variables_7.js index f18253a..cc655a1 100644 --- a/docs/search/variables_7.js +++ b/docs/search/variables_7.js @@ -1,5 +1,5 @@ var searchData= [ - ['stage_181',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], - ['style_182',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt']]] + ['stage_0',['stage',['../structclutchlog_1_1scope__t.html#adcca6846ff90d436c61861db85917744',1,'clutchlog::scope_t']]], + ['style_1',['style',['../classclutchlog_1_1fmt.html#a2bb0fde65fcd264393e102314dd1610b',1,'clutchlog::fmt']]] ]; diff --git a/docs/search/variables_8.html b/docs/search/variables_8.html index 37a2edd..88cbb01 100644 --- a/docs/search/variables_8.html +++ b/docs/search/variables_8.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
        Loading...
        - +
        Searching...
        No Matches
        - +
        diff --git a/docs/search/variables_8.js b/docs/search/variables_8.js index 2260ac2..fb13f9b 100644 --- a/docs/search/variables_8.js +++ b/docs/search/variables_8.js @@ -1,5 +1,5 @@ var searchData= [ - ['there_183',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], - ['type_184',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]] + ['there_0',['there',['../structclutchlog_1_1scope__t.html#a7918e55cd3bac1bd30c69b8c711387ff',1,'clutchlog::scope_t']]], + ['type_1',['type',['../structclutchlog_1_1fmt_1_1color.html#a3fd18c290567bd5c4971663a1aed12ae',1,'clutchlog::fmt::color']]] ]; diff --git a/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html index 7b185bf..baf92c8 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__16_m-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
        - + - @@ -36,21 +35,22 @@
        -
        clutchlog -  0.16 +
        +
        clutchlog 0.17
        - + +/* @license-end */ +
      • @@ -64,7 +64,7 @@ $(function() {
        @@ -84,37 +84,34 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__16_m.htm
    -
    -
    clutchlog::fmt::bg_16M Member List
    +
    clutchlog::fmt::bg_16M Member List

    This is the complete list of members for clutchlog::fmt::bg_16M, including all inherited members.

    - + - + - + - + - + - + - + - +
    bg_16M()clutchlog::fmt::bg_16Minline
    bg_16M(short r, short g, short b)clutchlog::fmt::bg_16Minline
    bg_16M(short r, short g, short b)clutchlog::fmt::bg_16Minline
    bg_16M(const std::string &srgb)clutchlog::fmt::bg_16Minline
    bg_16M(const bg &)clutchlog::fmt::bg_16Minline
    bg_16M(const bg &)clutchlog::fmt::bg_16Minline
    blue (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color_16M(ground t)clutchlog::fmt::color_16Minline
    color_16M(ground t, short r, short g, short b)clutchlog::fmt::color_16Minline
    color_16M(ground t, short r, short g, short b)clutchlog::fmt::color_16Minline
    color_16M(ground t, const std::string &srgb)clutchlog::fmt::color_16Minline
    green (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    green (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    ground enum nameclutchlog::fmt::color
    is_set() constclutchlog::fmt::color_16Minlinevirtual
    is_set() constclutchlog::fmt::color_16Minlinevirtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_16Minlinevirtual
    print_on(std::ostream &os) constclutchlog::fmt::color_16Minlinevirtual
    redclutchlog::fmt::color_16M
    typeclutchlog::fmt::color
    typeclutchlog::fmt::color
    diff --git a/docs/structclutchlog_1_1fmt_1_1bg__16_m.html b/docs/structclutchlog_1_1fmt_1_1bg__16_m.html index 22a9e70..97d3333 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__16_m.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt::bg_16M Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -87,8 +87,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__16_m.htm -
    -
    clutchlog::fmt::bg_16M Struct Reference
    +
    clutchlog::fmt::bg_16M Struct Reference
    @@ -111,15 +110,14 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__16_m.htm
    [legend]

    Detailed Description

    -

    background in 256-colors mode.

    +

    background in 256-colors mode.

    -

    Definition at line 677 of file clutchlog.h.

    +

    Definition at line 678 of file clutchlog.h.

    - - - + + @@ -140,49 +138,79 @@ Public Member Functions - - + + - - - + + + + + + + + +

    +

    Public Member Functions

    bg_16M ()
     Empty constructor: no color.
     bg_16M ()
     Empty constructor: no color. More...
     
     bg_16M (short r, short g, short b)
     Numeric triplet constructor. More...
     color_16M (ground t, const std::string &srgb)
     Hex triplet string constructor. More...
     
    -bool is_set () const
     Returns true if the underying representation encodes an existing color.
    bool is_set () const
     Returns true if the underying representation encodes an existing color. More...
     
    -std::ostream & print_on (std::ostream &os) const
     Print the color RGB triplet on the given stream.
     
    std::ostream & print_on (std::ostream &os) const
     Print the color RGB triplet on the given stream. More...
     
    - Public Member Functions inherited from clutchlog::fmt::color
     color (ansi a, ground g)
     Constructor. More...
     
    virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color. More...
     
    virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream. More...
     
    - - + - + - + - + - - +

    +

    Additional Inherited Members

    - Public Attributes inherited from clutchlog::fmt::color_16M
    short red
     The encoded RGB indices. More...
     
    -short green
    short green
     
    -short blue
    short blue
     
    - Public Attributes inherited from clutchlog::fmt::color
    -ansi mode
    ansi mode
     
    -enum clutchlog::fmt::color::ground type
    +enum clutchlog::fmt::color::ground type
     Type of color (foreground or background).
     
    - Public Types inherited from clutchlog::fmt::color
    enum  ground { fore = 38, -back = 48 +
    enum class  ground { fore = 38 +, back = 48 }
     Codes for representing foreground or background.
     Codes for representing foreground or background. More...
     

    Constructor & Destructor Documentation

    - -

    ◆ bg_16M() [1/3]

    + +

    ◆ bg_16M() [1/4]

    + +
    +
    + + + + + +
    + + + + + + + +
    clutchlog::fmt::bg_16M::bg_16M ()
    +
    +inline
    +
    + +

    Empty constructor: no color.

    + +

    Definition at line 680 of file clutchlog.h.

    + +
    +
    + +

    ◆ bg_16M() [2/4]

    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,33 +84,30 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__256.html
    -
    -
    clutchlog::fmt::bg_256 Member List
    +
    clutchlog::fmt::bg_256 Member List

    This is the complete list of members for clutchlog::fmt::bg_256, including all inherited members.

    - + - + - + - + - - - + + +
    bg_256()clutchlog::fmt::bg_256inline
    bg_256(const short b)clutchlog::fmt::bg_256inline
    bg_256(const short b)clutchlog::fmt::bg_256inline
    bg_256(const bg &)clutchlog::fmt::bg_256inline
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color_256(ground t)clutchlog::fmt::color_256inline
    color_256(ground t, const short i)clutchlog::fmt::color_256inline
    color_256(ground t, const short i)clutchlog::fmt::color_256inline
    ground enum nameclutchlog::fmt::color
    indexclutchlog::fmt::color_256
    indexclutchlog::fmt::color_256
    is_set() constclutchlog::fmt::color_256inlinevirtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_256inlinevirtual
    typeclutchlog::fmt::color
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_256inlinevirtual
    typeclutchlog::fmt::color
    diff --git a/docs/structclutchlog_1_1fmt_1_1bg__256.html b/docs/structclutchlog_1_1fmt_1_1bg__256.html index de835a5..1f9d1e8 100644 --- a/docs/structclutchlog_1_1fmt_1_1bg__256.html +++ b/docs/structclutchlog_1_1fmt_1_1bg__256.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt::bg_256 Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -87,8 +87,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__256.html -
    -
    clutchlog::fmt::bg_256 Struct Reference
    +
    clutchlog::fmt::bg_256 Struct Reference
    @@ -111,15 +110,14 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1bg__256.html
    [legend]

    Detailed Description

    -

    Background in 256-colors mode.

    +

    Background in 256-colors mode.

    -

    Definition at line 569 of file clutchlog.h.

    +

    Definition at line 570 of file clutchlog.h.

    - - - + + @@ -134,43 +132,75 @@ Public Member Functions - - + + - - - + + + + + + + + +

    +

    Public Member Functions

    bg_256 ()
     Empty constructor: no color.
     bg_256 ()
     Empty constructor: no color. More...
     
     bg_256 (const short b)
     Constructor. More...
     color_256 (ground t, const short i)
     Constructor. More...
     
    -bool is_set () const
     Returns true if the underying representation encodes an existing color.
    bool is_set () const
     Returns true if the underying representation encodes an existing color. More...
     
    -std::ostream & print_on (std::ostream &os) const
     Print the color index on the given stream.
     
    std::ostream & print_on (std::ostream &os) const
     Print the color index on the given stream. More...
     
    - Public Member Functions inherited from clutchlog::fmt::color
     color (ansi a, ground g)
     Constructor. More...
     
    virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color. More...
     
    virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream. More...
     
    - - + - + - - +

    +

    Additional Inherited Members

    - Public Attributes inherited from clutchlog::fmt::color_256
    short index
     The encoded color index in 4-bits ANSI. More...
     
    - Public Attributes inherited from clutchlog::fmt::color
    -ansi mode
    ansi mode
     
    -enum clutchlog::fmt::color::ground type
    +enum clutchlog::fmt::color::ground type
     Type of color (foreground or background).
     
    - Public Types inherited from clutchlog::fmt::color
    enum  ground { fore = 38, -back = 48 +
    enum class  ground { fore = 38 +, back = 48 }
     Codes for representing foreground or background.
     Codes for representing foreground or background. More...
     

    Constructor & Destructor Documentation

    - -

    ◆ bg_256() [1/2]

    + +

    ◆ bg_256() [1/3]

    + +
    +
    + + + + + +
    + + + + + + + +
    clutchlog::fmt::bg_256::bg_256 ()
    +
    +inline
    +
    + +

    Empty constructor: no color.

    + +

    Definition at line 572 of file clutchlog.h.

    + +
    +
    + +

    ◆ bg_256() [2/3]

    @@ -201,12 +231,12 @@ enum Definition at line 576 of file clutchlog.h.

    +

    Definition at line 577 of file clutchlog.h.

    - -

    ◆ bg_256() [2/2]

    + +

    ◆ bg_256() [3/3]

    @@ -232,7 +262,7 @@ enum
    Warning
    Only encodes "no color", whatever is passed.
    -

    Definition at line 581 of file clutchlog.h.

    +

    Definition at line 582 of file clutchlog.h.

    @@ -245,9 +275,7 @@ enum
    diff --git a/docs/structclutchlog_1_1fmt_1_1color-members.html b/docs/structclutchlog_1_1fmt_1_1color-members.html index 8ffbea5..463b096 100644 --- a/docs/structclutchlog_1_1fmt_1_1color-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,28 +84,25 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color.html',
    -
    -
    clutchlog::fmt::color Member List
    +
    clutchlog::fmt::color Member List

    This is the complete list of members for clutchlog::fmt::color, including all inherited members.

    - + - - - + + +
    color(ansi a, ground g)clutchlog::fmt::colorinline
    ground enum nameclutchlog::fmt::color
    ground enum nameclutchlog::fmt::color
    is_set() const =0clutchlog::fmt::colorpure virtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    operator<<(std::ostream &os, const color &c)clutchlog::fmt::colorfriend
    print_on(std::ostream &os) const =0clutchlog::fmt::colorpure virtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    operator<<clutchlog::fmt::colorfriend
    print_on(std::ostream &os) const =0clutchlog::fmt::colorpure virtual
    typeclutchlog::fmt::color
    diff --git a/docs/structclutchlog_1_1fmt_1_1color.html b/docs/structclutchlog_1_1fmt_1_1color.html index b66fd1c..1213ef0 100644 --- a/docs/structclutchlog_1_1fmt_1_1color.html +++ b/docs/structclutchlog_1_1fmt_1_1color.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt::color Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -90,8 +90,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color.html', Public Types | Friends | List of all members -
    -
    clutchlog::fmt::color Struct Referenceabstract
    +
    clutchlog::fmt::color Struct Referenceabstract
    @@ -107,51 +106,47 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color.html',
    [legend]

    Detailed Description

    -

    Interface class for colors representation.

    +

    Interface class for colors representation.

    -

    Definition at line 483 of file clutchlog.h.

    +

    Definition at line 484 of file clutchlog.h.

    - - - + + - - - + + +

    +

    Public Member Functions

     color (ansi a, ground g)
     Constructor. More...
     
    -virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color.
    virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color. More...
     
    -virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream.
     
    virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream. More...
     
    - - + - +

    +

    Public Attributes

    -ansi mode
    ansi mode
     
    -enum clutchlog::fmt::color::ground type
    +enum clutchlog::fmt::color::ground type
     Type of color (foreground or background).
     
    - - - +

    +

    Public Types

    enum  ground { fore = 38, -back = 48 +
    enum class  ground { fore = 38 +, back = 48 }
     Codes for representing foreground or background.
     Codes for representing foreground or background. More...
     
    - - - - + + +

    +

    Friends

    -std::ostream & operator<< (std::ostream &os, const color &c)
     Print the actually encoded escaped color sequence on the given stream.
     
    std::ostream & operator<< (std::ostream &os, const color &c)
     Print the actually encoded escaped color sequence on the given stream. More...
     

    Constructor & Destructor Documentation

    - +

    ◆ color()

    @@ -194,7 +189,152 @@ std::ostream & Definition at line 497 of file clutchlog.h.

    +

    Definition at line 498 of file clutchlog.h.

    + +
    +
    +

    Member Function Documentation

    + +

    ◆ is_set()

    + +
    +
    + + + + + +
    + + + + + + + +
    virtual bool clutchlog::fmt::color::is_set () const
    +
    +pure virtual
    +
    + +

    Should return true if the underying representation encodes an existing color.

    + +

    Implemented in clutchlog::fmt::color_256, and clutchlog::fmt::color_16M.

    + +
    +
    + +

    ◆ print_on()

    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual std::ostream & clutchlog::fmt::color::print_on (std::ostream & os) const
    +
    +pure virtual
    +
    + +

    Should print the underlying representation on the given stream.

    + +

    Implemented in clutchlog::fmt::color_256, and clutchlog::fmt::color_16M.

    + +
    +
    +

    Friends And Related Function Documentation

    + +

    ◆ operator<<

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    std::ostream & operator<< (std::ostream & os,
    const colorc 
    )
    +
    +friend
    +
    + +

    Print the actually encoded escaped color sequence on the given stream.

    + +

    Definition at line 507 of file clutchlog.h.

    + +
    +
    +

    Member Data Documentation

    + +

    ◆ mode

    + +
    +
    + + + + +
    ansi clutchlog::fmt::color::mode
    +
    + +

    Definition at line 485 of file clutchlog.h.

    + +
    +
    +

    Member Enumeration Documentation

    + +

    ◆ ground

    + +
    +
    + + + + + +
    + + + + +
    enum class clutchlog::fmt::color::ground
    +
    +strong
    +
    + +

    Codes for representing foreground or background.

    + +

    Definition at line 488 of file clutchlog.h.

    @@ -207,9 +347,7 @@ std::ostream &  diff --git a/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html index c3d2dc3..42dcda5 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color__16_m-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,33 +84,30 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__16_m.
    -
    -
    clutchlog::fmt::color_16M Member List
    +
    clutchlog::fmt::color_16M Member List

    This is the complete list of members for clutchlog::fmt::color_16M, including all inherited members.

    - + - + - + - + - + - +
    blue (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color_16M(ground t)clutchlog::fmt::color_16Minline
    color_16M(ground t, short r, short g, short b)clutchlog::fmt::color_16Minline
    color_16M(ground t, short r, short g, short b)clutchlog::fmt::color_16Minline
    color_16M(ground t, const std::string &srgb)clutchlog::fmt::color_16Minline
    green (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    green (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    ground enum nameclutchlog::fmt::color
    is_set() constclutchlog::fmt::color_16Minlinevirtual
    is_set() constclutchlog::fmt::color_16Minlinevirtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_16Minlinevirtual
    print_on(std::ostream &os) constclutchlog::fmt::color_16Minlinevirtual
    redclutchlog::fmt::color_16M
    typeclutchlog::fmt::color
    typeclutchlog::fmt::color
    diff --git a/docs/structclutchlog_1_1fmt_1_1color__16_m.html b/docs/structclutchlog_1_1fmt_1_1color__16_m.html index ddb2451..77bf878 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1color__16_m.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt::color_16M Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -88,8 +88,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__16_m. Public Member Functions | Public Attributes | List of all members -
    -
    clutchlog::fmt::color_16M Struct Reference
    +
    clutchlog::fmt::color_16M Struct Reference
    @@ -112,11 +111,11 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__16_m.
    [legend]

    Detailed Description

    -

    Abstract base class for 16M colors objects (24-bits ANSI).

    +

    Abstract base class for 16M colors objects (24-bits ANSI).

    -

    Definition at line 586 of file clutchlog.h.

    +

    Definition at line 587 of file clutchlog.h.

    - @@ -127,50 +126,51 @@ Public Member Functions - - + + - - - + + + + + + + + +

    +

    Public Member Functions

     color_16M (ground t)
     Constructor. More...
     color_16M (ground t, const std::string &srgb)
     Hex triplet string constructor. More...
     
    -bool is_set () const
     Returns true if the underying representation encodes an existing color.
    bool is_set () const
     Returns true if the underying representation encodes an existing color. More...
     
    -std::ostream & print_on (std::ostream &os) const
     Print the color RGB triplet on the given stream.
     
    std::ostream & print_on (std::ostream &os) const
     Print the color RGB triplet on the given stream. More...
     
    - Public Member Functions inherited from clutchlog::fmt::color
     color (ansi a, ground g)
     Constructor. More...
     
    virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color. More...
     
    virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream. More...
     
    - - + - + - + - +

    +

    Public Attributes

    short red
     The encoded RGB indices. More...
     
    -short green
    short green
     
    -short blue
    short blue
     
    - Public Attributes inherited from clutchlog::fmt::color
    -ansi mode
    ansi mode
     
    -enum clutchlog::fmt::color::ground type
    +enum clutchlog::fmt::color::ground type
     Type of color (foreground or background).
     
    - - - +

    +

    Additional Inherited Members

    - Public Types inherited from clutchlog::fmt::color
    enum  ground { fore = 38, -back = 48 +
    enum class  ground { fore = 38 +, back = 48 }
     Codes for representing foreground or background.
     Codes for representing foreground or background. More...
     

    Constructor & Destructor Documentation

    - +

    ◆ color_16M() [1/3]

    @@ -202,11 +202,11 @@ Additional Inherited Members -

    Definition at line 595 of file clutchlog.h.

    +

    Definition at line 596 of file clutchlog.h.

    - +

    ◆ color_16M() [2/3]

    @@ -263,11 +263,11 @@ Additional Inherited Members -

    Definition at line 604 of file clutchlog.h.

    +

    Definition at line 605 of file clutchlog.h.

    - +

    ◆ color_16M() [3/3]

    @@ -311,14 +311,82 @@ Additional Inherited Members -

    Definition at line 614 of file clutchlog.h.

    +

    Definition at line 615 of file clutchlog.h.

    -

    References red.

    +

    References red.

    + +
    + +

    Member Function Documentation

    + +

    ◆ is_set()

    + +
    +
    + + + + + +
    + + + + + + + +
    bool clutchlog::fmt::color_16M::is_set () const
    +
    +inlinevirtual
    +
    + +

    Returns true if the underying representation encodes an existing color.

    + +

    Implements clutchlog::fmt::color.

    + +

    Definition at line 637 of file clutchlog.h.

    + +

    References red.

    + +
    +
    + +

    ◆ print_on()

    + +
    +
    + + + + + +
    + + + + + + + + +
    std::ostream & clutchlog::fmt::color_16M::print_on (std::ostream & os) const
    +
    +inlinevirtual
    +
    + +

    Print the color RGB triplet on the given stream.

    + +

    Implements clutchlog::fmt::color.

    + +

    Definition at line 640 of file clutchlog.h.

    + +

    References red.

    Member Data Documentation

    - +

    ◆ red

    @@ -331,11 +399,43 @@ Additional Inherited Members

    The encoded RGB indices.

    -

    "No color" is encoded as -1.

    +

    "No color" is encoded as -1.

    -

    Definition at line 590 of file clutchlog.h.

    +

    Definition at line 591 of file clutchlog.h.

    -

    Referenced by color_16M(), is_set(), and print_on().

    +

    Referenced by color_16M(), is_set(), and print_on().

    + +
    + + +

    ◆ green

    + +
    +
    + + + + +
    short clutchlog::fmt::color_16M::green
    +
    + +

    Definition at line 591 of file clutchlog.h.

    + +
    +
    + +

    ◆ blue

    + +
    +
    + + + + +
    short clutchlog::fmt::color_16M::blue
    +
    + +

    Definition at line 591 of file clutchlog.h.

    @@ -348,9 +448,7 @@ Additional Inherited Members diff --git a/docs/structclutchlog_1_1fmt_1_1color__256-members.html b/docs/structclutchlog_1_1fmt_1_1color__256-members.html index ad6ae0c..f1f7902 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__256-members.html +++ b/docs/structclutchlog_1_1fmt_1_1color__256-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,30 +84,27 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__256.h
    -
    -
    clutchlog::fmt::color_256 Member List
    +
    clutchlog::fmt::color_256 Member List

    This is the complete list of members for clutchlog::fmt::color_256, including all inherited members.

    - + - + - + - +
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color_256(ground t)clutchlog::fmt::color_256inline
    color_256(ground t)clutchlog::fmt::color_256inline
    color_256(ground t, const short i)clutchlog::fmt::color_256inline
    ground enum nameclutchlog::fmt::color
    ground enum nameclutchlog::fmt::color
    indexclutchlog::fmt::color_256
    is_set() constclutchlog::fmt::color_256inlinevirtual
    is_set() constclutchlog::fmt::color_256inlinevirtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_256inlinevirtual
    print_on(std::ostream &os) constclutchlog::fmt::color_256inlinevirtual
    typeclutchlog::fmt::color
    diff --git a/docs/structclutchlog_1_1fmt_1_1color__256.html b/docs/structclutchlog_1_1fmt_1_1color__256.html index c52ec60..78f460c 100644 --- a/docs/structclutchlog_1_1fmt_1_1color__256.html +++ b/docs/structclutchlog_1_1fmt_1_1color__256.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt::color_256 Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -88,8 +88,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__256.h Public Member Functions | Public Attributes | List of all members -
    -
    clutchlog::fmt::color_256 Struct Reference
    +
    clutchlog::fmt::color_256 Struct Reference
    @@ -112,11 +111,11 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1color__256.h
    [legend]

    Detailed Description

    -

    Abstract base class for 256 colors objects (8-bits ANSI).

    +

    Abstract base class for 256 colors objects (8-bits ANSI).

    -

    Definition at line 522 of file clutchlog.h.

    +

    Definition at line 523 of file clutchlog.h.

    - @@ -124,44 +123,47 @@ Public Member Functions - - + + - - - + + + + + + + + +

    +

    Public Member Functions

     color_256 (ground t)
     Constructor. More...
     color_256 (ground t, const short i)
     Constructor. More...
     
    -bool is_set () const
     Returns true if the underying representation encodes an existing color.
    bool is_set () const
     Returns true if the underying representation encodes an existing color. More...
     
    -std::ostream & print_on (std::ostream &os) const
     Print the color index on the given stream.
     
    std::ostream & print_on (std::ostream &os) const
     Print the color index on the given stream. More...
     
    - Public Member Functions inherited from clutchlog::fmt::color
     color (ansi a, ground g)
     Constructor. More...
     
    virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color. More...
     
    virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream. More...
     
    - - + - +

    +

    Public Attributes

    short index
     The encoded color index in 4-bits ANSI. More...
     
    - Public Attributes inherited from clutchlog::fmt::color
    -ansi mode
    ansi mode
     
    -enum clutchlog::fmt::color::ground type
    +enum clutchlog::fmt::color::ground type
     Type of color (foreground or background).
     
    - - - +

    +

    Additional Inherited Members

    - Public Types inherited from clutchlog::fmt::color
    enum  ground { fore = 38, -back = 48 +
    enum class  ground { fore = 38 +, back = 48 }
     Codes for representing foreground or background.
     Codes for representing foreground or background. More...
     

    Constructor & Destructor Documentation

    - +

    ◆ color_256() [1/2]

    @@ -193,11 +195,11 @@ Additional Inherited Members -

    Definition at line 531 of file clutchlog.h.

    +

    Definition at line 532 of file clutchlog.h.

    - +

    ◆ color_256() [2/2]

    @@ -240,12 +242,80 @@ Additional Inherited Members -

    Definition at line 538 of file clutchlog.h.

    +

    Definition at line 539 of file clutchlog.h.

    + +
    + +

    Member Function Documentation

    + +

    ◆ is_set()

    + +
    +
    + + + + + +
    + + + + + + + +
    bool clutchlog::fmt::color_256::is_set () const
    +
    +inlinevirtual
    +
    + +

    Returns true if the underying representation encodes an existing color.

    + +

    Implements clutchlog::fmt::color.

    + +

    Definition at line 542 of file clutchlog.h.

    + +

    References index.

    + +
    +
    + +

    ◆ print_on()

    + +
    +
    + + + + + +
    + + + + + + + + +
    std::ostream & clutchlog::fmt::color_256::print_on (std::ostream & os) const
    +
    +inlinevirtual
    +
    + +

    Print the color index on the given stream.

    + +

    Implements clutchlog::fmt::color.

    + +

    Definition at line 545 of file clutchlog.h.

    + +

    References index.

    Member Data Documentation

    - +

    ◆ index

    @@ -258,11 +328,11 @@ Additional Inherited Members

    The encoded color index in 4-bits ANSI.

    -

    "No color" is encoded as -1.

    +

    "No color" is encoded as -1.

    -

    Definition at line 526 of file clutchlog.h.

    +

    Definition at line 527 of file clutchlog.h.

    -

    Referenced by is_set(), and print_on().

    +

    Referenced by is_set(), and print_on().

    @@ -275,9 +345,7 @@ Additional Inherited Members diff --git a/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html b/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html index a2dad5d..193f0d2 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__16_m-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,37 +84,34 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__16_m.htm
    -
    -
    clutchlog::fmt::fg_16M Member List
    +
    clutchlog::fmt::fg_16M Member List

    This is the complete list of members for clutchlog::fmt::fg_16M, including all inherited members.

    - + - + - + - + - + - + - + - +
    blue (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color_16M(ground t)clutchlog::fmt::color_16Minline
    color_16M(ground t, short r, short g, short b)clutchlog::fmt::color_16Minline
    color_16M(ground t, short r, short g, short b)clutchlog::fmt::color_16Minline
    color_16M(ground t, const std::string &srgb)clutchlog::fmt::color_16Minline
    fg_16M()clutchlog::fmt::fg_16Minline
    fg_16M()clutchlog::fmt::fg_16Minline
    fg_16M(short r, short g, short b)clutchlog::fmt::fg_16Minline
    fg_16M(const std::string &srgb)clutchlog::fmt::fg_16Minline
    fg_16M(const std::string &srgb)clutchlog::fmt::fg_16Minline
    fg_16M(const fg &)clutchlog::fmt::fg_16Minline
    green (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    green (defined in clutchlog::fmt::color_16M)clutchlog::fmt::color_16M
    ground enum nameclutchlog::fmt::color
    is_set() constclutchlog::fmt::color_16Minlinevirtual
    is_set() constclutchlog::fmt::color_16Minlinevirtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_16Minlinevirtual
    print_on(std::ostream &os) constclutchlog::fmt::color_16Minlinevirtual
    redclutchlog::fmt::color_16M
    typeclutchlog::fmt::color
    typeclutchlog::fmt::color
    diff --git a/docs/structclutchlog_1_1fmt_1_1fg__16_m.html b/docs/structclutchlog_1_1fmt_1_1fg__16_m.html index a23ddfe..890d2e0 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__16_m.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__16_m.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt::fg_16M Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -87,8 +87,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__16_m.htm -
    -
    clutchlog::fmt::fg_16M Struct Reference
    +
    clutchlog::fmt::fg_16M Struct Reference
    @@ -111,15 +110,14 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__16_m.htm
    [legend]

    Detailed Description

    -

    Foreground in 256-colors mode.

    +

    Foreground in 256-colors mode.

    -

    Definition at line 647 of file clutchlog.h.

    +

    Definition at line 648 of file clutchlog.h.

    - - - + + @@ -140,49 +138,79 @@ Public Member Functions - - + + - - - + + + + + + + + +

    +

    Public Member Functions

    fg_16M ()
     Empty constructor: no color.
     fg_16M ()
     Empty constructor: no color. More...
     
     fg_16M (short r, short g, short b)
     Numeric triplet constructor. More...
     color_16M (ground t, const std::string &srgb)
     Hex triplet string constructor. More...
     
    -bool is_set () const
     Returns true if the underying representation encodes an existing color.
    bool is_set () const
     Returns true if the underying representation encodes an existing color. More...
     
    -std::ostream & print_on (std::ostream &os) const
     Print the color RGB triplet on the given stream.
     
    std::ostream & print_on (std::ostream &os) const
     Print the color RGB triplet on the given stream. More...
     
    - Public Member Functions inherited from clutchlog::fmt::color
     color (ansi a, ground g)
     Constructor. More...
     
    virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color. More...
     
    virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream. More...
     
    - - + - + - + - + - - +

    +

    Additional Inherited Members

    - Public Attributes inherited from clutchlog::fmt::color_16M
    short red
     The encoded RGB indices. More...
     
    -short green
    short green
     
    -short blue
    short blue
     
    - Public Attributes inherited from clutchlog::fmt::color
    -ansi mode
    ansi mode
     
    -enum clutchlog::fmt::color::ground type
    +enum clutchlog::fmt::color::ground type
     Type of color (foreground or background).
     
    - Public Types inherited from clutchlog::fmt::color
    enum  ground { fore = 38, -back = 48 +
    enum class  ground { fore = 38 +, back = 48 }
     Codes for representing foreground or background.
     Codes for representing foreground or background. More...
     

    Constructor & Destructor Documentation

    - -

    ◆ fg_16M() [1/3]

    + +

    ◆ fg_16M() [1/4]

    + +
    +
    + + + + + +
    + + + + + + + +
    clutchlog::fmt::fg_16M::fg_16M ()
    +
    +inline
    +
    + +

    Empty constructor: no color.

    + +

    Definition at line 650 of file clutchlog.h.

    + +
    +
    + +

    ◆ fg_16M() [2/4]

    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,33 +84,30 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__256.html
    -
    -
    clutchlog::fmt::fg_256 Member List
    +
    clutchlog::fmt::fg_256 Member List

    This is the complete list of members for clutchlog::fmt::fg_256, including all inherited members.

    - + - + - + - + - - - + + +
    color(ansi a, ground g)clutchlog::fmt::colorinline
    color_256(ground t)clutchlog::fmt::color_256inline
    color_256(ground t)clutchlog::fmt::color_256inline
    color_256(ground t, const short i)clutchlog::fmt::color_256inline
    fg_256()clutchlog::fmt::fg_256inline
    fg_256()clutchlog::fmt::fg_256inline
    fg_256(const short f)clutchlog::fmt::fg_256inline
    fg_256(const fg &)clutchlog::fmt::fg_256inline
    fg_256(const fg &)clutchlog::fmt::fg_256inline
    ground enum nameclutchlog::fmt::color
    indexclutchlog::fmt::color_256
    indexclutchlog::fmt::color_256
    is_set() constclutchlog::fmt::color_256inlinevirtual
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_256inlinevirtual
    typeclutchlog::fmt::color
    mode (defined in clutchlog::fmt::color)clutchlog::fmt::color
    print_on(std::ostream &os) constclutchlog::fmt::color_256inlinevirtual
    typeclutchlog::fmt::color
    diff --git a/docs/structclutchlog_1_1fmt_1_1fg__256.html b/docs/structclutchlog_1_1fmt_1_1fg__256.html index 1bf58d2..0eca95f 100644 --- a/docs/structclutchlog_1_1fmt_1_1fg__256.html +++ b/docs/structclutchlog_1_1fmt_1_1fg__256.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::fmt::fg_256 Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -87,8 +87,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__256.html -
    -
    clutchlog::fmt::fg_256 Struct Reference
    +
    clutchlog::fmt::fg_256 Struct Reference
    @@ -111,15 +110,14 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1fmt_1_1fg__256.html
    [legend]

    Detailed Description

    -

    Foreground in 256-colors mode.

    +

    Foreground in 256-colors mode.

    -

    Definition at line 552 of file clutchlog.h.

    +

    Definition at line 553 of file clutchlog.h.

    - - - + + @@ -134,43 +132,75 @@ Public Member Functions - - + + - - - + + + + + + + + +

    +

    Public Member Functions

    fg_256 ()
     Empty constructor: no color.
     fg_256 ()
     Empty constructor: no color. More...
     
     fg_256 (const short f)
     Constructor. More...
     color_256 (ground t, const short i)
     Constructor. More...
     
    -bool is_set () const
     Returns true if the underying representation encodes an existing color.
    bool is_set () const
     Returns true if the underying representation encodes an existing color. More...
     
    -std::ostream & print_on (std::ostream &os) const
     Print the color index on the given stream.
     
    std::ostream & print_on (std::ostream &os) const
     Print the color index on the given stream. More...
     
    - Public Member Functions inherited from clutchlog::fmt::color
     color (ansi a, ground g)
     Constructor. More...
     
    virtual bool is_set () const =0
     Should return true if the underying representation encodes an existing color. More...
     
    virtual std::ostream & print_on (std::ostream &os) const =0
     Should print the underlying representation on the given stream. More...
     
    - - + - + - - +

    +

    Additional Inherited Members

    - Public Attributes inherited from clutchlog::fmt::color_256
    short index
     The encoded color index in 4-bits ANSI. More...
     
    - Public Attributes inherited from clutchlog::fmt::color
    -ansi mode
    ansi mode
     
    -enum clutchlog::fmt::color::ground type
    +enum clutchlog::fmt::color::ground type
     Type of color (foreground or background).
     
    - Public Types inherited from clutchlog::fmt::color
    enum  ground { fore = 38, -back = 48 +
    enum class  ground { fore = 38 +, back = 48 }
     Codes for representing foreground or background.
     Codes for representing foreground or background. More...
     

    Constructor & Destructor Documentation

    - -

    ◆ fg_256() [1/2]

    + +

    ◆ fg_256() [1/3]

    + +
    +
    + + + + + +
    + + + + + + + +
    clutchlog::fmt::fg_256::fg_256 ()
    +
    +inline
    +
    + +

    Empty constructor: no color.

    + +

    Definition at line 555 of file clutchlog.h.

    + +
    +
    + +

    ◆ fg_256() [2/3]

    @@ -201,12 +231,12 @@ enum Definition at line 559 of file clutchlog.h.

    +

    Definition at line 560 of file clutchlog.h.

    - -

    ◆ fg_256() [2/2]

    + +

    ◆ fg_256() [3/3]

    @@ -232,7 +262,7 @@ enum
    Warning
    Only encodes "no color", whatever is passed.
    -

    Definition at line 564 of file clutchlog.h.

    +

    Definition at line 565 of file clutchlog.h.

    @@ -245,9 +275,7 @@ enum
    diff --git a/docs/structclutchlog_1_1scope__t-members.html b/docs/structclutchlog_1_1scope__t-members.html index d690cfe..476fd12 100644 --- a/docs/structclutchlog_1_1scope__t-members.html +++ b/docs/structclutchlog_1_1scope__t-members.html @@ -2,8 +2,8 @@ - - + + clutchlog: Member List @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,25 +84,22 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1scope__t.html','');
    -
    -
    clutchlog::scope_t Member List
    +
    clutchlog::scope_t Member List
    diff --git a/docs/structclutchlog_1_1scope__t.html b/docs/structclutchlog_1_1scope__t.html index c11b24b..db3448e 100644 --- a/docs/structclutchlog_1_1scope__t.html +++ b/docs/structclutchlog_1_1scope__t.html @@ -2,8 +2,8 @@ - - + + clutchlog: clutchlog::scope_t Struct Reference @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -88,8 +88,7 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1scope__t.html',''); Public Member Functions | Public Attributes | List of all members -
    -
    clutchlog::scope_t Struct Reference
    +
    clutchlog::scope_t Struct Reference
    @@ -98,32 +97,119 @@ $(document).ready(function(){initNavTree('structclutchlog_1_1scope__t.html','');

    #include <clutchlog.h>

    Detailed Description

    -

    Structure holding a location matching.

    +

    Structure holding a location matching.

    -

    Definition at line 1128 of file clutchlog.h.

    +

    Definition at line 1130 of file clutchlog.h.

    - - - + +

    +

    Public Member Functions

    scope_t ()
     Constructor.
     scope_t ()
     Constructor. More...
     
    - - - + + - - + + - - + +

    +

    Public Attributes

    -bool matches
     Everything is compatible.
    bool matches
     Everything is compatible. More...
     
    -level stage
     Current log level.
    level stage
     Current log level. More...
     
    -bool there
     Location is compatible.
    bool there
     Location is compatible. More...
     
    +

    Constructor & Destructor Documentation

    + +

    ◆ scope_t()

    + +
    +
    + + + + + +
    + + + + + + + +
    clutchlog::scope_t::scope_t ()
    +
    +inline
    +
    + +

    Constructor.

    + +

    Definition at line 1142 of file clutchlog.h.

    + +
    +
    +

    Member Data Documentation

    + +

    ◆ matches

    + +
    +
    + + + + +
    bool clutchlog::scope_t::matches
    +
    + +

    Everything is compatible.

    + +

    Definition at line 1132 of file clutchlog.h.

    + +

    Referenced by clutchlog::dump(), clutchlog::locate(), and clutchlog::log().

    + +
    +
    + +

    ◆ stage

    + +
    +
    + + + + +
    level clutchlog::scope_t::stage
    +
    + +

    Current log level.

    + +

    Definition at line 1134 of file clutchlog.h.

    + +

    Referenced by clutchlog::locate().

    + +
    +
    + +

    ◆ there

    + +
    +
    + + + + +
    bool clutchlog::scope_t::there
    +
    + +

    Location is compatible.

    + +

    Definition at line 1140 of file clutchlog.h.

    + +

    Referenced by clutchlog::locate().

    + +
    +

    The documentation for this struct was generated from the following file: @@ -133,9 +219,7 @@ bool 
    diff --git a/docs/svgpan.js b/docs/svgpan.js index 1cad257..2678d38 100644 --- a/docs/svgpan.js +++ b/docs/svgpan.js @@ -1,57 +1,37 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. + The code below is based on SVGPan Library 1.2 and was modified for doxygen + to support both zooming and panning via the mouse and via embedded buttons. - Copyright (C) 1997-2017 by Dimitri van Heesch + This code is licensed under the following BSD license: - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + Copyright 2009-2010 Andrea Leofreddi . All rights reserved. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Redistribution and use in source and binary forms, with or without modification, are + permitted provided that the following conditions are met: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. - @licend The above is the entire license notice - for the JavaScript code in this file - */ -/** - * The code below is based on SVGPan Library 1.2 and was modified for doxygen - * to support both zooming and panning via the mouse and via embedded buttons. - * - * This code is licensed under the following BSD license: - * - * Copyright 2009-2010 Andrea Leofreddi . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of Andrea Leofreddi. + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those of the + authors and should not be interpreted as representing official policies, either expressed + or implied, of Andrea Leofreddi. + + @licend The above is the entire license notice for the JavaScript code in this file */ var root = document.documentElement; diff --git a/docs/t-assert_8cpp_source.html b/docs/t-assert_8cpp_source.html index 1fc9176..c368267 100644 --- a/docs/t-assert_8cpp_source.html +++ b/docs/t-assert_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-assert.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,63 +84,61 @@ $(document).ready(function(){initNavTree('t-assert_8cpp_source.html',''); initRe
    -
    -
    t-assert.cpp
    +
    t-assert.cpp
    -
    1 #include <iostream>
    -
    2 #include <cassert>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 // Make asserts (de)clutchable.
    -
    7 #define ASSERT(...) CLUTCHFUNC(error, assert, __VA_ARGS__);
    -
    8 
    -
    9 void h()
    -
    10 {
    -
    11  CLUTCHLOG(info, "!");
    -
    12  ASSERT(true == true);
    -
    13  std::clog << "--" << std::endl;
    -
    14 }
    -
    15 
    -
    16 void g()
    -
    17 {
    -
    18  CLUTCHLOG(warning, "world");
    -
    19  ASSERT(strcmp("life","life") == 0);
    -
    20  h();
    -
    21 }
    -
    22 
    -
    23 void f()
    -
    24 {
    -
    25  CLUTCHLOG(error, "hello ");
    -
    26  ASSERT(strcmp("no more","please")!=0);
    -
    27  g();
    -
    28 }
    -
    29 
    -
    30 int main(/*const int argc, char* argv[]*/)
    -
    31 {
    -
    32  auto& log = clutchlog::logger();
    -
    33 
    -
    34  log.func("f");
    -
    35  f();
    -
    36 
    -
    37  log.func("g");
    -
    38  f();
    -
    39 
    -
    40  log.func("h");
    -
    41  f();
    -
    42 }
    +
    1#include <iostream>
    +
    2#include <cassert>
    +
    3#include <cstring>
    +
    4
    +
    5#include "../clutchlog/clutchlog.h"
    +
    6
    +
    7// Make asserts (de)clutchable.
    +
    8#define ASSERT(...) CLUTCHFUNC(error, assert, __VA_ARGS__);
    +
    9
    +
    10void h()
    +
    11{
    +
    12 CLUTCHLOG(info, "!");
    +
    13 ASSERT(true == true);
    +
    14 std::clog << "--" << std::endl;
    +
    15}
    +
    16
    +
    17void g()
    +
    18{
    +
    19 CLUTCHLOG(warning, "world");
    +
    20 ASSERT(strcmp("life","life") == 0);
    +
    21 h();
    +
    22}
    +
    23
    +
    24void f()
    +
    25{
    +
    26 CLUTCHLOG(error, "hello ");
    +
    27 ASSERT(strcmp("no more","please")!=0);
    +
    28 g();
    +
    29}
    +
    30
    +
    31int main(/*const int argc, char* argv[]*/)
    +
    32{
    +
    33 auto& log = clutchlog::logger();
    +
    34
    +
    35 log.func("f");
    +
    36 f();
    +
    37
    +
    38 log.func("g");
    +
    39 f();
    +
    40
    +
    41 log.func("h");
    +
    42 f();
    +
    43}
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    diff --git a/docs/t-color16_m_8cpp_source.html b/docs/t-color16_m_8cpp_source.html index bc24383..982de1c 100644 --- a/docs/t-color16_m_8cpp_source.html +++ b/docs/t-color16_m_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-color16M.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,70 +84,67 @@ $(document).ready(function(){initNavTree('t-color16_m_8cpp_source.html',''); ini
    -
    -
    t-color16M.cpp
    +
    t-color16M.cpp
    -
    1 #include <iostream>
    -
    2 #include <limits>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 int main(/*const int argc, char* argv[]*/)
    -
    7 {
    -
    8  using typo = clutchlog::fmt::typo;
    -
    9  // using fg = clutchlog::fmt::fg;
    -
    10  // using bg = clutchlog::fmt::bg;
    -
    11 
    -
    12  clutchlog::fmt none;
    -
    13  clutchlog::fmt end(typo::reset);
    -
    14  clutchlog::fmt note(typo::bold);
    -
    15  clutchlog::fmt info(120,255,120); // greenish
    -
    16  clutchlog::fmt warning("#ff0055", typo::bold); // magentaish
    -
    17  clutchlog::fmt error(255,100,150, typo::bold); // redish magenta
    -
    18  clutchlog::fmt critical("#ffff00", "#ff0000"); // Yellow over red.
    -
    19 
    -
    20  auto& log = clutchlog::logger();
    -
    21  log.threshold(clutchlog::level::info);
    -
    22 
    -
    23  // Change a style.
    -
    24  log.style(clutchlog::level::critical, error);
    -
    25  CLUTCHLOG(critical,"Styles demo");
    -
    26 
    -
    27  CLUTCHLOG(info,"Either using functions...");
    -
    28  std::cout << none("No style: ") << std::endl;
    -
    29  std::cout << note("NOTE: bold") << std::endl;
    -
    30  std::cout << info("INFO: green") << std::endl;
    -
    31 
    -
    32  CLUTCHLOG(info,"... or tags.");
    -
    33  std::cout << warning << "WARNING" << end << ": bold magenta" << std::endl;
    -
    34  std::cout << error << "ERROR" << end << ": bold red" << std::endl;
    -
    35  std::cout << critical << "CRITICAL" << end << ": underlined black over red background" << std::endl;
    -
    36 
    -
    37  std::ostringstream format;
    -
    38  clutchlog::fmt discreet("#888888", typo::inverse);
    -
    39  format << "{level}: "
    -
    40  << discreet("{file}") << ":"
    -
    41  << clutchlog::fmt(/*front RGB*/200,150,0, /*back RGB*/0,0,0) << "{line}" // gold yellow over black
    -
    42  << clutchlog::fmt(typo::reset) << " {msg} ! " << std::endl;
    -
    43  log.format(format.str());
    -
    44  CLUTCHLOG(critical,"After having inserted styles within a new format template");
    -
    45 }
    -
    46 
    -
    47 
    +
    1#include <iostream>
    +
    2#include <limits>
    +
    3
    +
    4#include "../clutchlog/clutchlog.h"
    +
    5
    +
    6int main(/*const int argc, char* argv[]*/)
    +
    7{
    +
    8 using typo = clutchlog::fmt::typo;
    +
    9 // using fg = clutchlog::fmt::fg;
    +
    10 // using bg = clutchlog::fmt::bg;
    +
    11
    +
    12 clutchlog::fmt none;
    +
    13 clutchlog::fmt end(typo::reset);
    +
    14 clutchlog::fmt note(typo::bold);
    +
    15 clutchlog::fmt info(120,255,120); // greenish
    +
    16 clutchlog::fmt warning("#ff0055", typo::bold); // magentaish
    +
    17 clutchlog::fmt error(255,100,150, typo::bold); // redish magenta
    +
    18 clutchlog::fmt critical("#ffff00", "#ff0000"); // Yellow over red.
    +
    19
    +
    20 auto& log = clutchlog::logger();
    +
    21 log.threshold(clutchlog::level::info);
    +
    22
    +
    23 // Change a style.
    +
    24 log.style(clutchlog::level::critical, error);
    +
    25 CLUTCHLOG(critical,"Styles demo");
    +
    26
    +
    27 CLUTCHLOG(info,"Either using functions...");
    +
    28 std::cout << none("No style: ") << std::endl;
    +
    29 std::cout << note("NOTE: bold") << std::endl;
    +
    30 std::cout << info("INFO: green") << std::endl;
    +
    31
    +
    32 CLUTCHLOG(info,"... or tags.");
    +
    33 std::cout << warning << "WARNING" << end << ": bold magenta" << std::endl;
    +
    34 std::cout << error << "ERROR" << end << ": bold red" << std::endl;
    +
    35 std::cout << critical << "CRITICAL" << end << ": underlined black over red background" << std::endl;
    +
    36
    +
    37 std::ostringstream format;
    +
    38 clutchlog::fmt discreet("#888888", typo::inverse);
    +
    39 format << "{level}: "
    +
    40 << discreet("{file}") << ":"
    +
    41 << clutchlog::fmt(/*front RGB*/200,150,0, /*back RGB*/0,0,0) << "{line}" // gold yellow over black
    +
    42 << clutchlog::fmt(typo::reset) << " {msg} ! " << std::endl;
    +
    43 log.format(format.str());
    +
    44 CLUTCHLOG(critical,"After having inserted styles within a new format template");
    +
    45}
    +
    46
    +
    47
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:393
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:392
    diff --git a/docs/t-color256_8cpp_source.html b/docs/t-color256_8cpp_source.html index 828c3d6..ebda88c 100644 --- a/docs/t-color256_8cpp_source.html +++ b/docs/t-color256_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-color256.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,69 +84,66 @@ $(document).ready(function(){initNavTree('t-color256_8cpp_source.html',''); init
    -
    -
    t-color256.cpp
    +
    t-color256.cpp
    -
    1 #include <iostream>
    -
    2 #include <limits>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 int main(/*const int argc, char* argv[]*/)
    -
    7 {
    -
    8  using typo = clutchlog::fmt::typo;
    -
    9  // using fg = clutchlog::fmt::fg;
    -
    10  // using bg = clutchlog::fmt::bg;
    -
    11 
    -
    12  clutchlog::fmt none;
    -
    13  clutchlog::fmt end(typo::reset);
    -
    14  clutchlog::fmt note(typo::bold);
    -
    15  clutchlog::fmt info(106); // greenish
    -
    16  clutchlog::fmt warning(171, typo::bold); // magentaish
    -
    17  clutchlog::fmt error(198, typo::bold); // redish magenta
    -
    18  clutchlog::fmt critical(226, 196, typo::underline); // Yellow over red.
    -
    19 
    -
    20  auto& log = clutchlog::logger();
    -
    21  log.threshold(clutchlog::level::info);
    -
    22 
    -
    23  // Change a style.
    -
    24  log.style(clutchlog::level::critical, error);
    -
    25  CLUTCHLOG(critical,"Styles demo");
    -
    26 
    -
    27  CLUTCHLOG(info,"Either using functions...");
    -
    28  std::cout << none("No style: ") << std::endl;
    -
    29  std::cout << note("NOTE: bold") << std::endl;
    -
    30  std::cout << info("INFO: green") << std::endl;
    -
    31 
    -
    32  CLUTCHLOG(info,"... or tags.");
    -
    33  std::cout << warning << "WARNING" << end << ": bold magenta" << std::endl;
    -
    34  std::cout << error << "ERROR" << end << ": bold red" << std::endl;
    -
    35  std::cout << critical << "CRITICAL" << end << ": underlined black over red background" << std::endl;
    -
    36 
    -
    37  std::ostringstream format;
    -
    38  clutchlog::fmt discreet(254);
    -
    39  format << "{level}: "
    -
    40  << discreet("{file}:")
    -
    41  << clutchlog::fmt(220, typo::inverse) << "{line}" // gold yellow
    -
    42  << clutchlog::fmt(typo::reset) << " {msg} ! " << std::endl;
    -
    43  log.format(format.str());
    -
    44  CLUTCHLOG(critical,"After having inserted styles within a new format template");
    -
    45 }
    -
    46 
    +
    1#include <iostream>
    +
    2#include <limits>
    +
    3
    +
    4#include "../clutchlog/clutchlog.h"
    +
    5
    +
    6int main(/*const int argc, char* argv[]*/)
    +
    7{
    +
    8 using typo = clutchlog::fmt::typo;
    +
    9 // using fg = clutchlog::fmt::fg;
    +
    10 // using bg = clutchlog::fmt::bg;
    +
    11
    +
    12 clutchlog::fmt none;
    +
    13 clutchlog::fmt end(typo::reset);
    +
    14 clutchlog::fmt note(typo::bold);
    +
    15 clutchlog::fmt info(106); // greenish
    +
    16 clutchlog::fmt warning(171, typo::bold); // magentaish
    +
    17 clutchlog::fmt error(198, typo::bold); // redish magenta
    +
    18 clutchlog::fmt critical(226, 196, typo::underline); // Yellow over red.
    +
    19
    +
    20 auto& log = clutchlog::logger();
    +
    21 log.threshold(clutchlog::level::info);
    +
    22
    +
    23 // Change a style.
    +
    24 log.style(clutchlog::level::critical, error);
    +
    25 CLUTCHLOG(critical,"Styles demo");
    +
    26
    +
    27 CLUTCHLOG(info,"Either using functions...");
    +
    28 std::cout << none("No style: ") << std::endl;
    +
    29 std::cout << note("NOTE: bold") << std::endl;
    +
    30 std::cout << info("INFO: green") << std::endl;
    +
    31
    +
    32 CLUTCHLOG(info,"... or tags.");
    +
    33 std::cout << warning << "WARNING" << end << ": bold magenta" << std::endl;
    +
    34 std::cout << error << "ERROR" << end << ": bold red" << std::endl;
    +
    35 std::cout << critical << "CRITICAL" << end << ": underlined black over red background" << std::endl;
    +
    36
    +
    37 std::ostringstream format;
    +
    38 clutchlog::fmt discreet(254);
    +
    39 format << "{level}: "
    +
    40 << discreet("{file}:")
    +
    41 << clutchlog::fmt(220, typo::inverse) << "{line}" // gold yellow
    +
    42 << clutchlog::fmt(typo::reset) << " {msg} ! " << std::endl;
    +
    43 log.format(format.str());
    +
    44 CLUTCHLOG(critical,"After having inserted styles within a new format template");
    +
    45}
    +
    46
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:393
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:392
    diff --git a/docs/t-color_8cpp_source.html b/docs/t-color_8cpp_source.html index b61f9f2..90fcfe0 100644 --- a/docs/t-color_8cpp_source.html +++ b/docs/t-color_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-color.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,70 +84,67 @@ $(document).ready(function(){initNavTree('t-color_8cpp_source.html',''); initRes
    -
    -
    t-color.cpp
    +
    t-color.cpp
    -
    1 #include <iostream>
    -
    2 #include <limits>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 int main(/*const int argc, char* argv[]*/)
    -
    7 {
    -
    8  using typo = clutchlog::fmt::typo;
    -
    9  using fg = clutchlog::fmt::fg;
    -
    10  using bg = clutchlog::fmt::bg;
    -
    11 
    -
    12  clutchlog::fmt none;
    -
    13  clutchlog::fmt end(typo::reset);
    -
    14  clutchlog::fmt note(typo::bold);
    -
    15  clutchlog::fmt info(fg::green);
    -
    16  clutchlog::fmt warning(fg::magenta, typo::bold);
    -
    17  clutchlog::fmt error(fg::red, typo::bold);
    -
    18  clutchlog::fmt critical(bg::red, typo::underline, fg::black);
    -
    19 
    -
    20  auto& log = clutchlog::logger();
    -
    21  log.threshold(clutchlog::level::info);
    -
    22 
    -
    23  // Change a style.
    -
    24  log.style(clutchlog::level::critical, error);
    -
    25  CLUTCHLOG(critical,"Styles demo");
    -
    26 
    -
    27  CLUTCHLOG(info,"Either using functions...");
    -
    28  std::cout << none("No style: ") << std::endl;
    -
    29  std::cout << note("NOTE: bold") << std::endl;
    -
    30  std::cout << info("INFO: green") << std::endl;
    -
    31 
    -
    32  CLUTCHLOG(info,"... or tags.");
    -
    33  std::cout << warning << "WARNING" << end << ": bold magenta" << std::endl;
    -
    34  std::cout << error << "ERROR" << end << ": bold red" << std::endl;
    -
    35  std::cout << critical << "CRITICAL" << end << ": underlined black over red background" << std::endl;
    -
    36 
    -
    37  std::ostringstream format;
    -
    38  clutchlog::fmt discreet(clutchlog::fmt::fg::white);
    -
    39  format << "{level}: "
    -
    40  << discreet("{file}:")
    -
    41  << clutchlog::fmt(clutchlog::fmt::fg::yellow) << "{line}"
    -
    42  << clutchlog::fmt(clutchlog::fmt::typo::reset) << " {msg} ! " << std::endl;
    -
    43  log.format(format.str());
    -
    44  CLUTCHLOG(critical,"After having inserted styles within a new format template");
    -
    45 }
    +
    1#include <iostream>
    +
    2#include <limits>
    +
    3
    +
    4#include "../clutchlog/clutchlog.h"
    +
    5
    +
    6int main(/*const int argc, char* argv[]*/)
    +
    7{
    +
    8 using typo = clutchlog::fmt::typo;
    +
    9 using fg = clutchlog::fmt::fg;
    +
    10 using bg = clutchlog::fmt::bg;
    +
    11
    +
    12 clutchlog::fmt none;
    +
    13 clutchlog::fmt end(typo::reset);
    +
    14 clutchlog::fmt note(typo::bold);
    +
    15 clutchlog::fmt info(fg::green);
    +
    16 clutchlog::fmt warning(fg::magenta, typo::bold);
    +
    17 clutchlog::fmt error(fg::red, typo::bold);
    +
    18 clutchlog::fmt critical(bg::red, typo::underline, fg::black);
    +
    19
    +
    20 auto& log = clutchlog::logger();
    +
    21 log.threshold(clutchlog::level::info);
    +
    22
    +
    23 // Change a style.
    +
    24 log.style(clutchlog::level::critical, error);
    +
    25 CLUTCHLOG(critical,"Styles demo");
    +
    26
    +
    27 CLUTCHLOG(info,"Either using functions...");
    +
    28 std::cout << none("No style: ") << std::endl;
    +
    29 std::cout << note("NOTE: bold") << std::endl;
    +
    30 std::cout << info("INFO: green") << std::endl;
    +
    31
    +
    32 CLUTCHLOG(info,"... or tags.");
    +
    33 std::cout << warning << "WARNING" << end << ": bold magenta" << std::endl;
    +
    34 std::cout << error << "ERROR" << end << ": bold red" << std::endl;
    +
    35 std::cout << critical << "CRITICAL" << end << ": underlined black over red background" << std::endl;
    +
    36
    +
    37 std::ostringstream format;
    +
    38 clutchlog::fmt discreet(clutchlog::fmt::fg::white);
    +
    39 format << "{level}: "
    +
    40 << discreet("{file}:")
    +
    41 << clutchlog::fmt(clutchlog::fmt::fg::yellow) << "{line}"
    +
    42 << clutchlog::fmt(clutchlog::fmt::typo::reset) << " {msg} ! " << std::endl;
    +
    43 log.format(format.str());
    +
    44 CLUTCHLOG(critical,"After having inserted styles within a new format template");
    +
    45}
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:393
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    +
    bg
    Background color codes.
    Definition: clutchlog.h:425
    +
    fg
    Foreground color codes.
    Definition: clutchlog.h:404
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    -
    bg
    Background color codes.
    Definition: clutchlog.h:424
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:392
    -
    fg
    Foreground color codes.
    Definition: clutchlog.h:403
    diff --git a/docs/t-demo_8cpp_source.html b/docs/t-demo_8cpp_source.html index 6738be0..ede3343 100644 --- a/docs/t-demo_8cpp_source.html +++ b/docs/t-demo_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-demo.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,115 +84,112 @@ $(document).ready(function(){initNavTree('t-demo_8cpp_source.html',''); initResi
    -
    -
    t-demo.cpp
    +
    t-demo.cpp
    -
    1 #include <iostream>
    -
    2 
    -
    3 #include "../clutchlog/clutchlog.h"
    -
    4 
    -
    5 void i()
    -
    6 {
    -
    7  CLUTCHLOG(progress, "Reset data structures...");
    -
    8  CLUTCHLOG(debug, "OK");
    -
    9  CLUTCHLOG(progress, "Reset functors...");
    -
    10  CLUTCHLOG(critical, "Impossible to reset, I cannot recover.");
    -
    11 }
    -
    12 
    -
    13 void h()
    -
    14 {
    -
    15  CLUTCHLOG(note, "Filling up data of size: " << 0);
    -
    16  CLUTCHLOG(error, "Cannot parse input, I will reset stuff.");
    -
    17  i();
    -
    18  CLUTCHLOG(xdebug, "Last seen state: " << 0);
    -
    19 }
    -
    20 
    -
    21 void g()
    -
    22 {
    -
    23  CLUTCHLOG(warning, "Input size < " << 1);
    -
    24  h();
    -
    25 }
    -
    26 
    -
    27 void f()
    -
    28 {
    -
    29  CLUTCHLOG(progress, "Initialize data structures...");
    -
    30  CLUTCHLOG(debug, "OK");
    -
    31  CLUTCHLOG(progress, "Initialize functors...");
    -
    32  CLUTCHLOG(debug, "OK");
    -
    33  g();
    -
    34 }
    -
    35 
    -
    36 int main(const int argc, char* argv[])
    -
    37 {
    -
    38  auto& log = clutchlog::logger();
    -
    39 
    -
    40  log.style(clutchlog::level::critical,
    -
    41  clutchlog::fmt::fg::red);
    -
    42  log.style(clutchlog::level::error,
    -
    43  clutchlog::fmt::fg::red);
    -
    44  log.style(clutchlog::level::warning,
    -
    45  clutchlog::fmt::fg::magenta);
    -
    46  log.style(clutchlog::level::progress,
    -
    47  clutchlog::fmt::fg::yellow);
    -
    48  log.style(clutchlog::level::note,
    -
    49  clutchlog::fmt::fg::green);
    -
    50  log.style(clutchlog::level::info,
    -
    51  clutchlog::fmt::fg::magenta);
    -
    52  log.style(clutchlog::level::debug,
    -
    53  clutchlog::fmt::fg::cyan);
    -
    54  log.style(clutchlog::level::xdebug,
    -
    55  clutchlog::fmt::fg::blue);
    -
    56  std::ostringstream format;
    -
    57  clutchlog::fmt reset(clutchlog::fmt::typo::reset);
    -
    58  clutchlog::fmt discreet(clutchlog::fmt::fg::black);
    -
    59  clutchlog::fmt bold(clutchlog::fmt::typo::bold);
    -
    60  format << "{level_fmt}"
    -
    61  << "{level_letter}:"
    -
    62  << "{depth_marks} "
    -
    63  << bold("{msg}")
    -
    64  << discreet(" {hfill} ")
    -
    65  << "{level_fmt}{func}"
    -
    66  << discreet(" @ ")
    -
    67  << "{level_fmt}{file}"
    -
    68  << reset << ":"
    -
    69  << "{level_fmt}{line}"
    -
    70  << "\n";
    -
    71  log.format(format.str());
    -
    72 
    -
    73  // log.hfill_max(100);
    -
    74  log.out(std::clog);
    -
    75  log.depth_mark(">");
    -
    76  log.threshold(clutchlog::level::warning);
    -
    77 
    -
    78  if(argc <= 2) {
    -
    79  CLUTCHLOG(warning, "Log level not indicated, will default to xdebug");
    -
    80  log.threshold(clutchlog::level::xdebug);
    -
    81  } else {
    -
    82  try {
    -
    83  log.threshold(log.level_of(argv[1]));
    -
    84  } catch(std::out_of_range& err) {
    -
    85  CLUTCHLOG(critical,err.what());
    -
    86  exit(100);
    -
    87  }
    -
    88  }
    -
    89 
    -
    90  CLUTCHLOG(progress,"Start something");
    -
    91  f();
    -
    92  CLUTCHLOG(progress,"I have stopped");
    -
    93 }
    +
    1#include <iostream>
    +
    2
    +
    3#include "../clutchlog/clutchlog.h"
    +
    4
    +
    5void i()
    +
    6{
    +
    7 CLUTCHLOG(progress, "Reset data structures...");
    +
    8 CLUTCHLOG(debug, "OK");
    +
    9 CLUTCHLOG(progress, "Reset functors...");
    +
    10 CLUTCHLOG(critical, "Impossible to reset, I cannot recover.");
    +
    11}
    +
    12
    +
    13void h()
    +
    14{
    +
    15 CLUTCHLOG(note, "Filling up data of size: " << 0);
    +
    16 CLUTCHLOG(error, "Cannot parse input, I will reset stuff.");
    +
    17 i();
    +
    18 CLUTCHLOG(xdebug, "Last seen state: " << 0);
    +
    19}
    +
    20
    +
    21void g()
    +
    22{
    +
    23 CLUTCHLOG(warning, "Input size < " << 1);
    +
    24 h();
    +
    25}
    +
    26
    +
    27void f()
    +
    28{
    +
    29 CLUTCHLOG(progress, "Initialize data structures...");
    +
    30 CLUTCHLOG(debug, "OK");
    +
    31 CLUTCHLOG(progress, "Initialize functors...");
    +
    32 CLUTCHLOG(debug, "OK");
    +
    33 g();
    +
    34}
    +
    35
    +
    36int main(const int argc, char* argv[])
    +
    37{
    +
    38 auto& log = clutchlog::logger();
    +
    39
    +
    40 log.style(clutchlog::level::critical,
    +
    41 clutchlog::fmt::fg::red);
    +
    42 log.style(clutchlog::level::error,
    +
    43 clutchlog::fmt::fg::red);
    +
    44 log.style(clutchlog::level::warning,
    +
    45 clutchlog::fmt::fg::magenta);
    +
    46 log.style(clutchlog::level::progress,
    +
    47 clutchlog::fmt::fg::yellow);
    +
    48 log.style(clutchlog::level::note,
    +
    49 clutchlog::fmt::fg::green);
    +
    50 log.style(clutchlog::level::info,
    +
    51 clutchlog::fmt::fg::magenta);
    +
    52 log.style(clutchlog::level::debug,
    +
    53 clutchlog::fmt::fg::cyan);
    +
    54 log.style(clutchlog::level::xdebug,
    +
    55 clutchlog::fmt::fg::blue);
    +
    56 std::ostringstream format;
    +
    57 clutchlog::fmt reset(clutchlog::fmt::typo::reset);
    +
    58 clutchlog::fmt discreet(clutchlog::fmt::fg::black);
    +
    59 clutchlog::fmt bold(clutchlog::fmt::typo::bold);
    +
    60 format << "{level_fmt}"
    +
    61 << "{level_letter}:"
    +
    62 << "{depth_marks} "
    +
    63 << bold("{msg}")
    +
    64 << discreet(" {hfill} ")
    +
    65 << "{level_fmt}{func}"
    +
    66 << discreet(" @ ")
    +
    67 << "{level_fmt}{file}"
    +
    68 << reset << ":"
    +
    69 << "{level_fmt}{line}"
    +
    70 << "\n";
    +
    71 log.format(format.str());
    +
    72
    +
    73 // log.hfill_max(100);
    +
    74 log.out(std::clog);
    +
    75 log.depth_mark(">");
    +
    76 log.threshold(clutchlog::level::warning);
    +
    77
    +
    78 if(argc <= 2) {
    +
    79 CLUTCHLOG(warning, "Log level not indicated, will default to xdebug");
    +
    80 log.threshold(clutchlog::level::xdebug);
    +
    81 } else {
    +
    82 try {
    +
    83 log.threshold(log.level_of(argv[1]));
    +
    84 } catch(std::out_of_range& err) {
    +
    85 CLUTCHLOG(critical,err.what());
    +
    86 exit(100);
    +
    87 }
    +
    88 }
    +
    89
    +
    90 CLUTCHLOG(progress,"Start something");
    +
    91 f();
    +
    92 CLUTCHLOG(progress,"I have stopped");
    +
    93}
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    diff --git a/docs/t-depth-delta_8cpp_source.html b/docs/t-depth-delta_8cpp_source.html index b7900c2..152053b 100644 --- a/docs/t-depth-delta_8cpp_source.html +++ b/docs/t-depth-delta_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-depth-delta.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,82 +84,79 @@ $(document).ready(function(){initNavTree('t-depth-delta_8cpp_source.html',''); i
    -
    -
    t-depth-delta.cpp
    +
    t-depth-delta.cpp
    -
    1 #include <iostream>
    -
    2 #include <limits>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 void deepcall()
    -
    7 {
    -
    8  CLUTCHLOG(warning,"at depth 4");
    -
    9  CLUTCHLOGD(warning,"at depth 4+1", 1);
    -
    10  CLUTCHLOGD(warning,"at depth 4+2", 2);
    -
    11 }
    -
    12 
    -
    13 void subsubsubcall()
    -
    14 {
    -
    15  CLUTCHLOG(warning,"at depth 3");
    -
    16  CLUTCHLOGD(warning,"at depth 3+1", 1);
    -
    17  CLUTCHLOGD(warning,"at depth 3+2", 2);
    -
    18  deepcall();
    -
    19 }
    -
    20 
    -
    21 void subsubcall()
    -
    22 {
    -
    23  CLUTCHLOG(warning,"at depth 2");
    -
    24  CLUTCHLOGD(warning,"at depth 2+1", 1);
    -
    25  CLUTCHLOGD(warning,"at depth 2+2", 2);
    -
    26  subsubsubcall();
    -
    27 }
    -
    28 
    -
    29 void subcall()
    -
    30 {
    -
    31  CLUTCHLOG(warning,"at depth 1");
    -
    32  CLUTCHLOGD(warning,"at depth 1+1", 1);
    -
    33  CLUTCHLOGD(warning,"at depth 1+2", 2);
    -
    34  subsubcall();
    -
    35 }
    -
    36 
    -
    37 int main(/*const int argc, char* argv[]*/)
    -
    38 {
    -
    39  auto& log = clutchlog::logger();
    -
    40  using fmt = clutchlog::fmt;
    -
    41  using typo = clutchlog::fmt::typo;
    -
    42 
    -
    43  fmt reset(typo::reset);
    -
    44  std::ostringstream tpl;
    -
    45  tpl << "{depth_fmt}{depth} {depth_marks}"
    -
    46  << reset << "{funchash_fmt}in {func} {msg}\t\n";
    -
    47  log.format(tpl.str());
    -
    48  log.threshold(clutchlog::level::xdebug);
    -
    49  std::vector<fmt> greys = {fmt(15)};
    -
    50  for(unsigned short i=255; i > 231; i-=3) {
    -
    51  greys.push_back( fmt(i) ); }
    -
    52  log.depth_styles( greys );
    -
    53  log.depth_mark("| ");
    -
    54 
    -
    55  CLUTCHLOG(warning,"in main");
    -
    56  subcall();
    -
    57 }
    -
    58 
    +
    1#include <iostream>
    +
    2#include <limits>
    +
    3
    +
    4#include "../clutchlog/clutchlog.h"
    +
    5
    +
    6void deepcall()
    +
    7{
    +
    8 CLUTCHLOG(warning,"at depth 4");
    +
    9 CLUTCHLOGD(warning,"at depth 4+1", 1);
    +
    10 CLUTCHLOGD(warning,"at depth 4+2", 2);
    +
    11}
    +
    12
    +
    13void subsubsubcall()
    +
    14{
    +
    15 CLUTCHLOG(warning,"at depth 3");
    +
    16 CLUTCHLOGD(warning,"at depth 3+1", 1);
    +
    17 CLUTCHLOGD(warning,"at depth 3+2", 2);
    +
    18 deepcall();
    +
    19}
    +
    20
    +
    21void subsubcall()
    +
    22{
    +
    23 CLUTCHLOG(warning,"at depth 2");
    +
    24 CLUTCHLOGD(warning,"at depth 2+1", 1);
    +
    25 CLUTCHLOGD(warning,"at depth 2+2", 2);
    +
    26 subsubsubcall();
    +
    27}
    +
    28
    +
    29void subcall()
    +
    30{
    +
    31 CLUTCHLOG(warning,"at depth 1");
    +
    32 CLUTCHLOGD(warning,"at depth 1+1", 1);
    +
    33 CLUTCHLOGD(warning,"at depth 1+2", 2);
    +
    34 subsubcall();
    +
    35}
    +
    36
    +
    37int main(/*const int argc, char* argv[]*/)
    +
    38{
    +
    39 auto& log = clutchlog::logger();
    +
    40 using fmt = clutchlog::fmt;
    +
    41 using typo = clutchlog::fmt::typo;
    +
    42
    +
    43 fmt reset(typo::reset);
    +
    44 std::ostringstream tpl;
    +
    45 tpl << "{depth_fmt}{depth} {depth_marks}"
    +
    46 << reset << "{funchash_fmt}in {func} {msg}\t\n";
    +
    47 log.format(tpl.str());
    +
    48 log.threshold(clutchlog::level::xdebug);
    +
    49 std::vector<fmt> greys{ fmt(15) };
    +
    50 for(unsigned short i=255; i > 231; i-=3) {
    +
    51 greys.push_back( fmt(i) ); }
    +
    52 log.depth_styles( greys );
    +
    53 log.depth_mark("| ");
    +
    54
    +
    55 CLUTCHLOG(warning,"in main");
    +
    56 subcall();
    +
    57}
    +
    58
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:393
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
    Log a message at the given level and with a given depth delta.
    Definition: clutchlog.h:82
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    #define CLUTCHLOGD(LEVEL, WHAT, DEPTH_DELTA)
    Log a message at the given level and with a given depth delta.
    Definition: clutchlog.h:81
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:392
    diff --git a/docs/t-dump_8cpp_source.html b/docs/t-dump_8cpp_source.html index 322f600..90d3cac 100644 --- a/docs/t-dump_8cpp_source.html +++ b/docs/t-dump_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-dump.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,42 +84,39 @@ $(document).ready(function(){initNavTree('t-dump_8cpp_source.html',''); initResi
    -
    -
    t-dump.cpp
    +
    t-dump.cpp
    -
    1 #include <iostream>
    -
    2 #include <algorithm>
    -
    3 #include <random>
    -
    4 
    -
    5 #include "../clutchlog/clutchlog.h"
    -
    6 
    -
    7 int main(/*const int argc, char* argv[]*/)
    -
    8 {
    -
    9  auto& log = clutchlog::logger();
    -
    10 
    -
    11  log.out(std::clog);
    -
    12  log.threshold(clutchlog::level::xdebug);
    -
    13 
    -
    14  std::vector<std::string> msg = {"hello", "world", "!"};
    -
    15 
    -
    16  CLUTCHDUMP(xdebug, msg, "test_{n}.dat");
    -
    17 
    -
    18  std::vector<int> v(3);
    -
    19  std::generate(v.begin(), v.end(), std::rand);
    -
    20  CLUTCHDUMP(info, v, "rand_{n}.dat");
    -
    21 }
    +
    1#include <iostream>
    +
    2#include <algorithm>
    +
    3#include <random>
    +
    4
    +
    5#include "../clutchlog/clutchlog.h"
    +
    6
    +
    7int main(/*const int argc, char* argv[]*/)
    +
    8{
    +
    9 auto& log = clutchlog::logger();
    +
    10
    +
    11 log.out(std::clog);
    +
    12 log.threshold(clutchlog::level::xdebug);
    +
    13
    +
    14 std::vector<std::string> msg = {"hello", "world", "!"};
    +
    15
    +
    16 CLUTCHDUMP(xdebug, msg, "test_{n}.dat");
    +
    17
    +
    18 std::vector<int> v(3);
    +
    19 std::generate(v.begin(), v.end(), std::rand);
    +
    20 CLUTCHDUMP(info, v, "rand_{n}.dat");
    +
    21}
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:108
    -
    #define CLUTCHDUMP(LEVEL, CONTAINER, FILENAME)
    Dump the given container.
    Definition: clutchlog.h:107
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    diff --git a/docs/t-extra_8cpp_source.html b/docs/t-extra_8cpp_source.html new file mode 100644 index 0000000..7a05e50 --- /dev/null +++ b/docs/t-extra_8cpp_source.html @@ -0,0 +1,240 @@ + + + + + + + +clutchlog: t-extra.cpp Source File + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    clutchlog 0.17 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    t-extra.cpp
    +
    +
    +
    1#include <iostream>
    +
    2
    +
    3#include "../clutchlog/clutchlog.h"
    +
    4
    +
    5void dump_data()
    +
    6{
    +
    7 CLUTCHLOG(progress, "Dump parsed data...");
    +
    8 CLUTCHLOG(debug, "Write in `data_dump.csv`");
    +
    9 CLUTCHLOG(debug, "Data frame size: " << 0 << "x" << "150");
    +
    10 CLUTCHLOG(xdebug, "Resolution: " << 0);
    +
    11}
    +
    12
    +
    13void reset()
    +
    14{
    +
    15 CLUTCHLOG(progress, "Reset data structures...");
    +
    16 CLUTCHLOG(debug, "OK");
    +
    17 CLUTCHLOG(info, "Reset functors...");
    +
    18 CLUTCHLOG(critical, "Impossible to reset, I cannot recover.");
    +
    19 dump_data();
    +
    20}
    +
    21
    +
    22void process()
    +
    23{
    +
    24 CLUTCHLOG(note, "Filling up data of size: " << 0);
    +
    25 CLUTCHLOG(error, "Cannot parse input, I will reset stuff.");
    +
    26 reset();
    +
    27 CLUTCHLOG(xdebug, "Last seen state: " << 0);
    +
    28}
    +
    29
    +
    30void init_data()
    +
    31{
    +
    32 CLUTCHLOG(debug, "Data frame size: " << 2 << "x" << "150");
    +
    33 CLUTCHLOG(xdebug, "Resolution: " << 0.001);
    +
    34 CLUTCHLOG(warning, "Input height < " << 3);
    +
    35}
    +
    36
    +
    37void init_func()
    +
    38{
    +
    39 CLUTCHLOG(progress, "Allocate memory...");
    +
    40 CLUTCHLOG(warning, "Dimension: " << 12);
    +
    41 CLUTCHLOG(debug, "OK");
    +
    42}
    +
    43
    +
    44void init()
    +
    45{
    +
    46 CLUTCHLOG(progress, "Initialize data structures...");
    +
    47 init_data();
    +
    48 CLUTCHLOG(debug, "OK");
    +
    49 CLUTCHLOG(progress, "Initialize functors...");
    +
    50 init_func();
    +
    51 CLUTCHLOG(debug, "OK");
    +
    52 CLUTCHLOG(progress, "Process...");
    +
    53 process();
    +
    54 CLUTCHLOG(debug, "OK");
    +
    55}
    +
    56
    +
    57int main(const int argc, char* argv[])
    +
    58{
    +
    59 using level = clutchlog::level;
    +
    60 using fmt = clutchlog::fmt;
    +
    61 using fg = clutchlog::fmt::fg;
    +
    62 using bg = clutchlog::fmt::bg;
    +
    63 using typo = clutchlog::fmt::typo;
    +
    64
    +
    65 auto& log = clutchlog::logger();
    +
    66
    +
    67 log.style(level::critical, 197);
    +
    68 log.style(level::error, 202);
    +
    69 log.style(level::warning, 208);
    +
    70 log.style(level::progress, 34);
    +
    71 log.style(level::note, 35);
    +
    72 log.style(level::info, 36);
    +
    73 log.style(level::debug, 39);
    +
    74 log.style(level::xdebug, 45);
    +
    75 std::ostringstream format;
    +
    76 fmt reset(typo::reset);
    +
    77 fmt discreet(fg::black);
    +
    78 fmt bold(fmt::typo::bold);
    +
    79
    +
    80 log.depth_mark("| ");
    +
    81 log.hfill_mark('-');
    +
    82
    +
    83 const short dark = 238;
    +
    84 const short lite = 245;
    +
    85
    +
    86 std::vector<clutchlog::fmt> greys{ fmt(15) };
    +
    87 for(unsigned short i=255; i>231; i-=3) {
    +
    88 greys.push_back( fmt(i) );
    +
    89 }
    +
    90 log.depth_styles(greys);
    +
    91
    +
    92 format
    +
    93 << fmt(dark,lite) << "{name}"
    +
    94 << fmt(fg::none,lite,typo::inverse) << "{level_fmt}"
    +
    95 << fmt(fg::none,bg::black,typo::inverse) << "{level_fmt}" << " {level_short} " << reset
    +
    96 << "{level_fmt} " << reset
    +
    97 << fmt(dark,bg::none, typo::bold) << "{depth_marks}" << reset
    +
    98 // << "{funchash_fmt}"
    +
    99 << "{level_fmt}"
    +
    100 << bold("{msg}")
    +
    101 // << discreet(" {hfill} ")
    +
    102 << fmt(dark,bg::none) << " ·" << ""
    +
    103 << fmt(fg::none,dark) << "{funchash_fmt}-{hfill}"
    +
    104 << fmt(fg::none,dark) << " {funchash_fmt}{func} "
    +
    105 << fmt(lite,dark) << ""
    +
    106 // << fmt(dark,lite) << "{filehash_fmt}{file}" << reset
    +
    107 << fmt(dark,lite) << "{file}" << reset
    +
    108 << fmt(dark,lite) << ""
    +
    109 << fmt(lite,dark) << "{line}" << reset
    +
    110 << "\n";
    +
    111 log.format(format.str());
    +
    112
    +
    113 log.out(std::clog);
    +
    114 log.strip_calls(4);
    +
    115 log.filename(clutchlog::filename::dirstem);
    +
    116
    +
    117 if(argc <= 2) {
    +
    118 CLUTCHLOG(warning, "Log level not indicated, will default to xdebug");
    +
    119 log.threshold(level::xdebug);
    +
    120 } else {
    +
    121 try {
    +
    122 log.threshold(log.level_of(argv[1]));
    +
    123 } catch(std::out_of_range& err) {
    +
    124 CLUTCHLOG(critical,err.what());
    +
    125 exit(100);
    +
    126 }
    +
    127 }
    +
    128
    +
    129 CLUTCHLOG(progress,"Start analysis");
    +
    130 init();
    +
    131 CLUTCHLOG(progress,"I have stopped");
    +
    132}
    +
    133
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:393
    +
    level
    Available log levels.
    Definition: clutchlog.h:314
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    +
    bg
    Background color codes.
    Definition: clutchlog.h:425
    +
    fg
    Foreground color codes.
    Definition: clutchlog.h:404
    +
    +
    + + + + diff --git a/docs/t-filename_8cpp_source.html b/docs/t-filename_8cpp_source.html index 3f00cb7..609b894 100644 --- a/docs/t-filename_8cpp_source.html +++ b/docs/t-filename_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-filename.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,52 +84,49 @@ $(document).ready(function(){initNavTree('t-filename_8cpp_source.html',''); init
    -
    -
    t-filename.cpp
    +
    t-filename.cpp
    -
    1 #include <iostream>
    -
    2 #include <limits>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 int main(/*const int argc, char* argv[]*/)
    -
    7 {
    -
    8  auto& log = clutchlog::logger();
    -
    9  log.format("{msg}\t= {filehash_fmt}{file}\n");
    -
    10  log.threshold(clutchlog::level::xdebug);
    -
    11 
    -
    12  log.filename(clutchlog::filename::path);
    -
    13  CLUTCHLOG(note,"clutchlog::filename::path");
    -
    14 
    -
    15  log.filename(clutchlog::filename::base);
    -
    16  CLUTCHLOG(note,"clutchlog::filename::base");
    -
    17 
    -
    18  log.filename(clutchlog::filename::dir);
    -
    19  CLUTCHLOG(note,"clutchlog::filename::dir");
    -
    20 
    -
    21  log.filename(clutchlog::filename::dirbase);
    -
    22  CLUTCHLOG(note,"clutchlog::filename::dirbase");
    -
    23 
    -
    24  log.filename(clutchlog::filename::stem);
    -
    25  CLUTCHLOG(note,"clutchlog::filename::stem");
    -
    26 
    -
    27  log.filename(clutchlog::filename::dirstem);
    -
    28  CLUTCHLOG(note,"clutchlog::filename::dirstem");
    -
    29 }
    -
    30 
    -
    31 
    +
    1#include <iostream>
    +
    2#include <limits>
    +
    3
    +
    4#include "../clutchlog/clutchlog.h"
    +
    5
    +
    6int main(/*const int argc, char* argv[]*/)
    +
    7{
    +
    8 auto& log = clutchlog::logger();
    +
    9 log.format("{msg}\t= {filehash_fmt}{file}\n");
    +
    10 log.threshold(clutchlog::level::xdebug);
    +
    11
    +
    12 log.filename(clutchlog::filename::path);
    +
    13 CLUTCHLOG(note,"clutchlog::filename::path");
    +
    14
    +
    15 log.filename(clutchlog::filename::base);
    +
    16 CLUTCHLOG(note,"clutchlog::filename::base");
    +
    17
    +
    18 log.filename(clutchlog::filename::dir);
    +
    19 CLUTCHLOG(note,"clutchlog::filename::dir");
    +
    20
    +
    21 log.filename(clutchlog::filename::dirbase);
    +
    22 CLUTCHLOG(note,"clutchlog::filename::dirbase");
    +
    23
    +
    24 log.filename(clutchlog::filename::stem);
    +
    25 CLUTCHLOG(note,"clutchlog::filename::stem");
    +
    26
    +
    27 log.filename(clutchlog::filename::dirstem);
    +
    28 CLUTCHLOG(note,"clutchlog::filename::dirstem");
    +
    29}
    +
    30
    +
    31
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    diff --git a/docs/t-fmt-constructors_8cpp_source.html b/docs/t-fmt-constructors_8cpp_source.html index 1f181a8..4a68835 100644 --- a/docs/t-fmt-constructors_8cpp_source.html +++ b/docs/t-fmt-constructors_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-fmt-constructors.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,68 +84,65 @@ $(document).ready(function(){initNavTree('t-fmt-constructors_8cpp_source.html','
    -
    -
    t-fmt-constructors.cpp
    +
    t-fmt-constructors.cpp
    -
    1 #include <iostream>
    -
    2 #include <limits>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 int main(/*const int argc, char* argv[]*/)
    -
    7 {
    -
    8  using fmt = clutchlog::fmt;
    -
    9  using fg = clutchlog::fmt::fg;
    -
    10  using bg = clutchlog::fmt::bg;
    -
    11  using typo = clutchlog::fmt::typo;
    -
    12 
    -
    13  fmt none;
    -
    14  fmt c16_full(fg::red , bg::black , typo::bold);
    -
    15  fmt c16_nofg(bg::black , typo::bold);
    -
    16  fmt c16_nobg(fg::red , typo::bold);
    -
    17  fmt c16_fg (fg::red );
    -
    18  fmt c16_bg (bg::red );
    -
    19  fmt c16_typo(typo::bold);
    -
    20  fmt c16_bft (bg::black , fg::red , typo::bold);
    -
    21  fmt c16_bgfg(bg::black , fg::red );
    -
    22  fmt c16_tbf (typo::bold, bg::black , fg::red );
    -
    23  fmt c16_tfb (typo::bold, fg::red , bg::black );
    -
    24  fmt c16_tf (typo::bold, fg::red );
    -
    25  fmt c16_tb (typo::bold, bg::black );
    -
    26 
    -
    27  fmt c256_fbt(196 , 236 , typo::bold);
    -
    28  fmt c256_ft (196 , typo::bold);
    -
    29  fmt c256_fb (196 , 236 );
    -
    30  fmt c256_nbt(fg::none, 236 , typo::bold);
    -
    31  fmt c256_fnt(196 , bg::none , typo::bold);
    -
    32  fmt c256_nb (fg::none, 236 );
    -
    33  fmt c256_fn (196 , bg::none );
    -
    34 
    -
    35  fmt c16M_fbt(255,10,10 , 10,10,20 , typo::bold);
    -
    36  fmt c16M_ft (255,10,10 , typo::bold);
    -
    37  fmt c16M_fb (255,10,10 , 10,10,20 );
    -
    38  fmt c16M_nbt(fg::none , 10,10,20 , typo::bold);
    -
    39  fmt c16M_fnt(255,10,10 , bg::none , typo::bold);
    -
    40  fmt c16M_nb (fg::none , 10,10,20 );
    -
    41  fmt c16M_fn (255,10,10 , bg::none );
    -
    42 }
    -
    43 
    -
    44 
    -
    45 
    +
    1#include <iostream>
    +
    2#include <limits>
    +
    3
    +
    4#include "../clutchlog/clutchlog.h"
    +
    5
    +
    6int main(/*const int argc, char* argv[]*/)
    +
    7{
    +
    8 using fmt = clutchlog::fmt;
    +
    9 using fg = clutchlog::fmt::fg;
    +
    10 using bg = clutchlog::fmt::bg;
    +
    11 using typo = clutchlog::fmt::typo;
    +
    12
    +
    13 fmt none;
    +
    14 fmt c16_full(fg::red , bg::black , typo::bold);
    +
    15 fmt c16_nofg(bg::black , typo::bold);
    +
    16 fmt c16_nobg(fg::red , typo::bold);
    +
    17 fmt c16_fg (fg::red );
    +
    18 fmt c16_bg (bg::red );
    +
    19 fmt c16_typo(typo::bold);
    +
    20 fmt c16_bft (bg::black , fg::red , typo::bold);
    +
    21 fmt c16_bgfg(bg::black , fg::red );
    +
    22 fmt c16_tbf (typo::bold, bg::black , fg::red );
    +
    23 fmt c16_tfb (typo::bold, fg::red , bg::black );
    +
    24 fmt c16_tf (typo::bold, fg::red );
    +
    25 fmt c16_tb (typo::bold, bg::black );
    +
    26
    +
    27 fmt c256_fbt(196 , 236 , typo::bold);
    +
    28 fmt c256_ft (196 , typo::bold);
    +
    29 fmt c256_fb (196 , 236 );
    +
    30 fmt c256_nbt(fg::none, 236 , typo::bold);
    +
    31 fmt c256_fnt(196 , bg::none , typo::bold);
    +
    32 fmt c256_nb (fg::none, 236 );
    +
    33 fmt c256_fn (196 , bg::none );
    +
    34
    +
    35 fmt c16M_fbt(255,10,10 , 10,10,20 , typo::bold);
    +
    36 fmt c16M_ft (255,10,10 , typo::bold);
    +
    37 fmt c16M_fb (255,10,10 , 10,10,20 );
    +
    38 fmt c16M_nbt(fg::none , 10,10,20 , typo::bold);
    +
    39 fmt c16M_fnt(255,10,10 , bg::none , typo::bold);
    +
    40 fmt c16M_nb (fg::none , 10,10,20 );
    +
    41 fmt c16M_fn (255,10,10 , bg::none );
    +
    42}
    +
    43
    +
    44
    +
    45
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:393
    +
    bg
    Background color codes.
    Definition: clutchlog.h:425
    +
    fg
    Foreground color codes.
    Definition: clutchlog.h:404
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    -
    bg
    Background color codes.
    Definition: clutchlog.h:424
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:392
    -
    fg
    Foreground color codes.
    Definition: clutchlog.h:403
    diff --git a/docs/t-hash-color_8cpp_source.html b/docs/t-hash-color_8cpp_source.html index 278db16..383f744 100644 --- a/docs/t-hash-color_8cpp_source.html +++ b/docs/t-hash-color_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-hash-color.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,72 +84,69 @@ $(document).ready(function(){initNavTree('t-hash-color_8cpp_source.html',''); in
    -
    -
    t-hash-color.cpp
    +
    t-hash-color.cpp
    -
    1 #include <iostream>
    -
    2 #include <limits>
    -
    3 
    -
    4 #include "../clutchlog/clutchlog.h"
    -
    5 
    -
    6 void deepcall()
    -
    7 {
    -
    8  CLUTCHLOG(warning,"at depth 4");
    -
    9 }
    -
    10 
    -
    11 void subsubsubcall()
    -
    12 {
    -
    13  CLUTCHLOG(warning,"at depth 3");
    -
    14  deepcall();
    -
    15 }
    -
    16 
    -
    17 void subsubcall()
    -
    18 {
    -
    19  CLUTCHLOG(warning,"at depth 2");
    -
    20  subsubsubcall();
    -
    21 }
    -
    22 
    -
    23 void subcall()
    -
    24 {
    -
    25  CLUTCHLOG(warning,"at depth 1");
    -
    26  subsubcall();
    -
    27 }
    -
    28 
    -
    29 int main(/*const int argc, char* argv[]*/)
    -
    30 {
    -
    31  auto& log = clutchlog::logger();
    -
    32  using fmt = clutchlog::fmt;
    -
    33  using typo = clutchlog::fmt::typo;
    -
    34 
    -
    35  fmt reset(typo::reset);
    -
    36  std::ostringstream tpl;
    -
    37  tpl << "{level_fmt}Having a {level} {filehash_fmt}within {file} {funchash_fmt}calling {func} {depth_fmt}at depth {depth_marks} {depth} "
    -
    38  << reset << " : {msg}\n";
    -
    39  log.format(tpl.str());
    -
    40  log.threshold(clutchlog::level::xdebug);
    -
    41 
    -
    42  log.filehash_styles( {fmt(fmt::fg::red), fmt(fmt::fg::yellow)} );
    -
    43  log.funchash_styles( {fmt(fmt::fg::green), fmt(fmt::fg::blue),
    -
    44  fmt(fmt::fg::bright_green), fmt(fmt::fg::bright_blue), fmt(fmt::fg::magenta)} );
    -
    45  log.depth_styles( {fmt(255),fmt(250),fmt(245),fmt(240)} );
    -
    46 
    -
    47  CLUTCHLOG(warning,"in main");
    -
    48  subcall();
    -
    49 }
    +
    1#include <iostream>
    +
    2#include <limits>
    +
    3
    +
    4#include "../clutchlog/clutchlog.h"
    +
    5
    +
    6void deepcall()
    +
    7{
    +
    8 CLUTCHLOG(warning,"at depth 4");
    +
    9}
    +
    10
    +
    11void subsubsubcall()
    +
    12{
    +
    13 CLUTCHLOG(warning,"at depth 3");
    +
    14 deepcall();
    +
    15}
    +
    16
    +
    17void subsubcall()
    +
    18{
    +
    19 CLUTCHLOG(warning,"at depth 2");
    +
    20 subsubsubcall();
    +
    21}
    +
    22
    +
    23void subcall()
    +
    24{
    +
    25 CLUTCHLOG(warning,"at depth 1");
    +
    26 subsubcall();
    +
    27}
    +
    28
    +
    29int main(/*const int argc, char* argv[]*/)
    +
    30{
    +
    31 auto& log = clutchlog::logger();
    +
    32 using fmt = clutchlog::fmt;
    +
    33 using typo = clutchlog::fmt::typo;
    +
    34
    +
    35 fmt reset(typo::reset);
    +
    36 std::ostringstream tpl;
    +
    37 tpl << "{level_fmt}Having a {level} {filehash_fmt}within {file} {funchash_fmt}calling {func} {depth_fmt}at depth {depth_marks} {depth} "
    +
    38 << reset << " : {msg}\n";
    +
    39 log.format(tpl.str());
    +
    40 log.threshold(clutchlog::level::xdebug);
    +
    41
    +
    42 log.filehash_styles( {fmt(fmt::fg::red), fmt(fmt::fg::yellow)} );
    +
    43 log.funchash_styles( {fmt(fmt::fg::green), fmt(fmt::fg::blue),
    +
    44 fmt(fmt::fg::bright_green), fmt(fmt::fg::bright_blue), fmt(fmt::fg::magenta)} );
    +
    45 log.depth_styles( {fmt(255),fmt(250),fmt(245),fmt(240)} );
    +
    46
    +
    47 CLUTCHLOG(warning,"in main");
    +
    48 subcall();
    +
    49}
    +
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:380
    +
    typo
    Typographic style codes.
    Definition: clutchlog.h:393
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    Color and style formatter for ANSI terminal escape sequences.
    Definition: clutchlog.h:379
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    -
    typo
    Typographic style codes.
    Definition: clutchlog.h:392
    diff --git a/docs/t-log_8cpp_source.html b/docs/t-log_8cpp_source.html index be366c8..cb78594 100644 --- a/docs/t-log_8cpp_source.html +++ b/docs/t-log_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-log.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,91 +84,88 @@ $(document).ready(function(){initNavTree('t-log_8cpp_source.html',''); initResiz
    -
    -
    t-log.cpp
    +
    t-log.cpp
    -
    1 #include <iostream>
    -
    2 
    -
    3 #include "../clutchlog/clutchlog.h"
    -
    4 
    -
    5 void h()
    -
    6 {
    -
    7  CLUTCHLOG(info, "!");
    -
    8  std::clog << "--" << std::endl;
    -
    9 }
    -
    10 
    -
    11 void g()
    -
    12 {
    -
    13  CLUTCHLOG(warning, "world");
    -
    14  h();
    -
    15 }
    -
    16 
    -
    17 void f()
    -
    18 {
    -
    19  CLUTCHLOG(error, "hello ");
    -
    20  g();
    -
    21 }
    -
    22 
    -
    23 int main(/*const int argc, char* argv[]*/)
    -
    24 {
    -
    25  auto& log = clutchlog::logger();
    -
    26 
    -
    27  log.out(std::clog);
    -
    28 
    -
    29  std::clog << "depth: 99; threshold: xdebug; location: .*" << std::endl;
    -
    30 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    31  log.depth(99);
    -
    32 #endif
    -
    33  log.threshold(clutchlog::level::xdebug);
    -
    34  log.location(".*",".*");
    -
    35  f();
    -
    36 
    -
    37  std::clog << "depth: 4; threshold: xdebug; location: ,*" << std::endl;
    -
    38 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    39  log.depth(4);
    -
    40 #endif
    -
    41  assert(log.levels().find("XDebug") != std::end(log.levels())); // contains
    -
    42  assert(log.levels().find("Xdebug") == std::end(log.levels())); // not contains
    -
    43  log.threshold("XDebug");
    -
    44  log.location(".*");
    -
    45  f();
    -
    46 
    -
    47  std::clog << "depth: 99; threshold: warning; location: .*" << std::endl;
    -
    48 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    49  log.depth(99);
    -
    50 #endif
    -
    51  log.threshold(clutchlog::level::warning);
    -
    52  log.location(".*");
    -
    53  f();
    -
    54 
    -
    55  std::clog << "depth: 99; threshold: xdebug; location: 'core','g'" << std::endl;
    -
    56 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    57  log.depth(99);
    -
    58 #endif
    -
    59  log.threshold(clutchlog::level::xdebug);
    -
    60  log.location("core","g");
    -
    61  f();
    -
    62 
    -
    63  std::clog << "depth: 99; threshold: debug; location: '.*','(g|h)'" << std::endl;
    -
    64 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    -
    65  log.depth(99);
    -
    66 #endif
    -
    67  log.threshold("Debug");
    -
    68  log.location(".*","(g|h)");
    -
    69  f();
    -
    70 }
    +
    1#include <iostream>
    +
    2
    +
    3#include "../clutchlog/clutchlog.h"
    +
    4
    +
    5void h()
    +
    6{
    +
    7 CLUTCHLOG(info, "!");
    +
    8 std::clog << "--" << std::endl;
    +
    9}
    +
    10
    +
    11void g()
    +
    12{
    +
    13 CLUTCHLOG(warning, "world");
    +
    14 h();
    +
    15}
    +
    16
    +
    17void f()
    +
    18{
    +
    19 CLUTCHLOG(error, "hello ");
    +
    20 g();
    +
    21}
    +
    22
    +
    23int main(/*const int argc, char* argv[]*/)
    +
    24{
    +
    25 auto& log = clutchlog::logger();
    +
    26
    +
    27 log.out(std::clog);
    +
    28
    +
    29 std::clog << "depth: 99; threshold: xdebug; location: .*" << std::endl;
    +
    30#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    31 log.depth(99);
    +
    32#endif
    +
    33 log.threshold(clutchlog::level::xdebug);
    +
    34 log.location(".*",".*");
    +
    35 f();
    +
    36
    +
    37 std::clog << "depth: 4; threshold: xdebug; location: ,*" << std::endl;
    +
    38#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    39 log.depth(4);
    +
    40#endif
    +
    41 assert(log.levels().find("XDebug") != std::end(log.levels())); // contains
    +
    42 assert(log.levels().find("Xdebug") == std::end(log.levels())); // not contains
    +
    43 log.threshold("XDebug");
    +
    44 log.location(".*");
    +
    45 f();
    +
    46
    +
    47 std::clog << "depth: 99; threshold: warning; location: .*" << std::endl;
    +
    48#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    49 log.depth(99);
    +
    50#endif
    +
    51 log.threshold(clutchlog::level::warning);
    +
    52 log.location(".*");
    +
    53 f();
    +
    54
    +
    55 std::clog << "depth: 99; threshold: xdebug; location: 'core','g'" << std::endl;
    +
    56#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    57 log.depth(99);
    +
    58#endif
    +
    59 log.threshold(clutchlog::level::xdebug);
    +
    60 log.location("core","g");
    +
    61 f();
    +
    62
    +
    63 std::clog << "depth: 99; threshold: debug; location: '.*','(g|h)'" << std::endl;
    +
    64#if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
    +
    65 log.depth(99);
    +
    66#endif
    +
    67 log.threshold("Debug");
    +
    68 log.location(".*","(g|h)");
    +
    69 f();
    +
    70}
    +
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:307
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    static clutchlog & logger()
    Get the logger instance.
    Definition: clutchlog.h:306
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    diff --git a/docs/t-one-line-if_8cpp_source.html b/docs/t-one-line-if_8cpp_source.html index d135c05..6c58249 100644 --- a/docs/t-one-line-if_8cpp_source.html +++ b/docs/t-one-line-if_8cpp_source.html @@ -2,8 +2,8 @@ - - + + clutchlog: t-one-line-if.cpp Source File @@ -24,11 +24,10 @@
    - + - @@ -36,21 +35,22 @@
    -
    clutchlog -  0.16 +
    +
    clutchlog 0.17
    - + +/* @license-end */ +
    @@ -64,7 +64,7 @@ $(function() {
    @@ -84,34 +84,31 @@ $(document).ready(function(){initNavTree('t-one-line-if_8cpp_source.html',''); i
    -
    -
    t-one-line-if.cpp
    +
    t-one-line-if.cpp
    -
    1 #include "../clutchlog/clutchlog.h"
    -
    2 
    -
    3 int main()
    -
    4 {
    -
    5  if(true)
    -
    6  CLUTCHLOG(error, "WHAT?");
    -
    7  else
    -
    8  CLUTCHLOG(info, "OH!");
    -
    9 
    -
    10  if(false)
    -
    11  CLUTCHLOG(info, "AH!");
    -
    12  else
    -
    13  CLUTCHLOG(error, "NO!");
    -
    14 }
    +
    1#include "../clutchlog/clutchlog.h"
    +
    2
    +
    3int main()
    +
    4{
    +
    5 if(true)
    +
    6 CLUTCHLOG(error, "WHAT?");
    +
    7 else
    +
    8 CLUTCHLOG(info, "OH!");
    +
    9
    +
    10 if(false)
    +
    11 CLUTCHLOG(info, "AH!");
    +
    12 else
    +
    13 CLUTCHLOG(error, "NO!");
    +
    14}
    +
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:99
    -
    #define CLUTCHLOG(LEVEL, WHAT)
    Log a message at the given level.
    Definition: clutchlog.h:98
    diff --git a/docs/tabs.css b/docs/tabs.css index 7d45d36..fb0977a 100644 --- a/docs/tabs.css +++ b/docs/tabs.css @@ -1 +1 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} From 5609007da7fcdf742f1a9fb3ea74d96d846c4eab Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Tue, 10 Sep 2024 16:23:03 +0200 Subject: [PATCH 19/24] refactor(constructors): make all constructor explicits & use integral types --- clutchlog/clutchlog.h | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index 9d9466b..9efb6dc 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -712,45 +712,46 @@ class clutchlog /** @name All combination of 16-colors mode constructors with different parameters orders. * @{ */ - fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} - fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} - fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} - fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} - fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} - fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} + explicit fmt( fg f, bg b = bg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} + explicit fmt( fg f, typo s , bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} + explicit fmt( bg b, fg f = fg::none, typo s = typo::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} + explicit fmt( bg b, typo s , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} + explicit fmt(typo s, fg f = fg::none, bg b = bg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} + explicit fmt(typo s, bg b , fg f = fg::none) : mode(ansi::colors_16), style(s), fore(f), back(b) {} /** @} */ /** @name All combination of 256-colors mode constructors with different parameters orders. * @{ */ - fmt(fg_256 f, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {} - fmt(fg_256 f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {} - fmt(fg, bg_256 b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {} + explicit fmt(const short f, const short b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(b) {} + explicit fmt(const short f, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {} + explicit fmt(fg, const short b, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(fg::none), back_256(b) {} + explicit fmt(const short f, bg, typo s = typo::none) : mode(ansi::colors_256), style(s), fore_256(f), back_256(bg::none) {} /** @} */ /** @name All combination of 16M-colors mode constructors with different parameters orders. * @{ */ - fmt(const short fr, const short fg, const short fb, + explicit fmt(const short fr, const short fg, const short fb, const short gr, const short gg, const short gb, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(gr,gg,gb) {} - fmt(fg, + explicit fmt(fg, const short gr, const short gg, const short gb, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(gr,gg,gb) {} - fmt(const short fr, const short fg, const short fb, + explicit fmt(const short fr, const short fg, const short fb, bg, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {} - fmt(const short fr, const short fg, const short fb, + explicit fmt(const short fr, const short fg, const short fb, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(fr,fg,fb), back_16M(bg::none) {} - fmt(const std::string& f, const std::string& b, typo s = typo::none) + explicit fmt(const std::string& f, const std::string& b, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(b) {} - fmt(fg, const std::string& b, typo s = typo::none) + explicit fmt(fg, const std::string& b, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(fg::none), back_16M(b) {} - fmt(const std::string& f, bg, typo s = typo::none) + explicit fmt(const std::string& f, bg, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {} - fmt(const std::string& f, typo s = typo::none) + explicit fmt(const std::string& f, typo s = typo::none) : mode(ansi::colors_16M), style(s), fore_16M(f), back_16M(bg::none) {} /** @} */ From 36451de3c754437c69645746ec947da3cba4393b Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Tue, 10 Sep 2024 16:24:23 +0200 Subject: [PATCH 20/24] fix: avoid unecessary copy constructor --- clutchlog/clutchlog.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index 9efb6dc..22309aa 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -832,7 +832,7 @@ class clutchlog if(domain.size() == 0) { return fmt(static_cast(h % 256)); } else { - return fmt(domain[h % domain.size()]); + return domain[h % domain.size()]; } } }; // fmt class From 43028ec0d5042920e31ad67fd71069a43979aa3b Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Tue, 10 Sep 2024 16:25:19 +0200 Subject: [PATCH 21/24] fix(OFF): return singleton even when OFF --- clutchlog/clutchlog.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index 22309aa..e6ab9ec 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -1505,7 +1505,10 @@ class clutchlog class clutchlog { public: - static clutchlog& logger() {} + static clutchlog& logger() { + static clutchlog instance; + return instance; + } enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7}; enum filename {path, base, dir, dirbase, stem, dirstem}; class fmt { From 799ba17a183f9985756ca4ead6fe931513a904a5 Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Tue, 10 Sep 2024 16:26:08 +0200 Subject: [PATCH 22/24] fix(OFF): return values even when OFF --- clutchlog/clutchlog.h | 48 ++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index e6ab9ec..eeace5a 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -1603,9 +1603,9 @@ class clutchlog protected: std::ostream& print_on( std::ostream&) const {} public: - friend std::ostream& operator<<(std::ostream&, const fmt&) {} - std::string operator()( const std::string&) const {} - std::string str() const {} + friend std::ostream& operator<<(std::ostream& os, const fmt&) { return os; } + std::string operator()( const std::string& msg) const { return msg; } + std::string str() const { return ""; } static fmt hash( const std::string&, const std::vector) {} }; public: @@ -1624,32 +1624,32 @@ class clutchlog {} public: void format(const std::string&) {} - std::string format() const {} + std::string format() const { return ""; } void format_comment(const std::string&) {} - std::string format_comment() const {} + std::string format_comment() const { return ""; } void out(std::ostream&) {} std::ostream& out() {} #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 void depth(size_t) {} - size_t depth() const {} + size_t depth() const { return 0; } void depth_mark(const std::string) {} - std::string depth_mark() const {} + std::string depth_mark() const { return ""; } void strip_calls(const size_t) {} - size_t strip_calls() const {} + size_t strip_calls() const { return 0; } #endif #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1 void hfill_mark(const char) {} - char hfill_mark() const {} + char hfill_mark() const { return '\0'; } void hfill_fmt(fmt) {} - fmt hfill_fmt() const {} + fmt hfill_fmt() const { return fmt(); } void hfill_min(const size_t) {} - size_t hfill_min() {} + size_t hfill_min() { return 0; } void hfill_max(const size_t) {} - size_t hfill_max() {} + size_t hfill_max() { return 0; } #endif void filehash_styles(std::vector ) {} void funchash_styles(std::vector ) {} @@ -1657,9 +1657,9 @@ class clutchlog void threshold(level) {} void threshold(const std::string&) {} - level threshold() const {} + level threshold() const { return level::error; } const std::map levels() const {} - level level_of(const std::string) {} + level level_of(const std::string) { return level::error; } void file(std::string) {} void func(std::string) {} @@ -1677,25 +1677,29 @@ class clutchlog template void style(level, FMT...) {} void style(level, fmt) {} - fmt style(level) const {} + fmt style(level) const { return fmt(); } void filename(filename) {} public: std::string replace( - const std::string&, + const std::string& form, const std::string&, const std::string& ) const - {} + { + return form; + } std::string replace( - const std::string&, + const std::string& form, const std::string&, const size_t ) const - {} + { + return form; + } std::string format( - std::string, + std::string row, const std::string&, #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 const std::string&, @@ -1709,7 +1713,9 @@ class clutchlog const size_t #endif ) const - {} + { + return row; + } void log( const level&, From 28f50d0badd8471e8ae3221ecd2ac9338ffa9bd3 Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Sat, 21 Sep 2024 11:07:51 +0200 Subject: [PATCH 23/24] fix(depth): handle underflow gracefully If asked for stripping more calls than the actual depth, clutchlog was going in an infinite loop. --- clutchlog/clutchlog.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index eeace5a..764529d 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -1333,7 +1333,10 @@ class clutchlog row = replace(row, "\\{level_short\\}", _level_short.at(stage)); #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 - size_t actual_depth = depth - _strip_calls; + size_t actual_depth = 0; + if( _strip_calls < depth) { + actual_depth = depth - _strip_calls; + } row = replace(row, "\\{name\\}", name); row = replace(row, "\\{depth\\}", actual_depth); @@ -1358,6 +1361,7 @@ class clutchlog row = replace(row, "\\{depth_marks\\}", chevrons.str()); } #endif + row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str()); row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() ); row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() ); From c8d148cf97eb8921a4f3e6df1a4fe45ca87b2f76 Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Tue, 1 Oct 2024 09:47:23 +0200 Subject: [PATCH 24/24] fix(depth): avoid overflow when manually setting depth Setting the depth to INTMAX was overflowing if strep calls was also set, resulting in no log triggered. --- clutchlog/clutchlog.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index 764529d..9a2c57f 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -32,6 +32,7 @@ #define CLUTCHLOG_HAVE_UNIX_SYSINFO 1 #else #define CLUTCHLOG_HAVE_UNIX_SYSINFO 0 + // #pragma message("[clutchlog] no POSIX SYSINFO header") #endif //! True if the system can handle the `hfill` feature. @@ -42,6 +43,7 @@ #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 1 #else #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 0 + // #pragma message("[clutchlog] no POSIX SYSIOCTL header") #endif @@ -52,7 +54,12 @@ #ifndef NDEBUG //! Actually enable clutchlog features. #define WITH_CLUTCHLOG + // #pragma message("[clutchlog] automatically enabled") + // #else + // #pragma message("[clutchlog] automatically disabled") #endif +// #else + // #pragma message("[clutchlog] manually enabled") #endif /********************************************************************** @@ -171,6 +178,7 @@ #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {/*nothing*/} while(0) #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {/*nothing*/} while(0) #define CLUTCHCODE( LEVEL, CODE ) do {/*nothing*/} while(0) + // #pragma message("[clutchlog] fully disabled") #endif // WITH_CLUTCHLOG /********************************************************************** @@ -999,7 +1007,9 @@ class clutchlog #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 //! Set the stack depth above which logs are not printed. - void depth(size_t d) {_depth = d;} + void depth(size_t d) { + _depth = std::min(d, std::numeric_limits::max() - _strip_calls); + } //! Get the stack depth above which logs are not printed. size_t depth() const {return _depth;}