summaryrefslogtreecommitdiffstats
path: root/chromium/base/big_endian.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/base/big_endian.cc')
-rw-r--r--chromium/base/big_endian.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/chromium/base/big_endian.cc b/chromium/base/big_endian.cc
index 514581fe415..9e9e672e490 100644
--- a/chromium/base/big_endian.cc
+++ b/chromium/base/big_endian.cc
@@ -4,6 +4,7 @@
#include "base/big_endian.h"
+#include "base/numerics/checked_math.h"
#include "base/strings/string_piece.h"
namespace base {
@@ -59,6 +60,29 @@ bool BigEndianReader::ReadU64(uint64_t* value) {
return Read(value);
}
+template <typename T>
+bool BigEndianReader::ReadLengthPrefixed(base::StringPiece* out) {
+ T t_len;
+ if (!Read(&t_len))
+ return false;
+ size_t len = strict_cast<size_t>(t_len);
+ const char* original_ptr = ptr_;
+ if (!Skip(len)) {
+ ptr_ -= sizeof(T);
+ return false;
+ }
+ *out = base::StringPiece(original_ptr, len);
+ return true;
+}
+
+bool BigEndianReader::ReadU8LengthPrefixed(base::StringPiece* out) {
+ return ReadLengthPrefixed<uint8_t>(out);
+}
+
+bool BigEndianReader::ReadU16LengthPrefixed(base::StringPiece* out) {
+ return ReadLengthPrefixed<uint16_t>(out);
+}
+
BigEndianWriter::BigEndianWriter(char* buf, size_t len)
: ptr_(buf), end_(ptr_ + len) {}