File: int96.cc

package info (click to toggle)
tarantool 2.6.0-1.4
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 85,412 kB
  • sloc: ansic: 513,775; cpp: 69,493; sh: 25,650; python: 19,190; perl: 14,973; makefile: 4,178; yacc: 1,329; sql: 1,074; pascal: 620; ruby: 190; awk: 18; lisp: 7
file content (71 lines) | stat: -rw-r--r-- 1,873 bytes parent folder | download | duplicates (5)
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
#include <bit/int96.h>

#include "unit.h"

#define check(expr) if (!(expr)) printf("failed at %s:%d\n", __FILE__, __LINE__)

static void
test()
{
	header();

	const uint64_t a = 0xFFFFFFFFFFFFFFFFull / 2;
	int96_num num, num1, num2;
	int96_set_unsigned(&num, 0);
	int96_set_unsigned(&num1, a);
	int96_set_unsigned(&num2, a);
	int96_invert(&num2);
	check(int96_is_neg_int64(&num2));
	check(int96_extract_neg_int64(&num2) == int64_t(-a));
	check(int96_is_uint64(&num));
	check(int96_extract_uint64(&num) == 0);
	int96_add(&num, &num1);
	check(int96_is_uint64(&num));
	check(int96_extract_uint64(&num) == a);
	int96_add(&num, &num1);
	check(int96_is_uint64(&num));
	check(int96_extract_uint64(&num) == a * 2);
	for (int i = 1; i < 1000; i++) {
		for(int j = 0; j < i; j++) {
			int96_add(&num, &num1);
			check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
		}
		for(int j = 0; j < i - 1; j++) {
			int96_add(&num, &num2);
			check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
		}
		int96_add(&num, &num2);
		check(int96_is_uint64(&num));
		check(int96_extract_uint64(&num) == a * 2);
	}
	int96_add(&num, &num2);
	check(int96_is_uint64(&num));
	check(int96_extract_uint64(&num) == a);
	int96_add(&num, &num2);
	check(int96_is_uint64(&num));
	check(int96_extract_uint64(&num) == 0);
	int96_add(&num, &num2);
	check(int96_is_neg_int64(&num));
	check(int96_extract_neg_int64(&num) == int64_t(-a));
	for (int i = 1; i < 1000; i++) {
		for(int j = 0; j < i; j++) {
			int96_add(&num, &num2);
			check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
		}
		for(int j = 0; j < i - 1; j++) {
			int96_add(&num, &num1);
			check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
		}
		int96_add(&num, &num1);
		check(int96_is_neg_int64(&num));
		check(int96_extract_neg_int64(&num) == int64_t(-a));
	}

	footer();
}

int
main(int, const char **)
{
	test();
}