ptrmap.bmx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. SuperStrict
  2. Import "common.bmx"
  3. Extern
  4. Function bmx_map_ptrmap_clear(root:SavlRoot Ptr Ptr)
  5. Function bmx_map_ptrmap_isempty:Int(root:SavlRoot Ptr)
  6. Function bmx_map_ptrmap_insert(key:Byte Ptr, value:Object, root:SavlRoot Ptr Ptr)
  7. Function bmx_map_ptrmap_contains:Int(key:Byte Ptr, root:SavlRoot Ptr)
  8. Function bmx_map_ptrmap_valueforkey:Object(key:Byte Ptr, root:SavlRoot Ptr)
  9. Function bmx_map_ptrmap_remove:Int(key:Byte Ptr, root:SavlRoot Ptr Ptr)
  10. Function bmx_map_ptrmap_firstnode:SPtrMapNode Ptr(root:SavlRoot Ptr)
  11. Function bmx_map_ptrmap_nextnode:SPtrMapNode Ptr(node:SPtrMapNode Ptr)
  12. Function bmx_map_ptrmap_key:Byte Ptr(node:SPtrMapNode Ptr)
  13. Function bmx_map_ptrmap_value:Object(node:SPtrMapNode Ptr)
  14. Function bmx_map_ptrmap_hasnext:Int(node:SPtrMapNode Ptr, root:SavlRoot Ptr)
  15. Function bmx_map_ptrmap_copy(dst:SavlRoot Ptr Ptr, _root:SavlRoot Ptr)
  16. End Extern
  17. Struct SPtrMapNode
  18. Field link:SavlRoot
  19. Field key:Byte Ptr
  20. Field value:Object
  21. End Struct
  22. Rem
  23. bbdoc: A key/value (Byte Ptr/Object) map.
  24. End Rem
  25. Type TPtrMap
  26. Method Delete()
  27. Clear
  28. End Method
  29. Rem
  30. bbdoc: Clears the map.
  31. about: Removes all keys and values.
  32. End Rem
  33. Method Clear()
  34. ?ngcmod
  35. If Not IsEmpty() Then
  36. _modCount :+ 1
  37. End If
  38. ?
  39. bmx_map_ptrmap_clear(Varptr _root)
  40. End Method
  41. Rem
  42. bbdoc: Checks if the map is empty.
  43. about: #True if @map is empty, otherwise #False.
  44. End Rem
  45. Method IsEmpty:Int()
  46. Return bmx_map_ptrmap_isempty(_root)
  47. End Method
  48. Rem
  49. bbdoc: Inserts a key/value pair into the map.
  50. about: If the map already contains @key, its value is overwritten with @value.
  51. End Rem
  52. Method Insert( key:Byte Ptr,value:Object )
  53. bmx_map_ptrmap_insert(key, value, Varptr _root)
  54. ?ngcmod
  55. _modCount :+ 1
  56. ?
  57. End Method
  58. Rem
  59. bbdoc: Checks if the map contains @key.
  60. returns: #True if the map contains @key.
  61. End Rem
  62. Method Contains:Int( key:Byte Ptr )
  63. Return bmx_map_ptrmap_contains(key, _root)
  64. End Method
  65. Rem
  66. bbdoc: Finds a value given a @key.
  67. returns: The value associated with @key.
  68. about: If the map does not contain @key, a #Null object is returned.
  69. End Rem
  70. Method ValueForKey:Object( key:Byte Ptr )
  71. Return bmx_map_ptrmap_valueforkey(key, _root)
  72. End Method
  73. Rem
  74. bbdoc: Remove a key/value pair from the map.
  75. returns: #True if @key was removed, or #False otherwise.
  76. End Rem
  77. Method Remove:Int( key:Byte Ptr )
  78. ?ngcmod
  79. _modCount :+ 1
  80. ?
  81. Return bmx_map_ptrmap_remove(key, Varptr _root)
  82. End Method
  83. Method _FirstNode:TPtrNode()
  84. If Not IsEmpty() Then
  85. Local node:TPtrNode= New TPtrNode
  86. node._root = _root
  87. Return node
  88. Else
  89. Return Null
  90. End If
  91. End Method
  92. Rem
  93. bbdoc: Gets the map keys.
  94. returns: An enumeration object
  95. about: The object returned by #Keys can be used with #EachIn to iterate through the keys in the map.
  96. End Rem
  97. Method Keys:TPtrMapEnumerator()
  98. Local nodeenum:TPtrNodeEnumerator
  99. If Not isEmpty() Then
  100. nodeenum=New TPtrKeyEnumerator
  101. nodeenum._node=_FirstNode()
  102. Else
  103. nodeenum=New TPtrEmptyEnumerator
  104. End If
  105. Local mapenum:TPtrMapEnumerator=New TPtrMapEnumerator
  106. mapenum._enumerator=nodeenum
  107. nodeenum._map = Self
  108. ?ngcmod
  109. nodeenum._expectedModCount = _modCount
  110. ?
  111. Return mapenum
  112. End Method
  113. Rem
  114. bbdoc: Get the map values.
  115. returns: An enumeration object.
  116. about: The object returned by #Values can be used with #EachIn to iterate through the values in the map.
  117. End Rem
  118. Method Values:TPtrMapEnumerator()
  119. Local nodeenum:TPtrNodeEnumerator
  120. If Not isEmpty() Then
  121. nodeenum=New TPtrValueEnumerator
  122. nodeenum._node=_FirstNode()
  123. Else
  124. nodeenum=New TPtrEmptyEnumerator
  125. End If
  126. Local mapenum:TPtrMapEnumerator=New TPtrMapEnumerator
  127. mapenum._enumerator=nodeenum
  128. nodeenum._map = Self
  129. ?ngcmod
  130. nodeenum._expectedModCount = _modCount
  131. ?
  132. Return mapenum
  133. End Method
  134. Rem
  135. bbdoc: Returns a copy the contents of this map.
  136. End Rem
  137. Method Copy:TPtrMap()
  138. Local map:TPtrMap=New TPtrMap
  139. bmx_map_ptrmap_copy(Varptr map._root, _root)
  140. Return map
  141. End Method
  142. Rem
  143. bbdoc: Returns a node enumeration object.
  144. about: The object returned by #ObjectEnumerator can be used with #EachIn to iterate through the nodes in the map.
  145. End Rem
  146. Method ObjectEnumerator:TPtrNodeEnumerator()
  147. Local nodeenum:TPtrNodeEnumerator
  148. If Not isEmpty() Then
  149. nodeenum = New TPtrNodeEnumerator
  150. nodeenum._node=_FirstNode()
  151. nodeenum._map = Self
  152. Else
  153. nodeenum = New TPtrEmptyEnumerator
  154. End If
  155. Return nodeenum
  156. End Method
  157. Rem
  158. bbdoc: Finds a value given a @key using index syntax.
  159. returns: The value associated with @key.
  160. about: If the map does not contain @key, a #Null object is returned.
  161. End Rem
  162. Method Operator[]:Object(key:Byte Ptr)
  163. Return bmx_map_ptrmap_valueforkey(key, _root)
  164. End Method
  165. Rem
  166. bbdoc: Inserts a key/value pair into the map using index syntax.
  167. about: If the map already contains @key, its value is overwritten with @value.
  168. End Rem
  169. Method Operator[]=(key:Byte Ptr, value:Object)
  170. bmx_map_ptrmap_insert(key, value, Varptr _root)
  171. End Method
  172. Field _root:SavlRoot Ptr
  173. ?ngcmod
  174. Field _modCount:Int
  175. ?
  176. End Type
  177. Type TPtrNode
  178. Field _root:SavlRoot Ptr
  179. Field _nodePtr:SPtrMapNode Ptr
  180. Method Key:Byte Ptr()
  181. Return bmx_map_ptrmap_key(_nodePtr)
  182. End Method
  183. Method Value:Object()
  184. Return bmx_map_ptrmap_value(_nodePtr)
  185. End Method
  186. Method HasNext:Int()
  187. Return bmx_map_ptrmap_hasnext(_nodePtr, _root)
  188. End Method
  189. Method NextNode:TPtrNode()
  190. If Not _nodePtr Then
  191. _nodePtr = bmx_map_ptrmap_firstnode(_root)
  192. Else
  193. _nodePtr = bmx_map_ptrmap_nextnode(_nodePtr)
  194. End If
  195. Return Self
  196. End Method
  197. End Type
  198. Rem
  199. bbdoc: Byte Ptr holder for key returned by TPtrMap.Keys() enumerator.
  200. about: Because a single instance of #TPtrKey is used during enumeration, #value changes on each iteration.
  201. End Rem
  202. Type TPtrKey
  203. Rem
  204. bbdoc: Byte Ptr key value.
  205. End Rem
  206. Field value:Byte Ptr
  207. End Type
  208. Type TPtrNodeEnumerator
  209. Method HasNext:Int()
  210. Local has:Int = _node.HasNext()
  211. If Not has Then
  212. _map = Null
  213. End If
  214. Return has
  215. End Method
  216. Method NextObject:Object()
  217. ?ngcmod
  218. Assert _expectedModCount = _map._modCount, "TPtrMap Concurrent Modification"
  219. ?
  220. Local node:TPtrNode=_node
  221. _node=_node.NextNode()
  222. Return node
  223. End Method
  224. '***** PRIVATE *****
  225. Field _node:TPtrNode
  226. Field _map:TPtrMap
  227. ?ngcmod
  228. Field _expectedModCount:Int
  229. ?
  230. End Type
  231. Type TPtrKeyEnumerator Extends TPtrNodeEnumerator
  232. Field _key:TPtrKey = New TPtrKey
  233. Method NextObject:Object() Override
  234. ?ngcmod
  235. Assert _expectedModCount = _map._modCount, "TPtrMap Concurrent Modification"
  236. ?
  237. Local node:TPtrNode=_node
  238. _node=_node.NextNode()
  239. _key.value = node.Key()
  240. Return _key
  241. End Method
  242. End Type
  243. Type TPtrValueEnumerator Extends TPtrNodeEnumerator
  244. Method NextObject:Object() Override
  245. ?ngcmod
  246. Assert _expectedModCount = _map._modCount, "TPtrMap Concurrent Modification"
  247. ?
  248. Local node:TPtrNode=_node
  249. _node=_node.NextNode()
  250. Return node.Value()
  251. End Method
  252. End Type
  253. Type TPtrMapEnumerator
  254. Method ObjectEnumerator:TPtrNodeEnumerator()
  255. Return _enumerator
  256. End Method
  257. Field _enumerator:TPtrNodeEnumerator
  258. End Type
  259. Type TPtrEmptyEnumerator Extends TPtrNodeEnumerator
  260. Method HasNext:Int() Override
  261. _map = Null
  262. Return False
  263. End Method
  264. End Type