2 'create' : X_Pair_create,
\r
6 'release' : X_Pair_release
\r
9 var X_Pair_SIZE = 1000,
\r
10 X_Pair_KEY_STORE_LIST = [[]],
\r
11 X_Pair_PAIR_STORE_LIST = [[]],
\r
12 X_Pair_functionString = new Function( 's', 'p', 'k', (function(){
\r
13 var ret = 'var i=0,l=s.length,a;' +
\r
18 for( ; j < X_Pair_SIZE; ++j ){
\r
19 hex = j.toString( 16 );
\r
20 ret += 'case a[0x' + hex + ']:return p[i][0x' + hex + '];';
\r
24 X_Pair_noChashe = false,
\r
26 // TODO キャッシュするペアの数とヒット率、探索時間の記録
\r
27 X_Pair_lastKey, X_Pair_lastPair;
\r
29 function X_Pair_create( key, pair ){
\r
30 var keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length - 1 ],
\r
31 pairStore = X_Pair_PAIR_STORE_LIST[ X_Pair_PAIR_STORE_LIST.length - 1 ];
\r
33 X_Pair_noChashe = true;
\r
34 if( X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return;
\r
36 if( keyStore.length === X_Pair_SIZE ){
\r
37 keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length ] = [];
\r
38 pairStore = X_Pair_PAIR_STORE_LIST[ X_Pair_PAIR_STORE_LIST.length ] = [];
\r
41 keyStore[ keyStore.length ] = key;
\r
42 pairStore[ pairStore.length ] = pair;
\r
45 function X_Pair_get( key ){
\r
46 var chashe = !X_Pair_noChashe, pair;
\r
48 X_Pair_noChashe = false;
\r
49 if( key === X_Pair_lastKey ) return X_Pair_lastPair; // quick
\r
51 if( ( pair = X_Pair_functionString( X_Pair_KEY_STORE_LIST, X_Pair_PAIR_STORE_LIST, key ) ) && chashe ){
\r
52 X_Pair_lastKey = key;
\r
53 X_Pair_lastPair = pair;
\r
58 function X_Pair_release( key, opt_pair ){
\r
60 l = X_Pair_KEY_STORE_LIST.length,
\r
61 keyStore, pairStore, j;
\r
63 for( ; i < l; ++i ){
\r
64 keyStore = X_Pair_KEY_STORE_LIST[ i ];
\r
65 pairStore = X_Pair_PAIR_STORE_LIST[ i ];
\r
66 j = keyStore.indexOf( key );
\r
67 if( j !== -1 && ( opt_pair === undefined || pairStore[ j ] === opt_pair ) ){
\r
68 keyStore.splice( j, 1 );
\r
69 pairStore.splice( j, 1 );
\r
70 if( X_Pair_lastKey === key ){
\r
71 X_Pair_lastKey = X_Pair_lastPair = null;
\r