-
Notifications
You must be signed in to change notification settings - Fork 131
Expand file tree
/
Copy pathgennodearray.cc
More file actions
127 lines (102 loc) · 2.56 KB
/
gennodearray.cc
File metadata and controls
127 lines (102 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
* NIST Utils Class Library
* clutils/gennodearray.h
* April 1997
* David Sauder
* K. C. Morris
* Development of this software was funded by the United States Government,
* and is not subject to copyright.
*/
#include "config.h"
#include "clutils/gennode.h"
#include "clutils/gennodelist.h"
#include "clutils/gennodearray.h"
#ifndef HAVE_MEMMOVE
extern "C" {
extern void * memmove( void *, const void *, size_t );
}
#endif
GenericNode::GenericNode() {
next = 0;
prev = 0;
}
GenericNode::~GenericNode() {
Remove();
}
GenNodeArray::GenNodeArray( int defaultSize ) {
_bufsize = defaultSize;
_buf = new GenericNode*[_bufsize];
memset( _buf, 0, _bufsize * sizeof( GenericNode * ) );
_count = 0;
}
GenNodeArray::~GenNodeArray() {
delete [] _buf;
}
int GenNodeArray::Index( GenericNode ** gn ) {
return ( ( gn - _buf ) / sizeof( GenericNode * ) );
}
void GenNodeArray::Append( GenericNode * gn ) {
Insert( gn, _count );
}
int GenNodeArray::Insert( GenericNode * gn ) {
return Insert( gn, _count );
}
void
GenNodeArray::Check( int index ) {
GenericNode ** newbuf;
if( index >= _bufsize ) {
_bufsize = ( index + 1 ) * 2;
newbuf = new GenericNode*[_bufsize];
memset( newbuf, 0, _bufsize * sizeof( GenericNode * ) );
memmove( newbuf, _buf, _count * sizeof( GenericNode * ) );
delete [] _buf;
_buf = newbuf;
}
}
int
GenNodeArray::Insert( GenericNode * gn, int index ) {
const GenericNode ** spot;
index = ( index < 0 ) ? _count : index;
if( index < _count ) {
Check( _count + 1 );
spot = ( const GenericNode ** )&_buf[index];
memmove( spot + 1, spot, ( _count - index )*sizeof( GenericNode * ) );
} else {
Check( index );
spot = ( const GenericNode ** )&_buf[index];
}
*spot = gn;
++_count;
return index;
}
void
GenNodeArray::Remove( int index ) {
if( 0 <= index && index < _count ) {
--_count;
const GenericNode ** spot = ( const GenericNode ** )&_buf[index];
memmove( spot, spot + 1, ( _count - index )*sizeof( GenericNode * ) );
_buf[_count] = 0;
}
}
void GenNodeArray::ClearEntries() {
int i;
for( i = 0 ; i < _count; i++ ) {
_buf[i] = 0;
}
_count = 0;
}
void GenNodeArray::DeleteEntries() {
int i;
for( i = 0 ; i < _count; i++ ) {
delete( _buf[i] );
}
_count = 0;
}
int GenNodeArray::Index( GenericNode * gn ) {
for( int i = 0; i < _count; ++i ) {
if( _buf[i] == gn ) {
return i;
}
}
return -1;
}