ratio_io.hpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  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_DETAIL_RATIO_IO_HPP
  12. #define BOOST_RATIO_DETAIL_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> short_name();
  23. static basic_string<CharT> long_name();
  24. };
  25. } // boost
  26. */
  27. #include <boost/config.hpp>
  28. #include <boost/ratio/ratio.hpp>
  29. #include <boost/type_traits/integral_constant.hpp>
  30. #include <string>
  31. #include <sstream>
  32. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  33. #include <boost/ratio/ratio_static_string.hpp>
  34. #include <boost/static_string/static_string.hpp>
  35. #endif
  36. #if defined(BOOST_NO_CXX11_UNICODE_LITERALS) || defined(BOOST_NO_CXX11_CHAR16_T) || defined(BOOST_NO_CXX11_CHAR32_T) || defined(BOOST_NO_CXX11_U16STRING) || defined(BOOST_NO_CXX11_U32STRING)
  37. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  38. #undef BOOST_RATIO_HAS_UNICODE_SUPPORT
  39. #endif
  40. #else
  41. #define BOOST_RATIO_HAS_UNICODE_SUPPORT 1
  42. #endif
  43. namespace boost {
  44. //template <class Ratio>
  45. //struct ratio_string_is_localizable : false_type {};
  46. //template <class Ratio>
  47. //struct ratio_string_id : integral_constant<int,0> {};
  48. template <class Ratio, class CharT>
  49. struct ratio_string
  50. {
  51. static std::basic_string<CharT> short_name() {return long_name();}
  52. static std::basic_string<CharT> long_name();
  53. static std::basic_string<CharT> symbol() {return short_name();}
  54. static std::basic_string<CharT> prefix() {return long_name();}
  55. };
  56. template <class Ratio, class CharT>
  57. std::basic_string<CharT>
  58. ratio_string<Ratio, CharT>::long_name()
  59. {
  60. std::basic_ostringstream<CharT> os;
  61. os << CharT('[') << Ratio::num << CharT('/')
  62. << Ratio::den << CharT(']');
  63. return os.str();
  64. }
  65. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  66. namespace ratio_detail {
  67. template <class Ratio, class CharT>
  68. struct ratio_string_static
  69. {
  70. static std::string short_name() {
  71. return std::basic_string<CharT>(
  72. static_string::c_str<
  73. typename ratio_static_string<Ratio, CharT>::short_name
  74. >::value);
  75. }
  76. static std::string long_name() {
  77. return std::basic_string<CharT>(
  78. static_string::c_str<
  79. typename ratio_static_string<Ratio, CharT>::long_name
  80. >::value);
  81. }
  82. static std::basic_string<CharT> symbol() {return short_name();}
  83. static std::basic_string<CharT> prefix() {return long_name();}
  84. };
  85. }
  86. #endif
  87. // atto
  88. //template <>
  89. //struct ratio_string_is_localizable<atto> : true_type {};
  90. //
  91. //template <>
  92. //struct ratio_string_id<atto> : integral_constant<int,-18> {};
  93. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  94. template <typename CharT>
  95. struct ratio_string<atto, CharT> :
  96. ratio_detail::ratio_string_static<atto,CharT>
  97. {};
  98. #else
  99. template <>
  100. struct ratio_string<atto, char>
  101. {
  102. static std::string short_name() {return std::string(1, 'a');}
  103. static std::string long_name() {return std::string("atto");}
  104. static std::string symbol() {return short_name();}
  105. static std::string prefix() {return long_name();}
  106. };
  107. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  108. template <>
  109. struct ratio_string<atto, char16_t>
  110. {
  111. static std::u16string short_name() {return std::u16string(1, u'a');}
  112. static std::u16string long_name() {return std::u16string(u"atto");}
  113. static std::u16string symbol() {return short_name();}
  114. static std::u16string prefix() {return long_name();}
  115. };
  116. template <>
  117. struct ratio_string<atto, char32_t>
  118. {
  119. static std::u32string short_name() {return std::u32string(1, U'a');}
  120. static std::u32string long_name() {return std::u32string(U"atto");}
  121. static std::u32string symbol() {return short_name();}
  122. static std::u32string prefix() {return long_name();}
  123. };
  124. #endif
  125. #ifndef BOOST_NO_STD_WSTRING
  126. template <>
  127. struct ratio_string<atto, wchar_t>
  128. {
  129. static std::wstring short_name() {return std::wstring(1, L'a');}
  130. static std::wstring long_name() {return std::wstring(L"atto");}
  131. static std::wstring symbol() {return short_name();}
  132. static std::wstring prefix() {return long_name();}
  133. };
  134. #endif
  135. #endif
  136. // femto
  137. //template <>
  138. //struct ratio_string_is_localizable<femto> : true_type {};
  139. //
  140. //template <>
  141. //struct ratio_string_id<femto> : integral_constant<int,-15> {};
  142. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  143. template <typename CharT>
  144. struct ratio_string<femto, CharT> :
  145. ratio_detail::ratio_string_static<femto,CharT>
  146. {};
  147. #else
  148. template <>
  149. struct ratio_string<femto, char>
  150. {
  151. static std::string short_name() {return std::string(1, 'f');}
  152. static std::string long_name() {return std::string("femto");}
  153. static std::string symbol() {return short_name();}
  154. static std::string prefix() {return long_name();}
  155. };
  156. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  157. template <>
  158. struct ratio_string<femto, char16_t>
  159. {
  160. static std::u16string short_name() {return std::u16string(1, u'f');}
  161. static std::u16string long_name() {return std::u16string(u"femto");}
  162. static std::u16string symbol() {return short_name();}
  163. static std::u16string prefix() {return long_name();}
  164. };
  165. template <>
  166. struct ratio_string<femto, char32_t>
  167. {
  168. static std::u32string short_name() {return std::u32string(1, U'f');}
  169. static std::u32string long_name() {return std::u32string(U"femto");}
  170. static std::u32string symbol() {return short_name();}
  171. static std::u32string prefix() {return long_name();}
  172. };
  173. #endif
  174. #ifndef BOOST_NO_STD_WSTRING
  175. template <>
  176. struct ratio_string<femto, wchar_t>
  177. {
  178. static std::wstring short_name() {return std::wstring(1, L'f');}
  179. static std::wstring long_name() {return std::wstring(L"femto");}
  180. static std::wstring symbol() {return short_name();}
  181. static std::wstring prefix() {return long_name();}
  182. };
  183. #endif
  184. #endif
  185. // pico
  186. //template <>
  187. //struct ratio_string_is_localizable<pico> : true_type {};
  188. //
  189. //template <>
  190. //struct ratio_string_id<pico> : integral_constant<int,-12> {};
  191. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  192. template <typename CharT>
  193. struct ratio_string<pico, CharT> :
  194. ratio_detail::ratio_string_static<pico,CharT>
  195. {};
  196. #else
  197. template <>
  198. struct ratio_string<pico, char>
  199. {
  200. static std::string short_name() {return std::string(1, 'p');}
  201. static std::string long_name() {return std::string("pico");}
  202. static std::string symbol() {return short_name();}
  203. static std::string prefix() {return long_name();}
  204. };
  205. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  206. template <>
  207. struct ratio_string<pico, char16_t>
  208. {
  209. static std::u16string short_name() {return std::u16string(1, u'p');}
  210. static std::u16string long_name() {return std::u16string(u"pico");}
  211. static std::u16string symbol() {return short_name();}
  212. static std::u16string prefix() {return long_name();}
  213. };
  214. template <>
  215. struct ratio_string<pico, char32_t>
  216. {
  217. static std::u32string short_name() {return std::u32string(1, U'p');}
  218. static std::u32string long_name() {return std::u32string(U"pico");}
  219. static std::u32string symbol() {return short_name();}
  220. static std::u32string prefix() {return long_name();}
  221. };
  222. #endif
  223. #ifndef BOOST_NO_STD_WSTRING
  224. template <>
  225. struct ratio_string<pico, wchar_t>
  226. {
  227. static std::wstring short_name() {return std::wstring(1, L'p');}
  228. static std::wstring long_name() {return std::wstring(L"pico");}
  229. static std::wstring symbol() {return short_name();}
  230. static std::wstring prefix() {return long_name();}
  231. };
  232. #endif
  233. #endif
  234. // nano
  235. //template <>
  236. //struct ratio_string_is_localizable<nano> : true_type {};
  237. //
  238. //template <>
  239. //struct ratio_string_id<nano> : integral_constant<int,-9> {};
  240. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  241. template <typename CharT>
  242. struct ratio_string<nano, CharT> :
  243. ratio_detail::ratio_string_static<nano,CharT>
  244. {};
  245. #else
  246. template <>
  247. struct ratio_string<nano, char>
  248. {
  249. static std::string short_name() {return std::string(1, 'n');}
  250. static std::string long_name() {return std::string("nano");}
  251. static std::string symbol() {return short_name();}
  252. static std::string prefix() {return long_name();}
  253. };
  254. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  255. template <>
  256. struct ratio_string<nano, char16_t>
  257. {
  258. static std::u16string short_name() {return std::u16string(1, u'n');}
  259. static std::u16string long_name() {return std::u16string(u"nano");}
  260. static std::u16string symbol() {return short_name();}
  261. static std::u16string prefix() {return long_name();}
  262. };
  263. template <>
  264. struct ratio_string<nano, char32_t>
  265. {
  266. static std::u32string short_name() {return std::u32string(1, U'n');}
  267. static std::u32string long_name() {return std::u32string(U"nano");}
  268. static std::u32string symbol() {return short_name();}
  269. static std::u32string prefix() {return long_name();}
  270. };
  271. #endif
  272. #ifndef BOOST_NO_STD_WSTRING
  273. template <>
  274. struct ratio_string<nano, wchar_t>
  275. {
  276. static std::wstring short_name() {return std::wstring(1, L'n');}
  277. static std::wstring long_name() {return std::wstring(L"nano");}
  278. static std::wstring symbol() {return short_name();}
  279. static std::wstring prefix() {return long_name();}
  280. };
  281. #endif
  282. #endif
  283. // micro
  284. //template <>
  285. //struct ratio_string_is_localizable<micro> : true_type {};
  286. //
  287. //template <>
  288. //struct ratio_string_id<micro> : integral_constant<int,-6> {};
  289. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  290. template <typename CharT>
  291. struct ratio_string<micro, CharT> :
  292. ratio_detail::ratio_string_static<micro,CharT>
  293. {};
  294. #else
  295. template <>
  296. struct ratio_string<micro, char>
  297. {
  298. static std::string short_name() {return std::string("\xC2\xB5");}
  299. static std::string long_name() {return std::string("micro");}
  300. static std::string symbol() {return short_name();}
  301. static std::string prefix() {return long_name();}
  302. };
  303. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  304. template <>
  305. struct ratio_string<micro, char16_t>
  306. {
  307. static std::u16string short_name() {return std::u16string(1, u'\xB5');}
  308. static std::u16string long_name() {return std::u16string(u"micro");}
  309. static std::u16string symbol() {return short_name();}
  310. static std::u16string prefix() {return long_name();}
  311. };
  312. template <>
  313. struct ratio_string<micro, char32_t>
  314. {
  315. static std::u32string short_name() {return std::u32string(1, U'\xB5');}
  316. static std::u32string long_name() {return std::u32string(U"micro");}
  317. static std::u32string symbol() {return short_name();}
  318. static std::u32string prefix() {return long_name();}
  319. };
  320. #endif
  321. #ifndef BOOST_NO_STD_WSTRING
  322. template <>
  323. struct ratio_string<micro, wchar_t>
  324. {
  325. static std::wstring short_name() {return std::wstring(1, L'\xB5');}
  326. static std::wstring long_name() {return std::wstring(L"micro");}
  327. static std::wstring symbol() {return short_name();}
  328. static std::wstring prefix() {return long_name();}
  329. };
  330. #endif
  331. #endif
  332. // milli
  333. //template <>
  334. //struct ratio_string_is_localizable<milli> : true_type {};
  335. //
  336. //template <>
  337. //struct ratio_string_id<milli> : integral_constant<int,-3> {};
  338. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  339. template <typename CharT>
  340. struct ratio_string<milli, CharT> :
  341. ratio_detail::ratio_string_static<milli,CharT>
  342. {};
  343. #else
  344. template <>
  345. struct ratio_string<milli, char>
  346. {
  347. static std::string short_name() {return std::string(1, 'm');}
  348. static std::string long_name() {return std::string("milli");}
  349. static std::string symbol() {return short_name();}
  350. static std::string prefix() {return long_name();}
  351. };
  352. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  353. template <>
  354. struct ratio_string<milli, char16_t>
  355. {
  356. static std::u16string short_name() {return std::u16string(1, u'm');}
  357. static std::u16string long_name() {return std::u16string(u"milli");}
  358. static std::u16string symbol() {return short_name();}
  359. static std::u16string prefix() {return long_name();}
  360. };
  361. template <>
  362. struct ratio_string<milli, char32_t>
  363. {
  364. static std::u32string short_name() {return std::u32string(1, U'm');}
  365. static std::u32string long_name() {return std::u32string(U"milli");}
  366. static std::u32string symbol() {return short_name();}
  367. static std::u32string prefix() {return long_name();}
  368. };
  369. #endif
  370. #ifndef BOOST_NO_STD_WSTRING
  371. template <>
  372. struct ratio_string<milli, wchar_t>
  373. {
  374. static std::wstring short_name() {return std::wstring(1, L'm');}
  375. static std::wstring long_name() {return std::wstring(L"milli");}
  376. static std::wstring symbol() {return short_name();}
  377. static std::wstring prefix() {return long_name();}
  378. };
  379. #endif
  380. #endif
  381. // centi
  382. //template <>
  383. //struct ratio_string_is_localizable<centi> : true_type {};
  384. //
  385. //template <>
  386. //struct ratio_string_id<centi> : integral_constant<int,-2> {};
  387. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  388. template <typename CharT>
  389. struct ratio_string<centi, CharT> :
  390. ratio_detail::ratio_string_static<centi,CharT>
  391. {};
  392. #else
  393. template <>
  394. struct ratio_string<centi, char>
  395. {
  396. static std::string short_name() {return std::string(1, 'c');}
  397. static std::string long_name() {return std::string("centi");}
  398. static std::string symbol() {return short_name();}
  399. static std::string prefix() {return long_name();}
  400. };
  401. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  402. template <>
  403. struct ratio_string<centi, char16_t>
  404. {
  405. static std::u16string short_name() {return std::u16string(1, u'c');}
  406. static std::u16string long_name() {return std::u16string(u"centi");}
  407. static std::u16string symbol() {return short_name();}
  408. static std::u16string prefix() {return long_name();}
  409. };
  410. template <>
  411. struct ratio_string<centi, char32_t>
  412. {
  413. static std::u32string short_name() {return std::u32string(1, U'c');}
  414. static std::u32string long_name() {return std::u32string(U"centi");}
  415. static std::u32string symbol() {return short_name();}
  416. static std::u32string prefix() {return long_name();}
  417. };
  418. #endif
  419. #ifndef BOOST_NO_STD_WSTRING
  420. template <>
  421. struct ratio_string<centi, wchar_t>
  422. {
  423. static std::wstring short_name() {return std::wstring(1, L'c');}
  424. static std::wstring long_name() {return std::wstring(L"centi");}
  425. static std::wstring symbol() {return short_name();}
  426. static std::wstring prefix() {return long_name();}
  427. };
  428. #endif
  429. #endif
  430. // deci
  431. //template <>
  432. //struct ratio_string_is_localizable<deci> : true_type {};
  433. //
  434. //template <>
  435. //struct ratio_string_id<deci> : integral_constant<int,-1> {};
  436. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  437. template <typename CharT>
  438. struct ratio_string<deci, CharT> :
  439. ratio_detail::ratio_string_static<deci,CharT>
  440. {};
  441. #else
  442. template <>
  443. struct ratio_string<deci, char>
  444. {
  445. static std::string short_name() {return std::string(1, 'd');}
  446. static std::string long_name() {return std::string("deci");}
  447. static std::string symbol() {return short_name();}
  448. static std::string prefix() {return long_name();}
  449. };
  450. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  451. template <>
  452. struct ratio_string<deci, char16_t>
  453. {
  454. static std::u16string short_name() {return std::u16string(1, u'd');}
  455. static std::u16string long_name() {return std::u16string(u"deci");}
  456. static std::u16string symbol() {return short_name();}
  457. static std::u16string prefix() {return long_name();}
  458. };
  459. template <>
  460. struct ratio_string<deci, char32_t>
  461. {
  462. static std::u32string short_name() {return std::u32string(1, U'd');}
  463. static std::u32string long_name() {return std::u32string(U"deci");}
  464. static std::u32string symbol() {return short_name();}
  465. static std::u32string prefix() {return long_name();}
  466. };
  467. #endif
  468. #ifndef BOOST_NO_STD_WSTRING
  469. template <>
  470. struct ratio_string<deci, wchar_t>
  471. {
  472. static std::wstring short_name() {return std::wstring(1, L'd');}
  473. static std::wstring long_name() {return std::wstring(L"deci");}
  474. static std::wstring symbol() {return short_name();}
  475. static std::wstring prefix() {return long_name();}
  476. };
  477. #endif
  478. #endif
  479. // unit
  480. //template <>
  481. //struct ratio_string_is_localizable<ratio<1> > : true_type {};
  482. //
  483. //template <>
  484. //struct ratio_string_id<ratio<1> > : integral_constant<int,0> {};
  485. // deca
  486. //template <>
  487. //struct ratio_string_is_localizable<deca> : true_type {};
  488. //
  489. //template <>
  490. //struct ratio_string_id<deca> : integral_constant<int,1> {};
  491. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  492. template <typename CharT>
  493. struct ratio_string<deca, CharT> :
  494. ratio_detail::ratio_string_static<deca,CharT>
  495. {};
  496. #else
  497. template <>
  498. struct ratio_string<deca, char>
  499. {
  500. static std::string short_name() {return std::string("da");}
  501. static std::string long_name() {return std::string("deca");}
  502. static std::string symbol() {return short_name();}
  503. static std::string prefix() {return long_name();}
  504. };
  505. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  506. template <>
  507. struct ratio_string<deca, char16_t>
  508. {
  509. static std::u16string short_name() {return std::u16string(u"da");}
  510. static std::u16string long_name() {return std::u16string(u"deca");}
  511. static std::u16string symbol() {return short_name();}
  512. static std::u16string prefix() {return long_name();}
  513. };
  514. template <>
  515. struct ratio_string<deca, char32_t>
  516. {
  517. static std::u32string short_name() {return std::u32string(U"da");}
  518. static std::u32string long_name() {return std::u32string(U"deca");}
  519. static std::u32string symbol() {return short_name();}
  520. static std::u32string prefix() {return long_name();}
  521. };
  522. #endif
  523. #ifndef BOOST_NO_STD_WSTRING
  524. template <>
  525. struct ratio_string<deca, wchar_t>
  526. {
  527. static std::wstring short_name() {return std::wstring(L"da");}
  528. static std::wstring long_name() {return std::wstring(L"deca");}
  529. static std::wstring symbol() {return short_name();}
  530. static std::wstring prefix() {return long_name();}
  531. };
  532. #endif
  533. #endif
  534. // hecto
  535. //template <>
  536. //struct ratio_string_is_localizable<hecto> : true_type {};
  537. //
  538. //template <>
  539. //struct ratio_string_id<hecto> : integral_constant<int,2> {};
  540. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  541. template <typename CharT>
  542. struct ratio_string<hecto, CharT> :
  543. ratio_detail::ratio_string_static<hecto,CharT>
  544. {};
  545. #else
  546. template <>
  547. struct ratio_string<hecto, char>
  548. {
  549. static std::string short_name() {return std::string(1, 'h');}
  550. static std::string long_name() {return std::string("hecto");}
  551. static std::string symbol() {return short_name();}
  552. static std::string prefix() {return long_name();}
  553. };
  554. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  555. template <>
  556. struct ratio_string<hecto, char16_t>
  557. {
  558. static std::u16string short_name() {return std::u16string(1, u'h');}
  559. static std::u16string long_name() {return std::u16string(u"hecto");}
  560. static std::u16string symbol() {return short_name();}
  561. static std::u16string prefix() {return long_name();}
  562. };
  563. template <>
  564. struct ratio_string<hecto, char32_t>
  565. {
  566. static std::u32string short_name() {return std::u32string(1, U'h');}
  567. static std::u32string long_name() {return std::u32string(U"hecto");}
  568. static std::u32string symbol() {return short_name();}
  569. static std::u32string prefix() {return long_name();}
  570. };
  571. #endif
  572. #ifndef BOOST_NO_STD_WSTRING
  573. template <>
  574. struct ratio_string<hecto, wchar_t>
  575. {
  576. static std::wstring short_name() {return std::wstring(1, L'h');}
  577. static std::wstring long_name() {return std::wstring(L"hecto");}
  578. static std::wstring symbol() {return short_name();}
  579. static std::wstring prefix() {return long_name();}
  580. };
  581. #endif
  582. #endif
  583. // kilo
  584. //template <>
  585. //struct ratio_string_is_localizable<kilo> : true_type {};
  586. //
  587. //template <>
  588. //struct ratio_string_id<kilo> : integral_constant<int,3> {};
  589. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  590. template <typename CharT>
  591. struct ratio_string<kilo, CharT> :
  592. ratio_detail::ratio_string_static<kilo,CharT>
  593. {};
  594. #else
  595. template <>
  596. struct ratio_string<kilo, char>
  597. {
  598. static std::string short_name() {return std::string(1, 'k');}
  599. static std::string long_name() {return std::string("kilo");}
  600. static std::string symbol() {return short_name();}
  601. static std::string prefix() {return long_name();}
  602. };
  603. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  604. template <>
  605. struct ratio_string<kilo, char16_t>
  606. {
  607. static std::u16string short_name() {return std::u16string(1, u'k');}
  608. static std::u16string long_name() {return std::u16string(u"kilo");}
  609. static std::u16string symbol() {return short_name();}
  610. static std::u16string prefix() {return long_name();}
  611. };
  612. template <>
  613. struct ratio_string<kilo, char32_t>
  614. {
  615. static std::u32string short_name() {return std::u32string(1, U'k');}
  616. static std::u32string long_name() {return std::u32string(U"kilo");}
  617. static std::u32string symbol() {return short_name();}
  618. static std::u32string prefix() {return long_name();}
  619. };
  620. #endif
  621. #ifndef BOOST_NO_STD_WSTRING
  622. template <>
  623. struct ratio_string<kilo, wchar_t>
  624. {
  625. static std::wstring short_name() {return std::wstring(1, L'k');}
  626. static std::wstring long_name() {return std::wstring(L"kilo");}
  627. static std::wstring symbol() {return short_name();}
  628. static std::wstring prefix() {return long_name();}
  629. };
  630. #endif
  631. #endif
  632. // mega
  633. //template <>
  634. //struct ratio_string_is_localizable<mega> : true_type {};
  635. //
  636. //template <>
  637. //struct ratio_string_id<mega> : integral_constant<int,6> {};
  638. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  639. template <typename CharT>
  640. struct ratio_string<mega, CharT> :
  641. ratio_detail::ratio_string_static<mega,CharT>
  642. {};
  643. #else
  644. template <>
  645. struct ratio_string<mega, char>
  646. {
  647. static std::string short_name() {return std::string(1, 'M');}
  648. static std::string long_name() {return std::string("mega");}
  649. static std::string symbol() {return short_name();}
  650. static std::string prefix() {return long_name();}
  651. };
  652. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  653. template <>
  654. struct ratio_string<mega, char16_t>
  655. {
  656. static std::u16string short_name() {return std::u16string(1, u'M');}
  657. static std::u16string long_name() {return std::u16string(u"mega");}
  658. static std::u16string symbol() {return short_name();}
  659. static std::u16string prefix() {return long_name();}
  660. };
  661. template <>
  662. struct ratio_string<mega, char32_t>
  663. {
  664. static std::u32string short_name() {return std::u32string(1, U'M');}
  665. static std::u32string long_name() {return std::u32string(U"mega");}
  666. static std::u32string symbol() {return short_name();}
  667. static std::u32string prefix() {return long_name();}
  668. };
  669. #endif
  670. #ifndef BOOST_NO_STD_WSTRING
  671. template <>
  672. struct ratio_string<mega, wchar_t>
  673. {
  674. static std::wstring short_name() {return std::wstring(1, L'M');}
  675. static std::wstring long_name() {return std::wstring(L"mega");}
  676. static std::wstring symbol() {return short_name();}
  677. static std::wstring prefix() {return long_name();}
  678. };
  679. #endif
  680. #endif
  681. // giga
  682. //template <>
  683. //struct ratio_string_is_localizable<giga> : true_type {};
  684. //
  685. //template <>
  686. //struct ratio_string_id<giga> : integral_constant<int,9> {};
  687. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  688. template <typename CharT>
  689. struct ratio_string<giga, CharT> :
  690. ratio_detail::ratio_string_static<giga,CharT>
  691. {};
  692. #else
  693. template <>
  694. struct ratio_string<giga, char>
  695. {
  696. static std::string short_name() {return std::string(1, 'G');}
  697. static std::string long_name() {return std::string("giga");}
  698. static std::string symbol() {return short_name();}
  699. static std::string prefix() {return long_name();}
  700. };
  701. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  702. template <>
  703. struct ratio_string<giga, char16_t>
  704. {
  705. static std::u16string short_name() {return std::u16string(1, u'G');}
  706. static std::u16string long_name() {return std::u16string(u"giga");}
  707. static std::u16string symbol() {return short_name();}
  708. static std::u16string prefix() {return long_name();}
  709. };
  710. template <>
  711. struct ratio_string<giga, char32_t>
  712. {
  713. static std::u32string short_name() {return std::u32string(1, U'G');}
  714. static std::u32string long_name() {return std::u32string(U"giga");}
  715. static std::u32string symbol() {return short_name();}
  716. static std::u32string prefix() {return long_name();}
  717. };
  718. #endif
  719. #ifndef BOOST_NO_STD_WSTRING
  720. template <>
  721. struct ratio_string<giga, wchar_t>
  722. {
  723. static std::wstring short_name() {return std::wstring(1, L'G');}
  724. static std::wstring long_name() {return std::wstring(L"giga");}
  725. static std::wstring symbol() {return short_name();}
  726. static std::wstring prefix() {return long_name();}
  727. };
  728. #endif
  729. #endif
  730. // tera
  731. //template <>
  732. //struct ratio_string_is_localizable<tera> : true_type {};
  733. //
  734. //template <>
  735. //struct ratio_string_id<tera> : integral_constant<int,12> {};
  736. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  737. template <typename CharT>
  738. struct ratio_string<tera, CharT> :
  739. ratio_detail::ratio_string_static<tera,CharT>
  740. {};
  741. #else
  742. template <>
  743. struct ratio_string<tera, char>
  744. {
  745. static std::string short_name() {return std::string(1, 'T');}
  746. static std::string long_name() {return std::string("tera");}
  747. static std::string symbol() {return short_name();}
  748. static std::string prefix() {return long_name();}
  749. };
  750. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  751. template <>
  752. struct ratio_string<tera, char16_t>
  753. {
  754. static std::u16string short_name() {return std::u16string(1, u'T');}
  755. static std::u16string long_name() {return std::u16string(u"tera");}
  756. static std::u16string symbol() {return short_name();}
  757. static std::u16string prefix() {return long_name();}
  758. };
  759. template <>
  760. struct ratio_string<tera, char32_t>
  761. {
  762. static std::u32string short_name() {return std::u32string(1, U'T');}
  763. static std::u32string long_name() {return std::u32string(U"tera");}
  764. static std::u32string symbol() {return short_name();}
  765. static std::u32string prefix() {return long_name();}
  766. };
  767. #endif
  768. #ifndef BOOST_NO_STD_WSTRING
  769. template <>
  770. struct ratio_string<tera, wchar_t>
  771. {
  772. static std::wstring short_name() {return std::wstring(1, L'T');}
  773. static std::wstring long_name() {return std::wstring(L"tera");}
  774. static std::wstring symbol() {return short_name();}
  775. static std::wstring prefix() {return long_name();}
  776. };
  777. #endif
  778. #endif
  779. // peta
  780. //template <>
  781. //struct ratio_string_is_localizable<peta> : true_type {};
  782. //
  783. //template <>
  784. //struct ratio_string_id<peta> : integral_constant<int,15> {};
  785. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  786. template <typename CharT>
  787. struct ratio_string<peta, CharT> :
  788. ratio_detail::ratio_string_static<peta,CharT>
  789. {};
  790. #else
  791. template <>
  792. struct ratio_string<peta, char>
  793. {
  794. static std::string short_name() {return std::string(1, 'P');}
  795. static std::string long_name() {return std::string("peta");}
  796. static std::string symbol() {return short_name();}
  797. static std::string prefix() {return long_name();}
  798. };
  799. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  800. template <>
  801. struct ratio_string<peta, char16_t>
  802. {
  803. static std::u16string short_name() {return std::u16string(1, u'P');}
  804. static std::u16string long_name() {return std::u16string(u"peta");}
  805. static std::u16string symbol() {return short_name();}
  806. static std::u16string prefix() {return long_name();}
  807. };
  808. template <>
  809. struct ratio_string<peta, char32_t>
  810. {
  811. static std::u32string short_name() {return std::u32string(1, U'P');}
  812. static std::u32string long_name() {return std::u32string(U"peta");}
  813. static std::u32string symbol() {return short_name();}
  814. static std::u32string prefix() {return long_name();}
  815. };
  816. #endif
  817. #ifndef BOOST_NO_STD_WSTRING
  818. template <>
  819. struct ratio_string<peta, wchar_t>
  820. {
  821. static std::wstring short_name() {return std::wstring(1, L'P');}
  822. static std::wstring long_name() {return std::wstring(L"peta");}
  823. static std::wstring symbol() {return short_name();}
  824. static std::wstring prefix() {return long_name();}
  825. };
  826. #endif
  827. #endif
  828. // exa
  829. //template <>
  830. //struct ratio_string_is_localizable<exa> : true_type {};
  831. //
  832. //template <>
  833. //struct ratio_string_id<exa> : integral_constant<int,18> {};
  834. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  835. template <typename CharT>
  836. struct ratio_string<exa, CharT> :
  837. ratio_detail::ratio_string_static<exa,CharT>
  838. {};
  839. #else
  840. template <>
  841. struct ratio_string<exa, char>
  842. {
  843. static std::string short_name() {return std::string(1, 'E');}
  844. static std::string long_name() {return std::string("exa");}
  845. static std::string symbol() {return short_name();}
  846. static std::string prefix() {return long_name();}
  847. };
  848. #if BOOST_RATIO_HAS_UNICODE_SUPPORT
  849. template <>
  850. struct ratio_string<exa, char16_t>
  851. {
  852. static std::u16string short_name() {return std::u16string(1, u'E');}
  853. static std::u16string long_name() {return std::u16string(u"exa");}
  854. static std::u16string symbol() {return short_name();}
  855. static std::u16string prefix() {return long_name();}
  856. };
  857. template <>
  858. struct ratio_string<exa, char32_t>
  859. {
  860. static std::u32string short_name() {return std::u32string(1, U'E');}
  861. static std::u32string long_name() {return std::u32string(U"exa");}
  862. static std::u32string symbol() {return short_name();}
  863. static std::u32string prefix() {return long_name();}
  864. };
  865. #endif
  866. #ifndef BOOST_NO_STD_WSTRING
  867. template <>
  868. struct ratio_string<exa, wchar_t>
  869. {
  870. static std::wstring short_name() {return std::wstring(1, L'E');}
  871. static std::wstring long_name() {return std::wstring(L"exa");}
  872. static std::wstring symbol() {return short_name();}
  873. static std::wstring prefix() {return long_name();}
  874. };
  875. #endif
  876. #endif
  877. }
  878. #endif // BOOST_RATIO_RATIO_IO_HPP