stringmap.bmx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. SuperStrict
  2. Import "common.bmx"
  3. Extern
  4. Function bmx_map_stringmap_clear(root:SavlRoot Ptr Ptr)
  5. Function bmx_map_stringmap_isempty:Int(root:SavlRoot Ptr)
  6. Function bmx_map_stringmap_insert(key:String, value:Object, root:SavlRoot Ptr Ptr)
  7. Function bmx_map_stringmap_contains:Int(key:String, root:SavlRoot Ptr)
  8. Function bmx_map_stringmap_valueforkey:Object(key:String, root:SavlRoot Ptr)
  9. Function bmx_map_stringmap_remove:Int(key:String, root:SavlRoot Ptr Ptr)
  10. Function bmx_map_stringmap_firstnode:SStringMapNode Ptr(root:SavlRoot Ptr)
  11. Function bmx_map_stringmap_nextnode:SStringMapNode Ptr(node:Byte Ptr)
  12. Function bmx_map_stringmap_key:String(node:SStringMapNode Ptr)
  13. Function bmx_map_stringmap_value:Object(node:SStringMapNode Ptr)
  14. Function bmx_map_stringmap_hasnext:Int(node:SStringMapNode Ptr, root:SavlRoot Ptr)
  15. Function bmx_map_stringmap_copy(dst:SavlRoot Ptr Ptr, _root:SavlRoot Ptr)
  16. End Extern
  17. Struct SStringMapNode
  18. Field link:SavlRoot
  19. Field key:String
  20. Field value:Object
  21. End Struct
  22. Rem
  23. bbdoc: A key/value (String/Object) map.
  24. End Rem
  25. Type TStringMap
  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. bmx_map_stringmap_clear(Varptr _root)
  35. End Method
  36. Rem
  37. bbdoc: Checks if the map is empty.
  38. about: #True if @map is empty, otherwise #False.
  39. End Rem
  40. Method IsEmpty:Int()
  41. Return bmx_map_stringmap_isempty(_root)
  42. End Method
  43. Rem
  44. bbdoc: Inserts a key/value pair into the map.
  45. about: If the map already contains @key, its value is overwritten with @value.
  46. End Rem
  47. Method Insert( key:String,value:Object )
  48. key.Hash()
  49. bmx_map_stringmap_insert(key, value, Varptr _root)
  50. End Method
  51. Rem
  52. bbdoc: Checks if the map contains @key.
  53. returns: #True if the map contains @key.
  54. End Rem
  55. Method Contains:Int( key:String )
  56. key.Hash()
  57. Return bmx_map_stringmap_contains(key, _root)
  58. End Method
  59. Rem
  60. bbdoc: Finds a value given a @key.
  61. returns: The value associated with @key.
  62. about: If the map does not contain @key, a #Null object is returned.
  63. End Rem
  64. Method ValueForKey:Object( key:String )
  65. key.Hash()
  66. Return bmx_map_stringmap_valueforkey(key, _root)
  67. End Method
  68. Rem
  69. bbdoc: Remove a key/value pair from the map.
  70. returns: #True if @key was removed, or #False otherwise.
  71. End Rem
  72. Method Remove:Int( key:String )
  73. key.Hash()
  74. Return bmx_map_stringmap_remove(key, Varptr _root)
  75. End Method
  76. Method _FirstNode:TStringNode()
  77. If Not IsEmpty() Then
  78. Local node:TStringNode= New TStringNode
  79. node._root = _root
  80. Return node
  81. Else
  82. Return Null
  83. End If
  84. End Method
  85. Rem
  86. bbdoc: Gets the map keys.
  87. returns: An enumeration object
  88. about: The object returned by #Keys can be used with #EachIn to iterate through the keys in the map.
  89. End Rem
  90. Method Keys:TStringMapEnumerator()
  91. Local nodeenum:TStringNodeEnumerator
  92. If Not isEmpty() Then
  93. nodeenum=New TStringKeyEnumerator
  94. nodeenum._node=_FirstNode()
  95. Else
  96. nodeenum=New TStringEmptyEnumerator
  97. End If
  98. Local mapenum:TStringMapEnumerator=New TStringMapEnumerator
  99. mapenum._enumerator=nodeenum
  100. nodeenum._map = Self
  101. Return mapenum
  102. End Method
  103. Rem
  104. bbdoc: Get the map values.
  105. returns: An enumeration object.
  106. about: The object returned by #Values can be used with #EachIn to iterate through the values in the map.
  107. End Rem
  108. Method Values:TStringMapEnumerator()
  109. Local nodeenum:TStringNodeEnumerator
  110. If Not isEmpty() Then
  111. nodeenum=New TStringValueEnumerator
  112. nodeenum._node=_FirstNode()
  113. Else
  114. nodeenum=New TStringEmptyEnumerator
  115. End If
  116. Local mapenum:TStringMapEnumerator=New TStringMapEnumerator
  117. mapenum._enumerator=nodeenum
  118. nodeenum._map = Self
  119. Return mapenum
  120. End Method
  121. Rem
  122. bbdoc: Returns a copy the contents of this map.
  123. End Rem
  124. Method Copy:TStringMap()
  125. Local map:TStringMap=New TStringMap
  126. bmx_map_stringmap_copy(Varptr map._root, _root)
  127. Return map
  128. End Method
  129. Rem
  130. bbdoc: Returns a node enumeration object.
  131. about: The object returned by #ObjectEnumerator can be used with #EachIn to iterate through the nodes in the map.
  132. End Rem
  133. Method ObjectEnumerator:TStringNodeEnumerator()
  134. Local nodeenum:TStringNodeEnumerator
  135. If Not isEmpty() Then
  136. nodeenum = New TStringNodeEnumerator
  137. nodeenum._node=_FirstNode()
  138. nodeenum._map = Self
  139. Else
  140. nodeenum = New TStringEmptyEnumerator
  141. End If
  142. Return nodeenum
  143. End Method
  144. Rem
  145. bbdoc: Finds a value given a @key using index syntax.
  146. returns: The value associated with @key.
  147. about: If the map does not contain @key, a #Null object is returned.
  148. End Rem
  149. Method Operator[]:Object(key:String)
  150. key.Hash()
  151. Return bmx_map_stringmap_valueforkey(key, _root)
  152. End Method
  153. Rem
  154. bbdoc: Inserts a key/value pair into the map using index syntax.
  155. about: If the map already contains @key, its value is overwritten with @value.
  156. End Rem
  157. Method Operator[]=(key:String, value:Object)
  158. key.Hash()
  159. bmx_map_stringmap_insert(key, value, Varptr _root)
  160. End Method
  161. Field _root:SavlRoot Ptr
  162. End Type
  163. Type TStringNode
  164. Field _root:SavlRoot Ptr
  165. Field _nodePtr:SStringMapNode Ptr
  166. Method Key:String()
  167. Return bmx_map_stringmap_key(_nodePtr)
  168. End Method
  169. Method Value:Object()
  170. Return bmx_map_stringmap_value(_nodePtr)
  171. End Method
  172. Method HasNext:Int()
  173. Return bmx_map_stringmap_hasnext(_nodePtr, _root)
  174. End Method
  175. Method NextNode:TStringNode()
  176. If Not _nodePtr Then
  177. _nodePtr = bmx_map_stringmap_firstnode(_root)
  178. Else
  179. _nodePtr = bmx_map_stringmap_nextnode(_nodePtr)
  180. End If
  181. Return Self
  182. End Method
  183. End Type
  184. Type TStringNodeEnumerator
  185. Method HasNext:Int()
  186. Local has:Int = _node.HasNext()
  187. If Not has Then
  188. _map = Null
  189. End If
  190. Return has
  191. End Method
  192. Method NextObject:Object()
  193. Local node:TStringNode=_node
  194. _node=_node.NextNode()
  195. Return node
  196. End Method
  197. '***** PRIVATE *****
  198. Field _node:TStringNode
  199. Field _map:TStringMap
  200. End Type
  201. Type TStringKeyEnumerator Extends TStringNodeEnumerator
  202. Method NextObject:Object() Override
  203. Local node:TStringNode=_node
  204. _node=_node.NextNode()
  205. Return node.Key()
  206. End Method
  207. End Type
  208. Type TStringValueEnumerator Extends TStringNodeEnumerator
  209. Method NextObject:Object() Override
  210. Local node:TStringNode=_node
  211. _node=_node.NextNode()
  212. Return node.Value()
  213. End Method
  214. End Type
  215. Type TStringMapEnumerator
  216. Method ObjectEnumerator:TStringNodeEnumerator()
  217. Return _enumerator
  218. End Method
  219. Field _enumerator:TStringNodeEnumerator
  220. End Type
  221. Type TStringEmptyEnumerator Extends TStringNodeEnumerator
  222. Method HasNext:Int() Override
  223. _map = Null
  224. Return False
  225. End Method
  226. End Type