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
112
113
114
115
116
crate::ix!();
pub struct NodeEvictionCandidate
{
pub id: NodeId,
pub n_time_connected: Option<OffsetDateTime>,
pub min_ping_time: Option<Duration>, /* micros */
pub n_last_block_time: Option<OffsetDateTime>,
pub n_last_tx_time: Option<OffsetDateTime>,
pub relevant_services: bool,
pub relay_txes: bool,
pub bloom_filter: bool,
pub n_keyed_net_group: u64,
pub prefer_evict: bool,
pub is_local: bool,
pub network: Network,
}
//-----------------------------------------------
/**
| Sort an array by the specified comparator,
| then erase the last K elements where
| predicate is true.
|
*/
pub fn erase_last_kelements<T, Comparator>(
elements: &mut Vec<T>,
comparator: Comparator,
k: usize,
predicate: fn(_0: &NodeEvictionCandidate) -> bool) {
todo!();
/*
let predicate = predicate.unwrap_or([](const NodeEvictionCandidate& n) { return true; });
std::sort(elements.begin(), elements.end(), comparator);
size_t eraseSize = std::min(k, elements.size());
elements.erase(std::remove_if(elements.end() - eraseSize, elements.end(), predicate), elements.end());
*/
}
pub fn compare_node_block_time(
a: &NodeEvictionCandidate,
b: &NodeEvictionCandidate) -> bool {
todo!();
/*
// There is a fall-through here because it is common for a node to have many peers which have not yet relayed a block.
if (a.nLastBlockTime != b.nLastBlockTime) return a.nLastBlockTime < b.nLastBlockTime;
if (a.fRelevantServices != b.fRelevantServices) return b.fRelevantServices;
return a.nTimeConnected > b.nTimeConnected;
*/
}
pub fn compare_node_tx_time(
a: &NodeEvictionCandidate,
b: &NodeEvictionCandidate) -> bool {
todo!();
/*
// There is a fall-through here because it is common for a node to have more than a few peers that have not yet relayed txn.
if (a.nLastTXTime != b.nLastTXTime) return a.nLastTXTime < b.nLastTXTime;
if (a.fRelayTxes != b.fRelayTxes) return b.fRelayTxes;
if (a.fBloomFilter != b.fBloomFilter) return a.fBloomFilter;
return a.nTimeConnected > b.nTimeConnected;
*/
}
/**
| Pick out the potential block-relay
| only peers, and sort them by last block
| time.
|
*/
pub fn compare_node_block_relay_only_time(
a: &NodeEvictionCandidate,
b: &NodeEvictionCandidate) -> bool {
todo!();
/*
if (a.fRelayTxes != b.fRelayTxes) return a.fRelayTxes;
if (a.nLastBlockTime != b.nLastBlockTime) return a.nLastBlockTime < b.nLastBlockTime;
if (a.fRelevantServices != b.fRelevantServices) return b.fRelevantServices;
return a.nTimeConnected > b.nTimeConnected;
*/
}
pub fn reverse_compare_node_min_ping_time(
a: &NodeEvictionCandidate,
b: &NodeEvictionCandidate) -> bool {
todo!();
/*
return a.m_min_ping_time > b.m_min_ping_time;
*/
}
pub fn reverse_compare_node_time_connected(
a: &NodeEvictionCandidate,
b: &NodeEvictionCandidate) -> bool {
todo!();
/*
return a.nTimeConnected > b.nTimeConnected;
*/
}
pub fn compare_net_group_keyed(
a: &NodeEvictionCandidate,
b: &NodeEvictionCandidate) -> bool {
todo!();
/*
return a.nKeyedNetGroup < b.nKeyedNetGroup;
*/
}