libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

bits_test.cc (3048B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 #include "lib/jxl/base/bits.h"
      7 
      8 #include "lib/jxl/testing.h"
      9 
     10 namespace jxl {
     11 namespace {
     12 
     13 TEST(BitsTest, TestNumZeroBits) {
     14   // Zero input is well-defined.
     15   EXPECT_EQ(32u, Num0BitsAboveMS1Bit(0u));
     16   EXPECT_EQ(64u, Num0BitsAboveMS1Bit(0ull));
     17   EXPECT_EQ(32u, Num0BitsBelowLS1Bit(0u));
     18   EXPECT_EQ(64u, Num0BitsBelowLS1Bit(0ull));
     19 
     20   EXPECT_EQ(31u, Num0BitsAboveMS1Bit(1u));
     21   EXPECT_EQ(30u, Num0BitsAboveMS1Bit(2u));
     22   EXPECT_EQ(63u, Num0BitsAboveMS1Bit(1ull));
     23   EXPECT_EQ(62u, Num0BitsAboveMS1Bit(2ull));
     24 
     25   EXPECT_EQ(0u, Num0BitsBelowLS1Bit(1u));
     26   EXPECT_EQ(0u, Num0BitsBelowLS1Bit(1ull));
     27   EXPECT_EQ(1u, Num0BitsBelowLS1Bit(2u));
     28   EXPECT_EQ(1u, Num0BitsBelowLS1Bit(2ull));
     29 
     30   EXPECT_EQ(0u, Num0BitsAboveMS1Bit(0x80000000u));
     31   EXPECT_EQ(0u, Num0BitsAboveMS1Bit(0x8000000000000000ull));
     32   EXPECT_EQ(31u, Num0BitsBelowLS1Bit(0x80000000u));
     33   EXPECT_EQ(63u, Num0BitsBelowLS1Bit(0x8000000000000000ull));
     34 }
     35 
     36 TEST(BitsTest, TestFloorLog2) {
     37   // for input = [1, 7]
     38   const size_t expected[7] = {0, 1, 1, 2, 2, 2, 2};
     39   for (uint32_t i = 1; i <= 7; ++i) {
     40     EXPECT_EQ(expected[i - 1], FloorLog2Nonzero(i)) << " " << i;
     41     EXPECT_EQ(expected[i - 1], FloorLog2Nonzero(static_cast<uint64_t>(i)))
     42         << " " << i;
     43   }
     44 
     45   EXPECT_EQ(11u, FloorLog2Nonzero(0x00000fffu));  // 4095
     46   EXPECT_EQ(12u, FloorLog2Nonzero(0x00001000u));  // 4096
     47   EXPECT_EQ(12u, FloorLog2Nonzero(0x00001001u));  // 4097
     48 
     49   EXPECT_EQ(31u, FloorLog2Nonzero(0x80000000u));
     50   EXPECT_EQ(31u, FloorLog2Nonzero(0x80000001u));
     51   EXPECT_EQ(31u, FloorLog2Nonzero(0xFFFFFFFFu));
     52 
     53   EXPECT_EQ(31u, FloorLog2Nonzero(0x80000000ull));
     54   EXPECT_EQ(31u, FloorLog2Nonzero(0x80000001ull));
     55   EXPECT_EQ(31u, FloorLog2Nonzero(0xFFFFFFFFull));
     56 
     57   EXPECT_EQ(63u, FloorLog2Nonzero(0x8000000000000000ull));
     58   EXPECT_EQ(63u, FloorLog2Nonzero(0x8000000000000001ull));
     59   EXPECT_EQ(63u, FloorLog2Nonzero(0xFFFFFFFFFFFFFFFFull));
     60 }
     61 
     62 TEST(BitsTest, TestCeilLog2) {
     63   // for input = [1, 7]
     64   const size_t expected[7] = {0, 1, 2, 2, 3, 3, 3};
     65   for (uint32_t i = 1; i <= 7; ++i) {
     66     EXPECT_EQ(expected[i - 1], CeilLog2Nonzero(i)) << " " << i;
     67     EXPECT_EQ(expected[i - 1], CeilLog2Nonzero(static_cast<uint64_t>(i)))
     68         << " " << i;
     69   }
     70 
     71   EXPECT_EQ(12u, CeilLog2Nonzero(0x00000fffu));  // 4095
     72   EXPECT_EQ(12u, CeilLog2Nonzero(0x00001000u));  // 4096
     73   EXPECT_EQ(13u, CeilLog2Nonzero(0x00001001u));  // 4097
     74 
     75   EXPECT_EQ(31u, CeilLog2Nonzero(0x80000000u));
     76   EXPECT_EQ(32u, CeilLog2Nonzero(0x80000001u));
     77   EXPECT_EQ(32u, CeilLog2Nonzero(0xFFFFFFFFu));
     78 
     79   EXPECT_EQ(31u, CeilLog2Nonzero(0x80000000ull));
     80   EXPECT_EQ(32u, CeilLog2Nonzero(0x80000001ull));
     81   EXPECT_EQ(32u, CeilLog2Nonzero(0xFFFFFFFFull));
     82 
     83   EXPECT_EQ(63u, CeilLog2Nonzero(0x8000000000000000ull));
     84   EXPECT_EQ(64u, CeilLog2Nonzero(0x8000000000000001ull));
     85   EXPECT_EQ(64u, CeilLog2Nonzero(0xFFFFFFFFFFFFFFFFull));
     86 }
     87 
     88 }  // namespace
     89 }  // namespace jxl