Author: noctarius Date: Sat Nov 3 22:03:07 2012 New Revision: 1405431 URL: http://svn.apache.org/viewvc?rev=1405431&view=rev Log: Some small performance optimizations
Added: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/VisitableMarshallerContext.java - copied, changed from r1405430, directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastIntMap.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastLongMap.java Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/base/AbstractSerializerDefinition.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalClassDefinitionContainer.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializationContext.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializer.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializerCreator.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/BytecodeMarshallerGenerator.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/MarshallerGenerator.java directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/UnicodeUtil.java Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/base/AbstractSerializerDefinition.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/base/AbstractSerializerDefinition.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/base/AbstractSerializerDefinition.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/base/AbstractSerializerDefinition.java Sat Nov 3 22:03:07 2012 @@ -43,6 +43,7 @@ import org.apache.directmemory.lightning import org.apache.directmemory.lightning.generator.DefinitionVisitor; import org.apache.directmemory.lightning.instantiator.ObjectInstantiatorFactory; import org.apache.directmemory.lightning.internal.InternalMarshallerContext; +import org.apache.directmemory.lightning.internal.VisitableMarshallerContext; import org.apache.directmemory.lightning.internal.beans.introspection.AnnotatedTypeIntrospector; import org.apache.directmemory.lightning.internal.util.TypeUtil; import org.apache.directmemory.lightning.metadata.Attribute; @@ -54,7 +55,7 @@ public abstract class AbstractSerializer implements SerializerDefinition { - private final InternalMarshallerContext marshallerContext = new InternalMarshallerContext(); + private final VisitableMarshallerContext marshallerContext = new VisitableMarshallerContext(); private final Set<SerializerDefinition> children = new HashSet<SerializerDefinition>(); Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalClassDefinitionContainer.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalClassDefinitionContainer.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalClassDefinitionContainer.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalClassDefinitionContainer.java Sat Nov 3 22:03:07 2012 @@ -31,12 +31,10 @@ import java.util.Map; import java.util.Set; import org.apache.directmemory.lightning.internal.util.ClassUtil; +import org.apache.directmemory.lightning.internal.util.FastLongMap; import org.apache.directmemory.lightning.metadata.ClassDefinition; import org.apache.directmemory.lightning.metadata.ClassDefinitionContainer; -import com.carrotsearch.hppc.LongObjectMap; -import com.carrotsearch.hppc.LongObjectOpenHashMap; - class InternalClassDefinitionContainer implements ClassDefinitionContainer, Serializable { @@ -45,19 +43,20 @@ class InternalClassDefinitionContainer private final ClassDefinition[] classDefinitions; - private final LongObjectMap<ClassDefinition> classDefinitionsMappings; + //private final LongObjectMap<ClassDefinition> classDefinitionsMappings; + private final FastLongMap<ClassDefinition> classDefinitionsMappings; // Serialization private InternalClassDefinitionContainer( ClassDefinition[] classDefinitions ) { this.classDefinitions = classDefinitions; - this.classDefinitionsMappings = new LongObjectOpenHashMap<ClassDefinition>(); + this.classDefinitionsMappings = new FastLongMap<ClassDefinition>(); } InternalClassDefinitionContainer( Set<ClassDefinition> classDefinitions ) { this.classDefinitions = classDefinitions.toArray( new ClassDefinition[classDefinitions.size()] ); - this.classDefinitionsMappings = new LongObjectOpenHashMap<ClassDefinition>( classDefinitions.size() ); + this.classDefinitionsMappings = new FastLongMap<ClassDefinition>( classDefinitions.size() ); initMappings( this.classDefinitions ); } Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java Sat Nov 3 22:03:07 2012 @@ -19,12 +19,13 @@ package org.apache.directmemory.lightning.internal; import java.lang.reflect.Type; +import java.util.Collections; +import java.util.Map; import org.apache.directmemory.lightning.Marshaller; import org.apache.directmemory.lightning.MarshallerContext; - -import com.carrotsearch.hppc.ObjectObjectMap; -import com.carrotsearch.hppc.ObjectObjectOpenHashMap; +import org.apache.directmemory.lightning.internal.util.FastIntMap; +import org.apache.directmemory.lightning.internal.util.FastLongMap; public class InternalMarshallerContext implements MarshallerContext @@ -32,22 +33,30 @@ public class InternalMarshallerContext private final MarshallerContext parentMarshallerContext; - private final ObjectObjectMap<Type, Marshaller> marshallers = new ObjectObjectOpenHashMap<Type, Marshaller>(); + // private final ObjectObjectMap<Type, Marshaller> marshallers = new ObjectObjectOpenHashMap<Type, Marshaller>(); + // private Map<Type, Marshaller> marshallers; + private final FastIntMap<Marshaller> marshallers; - public InternalMarshallerContext() + public InternalMarshallerContext( FastIntMap<Marshaller> marshallers ) { - this( null ); + this( null, marshallers ); } public InternalMarshallerContext( MarshallerContext parentMarshallerContext ) { + this( parentMarshallerContext, new FastIntMap<Marshaller>() ); + } + + public InternalMarshallerContext( MarshallerContext parentMarshallerContext, FastIntMap<Marshaller> marshallers ) + { this.parentMarshallerContext = parentMarshallerContext; + this.marshallers = marshallers; } @Override public Marshaller getMarshaller( Type type ) { - Marshaller marshaller = marshallers.get( type ); + Marshaller marshaller = marshallers.get( System.identityHashCode( type ) ); if ( marshaller != null ) { return marshaller; @@ -64,11 +73,7 @@ public class InternalMarshallerContext @Override public void bindMarshaller( Type type, Marshaller marshaller ) { - marshallers.put( type, marshaller ); + marshallers.put( System.identityHashCode( type ), marshaller ); } - public ObjectObjectMap<Type, Marshaller> getInternalMap() - { - return marshallers; - } } Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializationContext.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializationContext.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializationContext.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializationContext.java Sat Nov 3 22:03:07 2012 @@ -30,6 +30,8 @@ import org.apache.directmemory.lightning import org.apache.directmemory.lightning.SerializationStrategy; import org.apache.directmemory.lightning.TypeBindableMarshaller; import org.apache.directmemory.lightning.instantiator.ObjectInstantiatorFactory; +import org.apache.directmemory.lightning.internal.util.FastIntMap; +import org.apache.directmemory.lightning.internal.util.FastLongMap; import org.apache.directmemory.lightning.internal.util.TypeUtil; import org.apache.directmemory.lightning.metadata.ClassDefinitionContainer; import org.apache.directmemory.lightning.metadata.ValueNullableEvaluator; @@ -45,7 +47,7 @@ public class InternalSerializationContex private final LongObjectMap<Object> referencesUnmarshall; - private final MarshallerContext marshallerContext = new InternalMarshallerContext(); + private final MarshallerContext marshallerContext; private final ClassDefinitionContainer classDefinitionContainer; @@ -64,7 +66,7 @@ public class InternalSerializationContex MarshallerStrategy marshallerStrategy, ObjectInstantiatorFactory objectInstantiatorFactory, ValueNullableEvaluator valueNullableEvaluator, - Map<Class<?>, Marshaller> definedMarshallers ) + FastIntMap<Marshaller> definedMarshallers ) { this.classDefinitionContainer = classDefinitionContainer; @@ -73,10 +75,12 @@ public class InternalSerializationContex this.objectInstantiatorFactory = objectInstantiatorFactory; this.valueNullableEvaluator = valueNullableEvaluator; - for ( Entry<Class<?>, Marshaller> entry : definedMarshallers.entrySet() ) - { - this.marshallerContext.bindMarshaller( entry.getKey(), entry.getValue() ); - } + this.marshallerContext = new InternalMarshallerContext( definedMarshallers ); + + /* + * for ( Entry<Class<?>, Marshaller> entry : definedMarshallers.entrySet() ) { + * this.marshallerContext.bindMarshaller( entry.getKey(), entry.getValue() ); } + */ if ( serializationStrategy == SerializationStrategy.SizeOptimized ) { Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializer.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializer.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializer.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializer.java Sat Nov 3 22:03:07 2012 @@ -20,9 +20,11 @@ package org.apache.directmemory.lightnin import java.io.File; import java.io.IOException; +import java.lang.reflect.Type; import java.util.Arrays; import java.util.Collections; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicReference; import org.apache.directmemory.lightning.ClassComparisonStrategy; @@ -37,6 +39,7 @@ import org.apache.directmemory.lightning import org.apache.directmemory.lightning.instantiator.ObjectInstantiatorFactory; import org.apache.directmemory.lightning.internal.generator.BytecodeMarshallerGenerator; import org.apache.directmemory.lightning.internal.generator.MarshallerGenerator; +import org.apache.directmemory.lightning.internal.util.FastIntMap; import org.apache.directmemory.lightning.logging.Logger; import org.apache.directmemory.lightning.metadata.ClassDefinition; import org.apache.directmemory.lightning.metadata.ClassDefinitionContainer; @@ -61,7 +64,7 @@ class InternalSerializer private final SerializationStrategy serializationStrategy; - private final Map<Class<?>, Marshaller> definedMarshallers; + private final FastIntMap<Marshaller> definedMarshallers; private final MarshallerStrategy marshallerStrategy; @@ -69,7 +72,7 @@ class InternalSerializer InternalSerializer( ClassDefinitionContainer classDefinitionContainer, SerializationStrategy serializationStrategy, ClassComparisonStrategy classComparisonStrategy, - Map<Class<?>, ClassDescriptor> classDescriptors, Map<Class<?>, Marshaller> marshallers, + Map<Class<?>, ClassDescriptor> classDescriptors, Map<Type, Marshaller> marshallers, ObjectInstantiatorFactory objectInstantiatorFactory, Logger logger, MarshallerStrategy marshallerStrategy, File debugCacheDirectory, ValueNullableEvaluator valueNullableEvaluator ) @@ -96,7 +99,12 @@ class InternalSerializer } } - this.definedMarshallers = marshallers; + this.definedMarshallers = new FastIntMap<Marshaller>( marshallers.size() ); + for ( Entry<Type, Marshaller> entry : marshallers.entrySet() ) + { + this.definedMarshallers.put( System.identityHashCode( entry.getKey() ), entry.getValue() ); + } + this.marshallerStrategy = marshallerStrategy; this.objectInstantiatorFactory = objectInstantiatorFactory; } Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializerCreator.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializerCreator.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializerCreator.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalSerializerCreator.java Sat Nov 3 22:03:07 2012 @@ -61,7 +61,7 @@ public final class InternalSerializerCre private final List<SerializerDefinition> serializerDefinitions = new ArrayList<SerializerDefinition>(); - private final Map<Class<?>, Marshaller> marshallers = new HashMap<Class<?>, Marshaller>(); + private final Map<Type, Marshaller> marshallers = new HashMap<Type, Marshaller>(); private final ObjectInstantiatorFactory objectInstantiatorFactory = new ObjenesisSerializer( true ); Copied: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/VisitableMarshallerContext.java (from r1405430, directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java) URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/VisitableMarshallerContext.java?p2=directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/VisitableMarshallerContext.java&p1=directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java&r1=1405430&r2=1405431&rev=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/InternalMarshallerContext.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/VisitableMarshallerContext.java Sat Nov 3 22:03:07 2012 @@ -26,7 +26,7 @@ import org.apache.directmemory.lightning import com.carrotsearch.hppc.ObjectObjectMap; import com.carrotsearch.hppc.ObjectObjectOpenHashMap; -public class InternalMarshallerContext +public class VisitableMarshallerContext implements MarshallerContext { @@ -34,12 +34,12 @@ public class InternalMarshallerContext private final ObjectObjectMap<Type, Marshaller> marshallers = new ObjectObjectOpenHashMap<Type, Marshaller>(); - public InternalMarshallerContext() + public VisitableMarshallerContext() { this( null ); } - public InternalMarshallerContext( MarshallerContext parentMarshallerContext ) + public VisitableMarshallerContext( MarshallerContext parentMarshallerContext ) { this.parentMarshallerContext = parentMarshallerContext; } Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/BytecodeMarshallerGenerator.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/BytecodeMarshallerGenerator.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/BytecodeMarshallerGenerator.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/BytecodeMarshallerGenerator.java Sat Nov 3 22:03:07 2012 @@ -54,7 +54,7 @@ public class BytecodeMarshallerGenerator @Override public Marshaller generateMarshaller( Class<?> type, List<PropertyDescriptor> propertyDescriptors, - Map<Class<?>, Marshaller> marshallers, + Map<java.lang.reflect.Type, Marshaller> marshallers, ClassDescriptorAwareSerializer serializer, SerializationStrategy serializationStrategy, ObjectInstantiatorFactory objectInstantiatorFactory, Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/MarshallerGenerator.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/MarshallerGenerator.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/MarshallerGenerator.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/MarshallerGenerator.java Sat Nov 3 22:03:07 2012 @@ -19,6 +19,7 @@ package org.apache.directmemory.lightning.internal.generator; import java.io.File; +import java.lang.reflect.Type; import java.util.List; import java.util.Map; @@ -33,7 +34,7 @@ public interface MarshallerGenerator { Marshaller generateMarshaller( Class<?> type, List<PropertyDescriptor> propertyDescriptors, - Map<Class<?>, Marshaller> marshallers, ClassDescriptorAwareSerializer serializer, + Map<Type, Marshaller> marshallers, ClassDescriptorAwareSerializer serializer, SerializationStrategy serializationStrategy, ObjectInstantiatorFactory objectInstantiatorFactory, File debugCacheDirectory, Logger logger ); Added: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastIntMap.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastIntMap.java?rev=1405431&view=auto ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastIntMap.java (added) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastIntMap.java Sat Nov 3 22:03:07 2012 @@ -0,0 +1,289 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.apache.directmemory.lightning.internal.util; + +import java.util.Iterator; + +/** + * A hash map using primitive ints as keys rather than objects. + * + * @author Justin Couch + * @author Alex Chaffee (a...@apache.org) + * @author Stephen Colebourne + * @author Nathan Sweet + */ +public final class FastIntMap<V> + implements Iterable<FastIntMap.Entry<V>> +{ + + private Entry[] table; + + private int size, mask, capacity, threshold; + + /** Same as: FastIntMap(16, 0.75f); */ + public FastIntMap() + { + this( 16, 0.75f ); + } + + /** Same as: FastIntMap(initialCapacity, 0.75f); */ + public FastIntMap( int initialCapacity ) + { + this( initialCapacity, 0.75f ); + } + + public FastIntMap( int initialCapacity, float loadFactor ) + { + if ( initialCapacity > 1 << 30 ) + throw new IllegalArgumentException( "initialCapacity is too large." ); + if ( initialCapacity < 0 ) + throw new IllegalArgumentException( "initialCapacity must be greater than zero." ); + if ( loadFactor <= 0 ) + throw new IllegalArgumentException( "initialCapacity must be greater than zero." ); + capacity = 1; + while ( capacity < initialCapacity ) + capacity <<= 1; + this.threshold = (int) ( capacity * loadFactor ); + this.table = new Entry[capacity]; + this.mask = capacity - 1; + } + + private int index( final int key ) + { + return index( key, mask ); + } + + private static int index( final int key, final int mask ) + { + return key & mask; + } + + public V put( int key, V value ) + { + final Entry<V>[] table = this.table; + int index = index( key ); + + // Check if key already exists. + for ( Entry<V> e = table[index]; e != null; e = e.next ) + { + if ( e.key != key ) + continue; + V oldValue = e.value; + e.value = value; + return oldValue; + } + + table[index] = new Entry<V>( key, value, table[index] ); + + if ( size++ >= threshold ) + rehash( table ); + + return null; + } + + private void rehash( final Entry<V>[] table ) + { + final int newCapacity = 2 * capacity; + final int newMask = newCapacity - 1; + + final Entry<V>[] newTable = new Entry[newCapacity]; + + for ( int i = 0, index; i < table.length; i++ ) + { + Entry<V> e = table[i]; + if ( e == null ) + continue; + do + { + final Entry<V> next = e.next; + index = index( e.key, newMask ); + e.next = newTable[index]; + newTable[index] = e; + e = next; + } + while ( e != null ); + } + + this.table = newTable; + capacity = newCapacity; + mask = newMask; + threshold *= 2; + } + + public V get( int key ) + { + final int index = index( key ); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) + return e.value; + return null; + } + + public boolean containsValue( Object value ) + { + final Entry<V>[] table = this.table; + for ( int i = table.length - 1; i >= 0; i-- ) + for ( Entry<V> e = table[i]; e != null; e = e.next ) + if ( e.value.equals( value ) ) + return true; + return false; + } + + public boolean containsKey( int key ) + { + final int index = index( key ); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) + return true; + return false; + } + + public V remove( int key ) + { + final int index = index( key ); + + Entry<V> prev = table[index]; + Entry<V> e = prev; + while ( e != null ) + { + Entry<V> next = e.next; + if ( e.key == key ) + { + size--; + if ( prev == e ) + table[index] = next; + else + prev.next = next; + return e.value; + } + prev = e; + e = next; + } + return null; + } + + public int size() + { + return size; + } + + public boolean isEmpty() + { + return size == 0; + } + + public void clear() + { + final Entry<V>[] table = this.table; + for ( int index = table.length - 1; index >= 0; index-- ) + table[index] = null; + size = 0; + } + + public EntryIterator iterator() + { + return new EntryIterator(); + } + + public class EntryIterator + implements Iterator<Entry<V>> + { + + private int nextIndex; + + private Entry<V> current; + + EntryIterator() + { + reset(); + } + + public void reset() + { + current = null; + // Find first bucket. + final Entry<V>[] table = FastIntMap.this.table; + int i; + for ( i = table.length - 1; i >= 0; i-- ) + if ( table[i] != null ) + break; + nextIndex = i; + } + + public boolean hasNext() + { + if ( nextIndex >= 0 ) + return true; + Entry e = current; + return e != null && e.next != null; + } + + public Entry<V> next() + { + // Next entry in current bucket. + Entry<V> e = current; + if ( e != null ) + { + e = e.next; + if ( e != null ) + { + current = e; + return e; + } + } + // Use the bucket at nextIndex and find the next nextIndex. + final Entry<V>[] table = FastIntMap.this.table; + int i = nextIndex; + e = current = table[i]; + while ( --i >= 0 ) + if ( table[i] != null ) + break; + nextIndex = i; + return e; + } + + public void remove() + { + FastIntMap.this.remove( current.key ); + } + } + + static final class Entry<T> + { + + final int key; + + T value; + + Entry<T> next; + + Entry( int key, T value, Entry<T> next ) + { + this.key = key; + this.value = value; + this.next = next; + } + + public int getKey() + { + return key; + } + + public T getValue() + { + return value; + } + + } + +} \ No newline at end of file Added: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastLongMap.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastLongMap.java?rev=1405431&view=auto ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastLongMap.java (added) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/FastLongMap.java Sat Nov 3 22:03:07 2012 @@ -0,0 +1,294 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.apache.directmemory.lightning.internal.util; + +import java.util.Iterator; + +/* + * Taken from lwjgl project + */ + +/** + * A hash map using primitive longs as keys rather than objects. + * + * @author Justin Couch + * @author Alex Chaffee (a...@apache.org) + * @author Stephen Colebourne + * @author Nathan Sweet + */ +public final class FastLongMap<V> + implements Iterable<FastLongMap.Entry<V>> +{ + + private Entry[] table; + + private int size, mask, capacity, threshold; + + /** Same as: FastLongMap(16, 0.75f); */ + public FastLongMap() + { + this( 16, 0.75f ); + } + + /** Same as: FastLongMap(initialCapacity, 0.75f); */ + public FastLongMap( int initialCapacity ) + { + this( initialCapacity, 0.75f ); + } + + public FastLongMap( int initialCapacity, float loadFactor ) + { + if ( initialCapacity > 1 << 30 ) + throw new IllegalArgumentException( "initialCapacity is too large." ); + if ( initialCapacity < 0 ) + throw new IllegalArgumentException( "initialCapacity must be greater than zero." ); + if ( loadFactor <= 0 ) + throw new IllegalArgumentException( "initialCapacity must be greater than zero." ); + capacity = 1; + while ( capacity < initialCapacity ) + capacity <<= 1; + this.threshold = (int) ( capacity * loadFactor ); + this.table = new Entry[capacity]; + this.mask = capacity - 1; + } + + private int index( final long key ) + { + return index( key, mask ); + } + + private static int index( final long key, final int mask ) + { + final int hash = (int) ( key ^ ( key >>> 32 ) ); + return hash & mask; + } + + public V put( long key, V value ) + { + final Entry<V>[] table = this.table; + int index = index( key ); + + // Check if key already exists. + for ( Entry<V> e = table[index]; e != null; e = e.next ) + { + if ( e.key != key ) + continue; + V oldValue = e.value; + e.value = value; + return oldValue; + } + + table[index] = new Entry<V>( key, value, table[index] ); + + if ( size++ >= threshold ) + rehash( table ); + + return null; + } + + private void rehash( final Entry<V>[] table ) + { + final int newCapacity = 2 * capacity; + final int newMask = newCapacity - 1; + + final Entry<V>[] newTable = new Entry[newCapacity]; + + for ( int i = 0, index; i < table.length; i++ ) + { + Entry<V> e = table[i]; + if ( e == null ) + continue; + do + { + final Entry<V> next = e.next; + index = index( e.key, newMask ); + e.next = newTable[index]; + newTable[index] = e; + e = next; + } + while ( e != null ); + } + + this.table = newTable; + capacity = newCapacity; + mask = newMask; + threshold *= 2; + } + + public V get( long key ) + { + final int index = index( key ); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) + return e.value; + return null; + } + + public boolean containsValue( Object value ) + { + final Entry<V>[] table = this.table; + for ( int i = table.length - 1; i >= 0; i-- ) + for ( Entry<V> e = table[i]; e != null; e = e.next ) + if ( e.value.equals( value ) ) + return true; + return false; + } + + public boolean containsKey( long key ) + { + final int index = index( key ); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) + return true; + return false; + } + + public V remove( long key ) + { + final int index = index( key ); + + Entry<V> prev = table[index]; + Entry<V> e = prev; + while ( e != null ) + { + Entry<V> next = e.next; + if ( e.key == key ) + { + size--; + if ( prev == e ) + table[index] = next; + else + prev.next = next; + return e.value; + } + prev = e; + e = next; + } + return null; + } + + public int size() + { + return size; + } + + public boolean isEmpty() + { + return size == 0; + } + + public void clear() + { + final Entry<V>[] table = this.table; + for ( int index = table.length - 1; index >= 0; index-- ) + table[index] = null; + size = 0; + } + + public EntryIterator iterator() + { + return new EntryIterator(); + } + + public class EntryIterator + implements Iterator<Entry<V>> + { + + private int nextIndex; + + private Entry<V> current; + + EntryIterator() + { + reset(); + } + + public void reset() + { + current = null; + // Find first bucket. + final Entry<V>[] table = FastLongMap.this.table; + int i; + for ( i = table.length - 1; i >= 0; i-- ) + if ( table[i] != null ) + break; + nextIndex = i; + } + + public boolean hasNext() + { + if ( nextIndex >= 0 ) + return true; + Entry e = current; + return e != null && e.next != null; + } + + public Entry<V> next() + { + // Next entry in current bucket. + Entry<V> e = current; + if ( e != null ) + { + e = e.next; + if ( e != null ) + { + current = e; + return e; + } + } + // Use the bucket at nextIndex and find the next nextIndex. + final Entry<V>[] table = FastLongMap.this.table; + int i = nextIndex; + e = current = table[i]; + while ( --i >= 0 ) + if ( table[i] != null ) + break; + nextIndex = i; + return e; + } + + public void remove() + { + FastLongMap.this.remove( current.key ); + } + } + + static final class Entry<T> + { + + final long key; + + T value; + + Entry<T> next; + + Entry( long key, T value, Entry<T> next ) + { + this.key = key; + this.value = value; + this.next = next; + } + + public long getKey() + { + return key; + } + + public T getValue() + { + return value; + } + + } + +} \ No newline at end of file Modified: directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/UnicodeUtil.java URL: http://svn.apache.org/viewvc/directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/UnicodeUtil.java?rev=1405431&r1=1405430&r2=1405431&view=diff ============================================================================== --- directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/UnicodeUtil.java (original) +++ directmemory/lightning/trunk/lightning-core/src/main/java/org/apache/directmemory/lightning/internal/util/UnicodeUtil.java Sat Nov 3 22:03:07 2012 @@ -330,7 +330,7 @@ public final class UnicodeUtil } } - if ( STRING_PP_CONSTRUCTOR == null ) + if ( STRING_PP_CONSTRUCTOR != null ) { return new String( out ); }