--- /dev/null
+/*\r
+\r
+ Derby - Class org.apache.derby.iapi.services.classfile.MemberTable\r
+\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to you under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+\r
+ */\r
+\r
+package org.apache.derby.iapi.services.classfile;\r
+\r
+import java.io.IOException;\r
+\r
+import java.util.Hashtable;\r
+import java.util.Vector;\r
+\r
+\r
+\r
+class MemberTable {\r
+ protected Vector entries;\r
+ private Hashtable hashtable;\r
+ private MemberTableHash mutableMTH = null;\r
+\r
+ public MemberTable(int count) {\r
+ entries = new Vector(count);\r
+ hashtable = new Hashtable((count > 50) ? count : 50);\r
+ mutableMTH = new MemberTableHash(null, null);\r
+ }\r
+\r
+ void addEntry(ClassMember item) {\r
+ MemberTableHash mth= new MemberTableHash(\r
+ item.getName(), \r
+ item.getDescriptor(),\r
+ entries.size());\r
+ /* Add to the Vector */\r
+ entries.addElement(item);\r
+\r
+ /* Add to the Hashtable */\r
+ hashtable.put(mth, mth);\r
+ }\r
+\r
+ ClassMember find(String name, String descriptor) {\r
+\r
+ /* Set up the mutable MTH for the search */\r
+ mutableMTH.name = name;\r
+ mutableMTH.descriptor = descriptor;\r
+ mutableMTH.setHashCode();\r
+\r
+ /* search the hash table */\r
+ MemberTableHash mth = (MemberTableHash) hashtable.get(mutableMTH);\r
+ if (mth == null)\r
+ {\r
+ return null;\r
+ }\r
+\r
+ return (ClassMember) entries.elementAt(mth.index);\r
+ }\r
+\r
+ void put(ClassFormatOutput out) throws IOException {\r
+\r
+ Vector lentries = entries;\r
+ int count = lentries.size();\r
+ for (int i = 0; i < count; i++) {\r
+ ((ClassMember) lentries.elementAt(i)).put(out);\r
+ }\r
+ }\r
+\r
+ int size() {\r
+ return entries.size();\r
+ }\r
+\r
+ int classFileSize() {\r
+ int size = 0;\r
+\r
+ Vector lentries = entries;\r
+ int count = lentries.size();\r
+ for (int i = 0; i < count; i++) {\r
+ size += ((ClassMember) lentries.elementAt(i)).classFileSize();\r
+ }\r
+\r
+ return size;\r
+ }\r
+}\r
+\r
+class MemberTableHash \r
+{\r
+ String name;\r
+ String descriptor;\r
+ int index;\r
+ int hashCode;\r
+ \r
+ MemberTableHash(String name, String descriptor, int index)\r
+ {\r
+ this.name = name;\r
+ this.descriptor = descriptor;\r
+ this.index = index;\r
+ /* Only set hashCode if both name and descriptor are non-null */\r
+ if (name != null && descriptor != null)\r
+ {\r
+ setHashCode();\r
+ }\r
+ }\r
+\r
+ MemberTableHash(String name, String descriptor)\r
+ {\r
+ this(name, descriptor, -1);\r
+ }\r
+\r
+ void setHashCode()\r
+ {\r
+ hashCode = name.hashCode() + descriptor.hashCode();\r
+ }\r
+\r
+ public boolean equals(Object other)\r
+ {\r
+ MemberTableHash mth = (MemberTableHash) other;\r
+\r
+ if (other == null)\r
+ {\r
+ return false;\r
+ }\r
+\r
+ if (name.equals(mth.name) && descriptor.equals(mth.descriptor))\r
+ {\r
+ return true;\r
+ }\r
+ else\r
+ {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ public int hashCode()\r
+ {\r
+ return hashCode;\r
+ }\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r