Files
rakshasa/server/order.go
T
2023-03-22 11:30:21 +08:00

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)
}
}
}