File: math.cpp

package info (click to toggle)
mkvtoolnix 97.0-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 60,284 kB
  • sloc: cpp: 217,034; ruby: 11,453; xml: 8,125; ansic: 6,885; sh: 5,274; python: 1,041; perl: 191; makefile: 113; awk: 16; javascript: 4
file content (111 lines) | stat: -rw-r--r-- 5,030 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "common/common_pch.h"

#include <limits>

#include "common/endian.h"
#include "common/math.h"

#include "tests/unit/init.h"

namespace {

TEST(Math, Popcount) {
  EXPECT_EQ(3, mtx::math::count_1_bits(131));
  EXPECT_EQ(3, mtx::math::count_1_bits(131u));
  EXPECT_EQ(3, mtx::math::count_1_bits(131ll));
  EXPECT_EQ(3, mtx::math::count_1_bits(131llu));

  EXPECT_EQ(16, mtx::math::count_1_bits(std::numeric_limits<uint16_t>::max()));
  EXPECT_EQ(32, mtx::math::count_1_bits(std::numeric_limits<uint32_t>::max()));
  EXPECT_EQ(64, mtx::math::count_1_bits(std::numeric_limits<uint64_t>::max()));

  EXPECT_EQ(63, mtx::math::count_1_bits(std::numeric_limits<uint64_t>::max() - 1));
}

TEST(Math, IntLog2) {
  EXPECT_EQ(-1, mtx::math::int_log2(0));
  EXPECT_EQ(0, mtx::math::int_log2(1));
  EXPECT_EQ(1, mtx::math::int_log2(2));
  EXPECT_EQ(2, mtx::math::int_log2(4));
  EXPECT_EQ(31, mtx::math::int_log2(0x80000000ul));
  EXPECT_EQ(32, mtx::math::int_log2(0x100000000ull));
  EXPECT_EQ(63, mtx::math::int_log2(0x8000000000000000ull));
  EXPECT_EQ(63, mtx::math::int_log2(0x8000001230000000ull));
}

TEST(Math, ToSigned) {
  unsigned char big_endian_signed_numbers[] = {
    0x83,                                           // 0
    0x80, 0x03,                                     // 1
    0x80, 0x00, 0x00, 0x03,                         // 3
    0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // 7

    0xfd,                                           // 15
    0xff, 0xfd,                                     // 16
    0xff, 0xff, 0xff, 0xfd,                         // 18
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, // 22
  };

  EXPECT_EQ(std::numeric_limits<int8_t>::min()  + 3, mtx::math::to_signed(big_endian_signed_numbers[0]));
  EXPECT_EQ(std::numeric_limits<int16_t>::min() + 3, mtx::math::to_signed(get_uint16_be(&big_endian_signed_numbers[1])));
  EXPECT_EQ(std::numeric_limits<int32_t>::min() + 3, mtx::math::to_signed(get_uint32_be(&big_endian_signed_numbers[3])));
  EXPECT_EQ(std::numeric_limits<int64_t>::min() + 3, mtx::math::to_signed(get_uint64_be(&big_endian_signed_numbers[7])));

  EXPECT_EQ(-3, mtx::math::to_signed(big_endian_signed_numbers[15]));
  EXPECT_EQ(-3, mtx::math::to_signed(get_uint16_be(&big_endian_signed_numbers[16])));
  EXPECT_EQ(-3, mtx::math::to_signed(get_uint32_be(&big_endian_signed_numbers[18])));
  EXPECT_EQ(-3, mtx::math::to_signed(get_uint64_be(&big_endian_signed_numbers[22])));

  EXPECT_EQ(std::numeric_limits<int8_t>::min()  + 3, mtx::math::to_signed(std::numeric_limits<int8_t>::min()  + 3));
  EXPECT_EQ(std::numeric_limits<int16_t>::min() + 3, mtx::math::to_signed(std::numeric_limits<int16_t>::min() + 3));
  EXPECT_EQ(std::numeric_limits<int32_t>::min() + 3, mtx::math::to_signed(std::numeric_limits<int32_t>::min() + 3));
  EXPECT_EQ(std::numeric_limits<int64_t>::min() + 3, mtx::math::to_signed(std::numeric_limits<int64_t>::min() + 3));

  EXPECT_EQ(-3, mtx::math::to_signed(static_cast<int8_t>(-3)));
  EXPECT_EQ(-3, mtx::math::to_signed(static_cast<int16_t>(-3)));
  EXPECT_EQ(-3, mtx::math::to_signed(static_cast<int32_t>(-3)));
  EXPECT_EQ(-3, mtx::math::to_signed(static_cast<int64_t>(-3)));
}

TEST(Math, ClampValueTo) {
  EXPECT_EQ((mtx_mp_rational_t{     0,      1}), mtx::math::clamp_values_to({          0,       1}, 65535));
  EXPECT_EQ((mtx_mp_rational_t{ 4'711,    815}), mtx::math::clamp_values_to({      4'711,     815}, 65535));
  EXPECT_EQ((mtx_mp_rational_t{65'535, 21'844}), mtx::math::clamp_values_to({  1'000'000, 333'333}, 65535));
  EXPECT_EQ((mtx_mp_rational_t{65'535,      1}), mtx::math::clamp_values_to({999'999'999,       1}, 65535));
}

TEST(Math, ToIntTruncating) {
  EXPECT_EQ(mtx::to_int(mtx::rational(-0, 3)), -0);
  EXPECT_EQ(mtx::to_int(mtx::rational(-1, 3)), -0);
  EXPECT_EQ(mtx::to_int(mtx::rational(-2, 3)), -0);
  EXPECT_EQ(mtx::to_int(mtx::rational(-3, 3)), -1);

  EXPECT_EQ(mtx::to_int(mtx::rational(0, 3)), 0);
  EXPECT_EQ(mtx::to_int(mtx::rational(1, 3)), 0);
  EXPECT_EQ(mtx::to_int(mtx::rational(2, 3)), 0);
  EXPECT_EQ(mtx::to_int(mtx::rational(3, 3)), 1);

  EXPECT_EQ(mtx::to_uint(mtx::rational(0, 3)), 0);
  EXPECT_EQ(mtx::to_uint(mtx::rational(1, 3)), 0);
  EXPECT_EQ(mtx::to_uint(mtx::rational(2, 3)), 0);
  EXPECT_EQ(mtx::to_uint(mtx::rational(3, 3)), 1);
}

TEST(Math, ToIntRounding) {
  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(-0, 3)), -0);
  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(-1, 3)), -0);
  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(-2, 3)), -1);
  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(-3, 3)), -1);

  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(0, 3)), 0);
  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(1, 3)), 0);
  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(2, 3)), 1);
  EXPECT_EQ(mtx::to_int_rounded(mtx::rational(3, 3)), 1);

  EXPECT_EQ(mtx::to_uint_rounded(mtx::rational(0, 3)), 0);
  EXPECT_EQ(mtx::to_uint_rounded(mtx::rational(1, 3)), 0);
  EXPECT_EQ(mtx::to_uint_rounded(mtx::rational(2, 3)), 1);
  EXPECT_EQ(mtx::to_uint_rounded(mtx::rational(3, 3)), 1);
}

}