js/SceneKit/SCNOrderedDictionary.js
'use strict'
/**
*
* @access public
* @extends {NSDictionary}
*/
export default class SCNOrderedDictionary {
/**
* @access public
* @param {NSCoder} coder -
* @returns {Object} -
*/
static initWithCoder(coder) {
const dict = new SCNOrderedDictionary()
if(typeof coder._refObj['NS.objects'] !== 'undefined'){
const keys = coder._refObj['NS.keys']
const objects = coder._refObj['NS.objects']
if(!Array.isArray(keys)){
throw new Error('NS.keys must be Array')
}
if(!Array.isArray(objects)){
throw new Error('NS.objects must be Array')
}
if(keys.length !== objects.length){
throw new Error('NS.keys.length !== NS.objects.length')
}
const keyCoder = coder.copy()
keyCoder._refObj = keys
const objCoder = coder.copy()
objCoder._refObj = objects
for(let i=0; i<keys.length; i++){
const key = keyCoder.decodeObjectForKey(i)
const obj = objCoder.decodeObjectForKey(i)
dict._keys.push(key)
dict._values.push(obj)
}
}else{
for(let i=0; ; i++){
const objKey = `NS.object.${i}`
const keyKey = `NS.key.${i}`
if(typeof coder._refObj[objKey] === 'undefined'){
break
}
const key = coder.decodeObjectForKey(keyKey)
const obj = coder.decodeObjectForKey(objKey)
dict._keys.push(key)
dict._values.push(obj)
}
}
return dict
}
constructor() {
this._keys = []
this._values = []
}
copy() {
const dict = new SCNOrderedDictionary()
dict._keys = this._keys.slice(0)
dict._values = this._values.slice(0)
return dict
}
keys() {
return this._keys.slice(0)
}
dictionary() {
const dict = {}
const len = this._keys.length
for(let i=0; i<len; i++){
dict[this._keys[i]] = this._values[i]
}
return dict
}
allValues() {
return this._values.slice(0)
}
allKeys() {
return this.keys()
}
count() {
return this._keys.length
}
removeAllObjects() {
this._keys = []
this._values = []
}
removeObjectForKey(key) {
const index = this._keys.indexOf(key)
if(index < 0){
return
}
this._keys.splice(index, 1)
this._values.splice(index, 1)
}
objectForKey(key) {
const index = this._keys.indexOf(key)
if(index < 0){
return null
}
return this._values[index]
}
setObjectForKey(object, key) {
let index = this._keys.indexOf(key)
if(index < 0){
index = this._keys.length
this._keys[index] = key
}
this._values[index] = object
}
valueForKey(key) {
return this.objectForKey(key)
}
setValueForKey(value, key) {
this.setObjectForKey(value, key)
}
// extension for JavaScript
set(key, object) {
this.setObjectForKey(object, key)
}
get(key) {
return this.objectForKey(key)
}
clear() {
this.removeAllObjects()
}
delete(key) {
this.removeObjectForKey(key)
}
forEach(func) {
const len = this._keys.length
for(let i=0; i<len; i++){
func(this._values[i], this._keys[i])
}
}
}