OSDN Git Service

ELCHNOS-OSECPU:式の内部表現への変換は完了した。
[chnosproject/AI004.git] / aiext.js
1 //
2 // クラス拡張
3 //
4
5 //継承機能
6 Function.prototype.extend = function(baseConstructor, newPrototype){
7         // http://sourceforge.jp/projects/h58pcdgame/scm/git/GameScriptCoreLibrary/blobs/master/www/corelib/jsbase.js
8         //最初にベースクラスのプロトタイプを引き継ぐ。
9         var F = function(){};
10         F.prototype = baseConstructor.prototype;
11         this.prototype = new F();
12         //新たなプロトタイプを追加・上書きする。
13         if(newPrototype){
14                 for(var prop in newPrototype){
15                         this.prototype[prop] = newPrototype[prop];
16                 }
17         }
18         //コンストラクタを設定
19         this.prototype.constructor = this;
20         //ベースクラスのコンストラクタを設定
21         this.base = baseConstructor;
22         return this;
23 };
24
25 //配列関連
26 Array.prototype.removeAllObject = function(anObject){
27         //Array中にある全てのanObjectを削除し、空いた部分は前につめる。
28         //戻り値は削除が一回でも実行されたかどうか
29         var ret = false;
30         for(var i = 0; i < this.length; i++){
31                 if(this[i] == anObject){
32                         this.splice(i, 1);
33                         ret = true;
34                         i--;
35                 }
36         }
37         return ret;
38 }
39 Array.prototype.removeAnObject = function(anObject){
40         //Array中にある最初のanObjectを削除し、空いた部分は前につめる。
41         //戻り値は削除が実行されたかどうか
42         for(var i = 0; i < this.length; i++){
43                 if(this[i] == anObject){
44                         this.splice(i, 1);
45                         return true;
46                 }
47         }
48         return false;
49 }
50 Array.prototype.removeByIndex = function(index){
51         //Array[index]を削除し、空いた部分は前につめる。
52         this.splice(index, 1);
53         return;
54 }
55 Array.prototype.intersectionWith = function(a, b, fEqualTo){
56         //積集合を求める
57         //fEqualToは省略可能で、評価関数fEqualTo(a[i], b[j])を設定する。
58         var r = new Array();
59         for(var i = 0, len = b.length; i < len; i++){
60                 if(this.isIncluded(b[i], fEqualTo)){
61                         r.push(b[i]);
62                 }
63         }
64         return r;
65 }
66 Array.prototype.unionWith = function(a, b, fEqualTo){
67         //和集合を求める
68         //fEqualToは省略可能で、評価関数fEqualTo(a[i], b[j])を設定する。
69         var r = new Array();
70         for(var i = 0, len = b.length; i < len; i++){
71                 if(!this.isIncluded(b[i], fEqualTo)){
72                         r.push(b[i]);
73                 }
74         }
75         return this.concat(r);
76 }
77 Array.prototype.isIncluded = function(obj, fEqualTo){
78         //含まれている場合は配列内のそのオブジェクトを返す
79         //fEqualToは省略可能で、評価関数fEqualTo(array[i], obj)を設定する。
80         if(fEqualTo == undefined){
81                 for(var i = 0, len = this.length; i < len; i++){
82                         if(this[i] == obj){
83                                 return this[i];
84                         }
85                 }
86         } else{
87                 for(var i = 0, len = this.length; i < len; i++){
88                         if(fEqualTo(this[i], obj)){
89                                 return this[i];
90                         }
91                 }
92         }
93         return false;
94 }
95 Array.prototype.pushUnique = function(obj, fEqualTo){
96         //値が既に存在する場合は追加しない。評価関数fEqualTo(array[i], obj)を設定することができる。
97         //結果的に配列内にあるオブジェクトが返される。
98         var o = this.isIncluded(obj, fEqualTo);
99         if(!o){
100                 this.push(obj);
101                 return obj;
102         }
103         return o;
104 }
105 Array.prototype.stableSort = function(f){
106         // http://blog.livedoor.jp/netomemo/archives/24688861.html
107         // Chrome等ではソートが必ずしも安定ではないので、この関数を利用する。
108         if(f == undefined){
109                 f = function(a,b){ return a - b; };
110         }
111         for(var i = 0; i < this.length; i++){
112                 this[i].__id__ = i;
113         }
114         this.sort.call(this, function(a,b){
115                 var ret = f(a, b);
116                 if(ret == 0){
117                         return (a.__id__ > b.__id__) ? 1 : -1;
118                 } else{
119                         return ret;
120                 }
121         });
122         for(var i = 0;i < this.length;i++){
123                 delete this[i].__id__;
124         }
125 }
126
127 Array.prototype.splitByArray = function(separatorList){
128         //Array中の文字列をseparatorList内の文字列でそれぞれで分割し、それらの文字列が含まれた配列を返す。
129         var retArray = new Array();
130         
131         for(var i = 0, iLen = this.length; i < iLen; i++){
132                 retArray = retArray.concat(this[i].splitByArray(separatorList));
133         }
134         
135         return retArray;
136 }
137
138 //文字列関連
139 String.prototype.replaceAll = function(org, dest){
140         //String中にある文字列orgを文字列destにすべて置換する。
141         //http://www.syboos.jp/webjs/doc/string-replace-and-replaceall.html
142         return this.split(org).join(dest);
143 }
144 String.prototype.compareLeftHand = function (search){
145         //前方一致長を求める。
146         for(var i = 0; search.charAt(i) != ""; i++){
147                 if(search.charAt(i) != this.charAt(i)){
148                         break;
149                 }
150         }
151         return i;
152 }
153 String.prototype.splitByArray = function(separatorList){
154         //リスト中の文字列それぞれで分割された配列を返す。
155         //separatorはそれ以前の文字列の末尾に追加された状態で含まれる。
156         //"abcdefg".splitByArray(["a", "e", "g"]);
157         //      = ["a", "bcde", "fg"]
158         var retArray = new Array();
159         retArray[0] = this;
160         
161         for(var i = 0; i < separatorList.length; i++){
162                 var tmpArray = new Array();
163                 for(var k = 0; k < retArray.length; k++){
164                         tmpArray[k] = retArray[k].split(separatorList[i]);
165                         if(tmpArray[k][tmpArray[k].length - 1] == ""){
166                                 tmpArray[k].splice(tmpArray[k].length - 1, 1);
167                                 if(tmpArray[k] && tmpArray[k].length > 0){
168                                         for(var m = 0; m < tmpArray[k].length; m++){
169                                                 tmpArray[k][m] += separatorList[i];
170                                         }
171                                 }
172                         } else{
173                                 for(var m = 0; m < tmpArray[k].length - 1; m++){
174                                         tmpArray[k][m] += separatorList[i];
175                                 }
176                         }
177                 }
178                 retArray = new Array();
179                 retArray = retArray.concat.apply(retArray, tmpArray);
180         }
181         
182         return retArray;
183 }
184
185 String.prototype.splitByArraySeparatorSeparated = function(separatorList){
186         //リスト中の文字列それぞれで分割された配列を返す。
187         //separatorも分割された状態で含まれる。
188         //"abcdefg".splitByArraySeparatorSeparated(["a", "e", "g"]);
189         //      = ["a", "bcd", "e", "f", "g"]
190         var retArray = new Array();
191         retArray[0] = this;
192         
193         for(var i = 0; i < separatorList.length; i++){
194                 var tmpArray = new Array();
195                 for(var k = 0; k < retArray.length; k++){
196                         var tmpArraySub = retArray[k].split(separatorList[i]);
197                         tmpArray[k] = new Array();
198                         for(var m = 0, mLen = tmpArraySub.length - 1; m < mLen; m++){
199                                 if(tmpArraySub[m] != ""){
200                                         tmpArray[k].push(tmpArraySub[m]);
201                                 }
202                                 tmpArray[k].push(separatorList[i]);
203                         }
204                         if(tmpArraySub[tmpArraySub.length - 1] != ""){
205                                 tmpArray[k].push(tmpArraySub[m]);
206                         }
207                 }
208                 retArray = new Array();
209                 retArray = retArray.concat.apply(retArray, tmpArray);
210         }
211         
212         return retArray;
213 }
214
215 String.prototype.splitByArraySeparatorSeparatedLong = function(separatorList){
216         //リスト中の文字列それぞれで分割された配列を返す。
217         //separatorも分割された状態で含まれる。
218         //separatorListの前の方にあるseparatorは、後方のseparatorによって分割されない。
219         //"abcdefgcdefg".splitByArraySeparatorSeparatedLong(["bcde", "cd", "f"]);
220         //      = ["a", "bcde", "f", "g", "cd", "e", "f", "g"]
221         //"for (i = 0; i != 15; i++) {".splitByArraySeparatorSeparatedLong(["!=", "(", ")", "="]);
222         //      = ["for ", "(", "i ", "=", " 0; i ", "!=", " 15; i++", ")", " {"]
223         var retArray = new Array();
224         var checkArray = new Array();
225         retArray[0] = this;
226         checkArray[0] = false;
227         
228         for(var i = 0; i < separatorList.length; i++){
229                 var tmpArray = new Array();
230                 var tmpCheckArray = new Array();
231                 for(var k = 0; k < retArray.length; k++){
232                         if(!checkArray[k]){
233                                 var tmpArraySub = retArray[k].split(separatorList[i]);
234                                 tmpArray[k] = new Array();
235                                 tmpCheckArray[k] = new Array();
236                                 for(var m = 0, mLen = tmpArraySub.length - 1; m < mLen; m++){
237                                         if(tmpArraySub[m] != ""){
238                                                 tmpArray[k].push(tmpArraySub[m]);
239                                                 tmpCheckArray[k].push(false);
240                                         }
241                                         tmpArray[k].push(separatorList[i]);
242                                         tmpCheckArray[k].push(true);
243                                 }
244                                 if(tmpArraySub[tmpArraySub.length - 1] != ""){
245                                         tmpArray[k].push(tmpArraySub[m]);
246                                         tmpCheckArray[k].push(false);
247                                 }
248                         } else{
249                                 tmpArray.push([retArray[k]]);
250                                 tmpCheckArray.push([true]);
251                         }
252                 }
253                 retArray = new Array();
254                 checkArray = new Array();
255                 retArray = retArray.concat.apply(retArray, tmpArray);
256                 checkArray = checkArray.concat.apply(checkArray, tmpCheckArray);
257         }
258         
259         return retArray;
260 }
261
262 String.prototype.trim = function(str){
263         return this.replace(/^[       ]+|[          ]+$/g, "").replace(/\n$/g, "");
264 }
265 //http://d.hatena.ne.jp/favril/20090514/1242280476
266 String.prototype.isKanjiAt = function(index){
267         var u = this.charCodeAt(index);
268         if( (0x4e00  <= u && u <= 0x9fcf) ||    // CJK統合漢字
269                 (0x3400  <= u && u <= 0x4dbf) ||        // CJK統合漢字拡張A
270                 (0x20000 <= u && u <= 0x2a6df) ||       // CJK統合漢字拡張B
271                 (0xf900  <= u && u <= 0xfadf) ||        // CJK互換漢字
272                 (0x2f800 <= u && u <= 0x2fa1f)){        // CJK互換漢字補助
273                 return true;
274         }
275     return false;
276 }
277 String.prototype.isHiraganaAt = function(index){
278         var u = this.charCodeAt(index);
279         if(0x3040 <= u && u <= 0x309f){
280                 return true;
281         }
282         return false;
283 }
284 String.prototype.isKatakanaAt = function(index){
285         var u = this.charCodeAt(index);
286         if(0x30a0 <= u && u <= 0x30ff){
287                 return true;
288         }
289         return false;
290 }
291 String.prototype.isHankakuKanaAt = function(index){
292         var u = this.charCodeAt(index);
293         if(0xff61 <= u && u <= 0xff9f){
294                 return true;
295         }
296         return false;
297 }