KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > vladium > jcd > cls > MethodCollection


1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2  *
3  * This program and the accompanying materials are made available under
4  * the terms of the Common Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
6  *
7  * $Id: MethodCollection.java,v 1.1.1.1 2004/05/09 16:57:47 vlad_r Exp $
8  */

9 package com.vladium.jcd.cls;
10
11 import java.io.IOException JavaDoc;
12 import java.util.ArrayList JavaDoc;
13 import java.util.List JavaDoc;
14
15 import com.vladium.jcd.lib.UDataOutputStream;
16 import com.vladium.util.IntVector;
17
18 // ----------------------------------------------------------------------------
19
/**
20  * @author (C) 2001, Vlad Roubtsov
21  */

22 final class MethodCollection implements IMethodCollection
23 {
24     // public: ................................................................
25

26     // ACCESSORS:
27

28     public Method_info get (final int offset)
29     {
30         return (Method_info) m_methods.get (offset);
31     }
32     
33     public int [] get (final ClassDef cls, final String JavaDoc name)
34     {
35         if (cls == null) throw new IllegalArgumentException JavaDoc ("null input: cls");
36         
37         // TODO: hash impl [not possible without having access to the parent ClassDef]
38

39         final int count = m_methods.size (); // use size() if class becomes non-final
40
final IntVector result = new IntVector (count);
41
42         for (int m = 0; m < count; ++ m)
43         {
44             final Method_info method = (Method_info) m_methods.get (m);
45             
46             if (method.getName (cls).equals (name))
47                 result.add (m);
48         }
49         
50         return result.values (); // IntVector optimizes for the empty case
51
}
52     
53     public int size ()
54     {
55         return m_methods.size ();
56     }
57     
58     // Cloneable:
59

60     /**
61      * Performs a deep copy.
62      */

63     public Object JavaDoc clone ()
64     {
65         try
66         {
67             final MethodCollection _clone = (MethodCollection) super.clone ();
68             
69             // deep clone:
70
final int methods_count = m_methods.size (); // use size() if class becomes non-final
71
_clone.m_methods = new ArrayList JavaDoc (methods_count);
72             for (int m = 0; m < methods_count; ++ m)
73             {
74                 _clone.m_methods.add (((Method_info) m_methods.get (m)).clone ());
75             }
76             
77             return _clone;
78         }
79         catch (CloneNotSupportedException JavaDoc e)
80         {
81             throw new InternalError JavaDoc (e.toString ());
82         }
83     }
84     
85     // IClassFormatOutput:
86

87     public void writeInClassFormat (final UDataOutputStream out) throws IOException JavaDoc
88     {
89         final int methods_count = m_methods.size (); // use size() if class becomes non-final
90
out.writeU2 (methods_count);
91         
92         for (int i = 0; i < methods_count; i++)
93         {
94             get (i).writeInClassFormat (out);
95         }
96     }
97     
98     // Visitor:
99

100     public void accept (final IClassDefVisitor visitor, final Object JavaDoc ctx)
101     {
102         visitor.visit (this, ctx);
103     }
104     
105
106     // MUTATORS:
107

108     public int add (final Method_info method)
109     {
110         final int newoffset = m_methods.size (); // use size() if class becomes non-final
111
m_methods.add (method);
112         
113         return newoffset;
114     }
115     
116     public Method_info set (final int offset, final Method_info method)
117     {
118         return (Method_info) m_methods.set (offset, method);
119     }
120     
121     public Method_info remove (final int offset)
122     {
123         return (Method_info) m_methods.remove (offset);
124     }
125     
126     // protected: .............................................................
127

128     // package: ...............................................................
129

130
131     MethodCollection (final int capacity)
132     {
133         m_methods = capacity < 0 ? new ArrayList JavaDoc () : new ArrayList JavaDoc (capacity);
134     }
135
136     // private: ...............................................................
137

138     
139     private List JavaDoc/* Method_info */ m_methods; // method collection
140

141 } // end of class
142
// ----------------------------------------------------------------------------
143

144
Popular Tags