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_noChashe = false,
\r
14 X_Pair_functionString = new Function( 's', 'p', 'k', (function(){
\r
15 var ret = 'var i=0,l=s.length,a;' +
\r
20 for( ; j < X_Pair_SIZE; ++j ){
\r
21 hex = j.toString( 16 );
\r
22 ret += 'case a[0x' + hex + ']:return p[i][0x' + hex + '];';
\r
27 // TODO キャッシュするペアの数とヒット率、探索時間の記録
\r
28 X_Pair_lastKey, X_Pair_lastPair;
\r
30 function X_Pair_create( key, pair ){
\r
31 var keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length - 1 ],
\r
32 pairStore = X_Pair_PAIR_STORE_LIST[ X_Pair_PAIR_STORE_LIST.length - 1 ];
\r
34 X_Pair_noChashe = true;
\r
35 if( X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return;
\r
37 if( keyStore.length === X_Pair_SIZE ){
\r
38 keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length ] = [];
\r
39 pairStore = X_Pair_PAIR_STORE_LIST[ X_Pair_PAIR_STORE_LIST.length ] = [];
\r
42 keyStore[ keyStore.length ] = key;
\r
43 pairStore[ pairStore.length ] = pair;
\r
46 function X_Pair_get( key ){
\r
47 var chashe = !X_Pair_noChashe, pair;
\r
49 X_Pair_noChashe = false;
\r
50 if( key === X_Pair_lastKey ) return X_Pair_lastPair; // quick
\r
52 if( ( pair = X_Pair_functionString( X_Pair_KEY_STORE_LIST, X_Pair_PAIR_STORE_LIST, key ) ) && chashe ){
\r
53 X_Pair_lastKey = key;
\r
54 X_Pair_lastPair = pair;
\r
59 function X_Pair_release( key, opt_pair ){
\r
61 l = X_Pair_KEY_STORE_LIST.length,
\r
62 keyStore, pairStore, j;
\r
64 for( ; i < l; ++i ){
\r
65 keyStore = X_Pair_KEY_STORE_LIST[ i ];
\r
66 pairStore = X_Pair_PAIR_STORE_LIST[ i ];
\r
67 j = keyStore.indexOf( key );
\r
68 if( j !== -1 && ( opt_pair === undefined || pairStore[ j ] === opt_pair ) ){
\r
69 keyStore.splice( j, 1 );
\r
70 pairStore.splice( j, 1 );
\r
71 if( X_Pair_lastKey === key ){
\r
72 X_Pair_lastKey = X_Pair_lastPair = null;
\r