-
Notifications
You must be signed in to change notification settings - Fork 0
/
bufferwrap.cpp
116 lines (103 loc) · 2.18 KB
/
bufferwrap.cpp
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
#ifndef BUFFERWRAP_H
#include "bufferwrap.h"
#endif
template<class T>
BufferWrap<T>::BufferWrap():stored(0),tempOff(-1)
{
}
template<class T>
bool BufferWrap<T>::init(QOpenGLBuffer::Type type,
QOpenGLBuffer::UsagePattern use)
{
buffer = QOpenGLBuffer(type);
buffer.setUsagePattern(use);
return buffer.create();
}
template<class T>
bool BufferWrap<T>::bind()
{
return buffer.bind();
}
template<class T>
void BufferWrap<T>::release()
{
buffer.release();
}
template<class T>
int BufferWrap<T>::count() const
{
return stored;
}
template<class T>
int BufferWrap<T>::capacity() const
{
return buffer.size()/sizeof(T);
}
template<class T>
int BufferWrap<T>::add(const T &t)
{
if(!delQ.empty()){
int i = delQ.dequeue();
place(i,t);
return i;
}
if(capacity()==count()){
int i = capacity();
extend(1);
place(i,t);
stored++;
return i;
}
int i = count();
place(i,t);
stored++;
return i;
}
template<class T>
void BufferWrap<T>::allocateTemporary(const QVector<T> &tmp)
{
reloc(count()+tmp.size());
buffer.write(count()*sizeof(T),tmp.data(),tmp.size()*sizeof(T));
tempOff = count()*sizeof(T);
}
template<class T>
int BufferWrap<T>::tempOffest() const
{
return tempOff;
}
template<class T>
void BufferWrap<T>::dropTemporary()
{
tempOff = -1;
}
template<class T>
void BufferWrap<T>::extend(int count)
{
if(count<0) return;
if(buffer.size()<=0){
buffer.allocate(count);
return;
}
QByteArray data(buffer.size(),'0');
buffer.read(0,data.data(),buffer.size());
buffer.allocate(buffer.size()+count*sizeof(T));
buffer.write(0,data.data(),data.size());
}
template<class T>
void BufferWrap<T>::reloc(int count)
{
if(count<0) return;
if(buffer.size()<=0){
buffer.allocate(count*sizeof(T));
return;
}
QByteArray data(buffer.size(),'0');
buffer.read(0,data.data(),buffer.size());
buffer.allocate(count*sizeof(T));
buffer.write(0,data.data(),qMin(buffer.size(),data.size()));
}
template<class T>
void BufferWrap<T>::place(int i, const T&&t)
{
buffer.write(i*sizeof(T),&t,sizeof(T));
}