set.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package yu_proto
  2. import (
  3. yu_strconv "gogs.qqck.cn/s/tools/strconv"
  4. )
  5. func (t *Protobuf) SetBool(value bool, ids ...any) *Protobuf {
  6. if len(ids) == 0 {
  7. return t
  8. }
  9. t.set(value, ids, 0, nil, t.list)
  10. return t
  11. }
  12. func (t *Protobuf) SetByte(value byte, ids ...any) *Protobuf {
  13. if len(ids) == 0 {
  14. return t
  15. }
  16. t.set(value, ids, 0, nil, t.list)
  17. return t
  18. }
  19. func (t *Protobuf) SetInt8(value int8, ids ...any) *Protobuf {
  20. if len(ids) == 0 {
  21. return t
  22. }
  23. t.set(value, ids, 0, nil, t.list)
  24. return t
  25. }
  26. func (t *Protobuf) SetUint8(value uint8, ids ...any) *Protobuf {
  27. if len(ids) == 0 {
  28. return t
  29. }
  30. t.set(value, ids, 0, nil, t.list)
  31. return t
  32. }
  33. func (t *Protobuf) SetInt16(value int16, ids ...any) *Protobuf {
  34. if len(ids) == 0 {
  35. return t
  36. }
  37. t.set(value, ids, 0, nil, t.list)
  38. return t
  39. }
  40. func (t *Protobuf) SetUint16(value uint16, ids ...any) *Protobuf {
  41. if len(ids) == 0 {
  42. return t
  43. }
  44. t.set(value, ids, 0, nil, t.list)
  45. return t
  46. }
  47. func (t *Protobuf) SetInt32(value int32, ids ...any) *Protobuf {
  48. if len(ids) == 0 {
  49. return t
  50. }
  51. t.set(value, ids, 0, nil, t.list)
  52. return t
  53. }
  54. func (t *Protobuf) SetUint32(value uint32, ids ...any) *Protobuf {
  55. if len(ids) == 0 {
  56. return t
  57. }
  58. t.set(value, ids, 0, nil, t.list)
  59. return t
  60. }
  61. func (t *Protobuf) SetInt64(value int64, ids ...any) *Protobuf {
  62. if len(ids) == 0 {
  63. return t
  64. }
  65. t.set(value, ids, 0, nil, t.list)
  66. return t
  67. }
  68. func (t *Protobuf) SetUint64(value uint64, ids ...any) *Protobuf {
  69. if len(ids) == 0 {
  70. return t
  71. }
  72. t.set(value, ids, 0, nil, t.list)
  73. return t
  74. }
  75. func (t *Protobuf) SetFloat32(value float32, ids ...any) *Protobuf {
  76. if len(ids) == 0 {
  77. return t
  78. }
  79. t.set(value, ids, 0, nil, t.list)
  80. return t
  81. }
  82. func (t *Protobuf) SetFloat64(value float64, ids ...any) *Protobuf {
  83. if len(ids) == 0 {
  84. return t
  85. }
  86. t.set(value, ids, 0, nil, t.list)
  87. return t
  88. }
  89. func (t *Protobuf) SetString(value string, ids ...any) *Protobuf {
  90. if len(ids) == 0 {
  91. return t
  92. }
  93. j_buf := make([]byte, len(value))
  94. copy(j_buf, value)
  95. t.set(j_buf, ids, 0, nil, t.list)
  96. return t
  97. }
  98. func (t *Protobuf) SetBytes(value []byte, ids ...any) *Protobuf {
  99. if len(ids) == 0 {
  100. return t
  101. }
  102. j_buf := make([]byte, len(value))
  103. copy(j_buf, value)
  104. t.set(j_buf, ids, 0, nil, t.list)
  105. return t
  106. }
  107. func (t *Protobuf) set(value any, ids []any, idi int, parent *node, list *node) {
  108. // 判断是否会有子链表
  109. if j_idi := idi + 1; j_idi < len(ids) {
  110. var j_i int
  111. switch j_id := ids[idi].(type) {
  112. case string:
  113. if j_id := yu_strconv.ParseUint64(j_id); j_id < 1 {
  114. return
  115. } else {
  116. var j_prev *node
  117. for {
  118. // 寻找同id节点
  119. if list.id == j_id {
  120. switch list.value.(type) {
  121. case *node:
  122. // 是链表结构,无需操作
  123. t.set(value, ids, j_idi, list, list.value.(*node))
  124. case *[]*node:
  125. // 是数组结构,无需操作
  126. t.set(value, ids, j_idi, list, nil)
  127. default:
  128. // 非链表结构,改变其值为链表
  129. list.value = &node{}
  130. t.set(value, ids, j_idi, list, list.value.(*node))
  131. }
  132. return
  133. }
  134. // 判断是否插入节点
  135. if list.id > j_id {
  136. // 判断是否为首节点
  137. if j_prev == nil {
  138. list._next = &node{list._next, list.id, list.value}
  139. list.id, list.value = j_id, &node{}
  140. t.set(value, ids, j_idi, list, list.value.(*node))
  141. } else {
  142. j_prev._next = &node{list, j_id, &node{}}
  143. t.set(value, ids, j_idi, j_prev._next, j_prev._next.value.(*node))
  144. }
  145. return
  146. }
  147. // 判断是否到链表尾部
  148. if list._next == nil {
  149. // 判断当前节点是否为空节点
  150. if list.id == 0 {
  151. // 空节点就直接赋值
  152. list.id, list.value = j_id, &node{}
  153. t.set(value, ids, j_idi, list, list.value.(*node))
  154. } else {
  155. // 创建新节点
  156. list._next = &node{nil, j_id, &node{}}
  157. t.set(value, ids, j_idi, list._next, list._next.value.(*node))
  158. }
  159. return
  160. }
  161. j_prev, list = list, list._next
  162. }
  163. }
  164. case int8:
  165. j_i = int(j_id)
  166. case uint8:
  167. j_i = int(j_id)
  168. case int16:
  169. j_i = int(j_id)
  170. case uint16:
  171. j_i = int(j_id)
  172. case int32:
  173. j_i = int(j_id)
  174. case uint32:
  175. j_i = int(j_id)
  176. case int64:
  177. j_i = int(j_id)
  178. case uint64:
  179. j_i = int(j_id)
  180. case int:
  181. j_i = j_id
  182. case uint:
  183. j_i = int(j_id)
  184. case uintptr:
  185. j_i = int(j_id)
  186. default:
  187. return
  188. }
  189. if j_i < 0 {
  190. return
  191. }
  192. if parent == nil {
  193. // 数组必须有一个父节点
  194. return
  195. }
  196. var j_array *[]*node
  197. switch parent.value.(type) {
  198. case *[]*node:
  199. // 是数组结构
  200. j_array = parent.value.(*[]*node)
  201. // 数组容量不足索引时扩充数组
  202. for len(*j_array) < j_i+1 {
  203. *j_array = append(*j_array, nil)
  204. }
  205. default:
  206. // 非数组结构,改变其值为数组
  207. j_tmp := make([]*node, j_i+1)
  208. j_array, parent.value = &j_tmp, &j_tmp
  209. }
  210. if (*j_array)[j_i] == nil {
  211. (*j_array)[j_i] = &node{}
  212. }
  213. if (*j_array)[j_i].value == nil {
  214. (*j_array)[j_i]._next, (*j_array)[j_i].id, (*j_array)[j_i].value = nil, 0, &node{}
  215. }
  216. switch (*j_array)[j_i].value.(type) {
  217. case *node:
  218. // 是链表结构,无需操作
  219. default:
  220. (*j_array)[j_i]._next, (*j_array)[j_i].id, (*j_array)[j_i].value = nil, 0, &node{}
  221. }
  222. t.set(value, ids, j_idi, (*j_array)[j_i], (*j_array)[j_i].value.(*node))
  223. return
  224. }
  225. // 最后一层链表
  226. var j_i int
  227. switch j_id := ids[idi].(type) {
  228. case string:
  229. if j_id := yu_strconv.ParseUint64(j_id); j_id < 1 {
  230. return
  231. } else {
  232. var j_prev *node
  233. for {
  234. // 寻找同id节点
  235. if list.id == j_id {
  236. list.value = value
  237. return
  238. }
  239. // 判断是否插入节点
  240. if list.id > j_id {
  241. // 判断是否为首节点
  242. if j_prev == nil {
  243. list._next = &node{list._next, list.id, list.value}
  244. list.id, list.value = j_id, value
  245. } else {
  246. j_prev._next = &node{list, j_id, value}
  247. }
  248. return
  249. }
  250. // 判断是否到链表尾部
  251. if list._next == nil {
  252. // 判断当前节点是否为空节点
  253. if list.id == 0 {
  254. // 空节点就直接赋值
  255. list.id, list.value = j_id, value
  256. } else {
  257. // 创建新节点
  258. list._next = &node{nil, j_id, value}
  259. }
  260. return
  261. }
  262. j_prev, list = list, list._next
  263. }
  264. }
  265. case int8:
  266. j_i = int(j_id)
  267. case uint8:
  268. j_i = int(j_id)
  269. case int16:
  270. j_i = int(j_id)
  271. case uint16:
  272. j_i = int(j_id)
  273. case int32:
  274. j_i = int(j_id)
  275. case uint32:
  276. j_i = int(j_id)
  277. case int64:
  278. j_i = int(j_id)
  279. case uint64:
  280. j_i = int(j_id)
  281. case int:
  282. j_i = j_id
  283. case uint:
  284. j_i = int(j_id)
  285. case uintptr:
  286. j_i = int(j_id)
  287. default:
  288. return
  289. }
  290. if j_i < 0 {
  291. return
  292. }
  293. if parent == nil {
  294. // 数组必须有一个父节点
  295. return
  296. }
  297. var j_array *[]*node
  298. switch parent.value.(type) {
  299. case *[]*node:
  300. // 是数组结构
  301. j_array = parent.value.(*[]*node)
  302. // 数组容量不足索引时扩充数组
  303. for len(*j_array) < j_i+1 {
  304. *j_array = append(*j_array, nil)
  305. }
  306. default:
  307. // 非数组结构,改变其值为数组
  308. j_tmp := make([]*node, j_i+1)
  309. j_array, parent.value = &j_tmp, &j_tmp
  310. }
  311. if (*j_array)[j_i] == nil {
  312. (*j_array)[j_i] = &node{}
  313. }
  314. (*j_array)[j_i]._next, (*j_array)[j_i].id, (*j_array)[j_i].value = nil, 0, value
  315. return
  316. }