v

Зеркало из https://github.com/vlang/v
Форк
0
/x
/
count.v 
98 строк · 1.9 Кб
1
module json2
2

3
import time
4

5
struct Count {
6
mut:
7
	total int
8
}
9

10
// get_total
11
fn (mut count Count) get_total() int {
12
	return count.total
13
}
14

15
// reset_total
16
fn (mut count Count) reset_total() {
17
	count.total = 0
18
}
19

20
// count_chars count json sizen without new encode
21
fn (mut count Count) count_chars[T](val T) {
22
	$if val is $option {
23
		workaround := val
24
		if workaround != none {
25
			count.count_chars(val)
26
		}
27
	} $else $if T is string {
28
		count.chars_in_string(val)
29
	} $else $if T is $sumtype {
30
		$for v in val.variants {
31
			if val is v {
32
				count.count_chars(val)
33
			}
34
		}
35
	} $else $if T is $alias {
36
		// TODO
37
	} $else $if T is time.Time {
38
		count.total += 26 // "YYYY-MM-DDTHH:mm:ss.123Z"
39
	} $else $if T is $map {
40
		count.total++ // {
41
		for k, v in val {
42
			count.count_chars(k)
43
			count.total++ // :
44
			count.count_chars(v)
45
		}
46
		count.total++ // }
47
	} $else $if T is $array {
48
		count.total += 2 // []
49
		if val.len > 0 {
50
			for element in val {
51
				count.count_chars(element)
52
			}
53
			count.total += val.len - 1 // ,
54
		}
55
	} $else $if T is $struct {
56
		count.chars_in_struct(val)
57
	} $else $if T is $enum {
58
		count.count_chars(int(val))
59
	} $else $if T is $int {
60
		// TODO: benchmark
61
		mut abs_val := val
62
		if val < 0 {
63
			count.total++ // -
64
			abs_val = -val
65
		}
66
		for number_value := abs_val; number_value >= 1; number_value /= 10 {
67
			count.total++
68
		}
69
		if val == 0 {
70
			count.total++
71
		}
72
	} $else $if T is $float {
73
		// TODO
74
	} $else $if T is bool {
75
		if val {
76
			count.total += 4 // true
77
		} else {
78
			count.total += 5 // false
79
		}
80
	} $else {
81
	}
82
}
83

84
// chars_in_struct
85
fn (mut count Count) chars_in_struct[T](val T) {
86
	count.total += 2 // {}
87
	$for field in T.fields {
88
		// TODO: handle attributes
89
		count.total += field.name.len + 3 // "":
90
		workaround := val.$(field.name)
91
		count.count_chars(workaround)
92
	}
93
}
94

95
// chars_in_string
96
fn (mut count Count) chars_in_string(val string) {
97
	count.total += val.len + 2 // ""
98
}
99

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.