source: EcnlProtoTool/trunk/webapp/webmrbc/Collection.cs@ 287

Last change on this file since 287 was 287, checked in by coas-nagasima, 7 years ago

ファイルヘッダーコメントを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csharp
File size: 4.6 KB
Line 
1/*
2 * TOPPERS/ECNL Prototyping tool
3 *
4 * Copyright (C) 2017 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id: Collection.cs 287 2017-05-05 14:22:23Z coas-nagasima $
36 */
37using System;
38using System.Linq;
39using System.Collections.Generic;
40using Bridge;
41using Bridge.Linq;
42using Bridge.Text.RegularExpressions;
43using System.Collections;
44
45namespace WebMrbc
46{
47 public interface IModel
48 {
49 string Identifier { get; }
50 }
51
52 public class Collection<T> : IEnumerable<T> where T : IModel
53 {
54 T[] List = new T[0];
55
56 public Collection()
57 {
58 }
59
60 public T LastModel { get { int i = List.Length; if (i == 0) return default(T); return List[i - 1]; } }
61 public int Length { get { return List.Length; } }
62
63 public EventHandler OnAdd;
64 public EventHandler OnRemove;
65 public EventHandler OnReset;
66 public EventHandler OnChange;
67
68 internal void Add(T item)
69 {
70 List.Push(item);
71
72 if (OnAdd != null)
73 OnAdd(this, EventArgs.Empty);
74 }
75
76 internal void Remove(T item)
77 {
78 var i = List.IndexOf(item);
79 if (i >= 0)
80 List.Splice(i, 1);
81
82 if (OnRemove != null)
83 OnRemove(this, EventArgs.Empty);
84 }
85
86 internal void Reset()
87 {
88 List.Splice(0, List.Length);
89
90 if (OnReset != null)
91 OnReset(this, EventArgs.Empty);
92 }
93
94 internal void Reset(IEnumerable<T> n)
95 {
96 List.Splice(0, List.Length);
97 List = (T[])List.Concat(n);
98
99 if (OnReset != null)
100 OnReset(this, EventArgs.Empty);
101 }
102
103 internal T At(int index)
104 {
105 return List[index];
106 }
107
108 internal string UniqueName(string identifier)
109 {
110 var prefix = "";
111 if ((identifier[0] >= 'a') && (identifier[0] <= 'z'))
112 prefix = identifier[0].ToString().ToUpper();
113 else if ((identifier[0] < 'A') || (identifier[0] > 'Z'))
114 prefix = "C";
115
116 var max = 0;
117 var n = new Regex("^" + identifier + "([0-9]+)$");
118 foreach (var c in List) {
119 var m = c.Identifier.Match(n);
120 if (m != null)
121 max = System.Math.Max(max, Script.ParseInt(m[0]));
122 break;
123 }
124 if (max == 0)
125 return prefix + identifier;
126 else
127 return prefix + identifier + max;
128 }
129
130 internal T FindWhere(object p)
131 {
132 foreach (var c in List) {
133 if (Script.Write<bool>("(function(c) { for (var i in p) if (p[i] !== c[i]) return false; return true; })(c)"))
134 return c;
135 }
136 return default(T);
137 }
138
139 public IEnumerator<T> GetEnumerator()
140 {
141 return (dynamic)List.GetEnumerator();
142 }
143
144 IEnumerator IEnumerable.GetEnumerator()
145 {
146 return List.GetEnumerator();
147 }
148 }
149}
Note: See TracBrowser for help on using the repository browser.