objectmap.bmx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. SuperStrict
  2. Import "common.bmx"
  3. Extern
  4. Function bmx_map_objectmap_clear(root:SavlRoot Ptr Ptr)
  5. Function bmx_map_objectmap_isempty:Int(root:SavlRoot Ptr)
  6. Function bmx_map_objectmap_insert(key:Object, value:Object, root:SavlRoot Ptr Ptr)
  7. Function bmx_map_objectmap_contains:Int(key:Object, root:SavlRoot Ptr)
  8. Function bmx_map_objectmap_valueforkey:Object(key:Object, root:SavlRoot Ptr)
  9. Function bmx_map_objectmap_remove:Int(key:Object, root:SavlRoot Ptr Ptr)
  10. Function bmx_map_objectmap_firstnode:SObjectMapNode Ptr(root:SavlRoot Ptr)
  11. Function bmx_map_objectmap_nextnode:SObjectMapNode Ptr(node:SObjectMapNode Ptr)
  12. Function bmx_map_objectmap_key:Object(node:SObjectMapNode Ptr)
  13. Function bmx_map_objectmap_value:Object(node:SObjectMapNode Ptr)
  14. Function bmx_map_objectmap_hasnext:Int(node:SObjectMapNode Ptr, root:SavlRoot Ptr)
  15. Function bmx_map_objectmap_copy(dst:SavlRoot Ptr Ptr, _root:SavlRoot Ptr)
  16. End Extern
  17. Struct SObjectMapNode
  18. Field link:SavlRoot
  19. Field key:Object
  20. Field value:Object
  21. End Struct
  22. Type TObjectMap
  23. Method Delete()
  24. Clear
  25. End Method
  26. Method Clear()
  27. ?ngcmod
  28. If Not IsEmpty() Then
  29. _modCount :+ 1
  30. End If
  31. ?
  32. bmx_map_objectmap_clear(Varptr _root)
  33. End Method
  34. Method IsEmpty:Int()
  35. Return bmx_map_objectmap_isempty(_root)
  36. End Method
  37. Method Insert( key:Object,value:Object )
  38. bmx_map_objectmap_insert(key, value, Varptr _root)
  39. ?ngcmod
  40. _modCount :+ 1
  41. ?
  42. End Method
  43. Method Contains:Int( key:Object )
  44. Return bmx_map_objectmap_contains(key, _root)
  45. End Method
  46. Method ValueForKey:Object( key:Object )
  47. Return bmx_map_objectmap_valueforkey(key, _root)
  48. End Method
  49. Method Remove:Int( key:Object )
  50. ?ngcmod
  51. _modCount :+ 1
  52. ?
  53. Return bmx_map_objectmap_remove(key, Varptr _root)
  54. End Method
  55. Method _FirstNode:TObjectNode()
  56. If Not IsEmpty() Then
  57. Local node:TObjectNode= New TObjectNode
  58. node._root = _root
  59. Return node
  60. Else
  61. Return Null
  62. End If
  63. End Method
  64. Method Keys:TObjectMapEnumerator()
  65. Local nodeenum:TObjectNodeEnumerator
  66. If Not isEmpty() Then
  67. nodeenum=New TObjectKeyEnumerator
  68. nodeenum._node=_FirstNode()
  69. Else
  70. nodeenum=New TObjectEmptyEnumerator
  71. End If
  72. Local mapenum:TObjectMapEnumerator=New TObjectMapEnumerator
  73. mapenum._enumerator=nodeenum
  74. nodeenum._map = Self
  75. ?ngcmod
  76. nodeenum._expectedModCount = _modCount
  77. ?
  78. Return mapenum
  79. End Method
  80. Method Values:TObjectMapEnumerator()
  81. Local nodeenum:TObjectNodeEnumerator
  82. If Not isEmpty() Then
  83. nodeenum=New TObjectValueEnumerator
  84. nodeenum._node=_FirstNode()
  85. Else
  86. nodeenum=New TObjectEmptyEnumerator
  87. End If
  88. Local mapenum:TObjectMapEnumerator=New TObjectMapEnumerator
  89. mapenum._enumerator=nodeenum
  90. nodeenum._map = Self
  91. ?ngcmod
  92. nodeenum._expectedModCount = _modCount
  93. ?
  94. Return mapenum
  95. End Method
  96. Method Copy:TObjectMap()
  97. Local map:TObjectMap=New TObjectMap
  98. bmx_map_objectmap_copy(Varptr map._root, _root)
  99. Return map
  100. End Method
  101. Method ObjectEnumerator:TObjectNodeEnumerator()
  102. Local nodeenum:TObjectNodeEnumerator
  103. If Not isEmpty() Then
  104. nodeenum = New TObjectNodeEnumerator
  105. nodeenum._node=_FirstNode()
  106. nodeenum._map = Self
  107. Else
  108. nodeenum = New TObjectEmptyEnumerator
  109. End If
  110. Return nodeenum
  111. End Method
  112. Field _root:SavlRoot Ptr
  113. ?ngcmod
  114. Field _modCount:Int
  115. ?
  116. End Type
  117. Type TObjectNode
  118. Field _root:SavlRoot Ptr
  119. Field _nodePtr:SObjectMapNode Ptr
  120. Method Key:Object()
  121. Return bmx_map_objectmap_key(_nodePtr)
  122. End Method
  123. Method Value:Object()
  124. Return bmx_map_objectmap_value(_nodePtr)
  125. End Method
  126. Method HasNext:Int()
  127. Return bmx_map_objectmap_hasnext(_nodePtr, _root)
  128. End Method
  129. Method NextNode:TObjectNode()
  130. If Not _nodePtr Then
  131. _nodePtr = bmx_map_objectmap_firstnode(_root)
  132. Else
  133. _nodePtr = bmx_map_objectmap_nextnode(_nodePtr)
  134. End If
  135. Return Self
  136. End Method
  137. End Type
  138. Type TObjectNodeEnumerator
  139. Method HasNext:Int()
  140. Local has:Int = _node.HasNext()
  141. If Not has Then
  142. _map = Null
  143. End If
  144. Return has
  145. End Method
  146. Method NextObject:Object()
  147. ?ngcmod
  148. Assert _expectedModCount = _map._modCount, "TObjectMap Concurrent Modification"
  149. ?
  150. Local node:TObjectNode=_node
  151. _node=_node.NextNode()
  152. Return node
  153. End Method
  154. '***** PRIVATE *****
  155. Field _node:TObjectNode
  156. Field _map:TObjectMap
  157. ?ngcmod
  158. Field _expectedModCount:Int
  159. ?
  160. End Type
  161. Type TObjectKeyEnumerator Extends TObjectNodeEnumerator
  162. Method NextObject:Object() Override
  163. ?ngcmod
  164. Assert _expectedModCount = _map._modCount, "TObjectMap Concurrent Modification"
  165. ?
  166. Local node:TObjectNode=_node
  167. _node=_node.NextNode()
  168. Return node.Key()
  169. End Method
  170. End Type
  171. Type TObjectValueEnumerator Extends TObjectNodeEnumerator
  172. Method NextObject:Object() Override
  173. ?ngcmod
  174. Assert _expectedModCount = _map._modCount, "TObjectMap Concurrent Modification"
  175. ?
  176. Local node:TObjectNode=_node
  177. _node=_node.NextNode()
  178. Return node.Value()
  179. End Method
  180. End Type
  181. Type TObjectMapEnumerator
  182. Method ObjectEnumerator:TObjectNodeEnumerator()
  183. Return _enumerator
  184. End Method
  185. Field _enumerator:TObjectNodeEnumerator
  186. End Type
  187. Type TObjectEmptyEnumerator Extends TObjectNodeEnumerator
  188. Method HasNext:Int() Override
  189. _map = Null
  190. Return False
  191. End Method
  192. End Type