KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > avalon > excalibur > collections > VariableSizeBuffer


1 /*
2
3  ============================================================================
4                    The Apache Software License, Version 1.1
5  ============================================================================
6  
7  Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
8  
9  Redistribution and use in source and binary forms, with or without modifica-
10  tion, are permitted provided that the following conditions are met:
11  
12  1. Redistributions of source code must retain the above copyright notice,
13     this list of conditions and the following disclaimer.
14  
15  2. Redistributions in binary form must reproduce the above copyright notice,
16     this list of conditions and the following disclaimer in the documentation
17     and/or other materials provided with the distribution.
18  
19  3. The end-user documentation included with the redistribution, if any, must
20     include the following acknowledgment: "This product includes software
21     developed by the Apache Software Foundation (http://www.apache.org/)."
22     Alternately, this acknowledgment may appear in the software itself, if
23     and wherever such third-party acknowledgments normally appear.
24  
25  4. The names "Jakarta", "Avalon", "Excalibur" and "Apache Software Foundation"
26     must not be used to endorse or promote products derived from this software
27     without prior written permission. For written permission, please contact
28     apache@apache.org.
29  
30  5. Products derived from this software may not be called "Apache", nor may
31     "Apache" appear in their name, without prior written permission of the
32     Apache Software Foundation.
33  
34  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
35  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
36  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
37  APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
38  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
39  DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
40  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
41  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
42  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
43  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44  
45  This software consists of voluntary contributions made by many individuals
46  on behalf of the Apache Software Foundation. For more information on the
47  Apache Software Foundation, please see <http://www.apache.org/>.
48  
49 */

50 package org.apache.avalon.excalibur.collections;
51
52 /**
53  * VariableSizeBuffer is a <strong>very</strong> efficient buffer implementation.
54  * According to performance testing, it exhibits a constant access time, but it
55  * also outperforms ArrayList when used for the same purpose.
56  *
57  * @deprecated use org.apache.commons.collections.UnboundedFifoBuffer instead
58  *
59  * @author <a HREF="fede@apache.org">Federico Barbieri</a>
60  * @author <a HREF="bloritsch@apache.org">Berin Loritsch</a>
61  * @version CVS $Revision: 1.4 $ $Date: 2003/03/22 12:46:22 $
62  * @since 4.0
63  */

64 public final class VariableSizeBuffer implements Buffer
65 {
66     protected Object JavaDoc[] m_buffer;
67     protected int m_head;
68     protected int m_tail;
69
70     /**
71      * Initialize the VariableSizeBuffer with the specified number of elements. The
72      * integer must be a positive integer.
73      */

74     public VariableSizeBuffer( int size )
75     {
76         m_buffer = new Object JavaDoc[ size + 1 ];
77         m_head = 0;
78         m_tail = 0;
79     }
80
81     /**
82      * Initialize the VariableSizeBuffer with the default number of elements. It is
83      * exactly the same as performing the following:
84      *
85      * <pre>
86      * new VariableSizeBuffer( 32 );
87      * </pre>
88      */

89     public VariableSizeBuffer()
90     {
91         this( 32 );
92     }
93
94     /**
95      * Tests to see if the CircularBuffer is empty.
96      */

97     public final boolean isEmpty()
98     {
99         return ( size() == 0 );
100     }
101
102     /**
103      * Returns the number of elements stored in the buffer.
104      */

105     public final int size()
106     {
107         int size = 0;
108
109         if( m_tail < m_head )
110         {
111             size = m_buffer.length - m_head + m_tail;
112         }
113         else
114         {
115             size = m_tail - m_head;
116         }
117
118         return size;
119     }
120
121     /**
122      * Add an object into the buffer
123      */

124     public final void add( final Object JavaDoc o )
125     {
126         if( null == o )
127         {
128             throw new NullPointerException JavaDoc( "Attempted to add null object to buffer" );
129         }
130
131         if( size() + 1 >= m_buffer.length )
132         {
133             Object JavaDoc[] tmp = new Object JavaDoc[ ( ( m_buffer.length - 1 ) * 2 ) + 1 ];
134
135             int j = 0;
136             for( int i = m_head; i != m_tail; )
137             {
138                 tmp[ j ] = m_buffer[ i ];
139                 m_buffer[ i ] = null;
140
141                 j++;
142                 i++;
143                 if( i == m_buffer.length )
144                 {
145                     i = 0;
146                 }
147             }
148
149             m_buffer = tmp;
150             m_head = 0;
151             m_tail = j;
152         }
153
154         m_buffer[ m_tail ] = o;
155         m_tail++;
156         if( m_tail >= m_buffer.length )
157         {
158             m_tail = 0;
159         }
160     }
161
162     /**
163      * Removes the next object from the buffer
164      */

165     public Object JavaDoc remove()
166     {
167         if( isEmpty() )
168         {
169             throw new BufferUnderflowException( "The buffer is already empty" );
170         }
171
172         Object JavaDoc element = m_buffer[ m_head ];
173
174         if( null != element )
175         {
176             m_buffer[ m_head ] = null;
177
178             m_head++;
179             if( m_head >= m_buffer.length )
180             {
181                 m_head = 0;
182             }
183         }
184
185         return element;
186     }
187 }
188
189
Popular Tags