2
2
3
3
#include " LineSink.h"
4
4
5
- #include < algorithm>
6
5
#include < cstring>
7
6
8
7
LineFinder::LineFinder (LineSink &sink)
@@ -18,7 +17,7 @@ void LineFinder::add(const uint8_t *data, uint64_t length, bool last) {
18
17
lineData (data, lineEnd);
19
18
data = lineEnd + 1 ;
20
19
} else {
21
- std::copy (data, endData, std::back_inserter (lineBuffer_) );
20
+ append (data, endData);
22
21
break ;
23
22
}
24
23
}
@@ -36,7 +35,7 @@ void LineFinder::lineData(const uint8_t *begin, const uint8_t *end) {
36
35
reinterpret_cast <const char *>(begin), end - begin);
37
36
length = (end - begin) + 1 ;
38
37
} else {
39
- std::copy (begin, end, std::back_inserter (lineBuffer_) );
38
+ append (begin, end);
40
39
shouldAddLine = sink_.onLine (lineOffsets_.size () + 1 , currentLineOffset_,
41
40
&lineBuffer_[0 ], lineBuffer_.size ());
42
41
length = lineBuffer_.size () + 1 ;
@@ -46,3 +45,12 @@ void LineFinder::lineData(const uint8_t *begin, const uint8_t *end) {
46
45
lineOffsets_.emplace_back (currentLineOffset_);
47
46
currentLineOffset_ += length;
48
47
}
48
+
49
+ void LineFinder::append (const uint8_t *begin, const uint8_t *end) {
50
+ // Was: std::copy(begin, end, std::back_inserter(lineBuffer_));
51
+ // but it turns out that's pretty slow... so let's do this instead:
52
+ auto offset = lineBuffer_.size ();
53
+ auto size = end - begin;
54
+ lineBuffer_.resize (offset + size);
55
+ std::memcpy (lineBuffer_.data () + offset, begin, size);
56
+ }
0 commit comments