OSDN Git Service

60fb3dcff48cfb0b904bb9751c2a89d4d08b60a8
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 09_XPair.js
1 X[ 'Pair' ] = {\r
2         'create'  : X_Pair_create,\r
3         \r
4         'get'     : X_Pair_get,\r
5         \r
6         'release' : X_Pair_release\r
7 };\r
8 \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
14                                   'for(;i<l;++i){' +\r
15                                   'a=s[i];' +\r
16                                   'switch(k){',\r
17                         j = 0, hex;\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
21                 };\r
22                 return ret + '}}';\r
23         })()),\r
24         X_Pair_noChashe = false,\r
25         \r
26         // TODO キャッシュするペアの数とヒット率、探索時間の記録\r
27         X_Pair_lastKey, X_Pair_lastPair;\r
28 \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
32         \r
33         X_Pair_noChashe = true;\r
34         if( X_Pair_get( key ) ) return;\r
35         \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
39         };\r
40         \r
41         keyStore[  keyStore.length  ] = key;\r
42         pairStore[ pairStore.length ] = pair;\r
43 };\r
44 \r
45 function X_Pair_get( key ){\r
46         var chashe = !X_Pair_noChashe, pair;\r
47         \r
48         X_Pair_noChashe = false;\r
49         if( key === X_Pair_lastKey ) return X_Pair_lastPair; // quick\r
50         \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
54         };\r
55         return pair;\r
56 };\r
57 \r
58 function X_Pair_release( key, opt_pair ){\r
59         var i = 0,\r
60                 l = X_Pair_KEY_STORE_LIST.length,\r
61                 keyStore, pairStore, j;\r
62         \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
72                         };\r
73                         break;\r
74                 };\r
75         };\r
76 };\r