229 lines
4.9 KiB
Go
229 lines
4.9 KiB
Go
package server
|
|
|
|
import "strings"
|
|
|
|
func orderNode(list []*node) {
|
|
f := func(a, b *node) bool {
|
|
if strings.Contains(a.addr, "(localhost)") {
|
|
return true
|
|
} else if strings.Contains(b.addr, "(localhost)") {
|
|
return false
|
|
}
|
|
return a.uuid < b.uuid
|
|
}
|
|
max_len := len(list)
|
|
tmp := make([]*node, max_len)
|
|
for i := 0; i < max_len-max_len&1; i += 2 {
|
|
if f(list[i+1], list[i]) {
|
|
list[i], list[i+1] = list[i+1], list[i]
|
|
}
|
|
|
|
}
|
|
for i := 0; i < max_len-max_len&3; i += 4 {
|
|
if f(list[i+2], list[i]) {
|
|
list[i], list[i+2] = list[i+2], list[i]
|
|
}
|
|
if f(list[i+3], list[i+1]) {
|
|
list[i+1], list[i+3] = list[i+3], list[i+1]
|
|
}
|
|
if f(list[i+2], list[i+1]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
}
|
|
|
|
}
|
|
if max_len&3 == 3 {
|
|
i := max_len - 3
|
|
if f(list[i+2], list[i]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
list[i], list[i+1] = list[i+1], list[i]
|
|
} else if f(list[i+2], list[i+1]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
}
|
|
}
|
|
var step, l, max, r int
|
|
step = 4
|
|
for step < max_len {
|
|
step <<= 1
|
|
for i := 0; i < max_len; i += step {
|
|
l, r, max = i, i+step/2, i+step
|
|
if max > max_len {
|
|
max = max_len
|
|
}
|
|
for index := i; index < max; index++ {
|
|
if l == step/2+i || (r < max && f(list[r], list[l])) {
|
|
tmp[index] = list[r]
|
|
r++
|
|
} else {
|
|
tmp[index] = list[l]
|
|
l++
|
|
}
|
|
}
|
|
}
|
|
if step < max_len {
|
|
for i := 0; i < max_len; i += step {
|
|
l, r, max = i, i+step/2, i+step
|
|
if max > max_len {
|
|
max = max_len
|
|
}
|
|
for index := i; index < max; index++ {
|
|
if l == step/2+i || (r < max && f(tmp[r], tmp[l])) {
|
|
list[index] = tmp[r]
|
|
r++
|
|
} else {
|
|
list[index] = tmp[l]
|
|
l++
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
copy(list, tmp)
|
|
}
|
|
}
|
|
}
|
|
func orderClientListen(list []*clientListen) {
|
|
f := func(a, b *clientListen) bool {
|
|
return a.id < b.id
|
|
}
|
|
max_len := len(list)
|
|
tmp := make([]*clientListen, max_len)
|
|
for i := 0; i < max_len-max_len&1; i += 2 {
|
|
if f(list[i+1], list[i]) {
|
|
list[i], list[i+1] = list[i+1], list[i]
|
|
}
|
|
|
|
}
|
|
for i := 0; i < max_len-max_len&3; i += 4 {
|
|
if f(list[i+2], list[i]) {
|
|
list[i], list[i+2] = list[i+2], list[i]
|
|
}
|
|
if f(list[i+3], list[i+1]) {
|
|
list[i+1], list[i+3] = list[i+3], list[i+1]
|
|
}
|
|
if f(list[i+2], list[i+1]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
}
|
|
|
|
}
|
|
if max_len&3 == 3 {
|
|
i := max_len - 3
|
|
if f(list[i+2], list[i]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
list[i], list[i+1] = list[i+1], list[i]
|
|
} else if f(list[i+2], list[i+1]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
}
|
|
}
|
|
var step, l, max, r int
|
|
step = 4
|
|
for step < max_len {
|
|
step <<= 1
|
|
for i := 0; i < max_len; i += step {
|
|
l, r, max = i, i+step/2, i+step
|
|
if max > max_len {
|
|
max = max_len
|
|
}
|
|
for index := i; index < max; index++ {
|
|
if l == step/2+i || (r < max && f(list[r], list[l])) {
|
|
tmp[index] = list[r]
|
|
r++
|
|
} else {
|
|
tmp[index] = list[l]
|
|
l++
|
|
}
|
|
}
|
|
}
|
|
if step < max_len {
|
|
for i := 0; i < max_len; i += step {
|
|
l, r, max = i, i+step/2, i+step
|
|
if max > max_len {
|
|
max = max_len
|
|
}
|
|
for index := i; index < max; index++ {
|
|
if l == step/2+i || (r < max && f(tmp[r], tmp[l])) {
|
|
list[index] = tmp[r]
|
|
r++
|
|
} else {
|
|
list[index] = tmp[l]
|
|
l++
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
copy(list, tmp)
|
|
}
|
|
}
|
|
}
|
|
func orderHttpProxy(list []*httpProxyClient) {
|
|
f := func(a, b *httpProxyClient) bool {
|
|
return a.id < b.id
|
|
}
|
|
max_len := len(list)
|
|
tmp := make([]*httpProxyClient, max_len)
|
|
for i := 0; i < max_len-max_len&1; i += 2 {
|
|
if f(list[i+1], list[i]) {
|
|
list[i], list[i+1] = list[i+1], list[i]
|
|
}
|
|
|
|
}
|
|
for i := 0; i < max_len-max_len&3; i += 4 {
|
|
if f(list[i+2], list[i]) {
|
|
list[i], list[i+2] = list[i+2], list[i]
|
|
}
|
|
if f(list[i+3], list[i+1]) {
|
|
list[i+1], list[i+3] = list[i+3], list[i+1]
|
|
}
|
|
if f(list[i+2], list[i+1]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
}
|
|
|
|
}
|
|
if max_len&3 == 3 {
|
|
i := max_len - 3
|
|
if f(list[i+2], list[i]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
list[i], list[i+1] = list[i+1], list[i]
|
|
} else if f(list[i+2], list[i+1]) {
|
|
list[i+1], list[i+2] = list[i+2], list[i+1]
|
|
}
|
|
}
|
|
var step, l, max, r int
|
|
step = 4
|
|
for step < max_len {
|
|
step <<= 1
|
|
for i := 0; i < max_len; i += step {
|
|
l, r, max = i, i+step/2, i+step
|
|
if max > max_len {
|
|
max = max_len
|
|
}
|
|
for index := i; index < max; index++ {
|
|
if l == step/2+i || (r < max && f(list[r], list[l])) {
|
|
tmp[index] = list[r]
|
|
r++
|
|
} else {
|
|
tmp[index] = list[l]
|
|
l++
|
|
}
|
|
}
|
|
}
|
|
if step < max_len {
|
|
for i := 0; i < max_len; i += step {
|
|
l, r, max = i, i+step/2, i+step
|
|
if max > max_len {
|
|
max = max_len
|
|
}
|
|
for index := i; index < max; index++ {
|
|
if l == step/2+i || (r < max && f(tmp[r], tmp[l])) {
|
|
list[index] = tmp[r]
|
|
r++
|
|
} else {
|
|
list[index] = tmp[l]
|
|
l++
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
copy(list, tmp)
|
|
}
|
|
}
|
|
}
|