avalon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From froehl...@apache.org
Subject cvs commit: jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/collections BucketMap.java
Date Sat, 16 Feb 2002 01:34:28 GMT
froehlich    02/02/15 17:34:28

  Modified:    src/java/org/apache/avalon/excalibur/collections
                        BucketMap.java
  Log:
  fixed _hopefully_ " No newline at end of file"
  
  Revision  Changes    Path
  1.3       +1 -1      jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/collections/BucketMap.java
  
  Index: BucketMap.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/collections/BucketMap.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- BucketMap.java	16 Feb 2002 01:32:48 -0000	1.2
  +++ BucketMap.java	16 Feb 2002 01:34:28 -0000	1.3
  @@ -1 +1 @@
  -/*
 * Copyright (C) The Apache Software Foundation. All rights reserved.
 *
 * This software
is published under the terms of the Apache Software License
 * version 1.1, a copy of which
has been included with this distribution in
 * the LICENSE.txt file.
 */
package org.apache.avalon.excalibur.collections;

import
java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;

/**
* A BucketMap is an efficient ThreadSafe implementation of a Map.  The
 * map only supports
get(), put(), and contains().
 *
 * @author  <a href="bloritsch@apache.org">Berin Loritsch</a>
* @author  <a href="g-froehlich@gmx.de">Gerhard Froehlich</a>
 * @version CVS
$Revision: 1.2 $ $Date: 2002/02/16 01:32:48 $
 * @since 4.0
 */
public final class BucketMap
{
   private static final int DEFAULT_BUCKETS = 256;
    private final Node[]   m_buckets;
   private final Object[] m_locks;

    /**
     */
    public BucketMap()
    {
        this(
DEFAULT_BUCKETS );
    }

    public BucketMap( int numBuckets )
    {
        int size =
( numBuckets >= 16 ) ? numBuckets : 16;
        m_buckets = new Node[size];
        m_locks
= new Object[size];

        for ( int i = 0; i < size; i++ )
        {
            m_locks[i]
= new Object();
        }
    }

    private final int getHash( Object key )
    {
      
 final int hash = key.hashCode() % m_buckets.length;
        return (hash < 0) ? hash *
-1 : hash;
    }

    /**
     * Add an object into the buffer.
     *
     * @throws BufferOverflowException
if adding this element exceeds the
     *         buffer's capacity.
     */
    public Set
keySet()
    {
        Set keySet = new HashSet();

        for (int i = 0; i < m_buckets.length;
i++ )
        {
            synchronized( m_locks[i] )
            {
                Node
n = m_buckets[i];

                while( n != null )
                {
                 
  keySet.add(n.key);
                    n = n.next;
                }
            }
    
   }

        return keySet;
    }

    /**
     * Add an object into the buffer.
     *
    * @throws BufferOverflowException if adding this element exceeds the
     *         buffer's
capacity.
     */
    public void put( final Object key, final Object value )
    {
     
  if ( null == key || null == value )
        {
            return;
        }

        int
hash = getHash( key );

        synchronized( m_locks[hash] )
        {
            Node n
= m_buckets[hash];

            if ( n == null )
            {
                n = new Node();
               n.key = key;
                n.value = value;
                m_buckets[hash]
= n;
                return;
            }

            while ( n.next != null )
        
   {
                if ( n.key.equals(key) )
                {
                    n.value
= value;
                    return;
                }

                n = n.next;
     
      }

            Node newNode = new Node();
            newNode.key = key;
          
 newNode.value = value;
            n.next = newNode;
        }
    }

    /**
     * Add
an object into the buffer.
     *
     * @throws BufferOverflowException if adding this element
exceeds the
     *         buffer's capacity.
     */
    public Object get( final Object
key )
    {
        if ( null == key )
        {
            return null;
        }

    
   int hash = getHash( key );

        synchronized( m_locks[hash] )
        {
          
 Node n = m_buckets[hash];

            while ( n != null )
            {
               
if ( n.key.equals(key) )
                {
                    return n.value;
          
     }

                n = n.next;
            }
        }

        return null;
    }

   /**
     * Add an object into the buffer.
     *
     * @throws BufferOverflowException
if adding this element exceeds the
     *         buffer's capacity.
     */
    public boolean
containsKey( final Object key )
    {
        if ( null == key )
        {
            return
false;
        }

        int hash = getHash( key );

        synchronized( m_locks[hash]
)
        {
            Node n = m_buckets[hash];

            while ( n != null )
      
     {
                if ( n.key.equals(key) )
                {
                    return
true;
                }

                n = n.next;
            }
        }

        return
false;
    }

    /**
     * Removes the next object from the buffer.
     *
     * @throws
BufferUnderflowException if the buffer is already empty
     */
    public Object remove(
Object key )
    {
        if ( null == key )
        {
            return null;
        }

       int hash = getHash( key );

        synchronized( m_locks[hash] )
        {
      
     Node n = m_buckets[hash];
            Node prev = null;

            while ( n != null
)
            {
                if ( n.key.equals( key ) )
                {
            
       if ( null == prev )
                    {
                        m_buckets[hash] =
n.next;
                    }
                    else
                    {
            
           prev.next = n.next;
                    }

                    return n.value;
               }

                prev = n;
                n = n.next;
            }
   
    }

        return null;
    }

