comparator.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. //@File comparator.go
  2. //@Time 2022/05/12
  3. //@Author #Suyghur,
  4. package comparator
  5. // Comparator Should return a number:
  6. // -1 , if a < b
  7. // 0 , if a == b
  8. // 1 , if a > b
  9. type Comparator func(a, b interface{}) int
  10. // BuiltinTypeComparator compare a with b
  11. // -1 , if a < b
  12. // 0 , if a == b
  13. // 1 , if a > b
  14. // make sure a and b are both builtin type
  15. func BuiltinTypeComparator(a, b interface{}) int {
  16. if a == b {
  17. return 0
  18. }
  19. switch a.(type) {
  20. case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64, uintptr:
  21. return cmpInt(a, b)
  22. case float32:
  23. if a.(float32) < b.(float32) {
  24. return -1
  25. }
  26. case float64:
  27. if a.(float64) < b.(float64) {
  28. return -1
  29. }
  30. case bool:
  31. if a.(bool) == false && b.(bool) == true {
  32. return -1
  33. }
  34. case string:
  35. if a.(string) < b.(string) {
  36. return -1
  37. }
  38. case complex64:
  39. return cmpComplex64(a.(complex64), b.(complex64))
  40. case complex128:
  41. return cmpComplex128(a.(complex128), b.(complex128))
  42. }
  43. return 1
  44. }
  45. func cmpInt(a, b interface{}) int {
  46. switch a.(type) {
  47. case int:
  48. return cmpInt64(int64(a.(int)), int64(b.(int)))
  49. case uint:
  50. return cmpUint64(uint64(a.(uint)), uint64(b.(uint)))
  51. case int8:
  52. return cmpInt64(int64(a.(int8)), int64(b.(int8)))
  53. case uint8:
  54. return cmpUint64(uint64(a.(uint8)), uint64(b.(uint8)))
  55. case int16:
  56. return cmpInt64(int64(a.(int16)), int64(b.(int16)))
  57. case uint16:
  58. return cmpUint64(uint64(a.(uint16)), uint64(b.(uint16)))
  59. case int32:
  60. return cmpInt64(int64(a.(int32)), int64(b.(int32)))
  61. case uint32:
  62. return cmpUint64(uint64(a.(uint32)), uint64(b.(uint32)))
  63. case int64:
  64. return cmpInt64(a.(int64), b.(int64))
  65. case uint64:
  66. return cmpUint64(a.(uint64), b.(uint64))
  67. case uintptr:
  68. return cmpUint64(uint64(a.(uintptr)), uint64(b.(uintptr)))
  69. }
  70. return 0
  71. }
  72. func cmpInt64(a, b int64) int {
  73. if a < b {
  74. return -1
  75. }
  76. return 1
  77. }
  78. func cmpUint64(a, b uint64) int {
  79. if a < b {
  80. return -1
  81. }
  82. return 1
  83. }
  84. func cmpFloat32(a, b float32) int {
  85. if a < b {
  86. return -1
  87. }
  88. return 1
  89. }
  90. func cmpFloat64(a, b float64) int {
  91. if a < b {
  92. return -1
  93. }
  94. return 1
  95. }
  96. func cmpComplex64(a, b complex64) int {
  97. if real(a) < real(b) {
  98. return -1
  99. }
  100. if real(a) == real(b) && imag(a) < imag(b) {
  101. return -1
  102. }
  103. return 1
  104. }
  105. func cmpComplex128(a, b complex128) int {
  106. if real(a) < real(b) {
  107. return -1
  108. }
  109. if real(a) == real(b) && imag(a) < imag(b) {
  110. return -1
  111. }
  112. return 1
  113. }
  114. //Reverse returns a comparator reverse to cmp
  115. func Reverse(cmp Comparator) Comparator {
  116. return func(a, b interface{}) int {
  117. return -cmp(a, b)
  118. }
  119. }
  120. // IntComparator compare a with b
  121. // -1 , if a < b
  122. // 0 , if a == b
  123. // 1 , if a > b
  124. func IntComparator(a, b interface{}) int {
  125. if a == b {
  126. return 0
  127. }
  128. if a.(int) < b.(int) {
  129. return -1
  130. }
  131. return 1
  132. }
  133. // UintComparator compare a with b
  134. // -1 , if a < b
  135. // 0 , if a == b
  136. // 1 , if a > b
  137. func UintComparator(a, b interface{}) int {
  138. if a == b {
  139. return 0
  140. }
  141. if a.(uint) < b.(uint) {
  142. return -1
  143. }
  144. return 1
  145. }
  146. // Int8Comparator compare a with b
  147. // -1 , if a < b
  148. // 0 , if a == b
  149. // 1 , if a > b
  150. func Int8Comparator(a, b interface{}) int {
  151. if a == b {
  152. return 0
  153. }
  154. if a.(int8) < b.(int8) {
  155. return -1
  156. }
  157. return 1
  158. }
  159. // Uint8Comparator compare a with b
  160. // -1 , if a < b
  161. // 0 , if a == b
  162. // 1 , if a > b
  163. func Uint8Comparator(a, b interface{}) int {
  164. if a == b {
  165. return 0
  166. }
  167. if a.(uint8) < b.(uint8) {
  168. return -1
  169. }
  170. return 1
  171. }
  172. // Int16Comparator compare a with b
  173. // -1 , if a < b
  174. // 0 , if a == b
  175. // 1 , if a > b
  176. func Int16Comparator(a, b interface{}) int {
  177. if a == b {
  178. return 0
  179. }
  180. if a.(int16) < b.(int16) {
  181. return -1
  182. }
  183. return 1
  184. }
  185. // Uint16Comparator compare a with b
  186. // -1 , if a < b
  187. // 0 , if a == b
  188. // 1 , if a > b
  189. func Uint16Comparator(a, b interface{}) int {
  190. if a == b {
  191. return 0
  192. }
  193. if a.(uint16) < b.(uint16) {
  194. return -1
  195. }
  196. return 1
  197. }
  198. // Int32Comparator compare a with b
  199. // -1 , if a < b
  200. // 0 , if a == b
  201. // 1 , if a > b
  202. func Int32Comparator(a, b interface{}) int {
  203. if a == b {
  204. return 0
  205. }
  206. if a.(int32) < b.(int32) {
  207. return -1
  208. }
  209. return 1
  210. }
  211. // Uint32Comparator compare a with b
  212. // -1 , if a < b
  213. // 0 , if a == b
  214. // 1 , if a > b
  215. func Uint32Comparator(a, b interface{}) int {
  216. if a == b {
  217. return 0
  218. }
  219. if a.(uint32) < b.(uint32) {
  220. return -1
  221. }
  222. return 1
  223. }
  224. // Int64Comparator compare a with b
  225. // -1 , if a < b
  226. // 0 , if a == b
  227. // 1 , if a > b
  228. func Int64Comparator(a, b interface{}) int {
  229. if a == b {
  230. return 0
  231. }
  232. if a.(int64) < b.(int64) {
  233. return -1
  234. }
  235. return 1
  236. }
  237. // Uint64Comparator compare a with b
  238. // -1 , if a < b
  239. // 0 , if a == b
  240. // 1 , if a > b
  241. func Uint64Comparator(a, b interface{}) int {
  242. if a == b {
  243. return 0
  244. }
  245. if a.(uint64) < b.(uint64) {
  246. return -1
  247. }
  248. return 1
  249. }
  250. // Float32Comparator compare a with b
  251. // -1 , if a < b
  252. // 0 , if a == b
  253. // 1 , if a > b
  254. func Float32Comparator(a, b interface{}) int {
  255. if a == b {
  256. return 0
  257. }
  258. if a.(float32) < b.(float32) {
  259. return -1
  260. }
  261. return 1
  262. }
  263. // Float64Comparator compare a with b
  264. // -1 , if a < b
  265. // 0 , if a == b
  266. // 1 , if a > b
  267. func Float64Comparator(a, b interface{}) int {
  268. if a == b {
  269. return 0
  270. }
  271. if a.(float64) < b.(float64) {
  272. return -1
  273. }
  274. return 1
  275. }
  276. // StringComparator compare a with b
  277. // -1 , if a < b
  278. // 0 , if a == b
  279. // 1 , if a > b
  280. func StringComparator(a, b interface{}) int {
  281. if a == b {
  282. return 0
  283. }
  284. if a.(string) < b.(string) {
  285. return -1
  286. }
  287. return 1
  288. }
  289. // UintptrComparator compare a with b
  290. // -1 , if a < b
  291. // 0 , if a == b
  292. // 1 , if a > b
  293. func UintptrComparator(a, b interface{}) int {
  294. if a == b {
  295. return 0
  296. }
  297. if a.(uintptr) < b.(uintptr) {
  298. return -1
  299. }
  300. return 1
  301. }
  302. // BoolComparator compare a with b
  303. // -1 , if a < b
  304. // 0 , if a == b
  305. // 1 , if a > b
  306. func BoolComparator(a, b interface{}) int {
  307. if a == b {
  308. return 0
  309. }
  310. if a.(bool) == false && b.(bool) == true {
  311. return -1
  312. }
  313. return 1
  314. }
  315. // Complex64Comparator compare a with b
  316. // -1 , if a < b
  317. // 0 , if a == b
  318. // 1 , if a > b
  319. func Complex64Comparator(a, b interface{}) int {
  320. if a == b {
  321. return 0
  322. }
  323. comA := a.(complex64)
  324. comB := b.(complex64)
  325. if real(comA) < real(comB) {
  326. return -1
  327. }
  328. if real(comA) == real(comB) && imag(comA) < imag(comB) {
  329. return -1
  330. }
  331. return 1
  332. }
  333. // Complex128Comparator compare a with b
  334. // -1 , if a < b
  335. // 0 , if a == b
  336. // 1 , if a > b
  337. func Complex128Comparator(a, b interface{}) int {
  338. if a == b {
  339. return 0
  340. }
  341. comA := a.(complex128)
  342. comB := b.(complex128)
  343. if real(comA) < real(comB) {
  344. return -1
  345. }
  346. if real(comA) == real(comB) && imag(comA) < imag(comB) {
  347. return -1
  348. }
  349. return 1
  350. }