KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > bsf > debug > clientImpl > CircularBuffer


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

55
56 package org.apache.bsf.debug.clientImpl;
57
58
59 public class CircularBuffer {
60
61     Object JavaDoc m_elements[];
62     int m_pos,m_end;
63
64     public CircularBuffer() {
65         m_elements = new Object JavaDoc[256];
66     }
67     
68     /**
69      * Grow but be carefull that we might be already wrapped
70      * around where the end is before the current position
71      * (m_end<m_pos)
72      *
73      * |....E.... P....|
74      *
75      * in which case we have to grow the array and then
76      * copy the two parts:
77      * - 0 to E==m_end
78      * - P==m_pos to the end
79      * the free space is created in the middle (tmp.length
80      * free slots) and therefore m_pos needs to be updated.
81      */

82     private void grow() {
83         int p,q;
84         Object JavaDoc tmp[] = m_elements;
85         m_elements = new Object JavaDoc[2*m_elements.length];
86         if (m_pos<=m_end) {
87             for (p=m_pos;p<m_end;p++)
88                 m_elements[p] = tmp[p];
89         } else {
90             for (p=0;p<m_end;p++)
91                 m_elements[p] = tmp[p];
92
93             for (p=m_pos;p<tmp.length;p++)
94                 m_elements[p+tmp.length] = tmp[p];
95             
96             m_pos += tmp.length;
97         }
98     }
99
100     public synchronized void push(Object JavaDoc elem) {
101         
102       if (m_end==m_elements.length) {
103         // we are full but not warped,
104
// can we warp around?
105
if (m_pos==0) {
106             // no... therefore just grow.
107
grow();
108         } else {
109             // yes, warp;
110
m_end = 0;
111         }
112         m_elements[m_end++] = elem;
113         return;
114       }
115       if (m_pos<=m_end) {
116         // we are not wrapped and we
117
// are not full (above test)...
118
// just add the event.
119
m_elements[m_end++] = elem;
120         return;
121       }
122       // we are wrapped...
123
if (m_end==m_pos-1) {
124         // we are warpped and full, grow.
125
grow();
126       }
127       m_elements[m_end++] = elem;
128     }
129     //////////////////////////////////
130
public boolean isEmpty() {
131       return (m_pos==m_end);
132     }
133     //////////////////////////////////
134
public Object JavaDoc pop() {
135       Object JavaDoc elem;
136       
137       if (m_pos==m_end) return null;
138       elem = m_elements[m_pos++];
139       if (m_pos==m_elements.length &&
140           m_pos!=m_end)
141           m_pos=0;
142       return elem;
143     }
144     
145 }
146
147
Popular Tags