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: InnerClassesAttribute_info.java,v 1.1.1.1 2004/05/09 16:57:48 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.jcd.cls.attribute;
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.UDataInputStream;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.lib.UDataOutputStream;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class InnerClassesAttribute_info extends Attribute_info
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // ACCESSORS:
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean makesClassNested (final int class_index, final int [] nestedAccessFlags)
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (class_index > 0)
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: avoid linear loop by keeping all class indices in a bitset
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int i = 0, iLimit = size (); i < iLimit; ++ i)
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final InnerClass_info info = get (i);
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (info.m_inner_class_index == class_index)
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    nestedAccessFlags [0] = info.m_inner_access_flags;
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    return true;
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return false;
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Returns {@link InnerClass_info} descriptor at a given offset.
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param offset inner class entry offset [must be in [0, size()) range;
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * input not checked]
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return InnerClass_info descriptor [never null]
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @throws IndexOutOfBoundsException if 'offset' is outside of valid range
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final InnerClass_info get (final int offset)
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return (InnerClass_info) m_classes.get (offset);
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Returns the number of descriptors in this collection [can be 0].
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final int size ()
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_classes.size ();
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final long length ()
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return 8 + (m_classes.size () << 3); // use size() if class becomes non-final
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // Visitor:
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void accept (final IAttributeVisitor visitor, final Object ctx)
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        visitor.visit (this, ctx);
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String toString ()
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer s = new StringBuffer ("InnerClassesAttribute_info: [attribute_name_index = " + m_name_index + ", attribute_length = " + length () + "]\n");
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int l = 0; l < size (); ++ l)
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append ("            " + get (l));
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append ("\n"); // TODO: proper EOL const
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return s.toString ();
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // Cloneable:
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Performs a deep copy.
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object clone ()
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final InnerClassesAttribute_info _clone = (InnerClassesAttribute_info) super.clone ();
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final List/* InnerClass_info */ classes = m_classes;
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // do deep copy:
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int class_count = classes.size (); // use size() if class becomes non-final
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        _clone.m_classes = new ArrayList (class_count);
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int e = 0; e < class_count; ++ e)
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            _clone.m_classes.add (((InnerClass_info) classes.get (e)).clone ());
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return _clone;
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // IClassFormatOutput:
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void writeInClassFormat (final UDataOutputStream out) throws IOException
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super.writeInClassFormat (out);
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final List/* InnerClass_info */ classes = m_classes;
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int class_count = classes.size (); // use size() if class becomes non-final
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeU2 (class_count);
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int l = 0; l < class_count; ++ l)
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            ((InnerClass_info) classes.get (l)).writeInClassFormat (out);
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    InnerClassesAttribute_info (final int attribute_name_index, final long attribute_length,
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                final UDataInputStream bytes)
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super (attribute_name_index, attribute_length);
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int class_count = bytes.readU2 ();
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final List/* InnerClass_info */ classes = new ArrayList (class_count);
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < class_count; ++ i)
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            classes.add (new InnerClass_info (bytes));
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_classes = classes;
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private List/* InnerClass_info */ m_classes; // never null
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------