uint_radix.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. // Copyright (c) 2001-2011 Hartmut Kaiser
  2. // Copyright (c) 2011 Jan Frederick Eick
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/config/warning_disable.hpp>
  7. #include <boost/detail/lightweight_test.hpp>
  8. #include <boost/spirit/include/karma_numeric.hpp>
  9. #include <boost/cstdint.hpp>
  10. #include "test.hpp"
  11. ///////////////////////////////////////////////////////////////////////////////
  12. //
  13. // *** BEWARE PLATFORM DEPENDENT!!! ***
  14. // *** The following assumes 32 bit boost::uint32_tegers.
  15. // *** Modify these constants when appropriate.
  16. //
  17. ///////////////////////////////////////////////////////////////////////////////
  18. char const* max_unsigned_base2 = "11111111111111111111111111111111";
  19. char const* max_unsigned_base3 = "102002022201221111210";
  20. char const* max_unsigned_base4 = "3333333333333333";
  21. char const* max_unsigned_base5 = "32244002423140";
  22. char const* max_unsigned_base6 = "1550104015503";
  23. char const* max_unsigned_base7 = "211301422353";
  24. char const* max_unsigned_base8 = "37777777777";
  25. char const* max_unsigned_base9 = "12068657453";
  26. char const* max_unsigned_base11 = "1904440553";
  27. char const* max_unsigned_base12 = "9ba461593";
  28. char const* max_unsigned_base13 = "535a79888";
  29. char const* max_unsigned_base14 = "2ca5b7463";
  30. char const* max_unsigned_base15 = "1a20dcd80";
  31. char const* max_unsigned_base16 = "ffffffff";
  32. char const* max_unsigned_base17 = "a7ffda90";
  33. char const* max_unsigned_base18 = "704he7g3";
  34. char const* max_unsigned_base19 = "4f5aff65";
  35. char const* max_unsigned_base20 = "3723ai4f";
  36. char const* max_unsigned_base21 = "281d55i3";
  37. char const* max_unsigned_base22 = "1fj8b183";
  38. char const* max_unsigned_base23 = "1606k7ib";
  39. char const* max_unsigned_base24 = "mb994af";
  40. char const* max_unsigned_base25 = "hek2mgk";
  41. char const* max_unsigned_base26 = "dnchbnl";
  42. char const* max_unsigned_base27 = "b28jpdl";
  43. char const* max_unsigned_base28 = "8pfgih3";
  44. char const* max_unsigned_base29 = "76beigf";
  45. char const* max_unsigned_base30 = "5qmcpqf";
  46. char const* max_unsigned_base31 = "4q0jto3";
  47. char const* max_unsigned_base32 = "3vvvvvv";
  48. char const* max_unsigned_base33 = "3aokq93";
  49. char const* max_unsigned_base34 = "2qhxjlh";
  50. char const* max_unsigned_base35 = "2br45qa";
  51. char const* max_unsigned_base36 = "1z141z3";
  52. int
  53. main()
  54. {
  55. using spirit_test::test;
  56. using boost::spirit::karma::uint_generator;
  57. ///////////////////////////////////////////////////////////////////////////
  58. // arbitrary radix test (base 2)
  59. ///////////////////////////////////////////////////////////////////////////
  60. {
  61. uint_generator<boost::uint32_t, 2> base2_generator;
  62. BOOST_TEST(test("1100111100100110010", base2_generator(424242)));
  63. BOOST_TEST(test("1100111100100110010", base2_generator, 424242));
  64. BOOST_TEST(test(max_unsigned_base2, base2_generator(0xffffffffu)));
  65. BOOST_TEST(test(max_unsigned_base2, base2_generator, 0xffffffffu));
  66. }
  67. ///////////////////////////////////////////////////////////////////////////
  68. // arbitrary radix test (base 3)
  69. ///////////////////////////////////////////////////////////////////////////
  70. {
  71. uint_generator<boost::uint32_t, 3> base3_generator;
  72. BOOST_TEST(test("210112221200", base3_generator(424242)));
  73. BOOST_TEST(test("210112221200", base3_generator, 424242));
  74. BOOST_TEST(test(max_unsigned_base3, base3_generator(0xffffffffu)));
  75. BOOST_TEST(test(max_unsigned_base3, base3_generator, 0xffffffffu));
  76. }
  77. ///////////////////////////////////////////////////////////////////////////
  78. // arbitrary radix test (base 4)
  79. ///////////////////////////////////////////////////////////////////////////
  80. {
  81. uint_generator<boost::uint32_t, 4> base4_generator;
  82. BOOST_TEST(test("1213210302", base4_generator(424242)));
  83. BOOST_TEST(test("1213210302", base4_generator, 424242));
  84. BOOST_TEST(test(max_unsigned_base4, base4_generator(0xffffffffu)));
  85. BOOST_TEST(test(max_unsigned_base4, base4_generator, 0xffffffffu));
  86. }
  87. ///////////////////////////////////////////////////////////////////////////
  88. // arbitrary radix test (base 5)
  89. ///////////////////////////////////////////////////////////////////////////
  90. {
  91. uint_generator<boost::uint32_t, 5> base5_generator;
  92. BOOST_TEST(test("102033432", base5_generator(424242)));
  93. BOOST_TEST(test("102033432", base5_generator, 424242));
  94. BOOST_TEST(test(max_unsigned_base5, base5_generator(0xffffffffu)));
  95. BOOST_TEST(test(max_unsigned_base5, base5_generator, 0xffffffffu));
  96. }
  97. ///////////////////////////////////////////////////////////////////////////
  98. // arbitrary radix test (base 6)
  99. ///////////////////////////////////////////////////////////////////////////
  100. {
  101. uint_generator<boost::uint32_t, 6> base6_generator;
  102. BOOST_TEST(test("13032030", base6_generator(424242)));
  103. BOOST_TEST(test("13032030", base6_generator, 424242));
  104. BOOST_TEST(test(max_unsigned_base6, base6_generator(0xffffffffu)));
  105. BOOST_TEST(test(max_unsigned_base6, base6_generator, 0xffffffffu));
  106. }
  107. ///////////////////////////////////////////////////////////////////////////
  108. // arbitrary radix test (base 7)
  109. ///////////////////////////////////////////////////////////////////////////
  110. {
  111. uint_generator<boost::uint32_t, 7> base7_generator;
  112. BOOST_TEST(test("3414600", base7_generator(424242)));
  113. BOOST_TEST(test("3414600", base7_generator, 424242));
  114. BOOST_TEST(test(max_unsigned_base7, base7_generator(0xffffffffu)));
  115. BOOST_TEST(test(max_unsigned_base7, base7_generator, 0xffffffffu));
  116. }
  117. ///////////////////////////////////////////////////////////////////////////
  118. // arbitrary radix test (base 8)
  119. ///////////////////////////////////////////////////////////////////////////
  120. {
  121. uint_generator<boost::uint32_t, 8> base8_generator;
  122. BOOST_TEST(test("1474462", base8_generator(424242)));
  123. BOOST_TEST(test("1474462", base8_generator, 424242));
  124. BOOST_TEST(test(max_unsigned_base8, base8_generator(0xffffffffu)));
  125. BOOST_TEST(test(max_unsigned_base8, base8_generator, 0xffffffffu));
  126. }
  127. ///////////////////////////////////////////////////////////////////////////
  128. // arbitrary radix test (base 9)
  129. ///////////////////////////////////////////////////////////////////////////
  130. {
  131. uint_generator<boost::uint32_t, 9> base9_generator;
  132. BOOST_TEST(test("715850", base9_generator(424242)));
  133. BOOST_TEST(test("715850", base9_generator, 424242));
  134. BOOST_TEST(test(max_unsigned_base9, base9_generator(0xffffffffu)));
  135. BOOST_TEST(test(max_unsigned_base9, base9_generator, 0xffffffffu));
  136. }
  137. ///////////////////////////////////////////////////////////////////////////
  138. // arbitrary radix test (base 11)
  139. ///////////////////////////////////////////////////////////////////////////
  140. {
  141. uint_generator<boost::uint32_t, 11> base11_generator;
  142. BOOST_TEST(test("26a815", base11_generator(424242)));
  143. BOOST_TEST(test("26a815", base11_generator, 424242));
  144. BOOST_TEST(test(max_unsigned_base11, base11_generator(0xffffffffu)));
  145. BOOST_TEST(test(max_unsigned_base11, base11_generator, 0xffffffffu));
  146. }
  147. ///////////////////////////////////////////////////////////////////////////
  148. // arbitrary radix test (base 12)
  149. ///////////////////////////////////////////////////////////////////////////
  150. {
  151. uint_generator<boost::uint32_t, 12> base12_generator;
  152. BOOST_TEST(test("185616", base12_generator(424242)));
  153. BOOST_TEST(test("185616", base12_generator, 424242));
  154. BOOST_TEST(test(max_unsigned_base12, base12_generator(0xffffffffu)));
  155. BOOST_TEST(test(max_unsigned_base12, base12_generator, 0xffffffffu));
  156. }
  157. ///////////////////////////////////////////////////////////////////////////
  158. // arbitrary radix test (base 13)
  159. ///////////////////////////////////////////////////////////////////////////
  160. {
  161. uint_generator<boost::uint32_t, 13> base13_generator;
  162. BOOST_TEST(test("11b140", base13_generator(424242)));
  163. BOOST_TEST(test("11b140", base13_generator, 424242));
  164. BOOST_TEST(test(max_unsigned_base13, base13_generator(0xffffffffu)));
  165. BOOST_TEST(test(max_unsigned_base13, base13_generator, 0xffffffffu));
  166. }
  167. ///////////////////////////////////////////////////////////////////////////
  168. // arbitrary radix test (base 14)
  169. ///////////////////////////////////////////////////////////////////////////
  170. {
  171. uint_generator<boost::uint32_t, 14> base14_generator;
  172. BOOST_TEST(test("b0870", base14_generator(424242)));
  173. BOOST_TEST(test("b0870", base14_generator, 424242));
  174. BOOST_TEST(test(max_unsigned_base14, base14_generator(0xffffffffu)));
  175. BOOST_TEST(test(max_unsigned_base14, base14_generator, 0xffffffffu));
  176. }
  177. ///////////////////////////////////////////////////////////////////////////
  178. // arbitrary radix test (base 15)
  179. ///////////////////////////////////////////////////////////////////////////
  180. {
  181. uint_generator<boost::uint32_t, 15> base15_generator;
  182. BOOST_TEST(test("85a7c", base15_generator(424242)));
  183. BOOST_TEST(test("85a7c", base15_generator, 424242));
  184. BOOST_TEST(test(max_unsigned_base15, base15_generator(0xffffffffu)));
  185. BOOST_TEST(test(max_unsigned_base15, base15_generator, 0xffffffffu));
  186. }
  187. ///////////////////////////////////////////////////////////////////////////
  188. // arbitrary radix test (base 16)
  189. ///////////////////////////////////////////////////////////////////////////
  190. {
  191. uint_generator<boost::uint32_t, 16> base16_generator;
  192. BOOST_TEST(test("67932", base16_generator(424242)));
  193. BOOST_TEST(test("67932", base16_generator, 424242));
  194. BOOST_TEST(test(max_unsigned_base16, base16_generator(0xffffffffu)));
  195. BOOST_TEST(test(max_unsigned_base16, base16_generator, 0xffffffffu));
  196. }
  197. ///////////////////////////////////////////////////////////////////////////
  198. // arbitrary radix test (base 17)
  199. ///////////////////////////////////////////////////////////////////////////
  200. {
  201. uint_generator<boost::uint32_t, 17> base17_generator;
  202. BOOST_TEST(test("515g7", base17_generator(424242)));
  203. BOOST_TEST(test("515g7", base17_generator, 424242));
  204. BOOST_TEST(test(max_unsigned_base17, base17_generator(0xffffffffu)));
  205. BOOST_TEST(test(max_unsigned_base17, base17_generator, 0xffffffffu));
  206. }
  207. ///////////////////////////////////////////////////////////////////////////
  208. // arbitrary radix test (base 18)
  209. ///////////////////////////////////////////////////////////////////////////
  210. {
  211. uint_generator<boost::uint32_t, 18> base18_generator;
  212. BOOST_TEST(test("40d70", base18_generator(424242)));
  213. BOOST_TEST(test("40d70", base18_generator, 424242));
  214. BOOST_TEST(test(max_unsigned_base18, base18_generator(0xffffffffu)));
  215. BOOST_TEST(test(max_unsigned_base18, base18_generator, 0xffffffffu));
  216. }
  217. ///////////////////////////////////////////////////////////////////////////
  218. // arbitrary radix test (base 19)
  219. ///////////////////////////////////////////////////////////////////////////
  220. {
  221. uint_generator<boost::uint32_t, 19> base19_generator;
  222. BOOST_TEST(test("34g3a", base19_generator(424242)));
  223. BOOST_TEST(test("34g3a", base19_generator, 424242));
  224. BOOST_TEST(test(max_unsigned_base19, base19_generator(0xffffffffu)));
  225. BOOST_TEST(test(max_unsigned_base19, base19_generator, 0xffffffffu));
  226. }
  227. ///////////////////////////////////////////////////////////////////////////
  228. // arbitrary radix test (base 20)
  229. ///////////////////////////////////////////////////////////////////////////
  230. {
  231. uint_generator<boost::uint32_t, 20> base20_generator;
  232. BOOST_TEST(test("2d0c2", base20_generator(424242)));
  233. BOOST_TEST(test("2d0c2", base20_generator, 424242));
  234. BOOST_TEST(test(max_unsigned_base20, base20_generator(0xffffffffu)));
  235. BOOST_TEST(test(max_unsigned_base20, base20_generator, 0xffffffffu));
  236. }
  237. ///////////////////////////////////////////////////////////////////////////
  238. // arbitrary radix test (base 21)
  239. ///////////////////////////////////////////////////////////////////////////
  240. {
  241. uint_generator<boost::uint32_t, 21> base21_generator;
  242. BOOST_TEST(test("23h00", base21_generator(424242)));
  243. BOOST_TEST(test("23h00", base21_generator, 424242));
  244. BOOST_TEST(test(max_unsigned_base21, base21_generator(0xffffffffu)));
  245. BOOST_TEST(test(max_unsigned_base21, base21_generator, 0xffffffffu));
  246. }
  247. ///////////////////////////////////////////////////////////////////////////
  248. // arbitrary radix test (base 22)
  249. ///////////////////////////////////////////////////////////////////////////
  250. {
  251. uint_generator<boost::uint32_t, 22> base22_generator;
  252. BOOST_TEST(test("1hibg", base22_generator(424242)));
  253. BOOST_TEST(test("1hibg", base22_generator, 424242));
  254. BOOST_TEST(test(max_unsigned_base22, base22_generator(0xffffffffu)));
  255. BOOST_TEST(test(max_unsigned_base22, base22_generator, 0xffffffffu));
  256. }
  257. ///////////////////////////////////////////////////////////////////////////
  258. // arbitrary radix test (base 23)
  259. ///////////////////////////////////////////////////////////////////////////
  260. {
  261. uint_generator<boost::uint32_t, 23> base23_generator;
  262. BOOST_TEST(test("1bjm7", base23_generator(424242)));
  263. BOOST_TEST(test("1bjm7", base23_generator, 424242));
  264. BOOST_TEST(test(max_unsigned_base23, base23_generator(0xffffffffu)));
  265. BOOST_TEST(test(max_unsigned_base23, base23_generator, 0xffffffffu));
  266. }
  267. ///////////////////////////////////////////////////////////////////////////
  268. // arbitrary radix test (base 24)
  269. ///////////////////////////////////////////////////////////////////////////
  270. {
  271. uint_generator<boost::uint32_t, 24> base24_generator;
  272. BOOST_TEST(test("16gci", base24_generator(424242)));
  273. BOOST_TEST(test("16gci", base24_generator, 424242));
  274. BOOST_TEST(test(max_unsigned_base24, base24_generator(0xffffffffu)));
  275. BOOST_TEST(test(max_unsigned_base24, base24_generator, 0xffffffffu));
  276. }
  277. ///////////////////////////////////////////////////////////////////////////
  278. // arbitrary radix test (base 25)
  279. ///////////////////////////////////////////////////////////////////////////
  280. {
  281. uint_generator<boost::uint32_t, 25> base25_generator;
  282. BOOST_TEST(test("123jh", base25_generator(424242)));
  283. BOOST_TEST(test("123jh", base25_generator, 424242));
  284. BOOST_TEST(test(max_unsigned_base25, base25_generator(0xffffffffu)));
  285. BOOST_TEST(test(max_unsigned_base25, base25_generator, 0xffffffffu));
  286. }
  287. ///////////////////////////////////////////////////////////////////////////
  288. // arbitrary radix test (base 26)
  289. ///////////////////////////////////////////////////////////////////////////
  290. {
  291. uint_generator<boost::uint32_t, 26> base26_generator;
  292. BOOST_TEST(test("o3f0", base26_generator(424242)));
  293. BOOST_TEST(test("o3f0", base26_generator, 424242));
  294. BOOST_TEST(test(max_unsigned_base26, base26_generator(0xffffffffu)));
  295. BOOST_TEST(test(max_unsigned_base26, base26_generator, 0xffffffffu));
  296. }
  297. ///////////////////////////////////////////////////////////////////////////
  298. // arbitrary radix test (base 27)
  299. ///////////////////////////////////////////////////////////////////////////
  300. {
  301. uint_generator<boost::uint32_t, 27> base27_generator;
  302. BOOST_TEST(test("lepi", base27_generator(424242)));
  303. BOOST_TEST(test("lepi", base27_generator, 424242));
  304. BOOST_TEST(test(max_unsigned_base27, base27_generator(0xffffffffu)));
  305. BOOST_TEST(test(max_unsigned_base27, base27_generator, 0xffffffffu));
  306. }
  307. ///////////////////////////////////////////////////////////////////////////
  308. // arbitrary radix test (base 28)
  309. ///////////////////////////////////////////////////////////////////////////
  310. {
  311. uint_generator<boost::uint32_t, 28> base28_generator;
  312. BOOST_TEST(test("j93e", base28_generator(424242)));
  313. BOOST_TEST(test("j93e", base28_generator, 424242));
  314. BOOST_TEST(test(max_unsigned_base28, base28_generator(0xffffffffu)));
  315. BOOST_TEST(test(max_unsigned_base28, base28_generator, 0xffffffffu));
  316. }
  317. ///////////////////////////////////////////////////////////////////////////
  318. // arbitrary radix test (base 29)
  319. ///////////////////////////////////////////////////////////////////////////
  320. {
  321. uint_generator<boost::uint32_t, 29> base29_generator;
  322. BOOST_TEST(test("hbd1", base29_generator(424242)));
  323. BOOST_TEST(test("hbd1", base29_generator, 424242));
  324. BOOST_TEST(test(max_unsigned_base29, base29_generator(0xffffffffu)));
  325. BOOST_TEST(test(max_unsigned_base29, base29_generator, 0xffffffffu));
  326. }
  327. ///////////////////////////////////////////////////////////////////////////
  328. // arbitrary radix test (base 30)
  329. ///////////////////////////////////////////////////////////////////////////
  330. {
  331. uint_generator<boost::uint32_t, 30> base30_generator;
  332. BOOST_TEST(test("flbc", base30_generator(424242)));
  333. BOOST_TEST(test("flbc", base30_generator, 424242));
  334. BOOST_TEST(test(max_unsigned_base30, base30_generator(0xffffffffu)));
  335. BOOST_TEST(test(max_unsigned_base30, base30_generator, 0xffffffffu));
  336. }
  337. ///////////////////////////////////////////////////////////////////////////
  338. // arbitrary radix test (base 31)
  339. ///////////////////////////////////////////////////////////////////////////
  340. {
  341. uint_generator<boost::uint32_t, 31> base31_generator;
  342. BOOST_TEST(test("e7e7", base31_generator(424242)));
  343. BOOST_TEST(test("e7e7", base31_generator, 424242));
  344. BOOST_TEST(test(max_unsigned_base31, base31_generator(0xffffffffu)));
  345. BOOST_TEST(test(max_unsigned_base31, base31_generator, 0xffffffffu));
  346. }
  347. ///////////////////////////////////////////////////////////////////////////
  348. // arbitrary radix test (base 32)
  349. ///////////////////////////////////////////////////////////////////////////
  350. {
  351. uint_generator<boost::uint32_t, 32> base32_generator;
  352. BOOST_TEST(test("cu9i", base32_generator(424242)));
  353. BOOST_TEST(test("cu9i", base32_generator, 424242));
  354. BOOST_TEST(test(max_unsigned_base32, base32_generator(0xffffffffu)));
  355. BOOST_TEST(test(max_unsigned_base32, base32_generator, 0xffffffffu));
  356. }
  357. ///////////////////////////////////////////////////////////////////////////
  358. // arbitrary radix test (base 33)
  359. ///////////////////////////////////////////////////////////////////////////
  360. {
  361. uint_generator<boost::uint32_t, 33> base33_generator;
  362. BOOST_TEST(test("bqir", base33_generator(424242)));
  363. BOOST_TEST(test("bqir", base33_generator, 424242));
  364. BOOST_TEST(test(max_unsigned_base33, base33_generator(0xffffffffu)));
  365. BOOST_TEST(test(max_unsigned_base33, base33_generator, 0xffffffffu));
  366. }
  367. ///////////////////////////////////////////////////////////////////////////
  368. // arbitrary radix test (base 34)
  369. ///////////////////////////////////////////////////////////////////////////
  370. {
  371. uint_generator<boost::uint32_t, 34> base34_generator;
  372. BOOST_TEST(test("aqxo", base34_generator(424242)));
  373. BOOST_TEST(test("aqxo", base34_generator, 424242));
  374. BOOST_TEST(test(max_unsigned_base34, base34_generator(0xffffffffu)));
  375. BOOST_TEST(test(max_unsigned_base34, base34_generator, 0xffffffffu));
  376. }
  377. ///////////////////////////////////////////////////////////////////////////
  378. // arbitrary radix test (base 35)
  379. ///////////////////////////////////////////////////////////////////////////
  380. {
  381. uint_generator<boost::uint32_t, 35> base35_generator;
  382. BOOST_TEST(test("9vb7", base35_generator(424242)));
  383. BOOST_TEST(test("9vb7", base35_generator, 424242));
  384. BOOST_TEST(test(max_unsigned_base35, base35_generator(0xffffffffu)));
  385. BOOST_TEST(test(max_unsigned_base35, base35_generator, 0xffffffffu));
  386. }
  387. ///////////////////////////////////////////////////////////////////////////
  388. // arbitrary radix test (base 36)
  389. ///////////////////////////////////////////////////////////////////////////
  390. {
  391. uint_generator<boost::uint32_t, 36> base36_generator;
  392. BOOST_TEST(test("93ci", base36_generator(424242)));
  393. BOOST_TEST(test("93ci", base36_generator, 424242));
  394. BOOST_TEST(test(max_unsigned_base36, base36_generator(0xffffffffu)));
  395. BOOST_TEST(test(max_unsigned_base36, base36_generator, 0xffffffffu));
  396. }
  397. return boost::report_errors();
  398. }