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
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
pub mod hash_alg;
pub mod crypto;
pub use crypto::crypto_alg_t;
use std::mem;
use crate::common::errcode;
pub mod spf;
pub use spf::spf_matrix_t;
pub mod prio_queue;
pub use prio_queue::priority_queue_t;
const MAX_SIZE:usize = 65536;
const SPF_MAX_NODE_NUM:usize = 1024;
pub fn slice_xor(src:&[u8],dst:&mut [u8])->errcode::RESULT {
let src_len = src.len();
let dst_len = dst.len();
if dst_len<src_len {
return errcode::ERROR_BUFFER_TOO_SMALL;
}
let u64_src_len:usize = src_len/mem::size_of::<u64>();
let u64_dst = unsafe { &mut *(dst.as_mut_ptr() as *mut [u64;MAX_SIZE]) };
let u64_src = unsafe { &*(src.as_ptr() as *const [u64;MAX_SIZE])};
for i in 0..u64_src_len {
u64_dst[i] ^=u64_src[i];
}
let u64_dst_len:usize = dst_len/mem::size_of::<u64>();
for j in u64_src_len..u64_dst_len {
u64_dst[j] ^=0u64;
}
for k in u64_dst_len*mem::size_of::<u64>()..dst_len {
dst[k] ^=0u8;
}
return errcode::RESULT_SUCCESS
}
pub fn slice_xor_simple(src:&[u8],dst:&mut [u8])->errcode::RESULT {
let src_len = src.len();
let dst_len = dst.len();
if dst_len<src_len {
return errcode::ERROR_BUFFER_TOO_SMALL;
}
for i in 0..src_len {
dst[i] ^= src[i]
}
for k in src_len..dst_len {
dst[k] ^=0u8;
}
return errcode::RESULT_SUCCESS
}
pub fn log2(v:u64)->usize {
if v==0 {
return 0
}
for i in 1..u64::BITS+1 {
if v>>i == 0 {
return (i-1) as usize
}
}
return 0
}
pub fn merge_slice<T>(v1:&mut Vec<T>,v2:&Vec<T>)
where T:PartialEq+Clone {
for s in v2 {
if !v1.contains(s){
v1.push((*s).clone())
}
}
}
use std::hash::Hash;
pub fn merge_slice2<T>(v1:&mut Vec<T>,v2:&Vec<T>)
where T:PartialEq+Clone+Eq+Hash+Sized {
use std::collections::HashSet;
let mut m:HashSet<T>=HashSet::with_capacity(v1.len()<<1);
m=v1.iter().map(|x| x.clone()).collect();
for s in v2{
if !m.contains(s) {
v1.push(s.clone())
}
}
}