forked from norouzi/mih
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray32.cpp
More file actions
120 lines (98 loc) · 2.54 KB
/
array32.cpp
File metadata and controls
120 lines (98 loc) · 2.54 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
/* dynamic array of 32-bit integers
* arr[0] : array size (number of items inserted in the array)
* arr[1] : array capacity
* arr[2..] : array content
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include "array32.h"
/* no need for the static keywork in the definition */
double Array32::ARRAY_RESIZE_FACTOR = 1.1; // minimum is 1.0
double Array32::ARRAY_RESIZE_ADD_FACTOR = 1; // minimum is 1
void Array32::set_array_resize_factor(double arf) {
ARRAY_RESIZE_FACTOR = arf;
}
Array32::Array32() {
arr = NULL;
}
Array32::Array32(int capacity) {
arr = (UINT32*) calloc ((2+capacity), sizeof(UINT32));
arr[0] = 0;
arr[1] = capacity;
}
Array32& Array32::operator = (const Array32 &rhs) {
if (&rhs != this)
this->arr = rhs.arr;
}
Array32::~Array32 () {
cleanup();
}
void Array32::cleanup () {
free(arr); // sometimes call free on NULL pointers, but that should be fine.
}
void Array32::expand(int newsize) {
if (arr[1] < newsize) {
arr[1] = newsize;
arr[0] = newsize;
arr = (UINT32*) realloc(arr, sizeof(UINT32)*(2 + arr[1]));
}
}
void Array32::push(UINT32 data) {
if (arr) {
if (arr[0] == arr[1]) {
arr[1] = std::max(ceil(arr[1]*ARRAY_RESIZE_FACTOR), arr[1]+ARRAY_RESIZE_ADD_FACTOR);
arr = (UINT32*) realloc(arr, sizeof(UINT32)*(2 + arr[1]));
}
arr[2 + arr[0]++] = data;
} else {
arr = (UINT32*) malloc ((2+ARRAY_RESIZE_ADD_FACTOR)*sizeof(UINT32));
arr[0] = 1;
arr[1] = 1;
arr[2] = data;
}
}
void Array32::insert(UINT32 index, UINT32 data) {
if (arr) {
if (arr[0] == arr[1]) {
arr[1] = ceil(arr[0]*ARRAY_RESIZE_FACTOR);
arr = (UINT32*) realloc (arr, sizeof(UINT32)*(2 + arr[1]));
}
// if (index+1 < arr[0])
memmove(arr+(2+index)+1, arr+(2+index), (arr[0]-index)*sizeof(*arr));
// /* alternative to memmove */
// for (int i=2+arr[0]; i>2+index; i--)
// arr[i] = arr[i-1];
arr[2+index] = data;
arr[0]++;
// printf("index: %d, data: %d, array: ", index, data);
// print();
} else {
arr = (UINT32*) malloc (3*sizeof(UINT32));
arr[0] = 1;
arr[1] = 1;
arr[2] = data;
}
}
UINT32* Array32::data() {
return arr? arr + 2 : NULL;
}
UINT32 Array32::size() {
return arr ? arr[0] : 0;
}
UINT32 Array32::capacity() {
return arr ? arr[1] : 0;
}
void Array32::print() {
for (int i=0; i<size(); i++) {
printf("%d, ", arr[i+2]);
}
printf("\n");
}
void Array32::init(int size) {
if (arr == NULL) {
arr = (UINT32*) malloc ((2+size)*sizeof(UINT32));
arr[0] = 0;
arr[1] = size;
}
}