endian_test.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
  1. // endian_test.cpp ---------------------------------------------------------//
  2. // Copyright Beman Dawes 1999-2008
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // See http://www.boost.org/LICENSE_1_0.txt
  5. // See library home page at http://www.boost.org/libs/endian
  6. //----------------------------------------------------------------------------//
  7. // This test probes for correct endianness, size, and value.
  8. // See endian_operations_test for tests of operator correctness and interaction
  9. // between operand types.
  10. //----------------------------------------------------------------------------//
  11. #include <boost/endian/detail/disable_warnings.hpp>
  12. #include <boost/endian/arithmetic.hpp>
  13. #include <boost/cstdint.hpp>
  14. #include <boost/detail/lightweight_main.hpp>
  15. #include <iostream>
  16. #include <limits>
  17. #include <climits>
  18. #include <cstdlib> // for atoi(), exit()
  19. #include <cstring> // for memcmp()
  20. using namespace std; // Not the best programming practice, but I
  21. using namespace boost; // want to verify this combination of using
  22. using namespace boost::endian; // namespaces works. See endian_operations_test
  23. // // for tests that don't do "using namespace".
  24. #define VERIFY(predicate) verify( predicate, __LINE__ )
  25. #define VERIFY_SIZE(actual, expected) verify_size( actual, expected, __LINE__ )
  26. #define VERIFY_VALUE_AND_OPS(endian_t,expected_t,expected) verify_value_and_ops<endian_t, expected_t>( expected, __LINE__ )
  27. #define VERIFY_BIG_REPRESENTATION(t) verify_representation<t>( true, __LINE__ )
  28. #define VERIFY_LITTLE_REPRESENTATION(t) verify_representation<t>( false, __LINE__ )
  29. #define VERIFY_NATIVE_REPRESENTATION(t) verify_native_representation<t>( __LINE__ )
  30. namespace
  31. {
  32. int err_count;
  33. void verify( bool x, int line )
  34. {
  35. if ( x ) return;
  36. ++err_count;
  37. cout << "Error: verify failed on line " << line << endl;
  38. }
  39. void verify_size( size_t actual, size_t expected, int line )
  40. {
  41. if ( actual == expected ) return;
  42. ++err_count;
  43. cout << "Error: verify size failed on line " << line << endl;
  44. cout << " A structure with an expected sizeof() " << expected
  45. << " had an actual sizeof() " << actual
  46. << "\n This will cause uses of endian types to fail\n";
  47. }
  48. template <class Endian, class Base>
  49. void verify_value_and_ops( const Base & expected, int line )
  50. {
  51. Endian v( expected );
  52. verify( v == expected, line );
  53. Endian v2;
  54. v2.operator=( expected );
  55. verify( v2 == expected, line );
  56. ++v; // verify integer_cover_operators being applied to this type -
  57. // will fail to compile if no endian<> specialization is present
  58. Endian v3( static_cast<Base>( 1 ) );
  59. Endian x(static_cast<typename Endian::value_type>(v2+v3));
  60. if ( x == x ) // silence warning
  61. return;
  62. }
  63. const char * big_rep = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0";
  64. const char * little_rep = "\xF0\xDE\xBC\x9A\x78\x56\x34\x12";
  65. template <class Endian>
  66. void verify_representation( bool is_big, int line )
  67. {
  68. int silence = 0;
  69. Endian x ( static_cast<typename Endian::value_type>
  70. (0x123456789abcdef0LL + silence) ); // will truncate
  71. if ( is_big )
  72. verify( memcmp( &x,
  73. reinterpret_cast<const char*>(big_rep)+8-sizeof(Endian),
  74. sizeof(Endian) ) == 0, line );
  75. else
  76. verify( memcmp( &x, little_rep, sizeof(Endian) ) == 0, line );
  77. }
  78. template <class Endian>
  79. inline void verify_native_representation( int line )
  80. {
  81. # if BOOST_ENDIAN_BIG_BYTE
  82. verify_representation<Endian>( true, line );
  83. # else
  84. verify_representation<Endian>( false, line );
  85. # endif
  86. }
  87. // detect_order -----------------------------------------------------//
  88. void detect_order()
  89. {
  90. union View
  91. {
  92. long long i;
  93. unsigned char c[8];
  94. };
  95. View v = { 0x0102030405060708LL }; // initialize v.i
  96. if ( memcmp( v.c, "\x8\7\6\5\4\3\2\1", 8) == 0 )
  97. {
  98. cout << "This machine is little-endian.\n";
  99. # if !BOOST_ENDIAN_LITTLE_BYTE
  100. cout << "yet boost/predef/other/endian.h does not define BOOST_ENDIAN_LITTLE_BYTE.\n"
  101. "The Boost Endian library must be revised to work correctly on this system.\n"
  102. "Please report this problem to the Boost mailing list.\n";
  103. exit(1);
  104. # endif
  105. }
  106. else if ( memcmp( v.c, "\1\2\3\4\5\6\7\x8", 8) == 0 )
  107. {
  108. cout << "This machine is big-endian.\n";
  109. # if !BOOST_ENDIAN_BIG_BYTE
  110. cout << "yet boost/predef/other/endian.h does not define BOOST_ENDIAN_BIG_BYTE.\n"
  111. "The Boost Endian library must be revised to work correctly on this system.\n"
  112. "Please report this problem to the Boost mailing list.\n";
  113. exit(1);
  114. # endif
  115. }
  116. else
  117. {
  118. cout << "This machine is neither strict big-endian nor strict little-endian\n"
  119. "The Boost Endian library must be revised to work correctly on this system.\n"
  120. "Please report this problem to the Boost mailing list.\n";
  121. exit(1);
  122. }
  123. cout << "That should not matter and is presented for your information only.\n";
  124. } // detect_order
  125. // check_data ------------------------------------------------------------//
  126. void check_data()
  127. {
  128. big_int8_t big_8;
  129. big_int16_t big_16;
  130. big_int24_t big_24;
  131. big_int32_t big_32;
  132. big_int40_t big_40;
  133. big_int48_t big_48;
  134. big_int56_t big_56;
  135. big_int64_t big_64;
  136. big_uint8_t big_u8;
  137. big_uint16_t big_u16;
  138. big_uint24_t big_u24;
  139. big_uint32_t big_u32;
  140. big_uint40_t big_u40;
  141. big_uint48_t big_u48;
  142. big_uint56_t big_u56;
  143. big_uint64_t big_u64;
  144. little_int8_t little_8;
  145. little_int16_t little_16;
  146. little_int24_t little_24;
  147. little_int32_t little_32;
  148. little_int40_t little_40;
  149. little_int48_t little_48;
  150. little_int56_t little_56;
  151. little_int64_t little_64;
  152. little_uint8_t little_u8;
  153. little_uint16_t little_u16;
  154. little_uint24_t little_u24;
  155. little_uint32_t little_u32;
  156. little_uint40_t little_u40;
  157. little_uint48_t little_u48;
  158. little_uint56_t little_u56;
  159. little_uint64_t little_u64;
  160. native_int8_t native_8;
  161. native_int16_t native_16;
  162. native_int24_t native_24;
  163. native_int32_t native_32;
  164. native_int40_t native_40;
  165. native_int48_t native_48;
  166. native_int56_t native_56;
  167. native_int64_t native_64;
  168. native_uint8_t native_u8;
  169. native_uint16_t native_u16;
  170. native_uint24_t native_u24;
  171. native_uint32_t native_u32;
  172. native_uint40_t native_u40;
  173. native_uint48_t native_u48;
  174. native_uint56_t native_u56;
  175. native_uint64_t native_u64;
  176. big_int16_at big_align_int16;
  177. big_int32_at big_align_int32;
  178. big_int64_at big_align_int64;
  179. big_uint16_at big_align_uint16;
  180. big_uint32_at big_align_uint32;
  181. big_uint64_at big_align_uint64;
  182. little_int16_at little_align_int16;
  183. little_int32_at little_align_int32;
  184. little_int64_at little_align_int64;
  185. little_uint16_at little_align_uint16;
  186. little_uint32_at little_align_uint32;
  187. little_uint64_at little_align_uint64;
  188. VERIFY(big_8.data() == reinterpret_cast<const unsigned char *>(&big_8));
  189. VERIFY(big_16.data() == reinterpret_cast<const unsigned char *>(&big_16));
  190. VERIFY(big_24.data() == reinterpret_cast<const unsigned char *>(&big_24));
  191. VERIFY(big_32.data() == reinterpret_cast<const unsigned char *>(&big_32));
  192. VERIFY(big_40.data() == reinterpret_cast<const unsigned char *>(&big_40));
  193. VERIFY(big_48.data() == reinterpret_cast<const unsigned char *>(&big_48));
  194. VERIFY(big_56.data() == reinterpret_cast<const unsigned char *>(&big_56));
  195. VERIFY(big_64.data() == reinterpret_cast<const unsigned char *>(&big_64));
  196. VERIFY(big_u8.data() == reinterpret_cast<const unsigned char *>(&big_u8));
  197. VERIFY(big_u16.data() == reinterpret_cast<const unsigned char *>(&big_u16));
  198. VERIFY(big_u24.data() == reinterpret_cast<const unsigned char *>(&big_u24));
  199. VERIFY(big_u32.data() == reinterpret_cast<const unsigned char *>(&big_u32));
  200. VERIFY(big_u40.data() == reinterpret_cast<const unsigned char *>(&big_u40));
  201. VERIFY(big_u48.data() == reinterpret_cast<const unsigned char *>(&big_u48));
  202. VERIFY(big_u56.data() == reinterpret_cast<const unsigned char *>(&big_u56));
  203. VERIFY(big_u64.data() == reinterpret_cast<const unsigned char *>(&big_u64));
  204. VERIFY(little_8.data() == reinterpret_cast<const unsigned char *>(&little_8));
  205. VERIFY(little_16.data() == reinterpret_cast<const unsigned char *>(&little_16));
  206. VERIFY(little_24.data() == reinterpret_cast<const unsigned char *>(&little_24));
  207. VERIFY(little_32.data() == reinterpret_cast<const unsigned char *>(&little_32));
  208. VERIFY(little_40.data() == reinterpret_cast<const unsigned char *>(&little_40));
  209. VERIFY(little_48.data() == reinterpret_cast<const unsigned char *>(&little_48));
  210. VERIFY(little_56.data() == reinterpret_cast<const unsigned char *>(&little_56));
  211. VERIFY(little_64.data() == reinterpret_cast<const unsigned char *>(&little_64));
  212. VERIFY(little_u8.data() == reinterpret_cast<const unsigned char *>(&little_u8));
  213. VERIFY(little_u16.data() == reinterpret_cast<const unsigned char *>(&little_u16));
  214. VERIFY(little_u24.data() == reinterpret_cast<const unsigned char *>(&little_u24));
  215. VERIFY(little_u32.data() == reinterpret_cast<const unsigned char *>(&little_u32));
  216. VERIFY(little_u40.data() == reinterpret_cast<const unsigned char *>(&little_u40));
  217. VERIFY(little_u48.data() == reinterpret_cast<const unsigned char *>(&little_u48));
  218. VERIFY(little_u56.data() == reinterpret_cast<const unsigned char *>(&little_u56));
  219. VERIFY(little_u64.data() == reinterpret_cast<const unsigned char *>(&little_u64));
  220. VERIFY(native_8.data() == reinterpret_cast<const unsigned char *>(&native_8));
  221. VERIFY(native_16.data() == reinterpret_cast<const unsigned char *>(&native_16));
  222. VERIFY(native_24.data() == reinterpret_cast<const unsigned char *>(&native_24));
  223. VERIFY(native_32.data() == reinterpret_cast<const unsigned char *>(&native_32));
  224. VERIFY(native_40.data() == reinterpret_cast<const unsigned char *>(&native_40));
  225. VERIFY(native_48.data() == reinterpret_cast<const unsigned char *>(&native_48));
  226. VERIFY(native_56.data() == reinterpret_cast<const unsigned char *>(&native_56));
  227. VERIFY(native_64.data() == reinterpret_cast<const unsigned char *>(&native_64));
  228. VERIFY(native_u8.data() == reinterpret_cast<const unsigned char *>(&native_u8));
  229. VERIFY(native_u16.data() == reinterpret_cast<const unsigned char *>(&native_u16));
  230. VERIFY(native_u24.data() == reinterpret_cast<const unsigned char *>(&native_u24));
  231. VERIFY(native_u32.data() == reinterpret_cast<const unsigned char *>(&native_u32));
  232. VERIFY(native_u40.data() == reinterpret_cast<const unsigned char *>(&native_u40));
  233. VERIFY(native_u48.data() == reinterpret_cast<const unsigned char *>(&native_u48));
  234. VERIFY(native_u56.data() == reinterpret_cast<const unsigned char *>(&native_u56));
  235. VERIFY(native_u64.data() == reinterpret_cast<const unsigned char *>(&native_u64));
  236. VERIFY(big_align_int16.data() == reinterpret_cast<const unsigned char *>(&big_align_int16));
  237. VERIFY(big_align_int32.data() == reinterpret_cast<const unsigned char *>(&big_align_int32));
  238. VERIFY(big_align_int64.data() == reinterpret_cast<const unsigned char *>(&big_align_int64));
  239. VERIFY(big_align_uint16.data() == reinterpret_cast<const unsigned char *>(&big_align_uint16));
  240. VERIFY(big_align_uint32.data() == reinterpret_cast<const unsigned char *>(&big_align_uint32));
  241. VERIFY(big_align_uint64.data() == reinterpret_cast<const unsigned char *>(&big_align_uint64));
  242. VERIFY(little_align_int16.data() == reinterpret_cast<const unsigned char *>(&little_align_int16));
  243. VERIFY(little_align_int32.data() == reinterpret_cast<const unsigned char *>(&little_align_int32));
  244. VERIFY(little_align_int64.data() == reinterpret_cast<const unsigned char *>(&little_align_int64));
  245. VERIFY(little_align_uint16.data() == reinterpret_cast<const unsigned char *>(&little_align_uint16));
  246. VERIFY(little_align_uint32.data() == reinterpret_cast<const unsigned char *>(&little_align_uint32));
  247. VERIFY(little_align_uint64.data() == reinterpret_cast<const unsigned char *>(&little_align_uint64));
  248. }
  249. // check_size ------------------------------------------------------------//
  250. void check_size()
  251. {
  252. VERIFY( numeric_limits<signed char>::digits == 7 );
  253. VERIFY( numeric_limits<unsigned char>::digits == 8 );
  254. VERIFY_SIZE( sizeof( big_int8_t ), 1 );
  255. VERIFY_SIZE( sizeof( big_int16_t ), 2 );
  256. VERIFY_SIZE( sizeof( big_int24_t ), 3 );
  257. VERIFY_SIZE( sizeof( big_int32_t ), 4 );
  258. VERIFY_SIZE( sizeof( big_int40_t ), 5 );
  259. VERIFY_SIZE( sizeof( big_int48_t ), 6 );
  260. VERIFY_SIZE( sizeof( big_int56_t ), 7 );
  261. VERIFY_SIZE( sizeof( big_int64_t ), 8 );
  262. VERIFY_SIZE( sizeof( big_uint8_t ), 1 );
  263. VERIFY_SIZE( sizeof( big_uint16_t ), 2 );
  264. VERIFY_SIZE( sizeof( big_uint24_t ), 3 );
  265. VERIFY_SIZE( sizeof( big_uint32_t ), 4 );
  266. VERIFY_SIZE( sizeof( big_uint40_t ), 5 );
  267. VERIFY_SIZE( sizeof( big_uint48_t ), 6 );
  268. VERIFY_SIZE( sizeof( big_uint56_t ), 7 );
  269. VERIFY_SIZE( sizeof( big_uint64_t ), 8 );
  270. VERIFY_SIZE( sizeof( little_int8_t ), 1 );
  271. VERIFY_SIZE( sizeof( little_int16_t ), 2 );
  272. VERIFY_SIZE( sizeof( little_int24_t ), 3 );
  273. VERIFY_SIZE( sizeof( little_int32_t ), 4 );
  274. VERIFY_SIZE( sizeof( little_int40_t ), 5 );
  275. VERIFY_SIZE( sizeof( little_int48_t ), 6 );
  276. VERIFY_SIZE( sizeof( little_int56_t ), 7 );
  277. VERIFY_SIZE( sizeof( little_int64_t ), 8 );
  278. VERIFY_SIZE( sizeof( little_uint8_t ), 1 );
  279. VERIFY_SIZE( sizeof( little_uint16_t ), 2 );
  280. VERIFY_SIZE( sizeof( little_uint24_t ), 3 );
  281. VERIFY_SIZE( sizeof( little_uint32_t ), 4 );
  282. VERIFY_SIZE( sizeof( little_uint40_t ), 5 );
  283. VERIFY_SIZE( sizeof( little_uint48_t ), 6 );
  284. VERIFY_SIZE( sizeof( little_uint56_t ), 7 );
  285. VERIFY_SIZE( sizeof( little_uint64_t ), 8 );
  286. VERIFY_SIZE( sizeof( native_int8_t ), 1 );
  287. VERIFY_SIZE( sizeof( native_int16_t ), 2 );
  288. VERIFY_SIZE( sizeof( native_int24_t ), 3 );
  289. VERIFY_SIZE( sizeof( native_int32_t ), 4 );
  290. VERIFY_SIZE( sizeof( native_int40_t ), 5 );
  291. VERIFY_SIZE( sizeof( native_int48_t ), 6 );
  292. VERIFY_SIZE( sizeof( native_int56_t ), 7 );
  293. VERIFY_SIZE( sizeof( native_int64_t ), 8 );
  294. VERIFY_SIZE( sizeof( native_uint8_t ), 1 );
  295. VERIFY_SIZE( sizeof( native_uint16_t ), 2 );
  296. VERIFY_SIZE( sizeof( native_uint24_t ), 3 );
  297. VERIFY_SIZE( sizeof( native_uint32_t ), 4 );
  298. VERIFY_SIZE( sizeof( native_uint40_t ), 5 );
  299. VERIFY_SIZE( sizeof( native_uint48_t ), 6 );
  300. VERIFY_SIZE( sizeof( native_uint56_t ), 7 );
  301. VERIFY_SIZE( sizeof( native_uint64_t ), 8 );
  302. VERIFY_SIZE(sizeof(big_int8_at), 1);
  303. VERIFY_SIZE(sizeof(big_int16_at), 2);
  304. VERIFY_SIZE( sizeof( big_int32_at ), 4 );
  305. VERIFY_SIZE( sizeof( big_int64_at ), 8 );
  306. VERIFY_SIZE(sizeof(big_uint8_at), 1);
  307. VERIFY_SIZE(sizeof(big_uint16_at), 2);
  308. VERIFY_SIZE( sizeof( big_uint32_at ), 4 );
  309. VERIFY_SIZE( sizeof( big_uint64_at ), 8 );
  310. VERIFY_SIZE(sizeof(little_int8_at), 1);
  311. VERIFY_SIZE(sizeof(little_int16_at), 2);
  312. VERIFY_SIZE( sizeof( little_int32_at ), 4 );
  313. VERIFY_SIZE( sizeof( little_int64_at ), 8 );
  314. VERIFY_SIZE(sizeof(little_uint8_at), 1);
  315. VERIFY_SIZE(sizeof(little_uint16_at), 2);
  316. VERIFY_SIZE( sizeof( little_uint32_at ), 4 );
  317. VERIFY_SIZE( sizeof( little_uint64_at ), 8 );
  318. } // check_size
  319. // check_alignment -------------------------------------------------------//
  320. void check_alignment()
  321. {
  322. // structs with offsets % 2 == 1 for type of size > 1 to ensure no alignment
  323. // bytes added for any size > 1
  324. struct big_struct
  325. {
  326. big_int8_t v0;
  327. big_int16_t v1;
  328. big_int24_t v3;
  329. char v6;
  330. big_int32_t v7;
  331. big_int40_t v11;
  332. char v16;
  333. big_int48_t v17;
  334. big_int56_t v23;
  335. char v30;
  336. big_int64_t v31;
  337. };
  338. struct big_u_struct
  339. {
  340. big_uint8_t v0;
  341. big_uint16_t v1;
  342. big_uint24_t v3;
  343. char v6;
  344. big_uint32_t v7;
  345. big_uint40_t v11;
  346. char v16;
  347. big_uint48_t v17;
  348. big_uint56_t v23;
  349. char v30;
  350. big_uint64_t v31;
  351. };
  352. struct little_struct
  353. {
  354. little_int8_t v0;
  355. little_int16_t v1;
  356. little_int24_t v3;
  357. char v6;
  358. little_int32_t v7;
  359. little_int40_t v11;
  360. char v16;
  361. little_int48_t v17;
  362. little_int56_t v23;
  363. char v30;
  364. little_int64_t v31;
  365. };
  366. struct little_u_struct
  367. {
  368. little_uint8_t v0;
  369. little_uint16_t v1;
  370. little_uint24_t v3;
  371. char v6;
  372. little_uint32_t v7;
  373. little_uint40_t v11;
  374. char v16;
  375. little_uint48_t v17;
  376. little_uint56_t v23;
  377. char v30;
  378. little_uint64_t v31;
  379. };
  380. struct native_struct
  381. {
  382. native_int8_t v0;
  383. native_int16_t v1;
  384. native_int24_t v3;
  385. char v6;
  386. native_int32_t v7;
  387. native_int40_t v11;
  388. char v16;
  389. native_int48_t v17;
  390. native_int56_t v23;
  391. char v30;
  392. native_int64_t v31;
  393. };
  394. struct native_u_struct
  395. {
  396. native_uint8_t v0;
  397. native_uint16_t v1;
  398. native_uint24_t v3;
  399. char v6;
  400. native_uint32_t v7;
  401. native_uint40_t v11;
  402. char v16;
  403. native_uint48_t v17;
  404. native_uint56_t v23;
  405. char v30;
  406. native_uint64_t v31;
  407. };
  408. // aligned test cases
  409. struct big_aligned_struct
  410. {
  411. big_int16_at v0;
  412. big_int32_at v1;
  413. char v3;
  414. // on a 32-bit system, the padding here may be 3 rather than 7 bytes
  415. big_int64_at v4;
  416. };
  417. struct little_aligned_struct
  418. {
  419. little_int16_at v0;
  420. little_int32_at v1;
  421. char v3;
  422. // on a 32-bit system, the padding here may be 3 rather than 7 bytes
  423. little_int64_at v4;
  424. };
  425. int saved_err_count = err_count;
  426. VERIFY_SIZE( sizeof(big_struct), 39 );
  427. VERIFY_SIZE( sizeof(big_u_struct), 39 );
  428. VERIFY_SIZE( sizeof(little_struct), 39 );
  429. VERIFY_SIZE( sizeof(little_u_struct), 39 );
  430. VERIFY_SIZE( sizeof(native_struct), 39 );
  431. VERIFY_SIZE( sizeof(native_u_struct), 39 );
  432. VERIFY( sizeof(big_aligned_struct) <= 24 );
  433. VERIFY( sizeof(little_aligned_struct) <= 24 );
  434. if ( saved_err_count == err_count )
  435. {
  436. cout <<
  437. "Size and alignment for structures of endian types are as expected.\n";
  438. }
  439. } // check_alignment
  440. // check_representation_and_range_and_ops --------------------------------//
  441. void check_representation_and_range_and_ops()
  442. {
  443. // unaligned integer types
  444. VERIFY_BIG_REPRESENTATION( big_int8_t );
  445. VERIFY_VALUE_AND_OPS( big_int8_t, int_least8_t, 0x7e );
  446. VERIFY_VALUE_AND_OPS( big_int8_t, int_least8_t, -0x80 );
  447. VERIFY_BIG_REPRESENTATION( big_int16_t );
  448. VERIFY_VALUE_AND_OPS( big_int16_t, int_least16_t, 0x7ffe );
  449. VERIFY_VALUE_AND_OPS( big_int16_t, int_least16_t, -0x8000 );
  450. VERIFY_BIG_REPRESENTATION( big_int24_t );
  451. VERIFY_VALUE_AND_OPS( big_int24_t, int_least32_t, 0x7ffffe );
  452. VERIFY_VALUE_AND_OPS( big_int24_t, int_least32_t, -0x800000 );
  453. VERIFY_BIG_REPRESENTATION( big_int32_t );
  454. VERIFY_VALUE_AND_OPS( big_int32_t, int_least32_t, 0x7ffffffe );
  455. VERIFY_VALUE_AND_OPS( big_int32_t, int_least32_t, -0x7fffffff-1 );
  456. VERIFY_BIG_REPRESENTATION( big_int40_t );
  457. VERIFY_VALUE_AND_OPS( big_int40_t, int_least64_t, 0x7ffffffffeLL );
  458. VERIFY_VALUE_AND_OPS( big_int40_t, int_least64_t, -0x8000000000LL );
  459. VERIFY_BIG_REPRESENTATION( big_int48_t );
  460. VERIFY_VALUE_AND_OPS( big_int48_t, int_least64_t, 0x7ffffffffffeLL );
  461. VERIFY_VALUE_AND_OPS( big_int48_t, int_least64_t, -0x800000000000LL );
  462. VERIFY_BIG_REPRESENTATION( big_int56_t );
  463. VERIFY_VALUE_AND_OPS( big_int56_t, int_least64_t, 0x7ffffffffffffeLL );
  464. VERIFY_VALUE_AND_OPS( big_int56_t, int_least64_t, -0x80000000000000LL );
  465. VERIFY_BIG_REPRESENTATION( big_int64_t );
  466. VERIFY_VALUE_AND_OPS( big_int64_t, int_least64_t, 0x7ffffffffffffffeLL );
  467. VERIFY_VALUE_AND_OPS( big_int64_t, int_least64_t, -0x7fffffffffffffffLL-1 );
  468. VERIFY_BIG_REPRESENTATION( big_uint8_t );
  469. VERIFY_VALUE_AND_OPS( big_uint8_t, uint_least8_t, 0xff );
  470. VERIFY_BIG_REPRESENTATION( big_uint16_t );
  471. VERIFY_VALUE_AND_OPS( big_uint16_t, uint_least16_t, 0xffff );
  472. VERIFY_BIG_REPRESENTATION( big_uint24_t );
  473. VERIFY_VALUE_AND_OPS( big_uint24_t, uint_least32_t, 0xffffff );
  474. VERIFY_BIG_REPRESENTATION( big_uint32_t );
  475. VERIFY_VALUE_AND_OPS( big_uint32_t, uint_least32_t, 0xffffffff );
  476. VERIFY_BIG_REPRESENTATION( big_uint40_t );
  477. VERIFY_VALUE_AND_OPS( big_uint40_t, uint_least64_t, 0xffffffffffLL );
  478. VERIFY_BIG_REPRESENTATION( big_uint48_t );
  479. VERIFY_VALUE_AND_OPS( big_uint48_t, uint_least64_t, 0xffffffffffffLL );
  480. VERIFY_BIG_REPRESENTATION( big_uint56_t );
  481. VERIFY_VALUE_AND_OPS( big_uint56_t, uint_least64_t, 0xffffffffffffffLL );
  482. VERIFY_BIG_REPRESENTATION( big_uint64_t );
  483. VERIFY_VALUE_AND_OPS( big_uint64_t, uint_least64_t, 0xffffffffffffffffULL );
  484. VERIFY_LITTLE_REPRESENTATION( little_int8_t );
  485. VERIFY_VALUE_AND_OPS( little_int8_t, int_least8_t, 0x7e );
  486. VERIFY_VALUE_AND_OPS( little_int8_t, int_least8_t, -0x80 );
  487. VERIFY_LITTLE_REPRESENTATION( little_int16_t );
  488. VERIFY_VALUE_AND_OPS( little_int16_t, int_least16_t, 0x7ffe );
  489. VERIFY_VALUE_AND_OPS( little_int16_t, int_least16_t, -0x8000 );
  490. VERIFY_LITTLE_REPRESENTATION( little_int24_t );
  491. VERIFY_VALUE_AND_OPS( little_int24_t, int_least32_t, 0x7ffffe );
  492. VERIFY_VALUE_AND_OPS( little_int24_t, int_least32_t, -0x800000 );
  493. VERIFY_LITTLE_REPRESENTATION( little_int32_t );
  494. VERIFY_VALUE_AND_OPS( little_int32_t, int_least32_t, 0x7ffffffe );
  495. VERIFY_VALUE_AND_OPS( little_int32_t, int_least32_t, -0x7fffffff-1 );
  496. VERIFY_LITTLE_REPRESENTATION( little_int40_t );
  497. VERIFY_VALUE_AND_OPS( little_int40_t, int_least64_t, 0x7ffffffffeLL );
  498. VERIFY_VALUE_AND_OPS( little_int40_t, int_least64_t, -0x8000000000LL );
  499. VERIFY_LITTLE_REPRESENTATION( little_int48_t );
  500. VERIFY_VALUE_AND_OPS( little_int48_t, int_least64_t, 0x7ffffffffffeLL );
  501. VERIFY_VALUE_AND_OPS( little_int48_t, int_least64_t, -0x800000000000LL );
  502. VERIFY_LITTLE_REPRESENTATION( little_int56_t );
  503. VERIFY_VALUE_AND_OPS( little_int56_t, int_least64_t, 0x7ffffffffffffeLL );
  504. VERIFY_VALUE_AND_OPS( little_int56_t, int_least64_t, -0x80000000000000LL );
  505. VERIFY_LITTLE_REPRESENTATION( little_int64_t );
  506. VERIFY_VALUE_AND_OPS( little_int64_t, int_least64_t, 0x7ffffffffffffffeLL );
  507. VERIFY_VALUE_AND_OPS( little_int64_t, int_least64_t, -0x7fffffffffffffffLL-1 );
  508. VERIFY_LITTLE_REPRESENTATION( little_uint8_t );
  509. VERIFY_VALUE_AND_OPS( little_uint8_t, uint_least8_t, 0xff );
  510. VERIFY_LITTLE_REPRESENTATION( little_uint16_t );
  511. VERIFY_VALUE_AND_OPS( little_uint16_t, uint_least16_t, 0xffff );
  512. VERIFY_LITTLE_REPRESENTATION( little_uint24_t );
  513. VERIFY_VALUE_AND_OPS( little_uint24_t, uint_least32_t, 0xffffff );
  514. VERIFY_LITTLE_REPRESENTATION( little_uint32_t );
  515. VERIFY_VALUE_AND_OPS( little_uint32_t, uint_least32_t, 0xffffffff );
  516. VERIFY_LITTLE_REPRESENTATION( little_uint40_t );
  517. VERIFY_VALUE_AND_OPS( little_uint40_t, uint_least64_t, 0xffffffffffLL );
  518. VERIFY_LITTLE_REPRESENTATION( little_uint48_t );
  519. VERIFY_VALUE_AND_OPS( little_uint48_t, uint_least64_t, 0xffffffffffffLL );
  520. VERIFY_LITTLE_REPRESENTATION( little_uint56_t );
  521. VERIFY_VALUE_AND_OPS( little_uint56_t, uint_least64_t, 0xffffffffffffffLL );
  522. VERIFY_LITTLE_REPRESENTATION( little_uint64_t );
  523. VERIFY_VALUE_AND_OPS( little_uint64_t, uint_least64_t, 0xffffffffffffffffULL );
  524. VERIFY_NATIVE_REPRESENTATION( native_int8_t );
  525. VERIFY_VALUE_AND_OPS( native_int8_t, int_least8_t, 0x7e );
  526. VERIFY_VALUE_AND_OPS( native_int8_t, int_least8_t, -0x80 );
  527. VERIFY_NATIVE_REPRESENTATION( native_int16_t );
  528. VERIFY_VALUE_AND_OPS( native_int16_t, int_least16_t, 0x7ffe );
  529. VERIFY_VALUE_AND_OPS( native_int16_t, int_least16_t, -0x8000 );
  530. VERIFY_NATIVE_REPRESENTATION( native_int24_t );
  531. VERIFY_VALUE_AND_OPS( native_int24_t, int_least32_t, 0x7ffffe );
  532. VERIFY_VALUE_AND_OPS( native_int24_t, int_least32_t, -0x800000 );
  533. VERIFY_NATIVE_REPRESENTATION( native_int32_t );
  534. VERIFY_VALUE_AND_OPS( native_int32_t, int_least32_t, 0x7ffffffe );
  535. VERIFY_VALUE_AND_OPS( native_int32_t, int_least32_t, -0x7fffffff-1 );
  536. VERIFY_NATIVE_REPRESENTATION( native_int40_t );
  537. VERIFY_VALUE_AND_OPS( native_int40_t, int_least64_t, 0x7ffffffffeLL );
  538. VERIFY_VALUE_AND_OPS( native_int40_t, int_least64_t, -0x8000000000LL );
  539. VERIFY_NATIVE_REPRESENTATION( native_int48_t );
  540. VERIFY_VALUE_AND_OPS( native_int48_t, int_least64_t, 0x7ffffffffffeLL );
  541. VERIFY_VALUE_AND_OPS( native_int48_t, int_least64_t, -0x800000000000LL );
  542. VERIFY_NATIVE_REPRESENTATION( native_int56_t );
  543. VERIFY_VALUE_AND_OPS( native_int56_t, int_least64_t, 0x7ffffffffffffeLL );
  544. VERIFY_VALUE_AND_OPS( native_int56_t, int_least64_t, -0x80000000000000LL );
  545. VERIFY_NATIVE_REPRESENTATION( native_int64_t );
  546. VERIFY_VALUE_AND_OPS( native_int64_t, int_least64_t, 0x7ffffffffffffffeLL );
  547. VERIFY_VALUE_AND_OPS( native_int64_t, int_least64_t, -0x7fffffffffffffffLL-1 );
  548. VERIFY_NATIVE_REPRESENTATION( native_uint8_t );
  549. VERIFY_VALUE_AND_OPS( native_uint8_t, uint_least8_t, 0xff );
  550. VERIFY_NATIVE_REPRESENTATION( native_uint16_t );
  551. VERIFY_VALUE_AND_OPS( native_uint16_t, uint_least16_t, 0xffff );
  552. VERIFY_NATIVE_REPRESENTATION( native_uint24_t );
  553. VERIFY_VALUE_AND_OPS( native_uint24_t, uint_least32_t, 0xffffff );
  554. VERIFY_NATIVE_REPRESENTATION( native_uint32_t );
  555. VERIFY_VALUE_AND_OPS( native_uint32_t, uint_least32_t, 0xffffffff );
  556. VERIFY_NATIVE_REPRESENTATION( native_uint40_t );
  557. VERIFY_VALUE_AND_OPS( native_uint40_t, uint_least64_t, 0xffffffffffLL );
  558. VERIFY_NATIVE_REPRESENTATION( native_uint48_t );
  559. VERIFY_VALUE_AND_OPS( native_uint48_t, uint_least64_t, 0xffffffffffffLL );
  560. VERIFY_NATIVE_REPRESENTATION( native_uint56_t );
  561. VERIFY_VALUE_AND_OPS( native_uint56_t, uint_least64_t, 0xffffffffffffffLL );
  562. VERIFY_NATIVE_REPRESENTATION( native_uint64_t );
  563. VERIFY_VALUE_AND_OPS( native_uint64_t, uint_least64_t, 0xffffffffffffffffULL );
  564. // aligned integer types
  565. VERIFY_BIG_REPRESENTATION( big_int16_at );
  566. VERIFY_VALUE_AND_OPS( big_int16_at, int_least16_t, 0x7ffe );
  567. VERIFY_VALUE_AND_OPS( big_int16_at, int_least16_t, -0x8000 );
  568. VERIFY_BIG_REPRESENTATION( big_int32_at );
  569. VERIFY_VALUE_AND_OPS( big_int32_at, int_least32_t, 0x7ffffffe );
  570. VERIFY_VALUE_AND_OPS( big_int32_at, int_least32_t, -0x7fffffff-1 );
  571. VERIFY_BIG_REPRESENTATION( big_int64_at );
  572. VERIFY_VALUE_AND_OPS( big_int64_at, int_least64_t, 0x7ffffffffffffffeLL );
  573. VERIFY_VALUE_AND_OPS( big_int64_at, int_least64_t, -0x7fffffffffffffffLL-1 );
  574. VERIFY_BIG_REPRESENTATION( big_uint16_at );
  575. VERIFY_VALUE_AND_OPS( big_uint16_at, uint_least16_t, 0xffff );
  576. VERIFY_BIG_REPRESENTATION( big_uint32_at );
  577. VERIFY_VALUE_AND_OPS( big_uint32_at, uint_least32_t, 0xffffffff );
  578. VERIFY_BIG_REPRESENTATION( big_uint64_at );
  579. VERIFY_VALUE_AND_OPS( big_uint64_at, uint_least64_t, 0xffffffffffffffffULL );
  580. VERIFY_LITTLE_REPRESENTATION( little_int16_at );
  581. VERIFY_VALUE_AND_OPS( little_int16_at, int_least16_t, 0x7ffe );
  582. VERIFY_VALUE_AND_OPS( little_int16_at, int_least16_t, -0x8000 );
  583. VERIFY_LITTLE_REPRESENTATION( little_int32_at );
  584. VERIFY_VALUE_AND_OPS( little_int32_at, int_least32_t, 0x7ffffffe );
  585. VERIFY_VALUE_AND_OPS( little_int32_at, int_least32_t, -0x7fffffff-1 );
  586. VERIFY_LITTLE_REPRESENTATION( little_int64_at );
  587. VERIFY_VALUE_AND_OPS( little_int64_at, int_least64_t, 0x7ffffffffffffffeLL );
  588. VERIFY_VALUE_AND_OPS( little_int64_at, int_least64_t, -0x7fffffffffffffffLL-1 );
  589. VERIFY_LITTLE_REPRESENTATION( little_uint16_at );
  590. VERIFY_VALUE_AND_OPS( little_uint16_at, uint_least16_t, 0xffff );
  591. VERIFY_LITTLE_REPRESENTATION( little_uint32_at );
  592. VERIFY_VALUE_AND_OPS( little_uint32_at, uint_least32_t, 0xffffffff );
  593. VERIFY_LITTLE_REPRESENTATION( little_uint64_at );
  594. VERIFY_VALUE_AND_OPS( little_uint64_at, uint_least64_t, 0xffffffffffffffffULL );
  595. } // check_representation_and_range
  596. /*
  597. class MyInt
  598. {
  599. int32_t mx;
  600. public:
  601. MyInt(int32_t x = 0) : mx(x) {}
  602. operator int32_t() const {return mx;}
  603. //friend int32_t operator+(const MyInt& x) {return x;}
  604. };
  605. void check_udt()
  606. {
  607. typedef boost::endian::endian_arithmetic< order::big, MyInt, 32 > mybig_int32_ut;
  608. mybig_int32_ut v(10);
  609. cout << "+v is " << +v << endl;
  610. v += 1;
  611. cout << "v is " << +v << endl;
  612. v -= 2;
  613. cout << "v is " << +v << endl;
  614. v *= 2;
  615. cout << "v is " << +v << endl;
  616. ++v;
  617. cout << "v is " << +v << endl;
  618. --v;
  619. cout << "v is " << +v << endl;
  620. // cout << "v+v is " << +(v+v) << endl;
  621. }
  622. void check_udt_le()
  623. {
  624. typedef boost::endian::endian_arithmetic< order::little, MyInt, 32 > mylittle_int32_ut;
  625. mylittle_int32_ut v(10);
  626. cout << "+v is " << +v << endl;
  627. v += 1;
  628. cout << "v is " << +v << endl;
  629. v -= 2;
  630. cout << "v is " << +v << endl;
  631. v *= 2;
  632. cout << "v is " << +v << endl;
  633. ++v;
  634. cout << "v is " << +v << endl;
  635. --v;
  636. cout << "v is " << +v << endl;
  637. // cout << "v+v is " << +(v+v) << endl;
  638. }
  639. */
  640. long iterations = 10000;
  641. template< class Endian >
  642. Endian timing_test( const char * s)
  643. {
  644. cout << s << " timing test, " << iterations << " iterations: ";
  645. // progress_timer t;
  646. Endian v = 1;
  647. for ( long i = 0; i < iterations; ++i )
  648. {
  649. v += 1;
  650. v *= 3;
  651. ++v;
  652. v *= i;
  653. if ( i == 0 ) VERIFY_VALUE_AND_OPS( Endian, typename Endian::value_type, 21 );
  654. }
  655. return v;
  656. }
  657. } // unnamed namespace
  658. // main ------------------------------------------------------------------------------//
  659. int cpp_main( int argc, char * argv[] )
  660. {
  661. cout << "Usage: "
  662. << argv[0] << " [#],\n where # specifies iteration count\n"
  663. " default iteration count is " << iterations << endl;
  664. if ( argc > 1 )
  665. iterations = atol( argv[1] );
  666. if ( iterations < 1 ) iterations = 1;
  667. detect_order();
  668. check_size();
  669. check_alignment();
  670. check_representation_and_range_and_ops();
  671. check_data();
  672. //check_udt();
  673. //check_udt_le();
  674. //timing_test<big_int32_t> ( "big_int32_t" );
  675. //timing_test<big_int32_at>( "big_int32_at" );
  676. //timing_test<little_int32_t> ( "little_int32_t" );
  677. //timing_test<little_int32_at>( "little_int32_at" );
  678. cout << "\n" << err_count << " errors detected\nTest "
  679. << (err_count==0 ? "passed\n\n" : "failed\n\n");
  680. return err_count ? 1 : 0;
  681. } // main