map.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package linkedhashmap
  2. import (
  3. "bytes"
  4. "github.com/goccy/go-json"
  5. "github.com/sagernet/sing/common"
  6. E "github.com/sagernet/sing/common/exceptions"
  7. "github.com/sagernet/sing/common/x/list"
  8. )
  9. type Map[K comparable, V any] struct {
  10. raw list.List[mapEntry[K, V]]
  11. rawMap map[K]*list.Element[mapEntry[K, V]]
  12. }
  13. func (m *Map[K, V]) init() {
  14. if m.rawMap == nil {
  15. m.rawMap = make(map[K]*list.Element[mapEntry[K, V]])
  16. }
  17. }
  18. func (m *Map[K, V]) MarshalJSON() ([]byte, error) {
  19. buffer := new(bytes.Buffer)
  20. buffer.WriteString("{")
  21. for item := m.raw.Front(); item != nil; {
  22. entry := item.Value
  23. err := json.NewEncoder(buffer).Encode(entry.Key)
  24. if err != nil {
  25. return nil, err
  26. }
  27. buffer.WriteString(": ")
  28. err = json.NewEncoder(buffer).Encode(entry.Value)
  29. if err != nil {
  30. return nil, err
  31. }
  32. item = item.Next()
  33. if item != nil {
  34. buffer.WriteString(", ")
  35. }
  36. }
  37. buffer.WriteString("}")
  38. return buffer.Bytes(), nil
  39. }
  40. func (m *Map[K, V]) UnmarshalJSON(content []byte) error {
  41. decoder := json.NewDecoder(bytes.NewReader(content))
  42. m.Clear()
  43. m.init()
  44. objectStart, err := decoder.Token()
  45. if err != nil {
  46. return err
  47. } else if objectStart != json.Delim('{') {
  48. return E.New("expected json object start, but starts with ", objectStart)
  49. }
  50. for decoder.More() {
  51. var entryKey K
  52. err = decoder.Decode(&entryKey)
  53. if err != nil {
  54. return err
  55. }
  56. var entryValue V
  57. err = decoder.Decode(&entryValue)
  58. if err != nil {
  59. return err
  60. }
  61. m.rawMap[entryKey] = m.raw.PushBack(mapEntry[K, V]{Key: entryKey, Value: entryValue})
  62. }
  63. objectEnd, err := decoder.Token()
  64. if err != nil {
  65. return err
  66. } else if objectEnd != json.Delim('}') {
  67. return E.New("expected json object end, but ends with ", objectEnd)
  68. }
  69. return nil
  70. }
  71. type mapEntry[K comparable, V any] struct {
  72. Key K
  73. Value V
  74. }
  75. func (m *Map[K, V]) Size() int {
  76. return m.raw.Size()
  77. }
  78. func (m *Map[K, V]) IsEmpty() bool {
  79. return m.raw.IsEmpty()
  80. }
  81. func (m *Map[K, V]) ContainsKey(key K) bool {
  82. m.init()
  83. _, loaded := m.rawMap[key]
  84. return loaded
  85. }
  86. func (m *Map[K, V]) Get(key K) (V, bool) {
  87. m.init()
  88. value, loaded := m.rawMap[key]
  89. return value.Value.Value, loaded
  90. }
  91. func (m *Map[K, V]) Put(key K, value V) V {
  92. m.init()
  93. entry, loaded := m.rawMap[key]
  94. if loaded {
  95. oldValue := entry.Value.Value
  96. entry.Value.Value = value
  97. return oldValue
  98. }
  99. entry = m.raw.PushBack(mapEntry[K, V]{Key: key, Value: value})
  100. m.rawMap[key] = entry
  101. return common.DefaultValue[V]()
  102. }
  103. func (m *Map[K, V]) PutAll(other *Map[K, V]) {
  104. for item := other.raw.Front(); item != nil; item = item.Next() {
  105. m.Put(item.Value.Key, item.Value.Value)
  106. }
  107. }
  108. func (m *Map[K, V]) Remove(key K) bool {
  109. m.init()
  110. entry, loaded := m.rawMap[key]
  111. if !loaded {
  112. return false
  113. }
  114. m.raw.Remove(entry)
  115. delete(m.rawMap, key)
  116. return true
  117. }
  118. func (m *Map[K, V]) RemoveAll(keys []K) {
  119. m.init()
  120. for _, key := range keys {
  121. entry, loaded := m.rawMap[key]
  122. if !loaded {
  123. continue
  124. }
  125. m.raw.Remove(entry)
  126. delete(m.rawMap, key)
  127. }
  128. }
  129. func (m *Map[K, V]) AsMap() map[K]V {
  130. result := make(map[K]V, m.raw.Len())
  131. for item := m.raw.Front(); item != nil; item = item.Next() {
  132. result[item.Value.Key] = item.Value.Value
  133. }
  134. return result
  135. }
  136. func (m *Map[K, V]) Keys() []K {
  137. result := make([]K, 0, m.raw.Len())
  138. for item := m.raw.Front(); item != nil; item = item.Next() {
  139. result = append(result, item.Value.Key)
  140. }
  141. return result
  142. }
  143. func (m *Map[K, V]) Values() []V {
  144. result := make([]V, 0, m.raw.Len())
  145. for item := m.raw.Front(); item != nil; item = item.Next() {
  146. result = append(result, item.Value.Value)
  147. }
  148. return result
  149. }
  150. func (m *Map[K, V]) Clear() {
  151. *m = Map[K, V]{}
  152. }