1 /** 2 * Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS-IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 exports.createAttributePool = function () { 18 var p = {}; 19 p.numToAttrib = {}; // e.g. {0: ['foo','bar']} 20 p.attribToNum = {}; // e.g. {'foo,bar': 0} 21 p.nextNum = 0; 22 23 p.putAttrib = function (attrib, dontAddIfAbsent) { 24 var str = String(attrib); 25 if (str in p.attribToNum) { 26 return p.attribToNum[str]; 27 } 28 if (dontAddIfAbsent) { 29 return -1; 30 } 31 var num = p.nextNum++; 32 p.attribToNum[str] = num; 33 p.numToAttrib[num] = [String(attrib[0] || ''), String(attrib[1] || '')]; 34 return num; 35 }; 36 37 p.getAttrib = function (num) { 38 var pair = p.numToAttrib[num]; 39 if (!pair) { 40 return pair; 41 } 42 return [pair[0], pair[1]]; // return a mutable copy 43 }; 44 45 p.getAttribKey = function (num) { 46 var pair = p.numToAttrib[num]; 47 if (!pair) return ''; 48 return pair[0]; 49 }; 50 51 p.getAttribValue = function (num) { 52 var pair = p.numToAttrib[num]; 53 if (!pair) return ''; 54 return pair[1]; 55 }; 56 57 p.eachAttrib = function (func) { 58 for (var n in p.numToAttrib) { 59 var pair = p.numToAttrib[n]; 60 func(pair[0], pair[1]); 61 } 62 }; 63 64 p.toJsonable = function () { 65 return { 66 numToAttrib: p.numToAttrib, 67 nextNum: p.nextNum 68 }; 69 }; 70 71 p.fromJsonable = function (obj) { 72 p.numToAttrib = obj.numToAttrib; 73 p.nextNum = obj.nextNum; 74 p.attribToNum = {}; 75 for (var n in p.numToAttrib) { 76 p.attribToNum[String(p.numToAttrib[n])] = Number(n); 77 } 78 return p; 79 }; 80 81 return p; 82 } 83