mirror of https://github.com/v2ray/v2ray-core
Darien Raymond
6 years ago
12 changed files with 132 additions and 70 deletions
@ -0,0 +1,29 @@
|
||||
package compare |
||||
|
||||
import "v2ray.com/core/common/errors" |
||||
|
||||
func BytesEqualWithDetail(a []byte, b []byte) error { |
||||
if len(a) != len(b) { |
||||
return errors.New("mismatch array length ", len(a), " vs ", len(b)) |
||||
} |
||||
for idx, v := range a { |
||||
if b[idx] != v { |
||||
return errors.New("mismatch array value at index [", idx, "]: ", v, " vs ", b[idx]) |
||||
} |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func BytesEqual(a []byte, b []byte) bool { |
||||
return BytesEqualWithDetail(a, b) == nil |
||||
} |
||||
|
||||
func BytesAll(arr []byte, value byte) bool { |
||||
for _, v := range arr { |
||||
if v != value { |
||||
return false |
||||
} |
||||
} |
||||
|
||||
return true |
||||
} |
@ -0,0 +1,43 @@
|
||||
package compare_test |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
. "v2ray.com/core/common/compare" |
||||
) |
||||
|
||||
func TestBytesEqual(t *testing.T) { |
||||
testCases := []struct { |
||||
Input1 []byte |
||||
Input2 []byte |
||||
Result bool |
||||
}{ |
||||
{ |
||||
Input1: []byte{}, |
||||
Input2: []byte{1}, |
||||
Result: false, |
||||
}, |
||||
{ |
||||
Input1: nil, |
||||
Input2: []byte{}, |
||||
Result: true, |
||||
}, |
||||
{ |
||||
Input1: []byte{1}, |
||||
Input2: []byte{1}, |
||||
Result: true, |
||||
}, |
||||
{ |
||||
Input1: []byte{1, 2}, |
||||
Input2: []byte{1, 3}, |
||||
Result: false, |
||||
}, |
||||
} |
||||
|
||||
for _, testCase := range testCases { |
||||
cmp := BytesEqual(testCase.Input1, testCase.Input2) |
||||
if cmp != testCase.Result { |
||||
t.Errorf("unexpected result %v from %v", cmp, testCase) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,30 @@
|
||||
package peer |
||||
|
||||
import ( |
||||
"sync" |
||||
) |
||||
|
||||
type Latency interface { |
||||
Value() uint64 |
||||
} |
||||
|
||||
type HasLatency interface { |
||||
ConnectionLatency() Latency |
||||
HandshakeLatency() Latency |
||||
} |
||||
|
||||
type AverageLatency struct { |
||||
access sync.Mutex |
||||
value uint64 |
||||
} |
||||
|
||||
func (al *AverageLatency) Update(newValue uint64) { |
||||
al.access.Lock() |
||||
defer al.access.Unlock() |
||||
|
||||
al.value = (al.value + newValue*2) / 3 |
||||
} |
||||
|
||||
func (al *AverageLatency) Value() uint64 { |
||||
return al.value |
||||
} |
@ -1,10 +0,0 @@
|
||||
package predicate |
||||
|
||||
func BytesAll(array []byte, b byte) bool { |
||||
for _, val := range array { |
||||
if val != b { |
||||
return false |
||||
} |
||||
} |
||||
return true |
||||
} |
@ -1,39 +0,0 @@
|
||||
package predicate // import "v2ray.com/core/common/predicate"
|
||||
|
||||
type Predicate func() bool |
||||
|
||||
func (v Predicate) And(predicate Predicate) Predicate { |
||||
return All(v, predicate) |
||||
} |
||||
|
||||
func (v Predicate) Or(predicate Predicate) Predicate { |
||||
return Any(v, predicate) |
||||
} |
||||
|
||||
func All(predicates ...Predicate) Predicate { |
||||
return func() bool { |
||||
for _, p := range predicates { |
||||
if !p() { |
||||
return false |
||||
} |
||||
} |
||||
return true |
||||
} |
||||
} |
||||
|
||||
func Any(predicates ...Predicate) Predicate { |
||||
return func() bool { |
||||
for _, p := range predicates { |
||||
if p() { |
||||
return true |
||||
} |
||||
} |
||||
return false |
||||
} |
||||
} |
||||
|
||||
func Not(predicate Predicate) Predicate { |
||||
return func() bool { |
||||
return !predicate() |
||||
} |
||||
} |
Loading…
Reference in new issue