annotate vendor/gopkg.in/yaml.v3/sorter.go @ 82:1b27391363d1 draft

Add posthook examples Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Tue, 26 Mar 2024 02:14:25 +0000
parents d8727551f403
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
74
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2 // Copyright (c) 2011-2019 Canonical Ltd
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
4 // Licensed under the Apache License, Version 2.0 (the "License");
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
5 // you may not use this file except in compliance with the License.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
6 // You may obtain a copy of the License at
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
7 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
8 // http://www.apache.org/licenses/LICENSE-2.0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
9 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
10 // Unless required by applicable law or agreed to in writing, software
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
11 // distributed under the License is distributed on an "AS IS" BASIS,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
13 // See the License for the specific language governing permissions and
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
14 // limitations under the License.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
15
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
16 package yaml
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
17
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
18 import (
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
19 "reflect"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
20 "unicode"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
21 )
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
22
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
23 type keyList []reflect.Value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
24
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
25 func (l keyList) Len() int { return len(l) }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
26 func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
27 func (l keyList) Less(i, j int) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
28 a := l[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
29 b := l[j]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
30 ak := a.Kind()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
31 bk := b.Kind()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
32 for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
33 a = a.Elem()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
34 ak = a.Kind()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
35 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
36 for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
37 b = b.Elem()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
38 bk = b.Kind()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
39 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
40 af, aok := keyFloat(a)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
41 bf, bok := keyFloat(b)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
42 if aok && bok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
43 if af != bf {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
44 return af < bf
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
45 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
46 if ak != bk {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
47 return ak < bk
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
48 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
49 return numLess(a, b)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
50 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
51 if ak != reflect.String || bk != reflect.String {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
52 return ak < bk
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
53 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
54 ar, br := []rune(a.String()), []rune(b.String())
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
55 digits := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
56 for i := 0; i < len(ar) && i < len(br); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
57 if ar[i] == br[i] {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
58 digits = unicode.IsDigit(ar[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
59 continue
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
60 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
61 al := unicode.IsLetter(ar[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
62 bl := unicode.IsLetter(br[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
63 if al && bl {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
64 return ar[i] < br[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
65 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
66 if al || bl {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
67 if digits {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
68 return al
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
69 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
70 return bl
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
71 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
72 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
73 var ai, bi int
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
74 var an, bn int64
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
75 if ar[i] == '0' || br[i] == '0' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
76 for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
77 if ar[j] != '0' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
78 an = 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
79 bn = 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
80 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
81 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
82 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
83 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
84 for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
85 an = an*10 + int64(ar[ai]-'0')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
86 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
87 for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
88 bn = bn*10 + int64(br[bi]-'0')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
89 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
90 if an != bn {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
91 return an < bn
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
92 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
93 if ai != bi {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
94 return ai < bi
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
95 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
96 return ar[i] < br[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
97 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
98 return len(ar) < len(br)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
99 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
100
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
101 // keyFloat returns a float value for v if it is a number/bool
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
102 // and whether it is a number/bool or not.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
103 func keyFloat(v reflect.Value) (f float64, ok bool) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
104 switch v.Kind() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
105 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
106 return float64(v.Int()), true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
107 case reflect.Float32, reflect.Float64:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
108 return v.Float(), true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
109 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
110 return float64(v.Uint()), true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
111 case reflect.Bool:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
112 if v.Bool() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
113 return 1, true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
114 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
115 return 0, true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
116 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
117 return 0, false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
118 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
119
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
120 // numLess returns whether a < b.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
121 // a and b must necessarily have the same kind.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
122 func numLess(a, b reflect.Value) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
123 switch a.Kind() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
124 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
125 return a.Int() < b.Int()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
126 case reflect.Float32, reflect.Float64:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
127 return a.Float() < b.Float()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
128 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
129 return a.Uint() < b.Uint()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
130 case reflect.Bool:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
131 return !a.Bool() && b.Bool()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
132 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
133 panic("not a number")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
134 }