1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: MethodCollection.java,v 1.1.1.1 2004/05/09 16:57:47 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.jcd.cls;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.ArrayList;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.List;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.lib.UDataOutputStream;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IntVector;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author (C) 2001, Vlad Roubtsov
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class MethodCollection implements IMethodCollection
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // ACCESSORS:
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Method_info get (final int offset)
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return (Method_info) m_methods.get (offset);
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int [] get (final ClassDef cls, final String name)
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (cls == null) throw new IllegalArgumentException  ("null input: cls");
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // TODO: hash impl [not possible without having access to the parent ClassDef]
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int count = m_methods.size (); // use size() if class becomes non-final
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final IntVector result = new IntVector (count);
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int m = 0; m < count; ++ m)
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final Method_info method = (Method_info) m_methods.get (m);
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (method.getName (cls).equals (name))
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                result.add (m);
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return result.values (); // IntVector optimizes for the empty case
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int size ()
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_methods.size ();
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // Cloneable:
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Performs a deep copy.
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object clone ()
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final MethodCollection _clone = (MethodCollection) super.clone ();
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // deep clone:
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int methods_count = m_methods.size (); // use size() if class becomes non-final
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            _clone.m_methods = new ArrayList (methods_count);
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int m = 0; m < methods_count; ++ m)
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                _clone.m_methods.add (((Method_info) m_methods.get (m)).clone ());
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return _clone;
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (CloneNotSupportedException e)
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new InternalError (e.toString ());
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // IClassFormatOutput:
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void writeInClassFormat (final UDataOutputStream out) throws IOException
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int methods_count = m_methods.size (); // use size() if class becomes non-final
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeU2 (methods_count);
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < methods_count; i++)
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            get (i).writeInClassFormat (out);
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // Visitor:
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void accept (final IClassDefVisitor visitor, final Object ctx)
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        visitor.visit (this, ctx);
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // MUTATORS:
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int add (final Method_info method)
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int newoffset = m_methods.size ();  // use size() if class becomes non-final
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_methods.add (method);
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return newoffset;
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Method_info set (final int offset, final Method_info method)
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return (Method_info) m_methods.set (offset, method);
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Method_info remove (final int offset)
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return (Method_info) m_methods.remove (offset);
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    MethodCollection (final int capacity)
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_methods = capacity < 0 ? new ArrayList () : new ArrayList (capacity);
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private List/* Method_info */ m_methods; // method collection
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
144