Advertisement
Guest User

Untitled

a guest
Dec 5th, 2024
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.20 KB | None | 0 0
  1. #include <random>
  2. #include<bit>
  3. #include "bit14/bit14.h"
  4.  
  5. template <typename T>
  6. void test_popcount(const T a)
  7. {
  8.     const int result1 = std::popcount(a);
  9.     const int result2 = bit14::popcount(a);
  10.    
  11.     if (result1 != result2)
  12.     {
  13.         std::cout << "error test_popcount!\n";
  14.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  15.     }
  16.        
  17. }
  18.  
  19. template <typename T>
  20. void test_countl_zero(const T a)
  21. {
  22.     const int result1 = std::countl_zero(a);
  23.     const int result2 = bit14::countl_zero(a);
  24.  
  25.     if (result1 != result2)
  26.     {
  27.         std::cout << "error test_countl_zero!\n";
  28.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  29.     }
  30. }
  31.  
  32. template <typename T>
  33. void test_countl_one(const T a)
  34. {
  35.     const int result1 = std::countl_one(a);
  36.     const int result2 = bit14::countl_one(a);
  37.  
  38.     if (result1 != result2)
  39.     {
  40.         std::cout << "error test_countl_one!\n";
  41.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  42.     }
  43. }
  44.  
  45. template <typename T>
  46. void test_countr_zero(const T a)
  47. {
  48.     const int result1 = std::countr_zero(a);
  49.     const int result2 = bit14::countr_zero(a);
  50.  
  51.     if (result1 != result2)
  52.     {
  53.         std::cout << "error test_countr_zero!\n";
  54.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  55.     }
  56. }
  57.  
  58. template <typename T>
  59. void test_countr_one(const T a)
  60. {
  61.     const int result1 = std::countr_one(a);
  62.     const int result2 = bit14::countr_one(a);
  63.  
  64.     if (result1 != result2)
  65.     {
  66.         std::cout << "error test_countr_one!\n";
  67.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  68.     }
  69. }
  70.  
  71. template <typename T>
  72. void test_rotl(const T a, const int rot)
  73. {
  74.     const T result1 = std::rotl(a, rot);
  75.     const T result2 = bit14::rotl(a, rot);
  76.  
  77.     if (result1 != result2)
  78.     {
  79.         std::cout << "error test_rotl!\n";
  80.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  81.     }
  82. }
  83.  
  84. template <typename T>
  85. void test_rotr(const T a, const int rot)
  86. {
  87.     const T result1 = std::rotr(a, rot);
  88.     const T result2 = bit14::rotr(a, rot);
  89.  
  90.     if (result1 != result2)
  91.     {
  92.         std::cout << "error test_rotr!\n";
  93.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  94.     }
  95. }
  96.  
  97. template <typename T>
  98. void test_bit_width(const T a)
  99. {
  100.     const int result1 = std::bit_width(a);
  101.     const int result2 = bit14::bit_width(a);
  102.  
  103.     if (result1 != result2)
  104.     {
  105.         std::cout << "error test_bit_width!\n";
  106.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  107.     }
  108. }
  109.  
  110. template <typename T>
  111. void test_bit_floor(const T a)
  112. {
  113.     const T result1 = std::bit_floor(a);
  114.     const T result2 = bit14::bit_floor(a);
  115.  
  116.     if (result1 != result2)
  117.     {
  118.         std::cout << "error test_bit_floor!\n";
  119.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  120.     }
  121. }
  122.  
  123. template <typename T>
  124. void test_bit_ceil(T a)
  125. {
  126.     a = a >> 1;
  127.     const T result1 = std::bit_ceil(a);
  128.     const T result2 = bit14::bit_ceil(a);
  129.  
  130.     if (result1 != result2)
  131.     {
  132.         std::cout << "error test_bit_ceil!\n";
  133.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  134.     }
  135. }
  136.  
  137. template <typename T>
  138. void test_single_bit(const T a)
  139. {
  140.     const bool result1 = std::has_single_bit(a);
  141.     const bool result2 = bit14::has_single_bit(a);
  142.  
  143.     if (result1 != result2)
  144.     {
  145.         std::cout << "error test_single_bit!\n";
  146.         std::cout << a << ", " << result1 << ", " << result2 << "\n";
  147.     }
  148. }
  149.  
  150. void test()
  151. {
  152.     std::random_device rd;
  153.     std::mt19937 gen(rd());
  154.     std::uniform_int_distribution<unsigned long long> distrib(0, std::numeric_limits<unsigned long long>::max());
  155.     std::uniform_int_distribution<int> rotate(std::numeric_limits<int>::lowest(), std::numeric_limits<int>::max());
  156.  
  157.     for (std::size_t i = 0; i < 1000000; ++i)
  158.     {
  159.         const int rot = rotate(gen);
  160.         const unsigned long long ull = distrib(gen);
  161.         const unsigned char uc = static_cast<unsigned char>(ull);
  162.         const unsigned short us = static_cast<unsigned short>(ull);
  163.         const unsigned int ui = static_cast<unsigned int>(ull);
  164.         const unsigned long ul = static_cast<unsigned long>(ull);
  165.  
  166.         test_popcount(uc);
  167.         test_popcount(us);
  168.         test_popcount(ui);
  169.         test_popcount(ul);
  170.         test_popcount(ull);
  171.  
  172.         test_countl_zero(uc);
  173.         test_countl_zero(us);
  174.         test_countl_zero(ui);
  175.         test_countl_zero(ul);
  176.         test_countl_zero(ull);
  177.  
  178.         test_countl_one(uc);
  179.         test_countl_one(us);
  180.         test_countl_one(ui);
  181.         test_countl_one(ul);
  182.         test_countl_one(ull);
  183.  
  184.         test_countr_zero(uc);
  185.         test_countr_zero(uc);
  186.         test_countr_zero(uc);
  187.         test_countr_zero(uc);
  188.         test_countr_zero(uc);
  189.  
  190.         test_countr_one(uc);
  191.         test_countr_one(uc);
  192.         test_countr_one(uc);
  193.         test_countr_one(uc);
  194.         test_countr_one(uc);
  195.  
  196.         test_rotl(uc, rot);
  197.         test_rotl(uc, rot);
  198.         test_rotl(uc, rot);
  199.         test_rotl(uc, rot);
  200.         test_rotl(uc, rot);
  201.  
  202.         test_rotr(uc, rot);
  203.         test_rotr(uc, rot);
  204.         test_rotr(uc, rot);
  205.         test_rotr(uc, rot);
  206.         test_rotr(uc, rot);
  207.  
  208.         test_bit_width(uc);
  209.         test_bit_width(uc);
  210.         test_bit_width(uc);
  211.         test_bit_width(uc);
  212.         test_bit_width(uc);
  213.  
  214.         test_bit_floor(uc);
  215.         test_bit_floor(uc);
  216.         test_bit_floor(uc);
  217.         test_bit_floor(uc);
  218.         test_bit_floor(uc);
  219.  
  220.         test_bit_ceil(uc);
  221.         test_bit_ceil(uc);
  222.         test_bit_ceil(uc);
  223.         test_bit_ceil(uc);
  224.         test_bit_ceil(uc);
  225.  
  226.         test_single_bit(uc);
  227.         test_single_bit(uc);
  228.         test_single_bit(uc);
  229.         test_single_bit(uc);
  230.         test_single_bit(uc);
  231.     }
  232. }
  233.  
  234. int main()
  235. {
  236.     test();
  237.     return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement