From 62343d06e0b786f05f650828934995d4f865cb56 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Fri, 13 Dec 2019 02:05:53 +0100 Subject: [PATCH] Stared reimplementing iohelper using concepts --- .gitignore | 42 ++++++++++++++++++++ src/write.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ test | Bin 0 -> 18976 bytes 3 files changed, 147 insertions(+) create mode 100644 .gitignore create mode 100644 src/write.cpp create mode 100755 test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..154005c --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +### Git ### +*.orig + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### premake-gmake ### +Makefile +*.make +build/ + +### Vim ### +# swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] +# session +Session.vim +# temporary +.netrwhist +# auto-generated tag files +tags +.clangd/ +compile_commands.json + +### Other stuff ### +.build +bootstrap/build/ +bootstrap/vendor/ diff --git a/src/write.cpp b/src/write.cpp new file mode 100644 index 0000000..bf94814 --- /dev/null +++ b/src/write.cpp @@ -0,0 +1,105 @@ +#include +#include + +namespace io { + template + void write(std::ostream&, T) { + static_assert(!std::is_same_v, "No known specialization of io::write for type"); + } + + template + concept NumberByte = std::is_integral_v && sizeof(T) == 1; + + template + void write(std::ostream& os, T value) { + os.write(reinterpret_cast(&value), sizeof(T)); + } + + namespace { + template + void write_bytes(std::ostream& os, T value, size_t length) { + for (auto i = length; i > 0; --i) { + uint8_t byte = (value >> (i-1)*8) & 0xFF; + write(os, byte); + } + } + } + + template requires std::is_integral_v + void write(std::ostream& os, T value) { + write_bytes(os, value, sizeof(T)); + } + + // Special implementation for size_t (also uint64_t, so maybe this is not that smart) + template <> + void write(std::ostream& os, size_t value) { + // Check if we need more then one byte + if (value > 0b01111111) { + // Calculate how many bytes we need to store the number + uint8_t length = 0; + auto x = value; + while (x != 0) { + x >>= 8; + length++; + } + + write(os, length | 0b10000000); + write_bytes(os, value, length); + } else { + write(os, value); + } + } + + template requires std::is_convertible_v + void write(std::ostream& os, T value) { + std::string_view s = value; + write(os, s.length()); + os << s; + } + + template + concept Container = requires (T a) { + typename T::value_type; + typename T::size_type; + typename T::iterator; + typename T::const_iterator; + a.size(); + a.begin(); + a.end(); + a.cbegin(); + a.cend(); + } && !std::is_convertible_v; + + template + void write(std::ostream& os, T value) { + write(os, value.size()); + for (const auto& entry : value) { + write(os, entry); + } + } +} + +#include +#include + +struct A { + int b; +}; + +namespace io { + template <> + void write(std::ostream& os, A value) { + write(os, value.b); + } +} + +int main() { + std::cout << "TEST\n"; + io::write(std::cout, 50); + + std::array a = {'a', 'b'}; + io::write(std::cout, a); + io::write(std::cout, "test"); + io::write(std::cout, A{4}); + std::cout << '\n'; +} diff --git a/test b/test new file mode 100755 index 0000000000000000000000000000000000000000..92c840f127a604e787e4681c1e656fead8f1969e GIT binary patch literal 18976 zcmeHP4{%(?dEdLUY}wc+VQes9@EPo>UGSlQ7IwhlPSV*=APHef#QZUj)7?qBSf>+r z?~Lq(qK*ucvm)wHT4+mB&x9~!N?SL{xGs}Y*-mYTNmBtCpp-P4jA>=;8UY3?sp0zj z_U(7~-s!G`Go8t_bE~=gc7NZW{r214x9|47)uVxy%}$3yaB_(+3M%cdG!dU->~ByR z5TDo}F2VP;;uy=|nnV+rCL&``V`JJV!q){Q5TJ&L zT_rWAilH}yxm>+5dn53lQw4y1@|%1hdn7}N-bA`YE z28!1eU_A$XaRK~_BKRK`!4JVkAv@HPLipSwcJ3^Kf4hjC6~I0Cb|}W4d|{Mt zDT0pzFXVqO>|ZLb6vI9UAXTC)6UIT(2#0RCf%?8)=z4D~KAfuNt z(i=@0kwj-}V}E=g(i!aTkC?o|oO?Tr{$z89QC%JC3np|U5sVti=1?H86GZ6w;GaswOI;? zSW7D&#Kn?mbP-)?&nql-RTL|ZQ#i~@1z+d+y1egF(h}l;x{fpMq6-$%p*-BDclsGed{lAmueFgg<=SZ3zuY8*_Sm@L%uHw_ zKPo>eo19tyOTd}cC-Gge!iOA{`-pdHGJ~}GZ7S39e`-ROU!yWD?We|N`4uYDl78xd zEFYmVE#;^7%koQ9rX~E;K3V=Am1*fdHHMx*nYIfTd`sfxgn1BvUjQ%vR$x&j`3*e zN2auNYEm0p-|2?su}wcFb9+9^WVDe-CLi6|bu4gRXrqBiEghHvG$V{lwZpNQ@`{6j z^CRPquLaJZo|5?!!xaZ7AUTzOLrWi@T82)kIM{Vw8*QB=R7?Mq;E&ZCTyZnfR+Xy9b})z@cc zS*72^rqvTUtCi_TE~Ha4Bad8gq-uWuk(o>eBXKR7{C#TjUtYj48CyDVBSm5Ten1$^ zf=cM=DlnCymr3m(XckXBhp=tue)h;<$iWeqk+It|Zn)ttM$7T3X2_quUY3p@hFV5T zA29=*e)Ge>($Xii^SG2uIoMl_84TrVYHh{AN|5P_gJQ#xil@f6AKj-$7Def;{Bd$T zFirh-Ebu<{9renz<~X8_1>V=t-|07}zKP05rX6r@o;DJgcAWm1lo@TMeqPA^tp6AF zvsn}QLcKZaD_5<}A|l&-bC^$mEr5aEDu?w;6eBfLd@#pN8#!ajrp}EjK{*)ZjJkl~ zm6MYV>`ABIfctVDuApv}qX|PzB0}~WaS>+~>-ka&vs{%gGs_grN$r-vwDCJKN7n!u zUQzKf&GolTi!PEL2~0Xp|1&({SWA~xk4#gC&ZVmgCWn@Gk`-hDx0mNR4~>cZ9vbbM zKzk-t1D>U^AdAPR_LEIp^Hw5m=0&HAnuk`)Fg=UN?xSkaW#&}^Q}e}NWv3?k=Mb$c zxv^sUPmaR(gJ5MRv5iB9wUKeBotrM!tx;6TEzTbk9k?W~F)t9W(n^v3wU&Mb-83O5 z^%&9PQ%B@XIEnzs;uyMLOCLtdFlpXajXjBpidA;aeMMSB4ORXsAGTx3GS>(Hms-X) zon9@3|L*4W8~(25^vC{AfBHg~Hn#30;EtBHpVFE>wSp=+{He=WQT?xKy=zH-*pfcm zl>QHYX2~zKk)sZ6gc?)b%E#%baXBdMkHwn$JMS| z=sx@!e9pa}$*jUnr7@k!ECh{xkjeCe&iOEt`8wzqKwkv?1!zBRW;T43$yDJt+7qCi zxHWzg)BrsL+5)*-&t)<{0et}U4Co2ah0uE&^hVIrpe>+Rd<^@bw}HM0`U>b7&70!LPwM zr|pDX44b6DazJ~)zYqMSR(`vw-vsPA@TbrR5#n!lSN?&s*}d!uSHSHVn-g%a`FdHC zyXx_|ntQ{@ye)3ufO~`AUFCPLX>fZQ+{+r=l@0E4`7HPh>{PQ2#9P*1)dCf92 zbEPWtdu>;%viz}wyu9ZF<@ea=evJ}-!pQXTXPG!<%5iT+iSMlr;I|been+cH@#%RT zrA4?erNr;7DR+dt2Q*poTd4`*GeM;$UQjap`;FiEx19iJz-AMJR#;QqJc^97G9JH9~h__N~}?Rjw|z6-O| zQxIR2J*Q!};}$%B?RW)Vw6r2--i1nUEQnt!JSz*yFBYEFh49O=@4s5PF6@@@^}&uW z6@|v1OI$AaJy*LtX0OkRn0c32CfW<)x%bDdTCVI>D~Hl_pCdlNQ*e8tNnQxQ47d|l z%Za>xq3aXjczNBH)+n5>+synTG7h}wzRzzWjShW&kJqydID&rD1#=Vs`xh z9C#uBzboah6yM0J_YiQhe+e}ZN$$OXzKajxVTH^63}B1lFySvLT>gd!-k@+^ulTxM zES~fRkpn?nUSM1m@_#4fX|m*x+Yqj^PFgkc`i0gz2Ud^#@%E&&bJ?u%`E7;sx<|E9 zIwqm{Wle5dYHsFh4zehRp9mVJ%JI-Yy|N8u(w6jReRUO5{_Zi?TA^)JyG$0o} zWd9v;UhJHGo%w;X)2HIFQq}v8!gnb9a!(FC2NrOO!}FJ$f@q;k%YkzY6(q?+h!3@E zzv|zc6tljF{8yCyMpZA(LrPC7{0fE3{W0L*Rrng^kKES-enjDWRlA~O1nD&JLVnIe z2T`2!`~5QDh2#f|;NJ&M@j0mc;c@a)g@2;_uQA;bPQ<6sxtS|v+?0@o+zg!T=i8xE z5;ShxeHLM4>0P@@T(6$-+wmb~=LR*Nw<-2NDg0XsmwSNV%}D!K&Wg_*8drAHva}XB z`8lEDAon}LX;AoCg>ygNBke2_2UNWgWiwjD{$Ai7C1WMeEBjX|J3KGmQT9FR#t_Ys z=}Zy(m*D=A{9mTVPrH)85x7U?t>iAmna25_s0yD}%v&H&c$ErLy}~<+*ojGbt7Vms z;<%DGBti)zX{7KHVo2nUP3cBV57EJ?B+l!E<9cs@ygS&hhmCk5sRvU-A{37e_D76J z*n4yB#+t%HI?nt=^t}?ShJ>gws$_!zL;pLU}`jgYslk z%LZMK#z}|{EY(Eg)iwH-mOC5#ExO*OS65d{alLyN9#b{P0)d@dJK~*s>~jc5t-^KH zIvq?haM+9L!o#rWZj^AmEI1IxsWKb@ONC^)DjF4850a^Fy;(OMGtXq@d_X%lZ}qnZ z^gvq^9Z%D72doD)1!_%Oh2C^eo4>WW5jq~kaCByUUpM+s3let2xJAC??gDl(E&Y` zjF3BYs*4YD`F!%Q7LH`mK`eQY3qvIt*ZUAFI&61QKGpX}26~M?c-8bJZz9s;Epmpg zZ6g>1DR?rJe^jp~@=##w9U&Z#Q{Aq*BCm1W-^xLI!;?6nCJ*rC&ac_q`5PXyQ%1~_ zZFcvv1JDllS^dO-SB=4uJu9PlG&rF0j2{hZ%lW)qlj_i^ovn>LIR7_~DB7Bg!+gI< zvk4JVd>MBx~oxk#oDY-yv5M0PRbE;aX zE?(x~$vgRLpFs9A#&QW#GqT#Bn~-$&xXAh9S%IdL!uCK5Z*o`62zG-S36u75E;@k2 z%!9%^5H})TTmZe@sVI)ZN5cxj0orv&uvbW4UohDxyy0B~uxC;uVRCljOfr@;TR{ge z5$O+-g31l{8^SABTQAP=A}^!pO~mDb;f?gEwYx72T`s{W4hKhuLXkm3hx=Fqqz!XS znl?C(s)Dg-2r6+{$Cp=DX`09Q6kgn5#BkG4;J)P|A=2v&r2L(zV`AtVrY$;!#;%n9C{T`<0Y}&Ku z&%r!>-p^#3KjFCl*z9<|{%VuM`=9y#lCReE8VdBAm*x;9-cREHf07?>uAk|@L5KE4 zSfBS%53M6>x$$O}a%I+k4-6W6tk3&j<4T|Zj|`7b)?>duf-bd*^?6@*LT$WMfoDyu z&vXV%tG@6lX{Fe1RYsomn9{!{vg-4GM7z@GdCF#3kIVC*Oc?t=>@zuitWU-*$z#b= zcA=_YiD$X2&-($)U~^WQ9s4WhidU*|G8bnX5URo^Lu8aNuSJ{zg#cN Sl7EHt_xeqVrFjZ@Me*PGkL1?? literal 0 HcmV?d00001