ratio_io.hpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  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/config.hpp>
  28. #ifdef BOOST_RATIO_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0
  29. #include <boost/ratio/detail/ratio_io.hpp>
  30. #else
  31. #include <boost/config.hpp>
  32. #include <boost/ratio/ratio.hpp>
  33. #include <boost/type_traits/integral_constant.hpp>
  34. #include <string>
  35. #include <sstream>
  36. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  37. #include <boost/ratio/ratio_static_string.hpp>
  38. #include <boost/static_string/static_string.hpp>
  39. #endif
  40. #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)
  41. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  42. #undef BOOST_RATIO_HAS_UNICODE_SUPPORT
  43. #endif
  44. #else
  45. #define BOOST_RATIO_HAS_UNICODE_SUPPORT 1
  46. #endif
  47. namespace boost {
  48. //template <class Ratio>
  49. //struct ratio_string_is_localizable : false_type {};
  50. //template <class Ratio>
  51. //struct ratio_string_id : integral_constant<int,0> {};
  52. template <class Ratio, class CharT>
  53. struct ratio_string
  54. {
  55. static std::basic_string<CharT> symbol() {return prefix();}
  56. static std::basic_string<CharT> prefix();
  57. };
  58. template <class Ratio, class CharT>
  59. std::basic_string<CharT>
  60. ratio_string<Ratio, CharT>::prefix()
  61. {
  62. std::basic_ostringstream<CharT> os;
  63. os << CharT('[') << Ratio::num << CharT('/')
  64. << Ratio::den << CharT(']');
  65. return os.str();
  66. }
  67. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  68. namespace ratio_detail {
  69. template <class Ratio, class CharT>
  70. struct ratio_string_static
  71. {
  72. static std::string symbol() {
  73. return std::basic_string<CharT>(
  74. static_string::c_str<
  75. typename ratio_static_string<Ratio, CharT>::symbol
  76. >::value);
  77. }
  78. static std::string prefix() {
  79. return std::basic_string<CharT>(
  80. static_string::c_str<
  81. typename ratio_static_string<Ratio, CharT>::prefix
  82. >::value);
  83. }
  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 symbol() {return std::string(1, 'a');}
  103. static std::string prefix() {return std::string("atto");}
  104. };
  105. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  106. template <>
  107. struct ratio_string<atto, char16_t>
  108. {
  109. static std::u16string symbol() {return std::u16string(1, u'a');}
  110. static std::u16string prefix() {return std::u16string(u"atto");}
  111. };
  112. template <>
  113. struct ratio_string<atto, char32_t>
  114. {
  115. static std::u32string symbol() {return std::u32string(1, U'a');}
  116. static std::u32string prefix() {return std::u32string(U"atto");}
  117. };
  118. #endif
  119. #ifndef BOOST_NO_STD_WSTRING
  120. template <>
  121. struct ratio_string<atto, wchar_t>
  122. {
  123. static std::wstring symbol() {return std::wstring(1, L'a');}
  124. static std::wstring prefix() {return std::wstring(L"atto");}
  125. };
  126. #endif
  127. #endif
  128. // femto
  129. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  130. template <typename CharT>
  131. struct ratio_string<femto, CharT> :
  132. ratio_detail::ratio_string_static<femto,CharT>
  133. {};
  134. #else
  135. template <>
  136. struct ratio_string<femto, char>
  137. {
  138. static std::string symbol() {return std::string(1, 'f');}
  139. static std::string prefix() {return std::string("femto");}
  140. };
  141. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  142. template <>
  143. struct ratio_string<femto, char16_t>
  144. {
  145. static std::u16string symbol() {return std::u16string(1, u'f');}
  146. static std::u16string prefix() {return std::u16string(u"femto");}
  147. };
  148. template <>
  149. struct ratio_string<femto, char32_t>
  150. {
  151. static std::u32string symbol() {return std::u32string(1, U'f');}
  152. static std::u32string prefix() {return std::u32string(U"femto");}
  153. };
  154. #endif
  155. #ifndef BOOST_NO_STD_WSTRING
  156. template <>
  157. struct ratio_string<femto, wchar_t>
  158. {
  159. static std::wstring symbol() {return std::wstring(1, L'f');}
  160. static std::wstring prefix() {return std::wstring(L"femto");}
  161. };
  162. #endif
  163. #endif
  164. // pico
  165. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  166. template <typename CharT>
  167. struct ratio_string<pico, CharT> :
  168. ratio_detail::ratio_string_static<pico,CharT>
  169. {};
  170. #else
  171. template <>
  172. struct ratio_string<pico, char>
  173. {
  174. static std::string symbol() {return std::string(1, 'p');}
  175. static std::string prefix() {return std::string("pico");}
  176. };
  177. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  178. template <>
  179. struct ratio_string<pico, char16_t>
  180. {
  181. static std::u16string symbol() {return std::u16string(1, u'p');}
  182. static std::u16string prefix() {return std::u16string(u"pico");}
  183. };
  184. template <>
  185. struct ratio_string<pico, char32_t>
  186. {
  187. static std::u32string symbol() {return std::u32string(1, U'p');}
  188. static std::u32string prefix() {return std::u32string(U"pico");}
  189. };
  190. #endif
  191. #ifndef BOOST_NO_STD_WSTRING
  192. template <>
  193. struct ratio_string<pico, wchar_t>
  194. {
  195. static std::wstring symbol() {return std::wstring(1, L'p');}
  196. static std::wstring prefix() {return std::wstring(L"pico");}
  197. };
  198. #endif
  199. #endif
  200. // nano
  201. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  202. template <typename CharT>
  203. struct ratio_string<nano, CharT> :
  204. ratio_detail::ratio_string_static<nano,CharT>
  205. {};
  206. #else
  207. template <>
  208. struct ratio_string<nano, char>
  209. {
  210. static std::string symbol() {return std::string(1, 'n');}
  211. static std::string prefix() {return std::string("nano");}
  212. };
  213. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  214. template <>
  215. struct ratio_string<nano, char16_t>
  216. {
  217. static std::u16string symbol() {return std::u16string(1, u'n');}
  218. static std::u16string prefix() {return std::u16string(u"nano");}
  219. };
  220. template <>
  221. struct ratio_string<nano, char32_t>
  222. {
  223. static std::u32string symbol() {return std::u32string(1, U'n');}
  224. static std::u32string prefix() {return std::u32string(U"nano");}
  225. };
  226. #endif
  227. #ifndef BOOST_NO_STD_WSTRING
  228. template <>
  229. struct ratio_string<nano, wchar_t>
  230. {
  231. static std::wstring symbol() {return std::wstring(1, L'n');}
  232. static std::wstring prefix() {return std::wstring(L"nano");}
  233. };
  234. #endif
  235. #endif
  236. // micro
  237. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  238. template <typename CharT>
  239. struct ratio_string<micro, CharT> :
  240. ratio_detail::ratio_string_static<micro,CharT>
  241. {};
  242. #else
  243. template <>
  244. struct ratio_string<micro, char>
  245. {
  246. static std::string symbol() {return std::string("\xC2\xB5");}
  247. static std::string prefix() {return std::string("micro");}
  248. };
  249. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  250. template <>
  251. struct ratio_string<micro, char16_t>
  252. {
  253. static std::u16string symbol() {return std::u16string(1, u'\xB5');}
  254. static std::u16string prefix() {return std::u16string(u"micro");}
  255. };
  256. template <>
  257. struct ratio_string<micro, char32_t>
  258. {
  259. static std::u32string symbol() {return std::u32string(1, U'\xB5');}
  260. static std::u32string prefix() {return std::u32string(U"micro");}
  261. };
  262. #endif
  263. #ifndef BOOST_NO_STD_WSTRING
  264. template <>
  265. struct ratio_string<micro, wchar_t>
  266. {
  267. static std::wstring symbol() {return std::wstring(1, L'\xB5');}
  268. static std::wstring prefix() {return std::wstring(L"micro");}
  269. };
  270. #endif
  271. #endif
  272. // milli
  273. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  274. template <typename CharT>
  275. struct ratio_string<milli, CharT> :
  276. ratio_detail::ratio_string_static<milli,CharT>
  277. {};
  278. #else
  279. template <>
  280. struct ratio_string<milli, char>
  281. {
  282. static std::string symbol() {return std::string(1, 'm');}
  283. static std::string prefix() {return std::string("milli");}
  284. };
  285. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  286. template <>
  287. struct ratio_string<milli, char16_t>
  288. {
  289. static std::u16string symbol() {return std::u16string(1, u'm');}
  290. static std::u16string prefix() {return std::u16string(u"milli");}
  291. };
  292. template <>
  293. struct ratio_string<milli, char32_t>
  294. {
  295. static std::u32string symbol() {return std::u32string(1, U'm');}
  296. static std::u32string prefix() {return std::u32string(U"milli");}
  297. };
  298. #endif
  299. #ifndef BOOST_NO_STD_WSTRING
  300. template <>
  301. struct ratio_string<milli, wchar_t>
  302. {
  303. static std::wstring symbol() {return std::wstring(1, L'm');}
  304. static std::wstring prefix() {return std::wstring(L"milli");}
  305. };
  306. #endif
  307. #endif
  308. // centi
  309. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  310. template <typename CharT>
  311. struct ratio_string<centi, CharT> :
  312. ratio_detail::ratio_string_static<centi,CharT>
  313. {};
  314. #else
  315. template <>
  316. struct ratio_string<centi, char>
  317. {
  318. static std::string symbol() {return std::string(1, 'c');}
  319. static std::string prefix() {return std::string("centi");}
  320. };
  321. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  322. template <>
  323. struct ratio_string<centi, char16_t>
  324. {
  325. static std::u16string symbol() {return std::u16string(1, u'c');}
  326. static std::u16string prefix() {return std::u16string(u"centi");}
  327. };
  328. template <>
  329. struct ratio_string<centi, char32_t>
  330. {
  331. static std::u32string symbol() {return std::u32string(1, U'c');}
  332. static std::u32string prefix() {return std::u32string(U"centi");}
  333. };
  334. #endif
  335. #ifndef BOOST_NO_STD_WSTRING
  336. template <>
  337. struct ratio_string<centi, wchar_t>
  338. {
  339. static std::wstring symbol() {return std::wstring(1, L'c');}
  340. static std::wstring prefix() {return std::wstring(L"centi");}
  341. };
  342. #endif
  343. #endif
  344. // deci
  345. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  346. template <typename CharT>
  347. struct ratio_string<deci, CharT> :
  348. ratio_detail::ratio_string_static<deci,CharT>
  349. {};
  350. #else
  351. template <>
  352. struct ratio_string<deci, char>
  353. {
  354. static std::string symbol() {return std::string(1, 'd');}
  355. static std::string prefix() {return std::string("deci");}
  356. };
  357. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  358. template <>
  359. struct ratio_string<deci, char16_t>
  360. {
  361. static std::u16string symbol() {return std::u16string(1, u'd');}
  362. static std::u16string prefix() {return std::u16string(u"deci");}
  363. };
  364. template <>
  365. struct ratio_string<deci, char32_t>
  366. {
  367. static std::u32string symbol() {return std::u32string(1, U'd');}
  368. static std::u32string prefix() {return std::u32string(U"deci");}
  369. };
  370. #endif
  371. #ifndef BOOST_NO_STD_WSTRING
  372. template <>
  373. struct ratio_string<deci, wchar_t>
  374. {
  375. static std::wstring symbol() {return std::wstring(1, L'd');}
  376. static std::wstring prefix() {return std::wstring(L"deci");}
  377. };
  378. #endif
  379. #endif
  380. // unit
  381. // deca
  382. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  383. template <typename CharT>
  384. struct ratio_string<deca, CharT> :
  385. ratio_detail::ratio_string_static<deca,CharT>
  386. {};
  387. #else
  388. template <>
  389. struct ratio_string<deca, char>
  390. {
  391. static std::string symbol() {return std::string("da");}
  392. static std::string prefix() {return std::string("deca");}
  393. };
  394. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  395. template <>
  396. struct ratio_string<deca, char16_t>
  397. {
  398. static std::u16string symbol() {return std::u16string(u"da");}
  399. static std::u16string prefix() {return std::u16string(u"deca");}
  400. };
  401. template <>
  402. struct ratio_string<deca, char32_t>
  403. {
  404. static std::u32string symbol() {return std::u32string(U"da");}
  405. static std::u32string prefix() {return std::u32string(U"deca");}
  406. };
  407. #endif
  408. #ifndef BOOST_NO_STD_WSTRING
  409. template <>
  410. struct ratio_string<deca, wchar_t>
  411. {
  412. static std::wstring symbol() {return std::wstring(L"da");}
  413. static std::wstring prefix() {return std::wstring(L"deca");}
  414. };
  415. #endif
  416. #endif
  417. // hecto
  418. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  419. template <typename CharT>
  420. struct ratio_string<hecto, CharT> :
  421. ratio_detail::ratio_string_static<hecto,CharT>
  422. {};
  423. #else
  424. template <>
  425. struct ratio_string<hecto, char>
  426. {
  427. static std::string symbol() {return std::string(1, 'h');}
  428. static std::string prefix() {return std::string("hecto");}
  429. };
  430. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  431. template <>
  432. struct ratio_string<hecto, char16_t>
  433. {
  434. static std::u16string symbol() {return std::u16string(1, u'h');}
  435. static std::u16string prefix() {return std::u16string(u"hecto");}
  436. };
  437. template <>
  438. struct ratio_string<hecto, char32_t>
  439. {
  440. static std::u32string symbol() {return std::u32string(1, U'h');}
  441. static std::u32string prefix() {return std::u32string(U"hecto");}
  442. };
  443. #endif
  444. #ifndef BOOST_NO_STD_WSTRING
  445. template <>
  446. struct ratio_string<hecto, wchar_t>
  447. {
  448. static std::wstring symbol() {return std::wstring(1, L'h');}
  449. static std::wstring prefix() {return std::wstring(L"hecto");}
  450. };
  451. #endif
  452. #endif
  453. // kilo
  454. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  455. template <typename CharT>
  456. struct ratio_string<kilo, CharT> :
  457. ratio_detail::ratio_string_static<kilo,CharT>
  458. {};
  459. #else
  460. template <>
  461. struct ratio_string<kilo, char>
  462. {
  463. static std::string symbol() {return std::string(1, 'k');}
  464. static std::string prefix() {return std::string("kilo");}
  465. };
  466. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  467. template <>
  468. struct ratio_string<kilo, char16_t>
  469. {
  470. static std::u16string symbol() {return std::u16string(1, u'k');}
  471. static std::u16string prefix() {return std::u16string(u"kilo");}
  472. };
  473. template <>
  474. struct ratio_string<kilo, char32_t>
  475. {
  476. static std::u32string symbol() {return std::u32string(1, U'k');}
  477. static std::u32string prefix() {return std::u32string(U"kilo");}
  478. };
  479. #endif
  480. #ifndef BOOST_NO_STD_WSTRING
  481. template <>
  482. struct ratio_string<kilo, wchar_t>
  483. {
  484. static std::wstring symbol() {return std::wstring(1, L'k');}
  485. static std::wstring prefix() {return std::wstring(L"kilo");}
  486. };
  487. #endif
  488. #endif
  489. // mega
  490. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  491. template <typename CharT>
  492. struct ratio_string<mega, CharT> :
  493. ratio_detail::ratio_string_static<mega,CharT>
  494. {};
  495. #else
  496. template <>
  497. struct ratio_string<mega, char>
  498. {
  499. static std::string symbol() {return std::string(1, 'M');}
  500. static std::string prefix() {return std::string("mega");}
  501. };
  502. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  503. template <>
  504. struct ratio_string<mega, char16_t>
  505. {
  506. static std::u16string symbol() {return std::u16string(1, u'M');}
  507. static std::u16string prefix() {return std::u16string(u"mega");}
  508. };
  509. template <>
  510. struct ratio_string<mega, char32_t>
  511. {
  512. static std::u32string symbol() {return std::u32string(1, U'M');}
  513. static std::u32string prefix() {return std::u32string(U"mega");}
  514. };
  515. #endif
  516. #ifndef BOOST_NO_STD_WSTRING
  517. template <>
  518. struct ratio_string<mega, wchar_t>
  519. {
  520. static std::wstring symbol() {return std::wstring(1, L'M');}
  521. static std::wstring prefix() {return std::wstring(L"mega");}
  522. };
  523. #endif
  524. #endif
  525. // giga
  526. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  527. template <typename CharT>
  528. struct ratio_string<giga, CharT> :
  529. ratio_detail::ratio_string_static<giga,CharT>
  530. {};
  531. #else
  532. template <>
  533. struct ratio_string<giga, char>
  534. {
  535. static std::string symbol() {return std::string(1, 'G');}
  536. static std::string prefix() {return std::string("giga");}
  537. };
  538. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  539. template <>
  540. struct ratio_string<giga, char16_t>
  541. {
  542. static std::u16string symbol() {return std::u16string(1, u'G');}
  543. static std::u16string prefix() {return std::u16string(u"giga");}
  544. };
  545. template <>
  546. struct ratio_string<giga, char32_t>
  547. {
  548. static std::u32string symbol() {return std::u32string(1, U'G');}
  549. static std::u32string prefix() {return std::u32string(U"giga");}
  550. };
  551. #endif
  552. #ifndef BOOST_NO_STD_WSTRING
  553. template <>
  554. struct ratio_string<giga, wchar_t>
  555. {
  556. static std::wstring symbol() {return std::wstring(1, L'G');}
  557. static std::wstring prefix() {return std::wstring(L"giga");}
  558. };
  559. #endif
  560. #endif
  561. // tera
  562. //template <>
  563. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  564. template <typename CharT>
  565. struct ratio_string<tera, CharT> :
  566. ratio_detail::ratio_string_static<tera,CharT>
  567. {};
  568. #else
  569. template <>
  570. struct ratio_string<tera, char>
  571. {
  572. static std::string symbol() {return std::string(1, 'T');}
  573. static std::string prefix() {return std::string("tera");}
  574. };
  575. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  576. template <>
  577. struct ratio_string<tera, char16_t>
  578. {
  579. static std::u16string symbol() {return std::u16string(1, u'T');}
  580. static std::u16string prefix() {return std::u16string(u"tera");}
  581. };
  582. template <>
  583. struct ratio_string<tera, char32_t>
  584. {
  585. static std::u32string symbol() {return std::u32string(1, U'T');}
  586. static std::u32string prefix() {return std::u32string(U"tera");}
  587. };
  588. #endif
  589. #ifndef BOOST_NO_STD_WSTRING
  590. template <>
  591. struct ratio_string<tera, wchar_t>
  592. {
  593. static std::wstring symbol() {return std::wstring(1, L'T');}
  594. static std::wstring prefix() {return std::wstring(L"tera");}
  595. };
  596. #endif
  597. #endif
  598. // peta
  599. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  600. template <typename CharT>
  601. struct ratio_string<peta, CharT> :
  602. ratio_detail::ratio_string_static<peta,CharT>
  603. {};
  604. #else
  605. template <>
  606. struct ratio_string<peta, char>
  607. {
  608. static std::string symbol() {return std::string(1, 'P');}
  609. static std::string prefix() {return std::string("peta");}
  610. };
  611. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  612. template <>
  613. struct ratio_string<peta, char16_t>
  614. {
  615. static std::u16string symbol() {return std::u16string(1, u'P');}
  616. static std::u16string prefix() {return std::u16string(u"peta");}
  617. };
  618. template <>
  619. struct ratio_string<peta, char32_t>
  620. {
  621. static std::u32string symbol() {return std::u32string(1, U'P');}
  622. static std::u32string prefix() {return std::u32string(U"peta");}
  623. };
  624. #endif
  625. #ifndef BOOST_NO_STD_WSTRING
  626. template <>
  627. struct ratio_string<peta, wchar_t>
  628. {
  629. static std::wstring symbol() {return std::wstring(1, L'P');}
  630. static std::wstring prefix() {return std::wstring(L"peta");}
  631. };
  632. #endif
  633. #endif
  634. // exa
  635. #ifdef BOOST_RATIO_HAS_STATIC_STRING
  636. template <typename CharT>
  637. struct ratio_string<exa, CharT> :
  638. ratio_detail::ratio_string_static<exa,CharT>
  639. {};
  640. #else
  641. template <>
  642. struct ratio_string<exa, char>
  643. {
  644. static std::string symbol() {return std::string(1, 'E');}
  645. static std::string prefix() {return std::string("exa");}
  646. };
  647. #if defined BOOST_RATIO_HAS_UNICODE_SUPPORT
  648. template <>
  649. struct ratio_string<exa, char16_t>
  650. {
  651. static std::u16string symbol() {return std::u16string(1, u'E');}
  652. static std::u16string prefix() {return std::u16string(u"exa");}
  653. };
  654. template <>
  655. struct ratio_string<exa, char32_t>
  656. {
  657. static std::u32string symbol() {return std::u32string(1, U'E');}
  658. static std::u32string prefix() {return std::u32string(U"exa");}
  659. };
  660. #endif
  661. #ifndef BOOST_NO_STD_WSTRING
  662. template <>
  663. struct ratio_string<exa, wchar_t>
  664. {
  665. static std::wstring symbol() {return std::wstring(1, L'E');}
  666. static std::wstring prefix() {return std::wstring(L"exa");}
  667. };
  668. #endif
  669. #endif
  670. }
  671. #endif // BOOST_RATIO_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0
  672. #endif // BOOST_RATIO_RATIO_IO_HPP