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: FieldCollection.java,v 1.1.1.1 2004/05/09 16:57:45 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 FieldCollection implements IFieldCollection
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 Field_info get (final int offset)
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return (Field_info) m_fields.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_fields.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 f = 0; f < count; ++ f)
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final Field_info field = (Field_info) m_fields.get (f);
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (field.getName (cls).equals (name))
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                result.add (f);
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_fields.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 FieldCollection _clone = (FieldCollection) super.clone ();
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // deep clone:
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int fields_count = m_fields.size (); // use size() if class becomes non-final
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            _clone.m_fields = new ArrayList (fields_count);
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int f = 0; f < fields_count; ++ f)
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                _clone.m_fields.add (((Field_info) m_fields.get (f)).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 fields_count = m_fields.size (); // use size() if class becomes non-final
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeU2 (fields_count);
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < fields_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 Field_info field)
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int newoffset = m_fields.size (); // use size() if class becomes non-final
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_fields.add (field);
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 Field_info set (final int offset, final Field_info field)
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return (Field_info) m_fields.set (offset, field);
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    FieldCollection (final int capacity)
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_fields = capacity < 0 ? new ArrayList () : new ArrayList (capacity);
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private List/* Field_info */ m_fields; // never null
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
138