Mercurial > hg > orthanc
annotate OrthancFramework/Sources/ChunkedBuffer.cpp @ 4543:5b1b46f3fcca Orthanc-1.7.3
close branch
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 02 Mar 2021 16:52:24 +0100 |
parents | 8c559dd5034b |
children | 0034f855c023 |
rev | line source |
---|---|
0 | 1 /** |
59 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
874
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
3640
94f4a18a79cc
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3385
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
4119
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public License |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
10 * the License, or (at your option) any later version. |
136 | 11 * |
0 | 12 * This program is distributed in the hope that it will be useful, but |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
4119
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
15 * Lesser General Public License for more details. |
0 | 16 * |
4119
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
18 * License along with this program. If not, see |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
19 * <http://www.gnu.org/licenses/>. |
0 | 20 **/ |
21 | |
22 | |
824
a811bdf8b8eb
precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
23 #include "PrecompiledHeaders.h" |
0 | 24 #include "ChunkedBuffer.h" |
25 | |
26 #include <cassert> | |
27 #include <string.h> | |
28 | |
29 | |
59 | 30 namespace Orthanc |
0 | 31 { |
32 void ChunkedBuffer::Clear() | |
33 { | |
34 numBytes_ = 0; | |
4150
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
35 pendingPos_ = 0; |
0 | 36 |
37 for (Chunks::iterator it = chunks_.begin(); | |
656 | 38 it != chunks_.end(); ++it) |
0 | 39 { |
40 delete *it; | |
41 } | |
42 } | |
43 | |
44 | |
4150
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
45 void ChunkedBuffer::AddChunkInternal(const void* chunkData, |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
46 size_t chunkSize) |
0 | 47 { |
48 if (chunkSize == 0) | |
49 { | |
50 return; | |
51 } | |
2040
6ea2e264ca50
retrieval of HTTP headers in answers within HttpClient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1921
diff
changeset
|
52 else |
6ea2e264ca50
retrieval of HTTP headers in answers within HttpClient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1921
diff
changeset
|
53 { |
6ea2e264ca50
retrieval of HTTP headers in answers within HttpClient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1921
diff
changeset
|
54 assert(chunkData != NULL); |
6ea2e264ca50
retrieval of HTTP headers in answers within HttpClient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1921
diff
changeset
|
55 chunks_.push_back(new std::string(reinterpret_cast<const char*>(chunkData), chunkSize)); |
6ea2e264ca50
retrieval of HTTP headers in answers within HttpClient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1921
diff
changeset
|
56 numBytes_ += chunkSize; |
6ea2e264ca50
retrieval of HTTP headers in answers within HttpClient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1921
diff
changeset
|
57 } |
0 | 58 } |
59 | |
60 | |
4150
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
61 void ChunkedBuffer::FlushPendingBuffer() |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
62 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
63 assert(pendingPos_ <= pendingBuffer_.size()); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
64 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
65 if (!pendingBuffer_.empty()) |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
66 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
67 AddChunkInternal(pendingBuffer_.c_str(), pendingPos_); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
68 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
69 else |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
70 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
71 assert(pendingPos_ == 0); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
72 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
73 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
74 pendingPos_ = 0; |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
75 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
76 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
77 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
78 ChunkedBuffer::ChunkedBuffer() : |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
79 numBytes_(0), |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
80 pendingPos_(0) |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
81 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
82 pendingBuffer_.resize(16 * 1024); // Default size of the pending buffer: 16KB |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
83 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
84 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
85 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
86 void ChunkedBuffer::SetPendingBufferSize(size_t size) |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
87 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
88 FlushPendingBuffer(); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
89 pendingBuffer_.resize(size); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
90 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
91 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
92 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
93 void ChunkedBuffer::AddChunk(const void* chunkData, |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
94 size_t chunkSize) |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
95 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
96 if (chunkSize > 0) |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
97 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
98 #if 1 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
99 assert(sizeof(char) == 1); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
100 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
101 // Optimization if Orthanc >= 1.7.3, to speed up in the presence of many small chunks |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
102 if (pendingPos_ + chunkSize <= pendingBuffer_.size()) |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
103 { |
4151
8c559dd5034b
Fix possible crash in HttpClient if sending multipart body (can occur in STOW-RS)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4150
diff
changeset
|
104 // There remains enough place in the pending buffer |
4150
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
105 memcpy(&pendingBuffer_[pendingPos_], chunkData, chunkSize); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
106 pendingPos_ += chunkSize; |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
107 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
108 else |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
109 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
110 FlushPendingBuffer(); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
111 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
112 if (!pendingBuffer_.empty() && |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
113 chunkSize < pendingBuffer_.size()) |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
114 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
115 memcpy(&pendingBuffer_[0], chunkData, chunkSize); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
116 pendingPos_ = chunkSize; |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
117 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
118 else |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
119 { |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
120 AddChunkInternal(chunkData, chunkSize); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
121 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
122 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
123 #else |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
124 // Non-optimized implementation in Orthanc <= 1.7.2 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
125 AddChunkInternal(chunkData, chunkSize); |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
126 #endif |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
127 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
128 } |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
129 |
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
130 |
874
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
131 void ChunkedBuffer::AddChunk(const std::string& chunk) |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
132 { |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
133 if (chunk.size() > 0) |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
134 { |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
135 AddChunk(&chunk[0], chunk.size()); |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
136 } |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
137 } |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
138 |
87791ebc1f50
download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
139 |
4148
732ad6c618ba
removing ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
140 void ChunkedBuffer::AddChunk(const std::string::const_iterator& begin, |
732ad6c618ba
removing ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
141 const std::string::const_iterator& end) |
3385
f5467ab24aa4
ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
142 { |
4148
732ad6c618ba
removing ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
143 const size_t s = end - begin; |
732ad6c618ba
removing ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
144 |
732ad6c618ba
removing ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
145 if (s > 0) |
3385
f5467ab24aa4
ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
146 { |
4148
732ad6c618ba
removing ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
147 AddChunk(&begin[0], s); |
3385
f5467ab24aa4
ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
148 } |
f5467ab24aa4
ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
149 } |
4148
732ad6c618ba
removing ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
150 |
3385
f5467ab24aa4
ChunkedBuffer::AddChunkDestructive()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
151 |
0 | 152 void ChunkedBuffer::Flatten(std::string& result) |
153 { | |
4150
b56f3a37a4a1
optimization of ChunkedBuffer if many small chunks are added
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4148
diff
changeset
|
154 FlushPendingBuffer(); |
0 | 155 result.resize(numBytes_); |
156 | |
157 size_t pos = 0; | |
158 for (Chunks::iterator it = chunks_.begin(); | |
656 | 159 it != chunks_.end(); ++it) |
0 | 160 { |
161 assert(*it != NULL); | |
162 | |
163 size_t s = (*it)->size(); | |
164 if (s != 0) | |
165 { | |
166 memcpy(&result[pos], (*it)->c_str(), s); | |
167 pos += s; | |
168 } | |
169 | |
170 delete *it; | |
171 } | |
172 | |
173 chunks_.clear(); | |
1921 | 174 numBytes_ = 0; |
0 | 175 } |
176 } |