Updated with new support for Windows NT in front end and thread lib
[dyninst.git] / pdutil / src / CircularBuffer.C
1 /*
2  * Copyright (c) 1996 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 /* 
43  * CircularBuffer.C
44  * member functions for the circularBuffer class
45  *
46  * $Log: CircularBuffer.C,v $
47  * Revision 1.2  1996/08/16 21:31:44  tamches
48  * updated copyright for release 1.1
49  *
50  * Revision 1.1  1996/02/22 17:47:26  karavan
51  * Initial version.
52  *
53  */
54
55 #include <iostream.h>
56 #include "util/h/CircularBuffer.h"
57
58 template <class Type, int Size>
59 circularBuffer<Type, Size>::circularBuffer ()  
60 {
61   first = 0;
62   last = 0;
63   count = 0;
64 }
65
66 template <class Type, int Size>
67 circularBuffer<Type, Size>::~circularBuffer ()
68 {
69   ;
70 }
71
72 template <class Type, int Size>
73 void circularBuffer<Type, Size>::print()
74 {
75   if (isEmpty()) {
76     cout << "\tCircular Buffer is empty" << endl;
77     return;
78   }
79   cout << "\tCircular Buffer Contents:" << endl;
80   int index = first;
81   int total = 0;
82   while ((total < count) && (index < Size)) {
83     cout << bufData[index] ; 
84     index++;
85     total++;
86   }
87   index = 0;
88   while (total < count) {
89     cout << bufData[index];
90     index++;
91     total++;
92   }
93   cout << endl;
94 }
95
96 template <class Type, int Size>
97 bool circularBuffer<Type, Size>::add (Type *t)
98 {
99   bufData[last] = *t;
100   if (last == (Size - 1))
101     last = 0;
102   else
103     last++;
104   if (count == Size) {
105     // overflow
106     if (first == (Size -1)) first = 0; else first++;
107     return true;
108   } else {
109     count++;
110     return false;
111   }
112 }
113
114 // assumes nonempty
115 template <class Type, int Size>
116 Type circularBuffer<Type, Size>::remove ()
117 {
118   int retIndex = first;
119   if (first == (Size - 1))
120     first = 0;
121   else
122     first++;
123   count--;
124   return bufData[retIndex];
125 }
126
127 template <class Type, int Size>
128 const Type *circularBuffer<Type, Size>::peek ()
129 {
130   if (isEmpty())
131     return (Type*)NULL;
132   return &(bufData[first]);
133 }
134