forked from panda3d/panda3d
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdcPackData.I
More file actions
137 lines (123 loc) · 3.26 KB
/
dcPackData.I
File metadata and controls
137 lines (123 loc) · 3.26 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
127
128
129
130
131
132
133
134
135
136
137
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file dcPackData.I
* @author drose
* @date 2004-06-15
*/
/**
*
*/
INLINE DCPackData::
DCPackData() {
_buffer = nullptr;
_allocated_size = 0;
_used_length = 0;
}
/**
*
*/
INLINE DCPackData::
~DCPackData() {
if (_buffer != nullptr) {
delete[] _buffer;
}
}
/**
* Empties the contents of the data (without necessarily freeing its allocated
* memory).
*/
INLINE void DCPackData::
clear() {
_used_length = 0;
}
/**
* Adds the indicated bytes to the end of the data.
*/
INLINE void DCPackData::
append_data(const char *buffer, size_t size) {
set_used_length(_used_length + size);
memcpy(_buffer + _used_length - size, buffer, size);
}
/**
* Adds the indicated number of bytes to the end of the data without
* initializing them, and returns a pointer to the beginning of the new data.
*/
INLINE char *DCPackData::
get_write_pointer(size_t size) {
set_used_length(_used_length + size);
return _buffer + _used_length - size;
}
/**
* Adds some uninitialized bytes to the end of the data.
*/
INLINE void DCPackData::
append_junk(size_t size) {
set_used_length(_used_length + size);
}
/**
* Changes the data at the indicated position to the given value. It is an
* error if there are not at least position + size bytes in the data.
*/
INLINE void DCPackData::
rewrite_data(size_t position, const char *buffer, size_t size) {
nassertv(position + size <= _used_length);
memcpy(_buffer + position, buffer, size);
}
/**
* Returns a pointer into the middle of the data at the indicated point.
*/
INLINE char *DCPackData::
get_rewrite_pointer(size_t position, size_t size) {
nassertr(position + size <= _used_length, nullptr);
return _buffer + position;
}
/**
* Returns the data buffer as a string. Also see get_data().
*/
INLINE std::string DCPackData::
get_string() const {
return std::string(_buffer, _used_length);
}
/**
* Returns the current length of the buffer. This is the number of useful
* bytes stored in the buffer, not the amount of memory it takes up.
*/
INLINE size_t DCPackData::
get_length() const {
return _used_length;
}
/**
* Returns the beginning of the data buffer. The buffer is not null-
* terminated, but see also get_string(). This may (or may not) return NULL if
* the buffer is empty.
*
* This may be used in conjunction with get_length() to copy all of the bytes
* out of the buffer.
*/
INLINE const char *DCPackData::
get_data() const {
return _buffer;
}
/**
* Returns the pointer to the beginning of the data buffer, and transfers
* ownership of the buffer to the caller. The caller is now responsible for
* ultimately freeing the returned pointer with delete[], if it is non-NULL.
* This may (or may not) return NULL if the buffer is empty.
*
* This also empties the DCPackData structure, and sets its length to zero (so
* you should call get_length() before calling this method).
*/
INLINE char *DCPackData::
take_data() {
char *data = _buffer;
_buffer = nullptr;
_allocated_size = 0;
_used_length = 0;
return data;
}