ratio_io.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. // ratio_io
  2. //
  3. // (C) Copyright Howard Hinnant
  4. // (C) Copyright 2010 Vicente J. Botet Escriba
  5. // Use, modification and distribution are subject to the Boost Software License,
  6. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt).
  8. //
  9. // This code was adapted by Vicente from Howard Hinnant's experimental work
  10. // on chrono i/o under lvm/libc++ to Boost
  11. #ifndef BOOST_RATIO_RATIO_IO_HPP
  12. #define BOOST_RATIO_RATIO_IO_HPP
  13. /*
  14. ratio_io synopsis
  15. #include <ratio>
  16. #include <string>
  17. namespace boost
  18. {
  19. template <class Ratio, class CharT>
  20. struct ratio_string
  21. {
  22. static basic_string<CharT> prefix();
  23. static basic_string<CharT> symbol();
  24. };
  25. } // boost
  26. */
  27. #include <boost/ratio/ratio.hpp>
  28. #include <string>
  29. #include <sstream>
  30. namespace boost {
  31. template <class Ratio, class CharT>
  32. struct ratio_string
  33. {
  34. static std::basic_string<CharT> symbol() {return prefix();}
  35. static std::basic_string<CharT> prefix();
  36. };
  37. template <class Ratio, class CharT>
  38. std::basic_string<CharT>
  39. ratio_string<Ratio, CharT>::prefix()
  40. {
  41. std::basic_ostringstream<CharT> os;
  42. os << CharT('[') << Ratio::num << CharT('/')
  43. << Ratio::den << CharT(']');
  44. return os.str();
  45. }
  46. // atto
  47. template <>
  48. struct ratio_string<atto, char>
  49. {
  50. static std::string symbol() {return std::string(1, 'a');}
  51. static std::string prefix() {return std::string("atto");}
  52. };
  53. template <>
  54. struct ratio_string<atto, char16_t>
  55. {
  56. static std::u16string symbol() {return std::u16string(1, u'a');}
  57. static std::u16string prefix() {return std::u16string(u"atto");}
  58. };
  59. template <>
  60. struct ratio_string<atto, char32_t>
  61. {
  62. static std::u32string symbol() {return std::u32string(1, U'a');}
  63. static std::u32string prefix() {return std::u32string(U"atto");}
  64. };
  65. template <>
  66. struct ratio_string<atto, wchar_t>
  67. {
  68. static std::wstring symbol() {return std::wstring(1, L'a');}
  69. static std::wstring prefix() {return std::wstring(L"atto");}
  70. };
  71. // femto
  72. template <>
  73. struct ratio_string<femto, char>
  74. {
  75. static std::string symbol() {return std::string(1, 'f');}
  76. static std::string prefix() {return std::string("femto");}
  77. };
  78. template <>
  79. struct ratio_string<femto, char16_t>
  80. {
  81. static std::u16string symbol() {return std::u16string(1, u'f');}
  82. static std::u16string prefix() {return std::u16string(u"femto");}
  83. };
  84. template <>
  85. struct ratio_string<femto, char32_t>
  86. {
  87. static std::u32string symbol() {return std::u32string(1, U'f');}
  88. static std::u32string prefix() {return std::u32string(U"femto");}
  89. };
  90. template <>
  91. struct ratio_string<femto, wchar_t>
  92. {
  93. static std::wstring symbol() {return std::wstring(1, L'f');}
  94. static std::wstring prefix() {return std::wstring(L"femto");}
  95. };
  96. // pico
  97. template <>
  98. struct ratio_string<pico, char>
  99. {
  100. static std::string symbol() {return std::string(1, 'p');}
  101. static std::string prefix() {return std::string("pico");}
  102. };
  103. template <>
  104. struct ratio_string<pico, char16_t>
  105. {
  106. static std::u16string symbol() {return std::u16string(1, u'p');}
  107. static std::u16string prefix() {return std::u16string(u"pico");}
  108. };
  109. template <>
  110. struct ratio_string<pico, char32_t>
  111. {
  112. static std::u32string symbol() {return std::u32string(1, U'p');}
  113. static std::u32string prefix() {return std::u32string(U"pico");}
  114. };
  115. template <>
  116. struct ratio_string<pico, wchar_t>
  117. {
  118. static std::wstring symbol() {return std::wstring(1, L'p');}
  119. static std::wstring prefix() {return std::wstring(L"pico");}
  120. };
  121. // nano
  122. template <>
  123. struct ratio_string<nano, char>
  124. {
  125. static std::string symbol() {return std::string(1, 'n');}
  126. static std::string prefix() {return std::string("nano");}
  127. };
  128. template <>
  129. struct ratio_string<nano, char16_t>
  130. {
  131. static std::u16string symbol() {return std::u16string(1, u'n');}
  132. static std::u16string prefix() {return std::u16string(u"nano");}
  133. };
  134. template <>
  135. struct ratio_string<nano, char32_t>
  136. {
  137. static std::u32string symbol() {return std::u32string(1, U'n');}
  138. static std::u32string prefix() {return std::u32string(U"nano");}
  139. };
  140. template <>
  141. struct ratio_string<nano, wchar_t>
  142. {
  143. static std::wstring symbol() {return std::wstring(1, L'n');}
  144. static std::wstring prefix() {return std::wstring(L"nano");}
  145. };
  146. // micro
  147. template <>
  148. struct ratio_string<micro, char>
  149. {
  150. static std::string symbol() {return std::string("\xC2\xB5");}
  151. static std::string prefix() {return std::string("micro");}
  152. };
  153. template <>
  154. struct ratio_string<micro, char16_t>
  155. {
  156. static std::u16string symbol() {return std::u16string(1, u'\xB5');}
  157. static std::u16string prefix() {return std::u16string(u"micro");}
  158. };
  159. template <>
  160. struct ratio_string<micro, char32_t>
  161. {
  162. static std::u32string symbol() {return std::u32string(1, U'\xB5');}
  163. static std::u32string prefix() {return std::u32string(U"micro");}
  164. };
  165. template <>
  166. struct ratio_string<micro, wchar_t>
  167. {
  168. static std::wstring symbol() {return std::wstring(1, L'\xB5');}
  169. static std::wstring prefix() {return std::wstring(L"micro");}
  170. };
  171. // milli
  172. template <>
  173. struct ratio_string<milli, char>
  174. {
  175. static std::string symbol() {return std::string(1, 'm');}
  176. static std::string prefix() {return std::string("milli");}
  177. };
  178. template <>
  179. struct ratio_string<milli, char16_t>
  180. {
  181. static std::u16string symbol() {return std::u16string(1, u'm');}
  182. static std::u16string prefix() {return std::u16string(u"milli");}
  183. };
  184. template <>
  185. struct ratio_string<milli, char32_t>
  186. {
  187. static std::u32string symbol() {return std::u32string(1, U'm');}
  188. static std::u32string prefix() {return std::u32string(U"milli");}
  189. };
  190. template <>
  191. struct ratio_string<milli, wchar_t>
  192. {
  193. static std::wstring symbol() {return std::wstring(1, L'm');}
  194. static std::wstring prefix() {return std::wstring(L"milli");}
  195. };
  196. // centi
  197. template <>
  198. struct ratio_string<centi, char>
  199. {
  200. static std::string symbol() {return std::string(1, 'c');}
  201. static std::string prefix() {return std::string("centi");}
  202. };
  203. template <>
  204. struct ratio_string<centi, char16_t>
  205. {
  206. static std::u16string symbol() {return std::u16string(1, u'c');}
  207. static std::u16string prefix() {return std::u16string(u"centi");}
  208. };
  209. template <>
  210. struct ratio_string<centi, char32_t>
  211. {
  212. static std::u32string symbol() {return std::u32string(1, U'c');}
  213. static std::u32string prefix() {return std::u32string(U"centi");}
  214. };
  215. template <>
  216. struct ratio_string<centi, wchar_t>
  217. {
  218. static std::wstring symbol() {return std::wstring(1, L'c');}
  219. static std::wstring prefix() {return std::wstring(L"centi");}
  220. };
  221. // deci
  222. template <>
  223. struct ratio_string<deci, char>
  224. {
  225. static std::string symbol() {return std::string(1, 'd');}
  226. static std::string prefix() {return std::string("deci");}
  227. };
  228. template <>
  229. struct ratio_string<deci, char16_t>
  230. {
  231. static std::u16string symbol() {return std::u16string(1, u'd');}
  232. static std::u16string prefix() {return std::u16string(u"deci");}
  233. };
  234. template <>
  235. struct ratio_string<deci, char32_t>
  236. {
  237. static std::u32string symbol() {return std::u32string(1, U'd');}
  238. static std::u32string prefix() {return std::u32string(U"deci");}
  239. };
  240. template <>
  241. struct ratio_string<deci, wchar_t>
  242. {
  243. static std::wstring symbol() {return std::wstring(1, L'd');}
  244. static std::wstring prefix() {return std::wstring(L"deci");}
  245. };
  246. // unit
  247. // deca
  248. template <>
  249. struct ratio_string<deca, char>
  250. {
  251. static std::string symbol() {return std::string("da");}
  252. static std::string prefix() {return std::string("deca");}
  253. };
  254. template <>
  255. struct ratio_string<deca, char16_t>
  256. {
  257. static std::u16string symbol() {return std::u16string(u"da");}
  258. static std::u16string prefix() {return std::u16string(u"deca");}
  259. };
  260. template <>
  261. struct ratio_string<deca, char32_t>
  262. {
  263. static std::u32string symbol() {return std::u32string(U"da");}
  264. static std::u32string prefix() {return std::u32string(U"deca");}
  265. };
  266. template <>
  267. struct ratio_string<deca, wchar_t>
  268. {
  269. static std::wstring symbol() {return std::wstring(L"da");}
  270. static std::wstring prefix() {return std::wstring(L"deca");}
  271. };
  272. // hecto
  273. template <>
  274. struct ratio_string<hecto, char>
  275. {
  276. static std::string symbol() {return std::string(1, 'h');}
  277. static std::string prefix() {return std::string("hecto");}
  278. };
  279. template <>
  280. struct ratio_string<hecto, char16_t>
  281. {
  282. static std::u16string symbol() {return std::u16string(1, u'h');}
  283. static std::u16string prefix() {return std::u16string(u"hecto");}
  284. };
  285. template <>
  286. struct ratio_string<hecto, char32_t>
  287. {
  288. static std::u32string symbol() {return std::u32string(1, U'h');}
  289. static std::u32string prefix() {return std::u32string(U"hecto");}
  290. };
  291. template <>
  292. struct ratio_string<hecto, wchar_t>
  293. {
  294. static std::wstring symbol() {return std::wstring(1, L'h');}
  295. static std::wstring prefix() {return std::wstring(L"hecto");}
  296. };
  297. // kilo
  298. template <>
  299. struct ratio_string<kilo, char>
  300. {
  301. static std::string symbol() {return std::string(1, 'k');}
  302. static std::string prefix() {return std::string("kilo");}
  303. };
  304. template <>
  305. struct ratio_string<kilo, char16_t>
  306. {
  307. static std::u16string symbol() {return std::u16string(1, u'k');}
  308. static std::u16string prefix() {return std::u16string(u"kilo");}
  309. };
  310. template <>
  311. struct ratio_string<kilo, char32_t>
  312. {
  313. static std::u32string symbol() {return std::u32string(1, U'k');}
  314. static std::u32string prefix() {return std::u32string(U"kilo");}
  315. };
  316. template <>
  317. struct ratio_string<kilo, wchar_t>
  318. {
  319. static std::wstring symbol() {return std::wstring(1, L'k');}
  320. static std::wstring prefix() {return std::wstring(L"kilo");}
  321. };
  322. // mega
  323. template <>
  324. struct ratio_string<mega, char>
  325. {
  326. static std::string symbol() {return std::string(1, 'M');}
  327. static std::string prefix() {return std::string("mega");}
  328. };
  329. template <>
  330. struct ratio_string<mega, char16_t>
  331. {
  332. static std::u16string symbol() {return std::u16string(1, u'M');}
  333. static std::u16string prefix() {return std::u16string(u"mega");}
  334. };
  335. template <>
  336. struct ratio_string<mega, char32_t>
  337. {
  338. static std::u32string symbol() {return std::u32string(1, U'M');}
  339. static std::u32string prefix() {return std::u32string(U"mega");}
  340. };
  341. template <>
  342. struct ratio_string<mega, wchar_t>
  343. {
  344. static std::wstring symbol() {return std::wstring(1, L'M');}
  345. static std::wstring prefix() {return std::wstring(L"mega");}
  346. };
  347. // giga
  348. template <>
  349. struct ratio_string<giga, char>
  350. {
  351. static std::string symbol() {return std::string(1, 'G');}
  352. static std::string prefix() {return std::string("giga");}
  353. };
  354. template <>
  355. struct ratio_string<giga, char16_t>
  356. {
  357. static std::u16string symbol() {return std::u16string(1, u'G');}
  358. static std::u16string prefix() {return std::u16string(u"giga");}
  359. };
  360. template <>
  361. struct ratio_string<giga, char32_t>
  362. {
  363. static std::u32string symbol() {return std::u32string(1, U'G');}
  364. static std::u32string prefix() {return std::u32string(U"giga");}
  365. };
  366. template <>
  367. struct ratio_string<giga, wchar_t>
  368. {
  369. static std::wstring symbol() {return std::wstring(1, L'G');}
  370. static std::wstring prefix() {return std::wstring(L"giga");}
  371. };
  372. // tera
  373. template <>
  374. struct ratio_string<tera, char>
  375. {
  376. static std::string symbol() {return std::string(1, 'T');}
  377. static std::string prefix() {return std::string("tera");}
  378. };
  379. template <>
  380. struct ratio_string<tera, char16_t>
  381. {
  382. static std::u16string symbol() {return std::u16string(1, u'T');}
  383. static std::u16string prefix() {return std::u16string(u"tera");}
  384. };
  385. template <>
  386. struct ratio_string<tera, char32_t>
  387. {
  388. static std::u32string symbol() {return std::u32string(1, U'T');}
  389. static std::u32string prefix() {return std::u32string(U"tera");}
  390. };
  391. template <>
  392. struct ratio_string<tera, wchar_t>
  393. {
  394. static std::wstring symbol() {return std::wstring(1, L'T');}
  395. static std::wstring prefix() {return std::wstring(L"tera");}
  396. };
  397. // peta
  398. template <>
  399. struct ratio_string<peta, char>
  400. {
  401. static std::string symbol() {return std::string(1, 'P');}
  402. static std::string prefix() {return std::string("peta");}
  403. };
  404. template <>
  405. struct ratio_string<peta, char16_t>
  406. {
  407. static std::u16string symbol() {return std::u16string(1, u'P');}
  408. static std::u16string prefix() {return std::u16string(u"peta");}
  409. };
  410. template <>
  411. struct ratio_string<peta, char32_t>
  412. {
  413. static std::u32string symbol() {return std::u32string(1, U'P');}
  414. static std::u32string prefix() {return std::u32string(U"peta");}
  415. };
  416. template <>
  417. struct ratio_string<peta, wchar_t>
  418. {
  419. static std::wstring symbol() {return std::wstring(1, L'P');}
  420. static std::wstring prefix() {return std::wstring(L"peta");}
  421. };
  422. // exa
  423. template <>
  424. struct ratio_string<exa, char>
  425. {
  426. static std::string symbol() {return std::string(1, 'E');}
  427. static std::string prefix() {return std::string("exa");}
  428. };
  429. template <>
  430. struct ratio_string<exa, char16_t>
  431. {
  432. static std::u16string symbol() {return std::u16string(1, u'E');}
  433. static std::u16string prefix() {return std::u16string(u"exa");}
  434. };
  435. template <>
  436. struct ratio_string<exa, char32_t>
  437. {
  438. static std::u32string symbol() {return std::u32string(1, U'E');}
  439. static std::u32string prefix() {return std::u32string(U"exa");}
  440. };
  441. template <>
  442. struct ratio_string<exa, wchar_t>
  443. {
  444. static std::wstring symbol() {return std::wstring(1, L'E');}
  445. static std::wstring prefix() {return std::wstring(L"exa");}
  446. };
  447. }
  448. #endif // BOOST_RATIO_RATIO_IO_HPP