2005-09-22 Marek Sieradzki <marek.sieradzki@gmail.com>
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / TargetCollection.cs
1 //
2 // TargetCollection.cs: Collection of targets.
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 //
7 // (C) 2005 Marek Sieradzki
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 #if NET_2_0
29
30 using System;
31 using System.Collections;
32 using System.Reflection;
33
34 namespace Microsoft.Build.BuildEngine {
35         public class TargetCollection : ITargetCollection, ICollection, IEnumerable {
36                 
37                 IDictionary     targetsByName;
38                 Project         parentProject;
39         
40                 internal TargetCollection (Project project)
41                 {
42                         this.targetsByName = new Hashtable ();
43                         this.parentProject = project;
44                 }
45         
46                 public Target AddNewTarget (string targetName)
47                 {
48                         Target t;
49                         
50                         t = new Target (parentProject, targetName);
51                         targetsByName.Add (targetName, t);
52                         
53                         return t;
54                 }
55
56                 public void CopyTo (Array array, int index)
57                 {
58                         targetsByName.Values.CopyTo (array, index);
59                 }
60
61                 public void CopyToStronglyTypedArray (Target[] array,
62                                                       int index)
63                 {
64                         if (array == null)
65                                 throw new ArgumentNullException ("array");
66                         if (index < 0)
67                                 throw new ArgumentOutOfRangeException ("index");
68                         if (array.Rank > 1)
69                                 throw new ArgumentException ("array is multidimensional");
70                         if ((array.Length > 0) && (index >= array.Length))
71                                 throw new ArgumentException ("index is equal or greater than array.Length");
72                         if (index + targetsByName.Count > array.Length)
73                                 throw new ArgumentException ("Not enough room from index to end of array for this BuildPropertyGroupCollection");
74                 
75                         IEnumerator it = GetEnumerator ();
76                         int i = index;
77                         while (it.MoveNext ()) {
78                                 array.SetValue((Target) it.Current, i++);
79                         }
80                 }
81
82                 public bool Exists (string targetName)
83                 {
84                         return targetsByName.Contains (targetName);
85                 }
86
87                 public IEnumerator GetEnumerator ()
88                 {
89                         foreach (DictionaryEntry de in targetsByName) {
90                                 yield return (Target)de.Key;
91                         }
92                 }
93
94                 public void RemoveTarget (Target targetToRemove)
95                 {
96                         targetsByName.Remove (targetToRemove.Name);
97                 }
98
99                 public int Count {
100                         get {
101                                 return targetsByName.Count;
102                         }
103                 }
104
105                 public bool IsSynchronized {
106                         get {
107                                 return false;
108                         }
109                 }
110
111                 public object SyncRoot {
112                         get {
113                                 return this;
114                         }
115                 }
116
117                 public Target this[string index] {
118                         get {
119                                 return (Target) targetsByName [index];
120                         }
121                 }
122         }
123 }
124
125 #endif