Initial version.
[dyninst.git] / pdutil / src / CircularBuffer.C
1 /*
2  * Copyright (c) 1993, 1994 Barton P. Miller, Jeff Hollingsworth,
3  *     Bruce Irvin, Jon Cargille, Krishna Kunchithapadam, Karen
4  *     Karavanic, Tia Newhall, Mark Callaghan.  All rights reserved.
5  * 
6  * This software is furnished under the condition that it may not be
7  * provided or otherwise made available to, or used by, any other
8  * person, except as provided for by the terms of applicable license
9  * agreements.  No title to or ownership of the software is hereby
10  * transferred.  The name of the principals may not be used in any
11  * advertising or publicity related to this software without specific,
12  * written prior authorization.  Any use of this software must include
13  * the above copyright notice.
14  *
15  */
16
17 /* 
18  * CircularBuffer.C
19  * member functions for the circularBuffer class
20  *
21  * $Log: CircularBuffer.C,v $
22  * Revision 1.1  1996/02/22 17:47:26  karavan
23  * Initial version.
24  *
25  */
26
27 #include <iostream.h>
28 #include "util/h/CircularBuffer.h"
29
30 template <class Type, int Size>
31 circularBuffer<Type, Size>::circularBuffer ()  
32 {
33   first = 0;
34   last = 0;
35   count = 0;
36 }
37
38 template <class Type, int Size>
39 circularBuffer<Type, Size>::~circularBuffer ()
40 {
41   ;
42 }
43
44 template <class Type, int Size>
45 void circularBuffer<Type, Size>::print()
46 {
47   if (isEmpty()) {
48     cout << "\tCircular Buffer is empty" << endl;
49     return;
50   }
51   cout << "\tCircular Buffer Contents:" << endl;
52   int index = first;
53   int total = 0;
54   while ((total < count) && (index < Size)) {
55     cout << bufData[index] ; 
56     index++;
57     total++;
58   }
59   index = 0;
60   while (total < count) {
61     cout << bufData[index];
62     index++;
63     total++;
64   }
65   cout << endl;
66 }
67
68 template <class Type, int Size>
69 bool circularBuffer<Type, Size>::add (Type *t)
70 {
71   bufData[last] = *t;
72   if (last == (Size - 1))
73     last = 0;
74   else
75     last++;
76   if (count == Size) {
77     // overflow
78     if (first == (Size -1)) first = 0; else first++;
79     return true;
80   } else {
81     count++;
82     return false;
83   }
84 }
85
86 // assumes nonempty
87 template <class Type, int Size>
88 Type circularBuffer<Type, Size>::remove ()
89 {
90   int retIndex = first;
91   if (first == (Size - 1))
92     first = 0;
93   else
94     first++;
95   count--;
96   return bufData[retIndex];
97 }
98
99 template <class Type, int Size>
100 const Type *circularBuffer<Type, Size>::peek ()
101 {
102   if (isEmpty())
103     return (Type*)NULL;
104   return &(bufData[first]);
105 }
106