-
Notifications
You must be signed in to change notification settings - Fork 1
/
MemoryPool.java
108 lines (93 loc) · 2.65 KB
/
MemoryPool.java
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
import java.util.Arrays;
// -------------------------------------------------------------------------
/**
* memorypool class stores the record in byte type to memory pool.
*
* @author wenfeng ren (rwenfeng)
* @version Sep 7, 2014
*/
public class MemoryPool
{
/**
* memory pool array.
*/
private byte[] pool;
/**
* the blockSize uses to reallocate.
*/
private int blockSize;
// ----------------------------------------------------------
/**
* Create a new MemoryPool object and initial with blockSize.
*
* @param blockSize
* of the pool array
*/
public MemoryPool(int blockSize)
{
this.blockSize = blockSize;
pool = new byte[blockSize];
}
// ----------------------------------------------------------
/**
* store data to pool array at index "position".
*
* @param data
* to be stored into pool array
* @param position
* where the data inserted
*/
public void store(byte[] data, int position)
{
// store the length of record in first two bytes
pool[position] = (byte)(data.length >> 8);
pool[position + 1] = (byte)(data.length);
// copy the data into memory pool
for (int i = 0; i < data.length; i++)
{
pool[position + 2 + i] = data[i];
}
}
// ----------------------------------------------------------
/**
* get data in pool array with index "position".
*
* @param position
* where the data is
* @return data in pool array
*/
public byte read(int position)
{
byte size;
// read the size of record from first two bytes
size = (byte)(pool[position] << 8);
size = (byte)(size + pool[position + 1]);
return size;
}
// ----------------------------------------------------------
/**
* read from pool array to space array.
*
* @param space
* the record will be copied to
* @param position
* of the record
* @param size
* of the record
*/
public void read(byte[] space, int position, int size)
{
System.arraycopy(pool, position, space, 0, size);
}
// ----------------------------------------------------------
/**
* extends the size of memory pool array by twice of the original array.
*/
public void reallocate()
{
int newLength = pool.length + blockSize;
pool = Arrays.copyOf(pool, newLength);
System.out.println("Memory pool expanded to be " + newLength
+ " bytes.");
}
}