Home Reference Source Repository

js/SceneKit/SCNOrderedDictionary.js

  1. 'use strict'
  2.  
  3. /**
  4. *
  5. * @access public
  6. * @extends {NSDictionary}
  7. */
  8. export default class SCNOrderedDictionary {
  9. /**
  10. * @access public
  11. * @param {NSCoder} coder -
  12. * @returns {Object} -
  13. */
  14. static initWithCoder(coder) {
  15. const dict = new SCNOrderedDictionary()
  16. if(typeof coder._refObj['NS.objects'] !== 'undefined'){
  17. const keys = coder._refObj['NS.keys']
  18. const objects = coder._refObj['NS.objects']
  19. if(!Array.isArray(keys)){
  20. throw new Error('NS.keys must be Array')
  21. }
  22. if(!Array.isArray(objects)){
  23. throw new Error('NS.objects must be Array')
  24. }
  25. if(keys.length !== objects.length){
  26. throw new Error('NS.keys.length !== NS.objects.length')
  27. }
  28.  
  29. const keyCoder = coder.copy()
  30. keyCoder._refObj = keys
  31.  
  32. const objCoder = coder.copy()
  33. objCoder._refObj = objects
  34.  
  35. for(let i=0; i<keys.length; i++){
  36. const key = keyCoder.decodeObjectForKey(i)
  37. const obj = objCoder.decodeObjectForKey(i)
  38. dict._keys.push(key)
  39. dict._values.push(obj)
  40. }
  41. }else{
  42. for(let i=0; ; i++){
  43. const objKey = `NS.object.${i}`
  44. const keyKey = `NS.key.${i}`
  45. if(typeof coder._refObj[objKey] === 'undefined'){
  46. break
  47. }
  48. const key = coder.decodeObjectForKey(keyKey)
  49. const obj = coder.decodeObjectForKey(objKey)
  50. dict._keys.push(key)
  51. dict._values.push(obj)
  52. }
  53. }
  54.  
  55. return dict
  56. }
  57.  
  58. constructor() {
  59. this._keys = []
  60. this._values = []
  61. }
  62.  
  63. copy() {
  64. const dict = new SCNOrderedDictionary()
  65. dict._keys = this._keys.slice(0)
  66. dict._values = this._values.slice(0)
  67. return dict
  68. }
  69.  
  70. keys() {
  71. return this._keys.slice(0)
  72. }
  73.  
  74. dictionary() {
  75. const dict = {}
  76. const len = this._keys.length
  77. for(let i=0; i<len; i++){
  78. dict[this._keys[i]] = this._values[i]
  79. }
  80. return dict
  81. }
  82.  
  83. allValues() {
  84. return this._values.slice(0)
  85. }
  86.  
  87. allKeys() {
  88. return this.keys()
  89. }
  90.  
  91. count() {
  92. return this._keys.length
  93. }
  94.  
  95. removeAllObjects() {
  96. this._keys = []
  97. this._values = []
  98. }
  99.  
  100. removeObjectForKey(key) {
  101. const index = this._keys.indexOf(key)
  102. if(index < 0){
  103. return
  104. }
  105. this._keys.splice(index, 1)
  106. this._values.splice(index, 1)
  107. }
  108.  
  109. objectForKey(key) {
  110. const index = this._keys.indexOf(key)
  111. if(index < 0){
  112. return null
  113. }
  114. return this._values[index]
  115. }
  116.  
  117. setObjectForKey(object, key) {
  118. let index = this._keys.indexOf(key)
  119. if(index < 0){
  120. index = this._keys.length
  121. this._keys[index] = key
  122. }
  123. this._values[index] = object
  124. }
  125.  
  126. valueForKey(key) {
  127. return this.objectForKey(key)
  128. }
  129.  
  130. setValueForKey(value, key) {
  131. this.setObjectForKey(value, key)
  132. }
  133.  
  134. // extension for JavaScript
  135.  
  136. set(key, object) {
  137. this.setObjectForKey(object, key)
  138. }
  139.  
  140. get(key) {
  141. return this.objectForKey(key)
  142. }
  143.  
  144. clear() {
  145. this.removeAllObjects()
  146. }
  147.  
  148. delete(key) {
  149. this.removeObjectForKey(key)
  150. }
  151.  
  152. forEach(func) {
  153. const len = this._keys.length
  154. for(let i=0; i<len; i++){
  155. func(this._values[i], this._keys[i])
  156. }
  157. }
  158. }