Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Symbol Table storage changes

This table changes the symbol table to use a TreeMap instead of a HashMap 
for storing its symbols.  This means that the prefix lookup used by 
content assist will now be O( log(n) ) instead of O( n ).

Tested on Windows.

-Andrew

Index: parser/ChangeLog-parser
===================================================================
retrieving revision 1.16
diff -u -r1.16 ChangeLog-parser
--- parser/ChangeLog-parser	9 Jan 2004 16:59:25 -0000	1.16
+++ parser/ChangeLog-parser	12 Jan 2004 22:02:11 -0000
@@ -1,3 +1,6 @@
+2004-01-12 Andrew Niefer
+	Change symbol table to use TreeMap instead of HashMap for storing its symbols to improve prefix lookup performance.
+
 2004-01-08 Andrew Niefer
 	fixing bug 43110 - Parser support needed for functions with ellipses
 	Added IParameterizedSymbol.setHasVariableArgs() & hasVariableArgs()
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java
===================================================================
retrieving revision 1.6
diff -u -r1.6 ContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	7 Jan 2004 02:00:17 -0000	1.6
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	12 Jan 2004 22:02:13 -0000
@@ -14,6 +14,7 @@
  
 package org.eclipse.cdt.internal.core.parser.pst;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -21,6 +22,8 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
 
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
 import org.eclipse.cdt.core.parser.ast.IASTMember;
@@ -52,7 +55,7 @@
 		ContainerSymbol copy = (ContainerSymbol)super.clone();
 			
 		copy._usingDirectives  = ( _usingDirectives != null ) ? (LinkedList) _usingDirectives.clone() : null; 
-		copy._containedSymbols = ( _containedSymbols != null )? (HashMap) _containedSymbols.clone() : null;
+		copy._containedSymbols = ( _containedSymbols != null )? (TreeMap) _containedSymbols.clone() : null;
 
 		return copy;	
 	}
@@ -118,7 +121,6 @@
 					origList.add( origDecl );
 					origList.add( obj );
 			
-					declarations.remove( origDecl );
 					declarations.put( obj.getName(), origList );
 				} else	{
 					origList.add( obj );
@@ -262,9 +264,9 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#getContainedSymbols()
 	 */
-	public Map getContainedSymbols(){
+	public SortedMap getContainedSymbols(){
 		if( _containedSymbols == null ){
-			_containedSymbols = new HashMap();
+			_containedSymbols = new TreeMap( new SymbolTableComparator() );
 		}
 		return _containedSymbols;
 	}
@@ -760,7 +762,6 @@
 					}
 				}
 				if( list.size() == 1 ){
-					_context.getContainedSymbols().remove( _symbol.getName() );
 					_context.getContainedSymbols().put( _symbol.getName(), list.getFirst() );
 				}
 			} else if( obj instanceof BasicSymbol ){
@@ -786,8 +787,22 @@
 		private IContainerSymbol _decl;
 		private IContainerSymbol _namespace;
 	}
-
+	
+	static protected class SymbolTableComparator implements Comparator{
+		public int compare( Object o1, Object o2 ){
+			int result = ((String) o1).compareToIgnoreCase( (String) o2 );
+			if( result == 0 ){
+				return ((String) o1).compareTo( (String) o2 );
+			}
+			return result;
+		}
+		
+		public boolean equals( Object obj ){
+			return ( obj instanceof SymbolTableComparator );
+		}
+	}
+	
 	private		LinkedList	_usingDirectives;		//collection of nominated namespaces
-	private		HashMap 	_containedSymbols;		//declarations contained by us.
+	private		TreeMap 	_containedSymbols;		//declarations contained by us.
 
 }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java
===================================================================
retrieving revision 1.10
diff -u -r1.10 IContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java	10 Dec 2003 00:07:26 -0000	1.10
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java	12 Jan 2004 22:02:13 -0000
@@ -17,7 +17,7 @@
 package org.eclipse.cdt.internal.core.parser.pst;
 
 import java.util.List;
