OSDN Git Service

Version 0.5.151, fix X.Timer.remove & X.OAuth2 is working.
[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_noChashe        = false,\r
13         \r
14         X_Pair_functionString  = new Function( 's', 'p', 'k', (function(){\r
15                 var ret = 'var i=0,l=s.length,a;' +\r
16                                   'for(;i<l;++i){' +\r
17                                   'a=s[i];' +\r
18                                   'switch(k){',\r
19                         j = 0, hex;\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
23                 };\r
24                 return ret + '}}';\r
25         })()),\r
26         \r
27         // TODO キャッシュするペアの数とヒット率、探索時間の記録\r
28         X_Pair_lastKey, X_Pair_lastPair;\r
29 \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
33         \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
36         \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
40         };\r
41         \r
42         keyStore[  keyStore.length  ] = key;\r
43         pairStore[ pairStore.length ] = pair;\r
44 };\r
45 \r
46 function X_Pair_get( key ){\r
47         var chashe = !X_Pair_noChashe, pair;\r
48         \r
49         X_Pair_noChashe = false;\r
50         if( key === X_Pair_lastKey ) return X_Pair_lastPair; // quick\r
51         \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
55         };\r
56         return pair;\r
57 };\r
58 \r
59 function X_Pair_release( key, opt_pair ){\r
60         var i = 0,\r
61                 l = X_Pair_KEY_STORE_LIST.length,\r
62                 keyStore, pairStore, j;\r
63         \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
73                         };\r
74                         break;\r
75                 };\r
76         };\r
77 };\r