    private final static class Node
    {
        protected
Object key;
        protected Object value;
        protected Node next;
    }
}
  \ No newline at end of file
  +/*
 * Copyright (C) The Apache Software Foundation. All rights reserved.
 *
 * This software
is published under the terms of the Apache Software License
 * version 1.1, a copy of which
has been included with this distribution in
 * the LICENSE.txt file.
 */
package org.apache.avalon.excalibur.collections;

import
java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;

/**
* A BucketMap is an efficient ThreadSafe implementation of a Map.  The
 * map only supports
get(), put(), and contains().
 *
 * @author  <a href="bloritsch@apache.org">Berin Loritsch</a>
* @author  <a href="g-froehlich@gmx.de">Gerhard Froehlich</a>
 * @version CVS
$Revision: 1.3 $ $Date: 2002/02/16 01:34:28 $
 * @since 4.0
 */
public final class BucketMap
{
   private static final int DEFAULT_BUCKETS = 256;
    private final Node[]   m_buckets;
   private final Object[] m_locks;

    /**
     */
    public BucketMap()
    {
        this(
DEFAULT_BUCKETS );
    }

    public BucketMap( int numBuckets )
    {
        int size =
( numBuckets >= 16 ) ? numBuckets : 16;
        m_buckets = new Node[size];
        m_locks
= new Object[size];

        for ( int i = 0; i < size; i++ )
        {
            m_locks[i]
= new Object();
        }
    }

    private final int getHash( Object key )
    {
      
 final int hash = key.hashCode() % m_buckets.length;
        return (hash < 0) ? hash *
-1 : hash;
    }

    /**
     * Add an object into the buffer.
     *
     * @throws BufferOverflowException
if adding this element exceeds the
     *         buffer's capacity.
     */
    public Set
keySet()
    {
        Set keySet = new HashSet();

        for (int i = 0; i < m_buckets.length;
i++ )
        {
            synchronized( m_locks[i] )
            {
                Node
n = m_buckets[i];

                while( n != null )
                {
                 
  keySet.add(n.key);
                    n = n.next;
                }
            }
    
   }

        return keySet;
    }

    /**
     * Add an object into the buffer.
     *
    * @throws BufferOverflowException if adding this element exceeds the
     *         buffer's
capacity.
     */
    public void put( final Object key, final Object value )
    {
     
  if ( null == key || null == value )
        {
            return;
        }

        int
hash = getHash( key );

        synchronized( m_locks[hash] )
        {
            Node n
= m_buckets[hash];

            if ( n == null )
            {
                n = new Node();
               n.key = key;
                n.value = value;
                m_buckets[hash]
= n;
                return;
            }

            while ( n.next != null )
        
   {
                if ( n.key.equals(key) )
                {
                    n.value
= value;
                    return;
                }

                n = n.next;
     
      }

            Node newNode = new Node();
            newNode.key = key;
          
 newNode.value = value;
            n.next = newNode;
        }
    }

    /**
     * Add
an object into the buffer.
     *
     * @throws BufferOverflowException if adding this element
exceeds the
     *         buffer's capacity.
     */
    public Object get( final Object
key )
    {
        if ( null == key )
        {
            return null;
        }

    
   int hash = getHash( key );

        synchronized( m_locks[hash] )
        {
          
 Node n = m_buckets[hash];

            while ( n != null )
            {
               
if ( n.key.equals(key) )
                {
                    return n.value;
          
     }

                n = n.next;
            }
        }

        return null;
    }

   /**
     * Add an object into the buffer.
     *
     * @throws BufferOverflowException
if adding this element exceeds the
     *         buffer's capacity.
     */
    public boolean
containsKey( final Object key )
    {
        if ( null == key )
        {
            return
false;
        }

        int hash = getHash( key );

        synchronized( m_locks[hash]
)
        {
            Node n = m_buckets[hash];

            while ( n != null )
      
     {
                if ( n.key.equals(key) )
                {
                    return
true;
                }

                n = n.next;
            }
        }

        return
false;
    }

    /**
     * Removes the next object from the buffer.
     *
     * @throws
BufferUnderflowException if the buffer is already empty
     */
    public Object remove(
Object key )
    {
        if ( null == key )
        {
            return null;
        }

       int hash = getHash( key );

        synchronized( m_locks[hash] )
        {
      
     Node n = m_buckets[hash];
            Node prev = null;

            while ( n != null
)
            {
                if ( n.key.equals( key ) )
                {
            
       if ( null == prev )
                    {
                        m_buckets[hash] =
n.next;
                    }
                    else
                    {
            
           prev.next = n.next;
                    }

                    return n.value;
               }

                prev = n;
                n = n.next;
            }
   
    }

        return null;
    }

    private final static class Node
    {
        protected
Object key;
        protected Object value;
        protected Node next;
    }
}

  \ No newline at end of file
  
  
  

--
To unsubscribe, e-mail:   <mailto:avalon-cvs-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:avalon-cvs-help@jakarta.apache.org>


Mime
View raw message