-import java.util.Map;
+import java.util.SortedMap;
 
 
 /**
@@ -37,7 +37,7 @@
 	public ISymbol addUsingDeclaration( String name ) throws ParserSymbolTableException;
 	public ISymbol addUsingDeclaration( String name, IContainerSymbol declContext ) throws ParserSymbolTableException;
 			
-	public Map getContainedSymbols();
+	public SortedMap getContainedSymbols();
 	
 	public List prefixLookup( TypeFilter filter, String prefix, boolean qualified ) throws ParserSymbolTableException;
 	
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java
===================================================================
retrieving revision 1.6
diff -u -r1.6 IParameterizedSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java	9 Jan 2004 16:59:25 -0000	1.6
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java	12 Jan 2004 22:02:13 -0000
@@ -17,7 +17,7 @@
 package org.eclipse.cdt.internal.core.parser.pst;
 
 import java.util.List;
-import java.util.Map;
+import java.util.SortedMap;
 
 
 /**
@@ -36,7 +36,7 @@
 	public List getArgumentList();
 	//public void setArgumentList( List list );
 	
-	public Map getParameterMap();
+	public SortedMap getParameterMap();
 	public List getParameterList();
 	//public void setParameterList( List list );
 
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java
===================================================================
retrieving revision 1.2
diff -u -r1.2 ParameterizedSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java	9 Jan 2004 16:59:25 -0000	1.2
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java	12 Jan 2004 22:02:13 -0000
@@ -13,11 +13,12 @@
  */
 package org.eclipse.cdt.internal.core.parser.pst;
 
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
 
 import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command;
 
@@ -45,7 +46,7 @@
 		ParameterizedSymbol copy = (ParameterizedSymbol)super.clone();
 			
 		copy._parameterList = ( _parameterList != null ) ? (LinkedList) _parameterList.clone() : null;
-		copy._parameterMap	= ( _parameterMap  != null ) ? (HashMap) _parameterMap.clone() : null;
+		copy._parameterMap	= ( _parameterMap  != null ) ? (TreeMap) _parameterMap.clone() : null;
 		
 		copy._argumentList	  = ( _argumentList != null ) ? (LinkedList) _argumentList.clone() : null;
 		copy._specializations = ( _specializations != null ) ? (LinkedList) _specializations.clone() : null;
@@ -140,9 +141,9 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol#getParameterMap()
 	 */
-	public Map getParameterMap(){
+	public SortedMap getParameterMap(){
 		if( _parameterMap == null ){
-			_parameterMap = new HashMap();
+			_parameterMap = new TreeMap( new SymbolTableComparator() );
 		}
 		return _parameterMap;
 	}
@@ -282,7 +283,7 @@
 	}
 	
 	private 	LinkedList	_parameterList;			//have my cake
-	private 	HashMap		_parameterMap;			//and eat it too
+	private 	TreeMap		_parameterMap;			//and eat it too
 	private		LinkedList	_specializations;		//template specializations
 	private		LinkedList	_argumentList;			//template specialization arguments
 	private 	ISymbol		_returnType;
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
===================================================================
retrieving revision 1.33
diff -u -r1.33 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	9 Jan 2004 16:59:25 -0000	1.33
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	12 Jan 2004 22:02:14 -0000
@@ -22,6 +22,7 @@
 import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
 
 import org.eclipse.cdt.core.parser.Enum;
 import org.eclipse.cdt.core.parser.ParserLanguage;
@@ -302,9 +303,9 @@
 			data.associated.remove( lookIn );
 		}
 		
-		Map declarations = lookIn.getContainedSymbols();
+		SortedMap declarations = lookIn.getContainedSymbols();
 		
-		Iterator iterator = ( data.mode == LookupMode.PREFIX ) ? declarations.keySet().iterator() : null;
+		Iterator iterator = ( data.mode == LookupMode.PREFIX ) ? declarations.tailMap( data.name.toLowerCase() ).keySet().iterator() : null;
 		String name = ( iterator != null && iterator.hasNext() ) ? (String) iterator.next() : data.name;
 		
 		while( name != null ) {
@@ -315,6 +316,8 @@
 				
 				if( obj != null )
 					found.put( name, obj );
+			} else {
+				break;
 			}
 						
 			if( iterator != null && iterator.hasNext() ){
@@ -329,9 +332,9 @@
 		}
 		
 		if( lookIn instanceof IParameterizedSymbol ){
-			Map parameters = ((IParameterizedSymbol)lookIn).getParameterMap();
+			SortedMap parameters = ((IParameterizedSymbol)lookIn).getParameterMap();
 			if( parameters != null ){
-				iterator = ( data.mode == LookupMode.PREFIX ) ? parameters.keySet().iterator() : null;
+				iterator = ( data.mode == LookupMode.PREFIX ) ? parameters.tailMap( data.name.toLowerCase() ).keySet().iterator() : null;
 				name = ( iterator != null && iterator.hasNext() ) ? (String) iterator.next() : data.name;
 				while( name != null ){
 					if( nameMatches( data, name ) ){
@@ -340,7 +343,10 @@
 						if( obj != null ){
 							found.put( name, obj );
 						}
+					} else {
+						break;
 					}
+					
 					if( iterator != null && iterator.hasNext() ){
 						name = (String) iterator.next();
 					} else {

Back to the top