| Index: third_party/protobuf/src/google/protobuf/map_entry_lite.h
|
| diff --git a/third_party/protobuf/src/google/protobuf/map_entry_lite.h b/third_party/protobuf/src/google/protobuf/map_entry_lite.h
|
| index bb1d7e06b5ecf9619aa7b8e6d28b8f8f51cdcd47..7cdf1b9379d1bcbdd034efbfe6d3a6b6681a5a65 100644
|
| --- a/third_party/protobuf/src/google/protobuf/map_entry_lite.h
|
| +++ b/third_party/protobuf/src/google/protobuf/map_entry_lite.h
|
| @@ -31,7 +31,6 @@
|
| #ifndef GOOGLE_PROTOBUF_MAP_ENTRY_LITE_H__
|
| #define GOOGLE_PROTOBUF_MAP_ENTRY_LITE_H__
|
|
|
| -#include <assert.h>
|
| #include <google/protobuf/map_type_handler.h>
|
| #include <google/protobuf/wire_format_lite_inl.h>
|
|
|
| @@ -55,38 +54,6 @@ class MapFieldLite;
|
| namespace protobuf {
|
| namespace internal {
|
|
|
| -// MoveHelper::Move is used to set *dest. It copies *src, or moves it (in
|
| -// the C++11 sense), or swaps it. *src is left in a sane state for
|
| -// subsequent destruction, but shouldn't be used for anything.
|
| -template <bool is_enum, bool is_message, bool is_stringlike, typename T>
|
| -struct MoveHelper { // primitives
|
| - static void Move(T* src, T* dest) { *dest = *src; }
|
| -};
|
| -
|
| -template <bool is_message, bool is_stringlike, typename T>
|
| -struct MoveHelper<true, is_message, is_stringlike, T> { // enums
|
| - static void Move(T* src, T* dest) { *dest = *src; }
|
| - // T is an enum here, so allow conversions to and from int.
|
| - static void Move(T* src, int* dest) { *dest = static_cast<int>(*src); }
|
| - static void Move(int* src, T* dest) { *dest = static_cast<T>(*src); }
|
| -};
|
| -
|
| -template <bool is_stringlike, typename T>
|
| -struct MoveHelper<false, true, is_stringlike, T> { // messages
|
| - static void Move(T* src, T* dest) { dest->Swap(src); }
|
| -};
|
| -
|
| -template <typename T>
|
| -struct MoveHelper<false, false, true, T> { // strings and similar
|
| - static void Move(T* src, T* dest) {
|
| -#if __cplusplus >= 201103L
|
| - *dest = std::move(*src);
|
| -#else
|
| - dest->swap(*src);
|
| -#endif
|
| - }
|
| -};
|
| -
|
| // MapEntryLite is used to implement parsing and serialization of map for lite
|
| // runtime.
|
| template <typename Key, typename Value,
|
| @@ -119,7 +86,7 @@ class MapEntryLite : public MessageLite {
|
| kKeyFieldNumber, KeyTypeHandler::kWireType);
|
| static const uint8 kValueTag = GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(
|
| kValueFieldNumber, ValueTypeHandler::kWireType);
|
| - static const size_t kTagSize = 1;
|
| + static const int kTagSize = 1;
|
|
|
| public:
|
| ~MapEntryLite() {
|
| @@ -171,7 +138,7 @@ class MapEntryLite : public MessageLite {
|
| // need to care whether the value is unknown enum;
|
| // 4) missing key/value: missed key/value will have default value. caller
|
| // should take this entry as if key/value is set to default value.
|
| - tag = input->ReadTagNoLastTag();
|
| + tag = input->ReadTag();
|
| switch (tag) {
|
| case kKeyTag:
|
| if (!KeyTypeHandler::Read(input, mutable_key())) {
|
| @@ -201,8 +168,8 @@ class MapEntryLite : public MessageLite {
|
| }
|
| }
|
|
|
| - size_t ByteSizeLong() const {
|
| - size_t size = 0;
|
| + int ByteSize() const {
|
| + int size = 0;
|
| size += has_key() ? kTagSize + KeyTypeHandler::ByteSize(key()) : 0;
|
| size += has_value() ? kTagSize + ValueTypeHandler::ByteSize(value()) : 0;
|
| return size;
|
| @@ -213,16 +180,10 @@ class MapEntryLite : public MessageLite {
|
| ValueTypeHandler::Write(kValueFieldNumber, value(), output);
|
| }
|
|
|
| - ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(bool deterministic,
|
| - ::google::protobuf::uint8* output) const {
|
| - output = KeyTypeHandler::InternalWriteToArray(kKeyFieldNumber, key(),
|
| - deterministic, output);
|
| - output = ValueTypeHandler::InternalWriteToArray(kValueFieldNumber, value(),
|
| - deterministic, output);
|
| - return output;
|
| - }
|
| ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const {
|
| - return InternalSerializeWithCachedSizesToArray(false, output);
|
| + output = KeyTypeHandler::WriteToArray(kKeyFieldNumber, key(), output);
|
| + output = ValueTypeHandler::WriteToArray(kValueFieldNumber, value(), output);
|
| + return output;
|
| }
|
|
|
| int GetCachedSize() const {
|
| @@ -310,111 +271,6 @@ class MapEntryLite : public MessageLite {
|
| arena, key, value);
|
| }
|
|
|
| - // Parsing using MergePartialFromCodedStream, above, is not as
|
| - // efficient as it could be. This helper class provides a speedier way.
|
| - template <typename MapField, typename Map>
|
| - class Parser {
|
| - public:
|
| - explicit Parser(MapField* mf) : mf_(mf), map_(mf->MutableMap()) {}
|
| -
|
| - // This does what the typical MergePartialFromCodedStream() is expected to
|
| - // do, with the additional side-effect that if successful (i.e., if true is
|
| - // going to be its return value) it inserts the key-value pair into map_.
|
| - bool MergePartialFromCodedStream(::google::protobuf::io::CodedInputStream* input) {
|
| - // Look for the expected thing: a key and then a value. If it fails,
|
| - // invoke the enclosing class's MergePartialFromCodedStream, or return
|
| - // false if that would be pointless.
|
| - if (input->ExpectTag(kKeyTag)) {
|
| - if (!KeyTypeHandler::Read(input, &key_)) {
|
| - return false;
|
| - }
|
| - // Peek at the next byte to see if it is kValueTag. If not, bail out.
|
| - const void* data;
|
| - int size;
|
| - input->GetDirectBufferPointerInline(&data, &size);
|
| - // We could use memcmp here, but we don't bother. The tag is one byte.
|
| - GOOGLE_COMPILE_ASSERT(kTagSize == 1, tag_size_error);
|
| - if (size > 0 && *reinterpret_cast<const char*>(data) == kValueTag) {
|
| - typename Map::size_type size = map_->size();
|
| - value_ptr_ = &(*map_)[key_];
|
| - if (GOOGLE_PREDICT_TRUE(size != map_->size())) {
|
| - // We created a new key-value pair. Fill in the value.
|
| - typedef
|
| - typename MapIf<ValueTypeHandler::kIsEnum, int*, Value*>::type T;
|
| - input->Skip(kTagSize); // Skip kValueTag.
|
| - if (!ValueTypeHandler::Read(input,
|
| - reinterpret_cast<T>(value_ptr_))) {
|
| - map_->erase(key_); // Failure! Undo insertion.
|
| - return false;
|
| - }
|
| - if (input->ExpectAtEnd()) return true;
|
| - return ReadBeyondKeyValuePair(input);
|
| - }
|
| - }
|
| - } else {
|
| - key_ = Key();
|
| - }
|
| -
|
| - entry_.reset(mf_->NewEntry());
|
| - *entry_->mutable_key() = key_;
|
| - const bool result = entry_->MergePartialFromCodedStream(input);
|
| - if (result) UseKeyAndValueFromEntry();
|
| - if (entry_->GetArena() != NULL) entry_.release();
|
| - return result;
|
| - }
|
| -
|
| - const Key& key() const { return key_; }
|
| - const Value& value() const { return *value_ptr_; }
|
| -
|
| - private:
|
| - void UseKeyAndValueFromEntry() GOOGLE_ATTRIBUTE_COLD {
|
| - // Update key_ in case we need it later (because key() is called).
|
| - // This is potentially inefficient, especially if the key is
|
| - // expensive to copy (e.g., a long string), but this is a cold
|
| - // path, so it's not a big deal.
|
| - key_ = entry_->key();
|
| - value_ptr_ = &(*map_)[key_];
|
| - MoveHelper<ValueTypeHandler::kIsEnum,
|
| - ValueTypeHandler::kIsMessage,
|
| - ValueTypeHandler::kWireType ==
|
| - WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
|
| - Value>::Move(entry_->mutable_value(), value_ptr_);
|
| - }
|
| -
|
| - // After reading a key and value successfully, and inserting that data
|
| - // into map_, we are not at the end of the input. This is unusual, but
|
| - // allowed by the spec.
|
| - bool ReadBeyondKeyValuePair(::google::protobuf::io::CodedInputStream* input)
|
| - GOOGLE_ATTRIBUTE_COLD {
|
| - typedef MoveHelper<KeyTypeHandler::kIsEnum,
|
| - KeyTypeHandler::kIsMessage,
|
| - KeyTypeHandler::kWireType ==
|
| - WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
|
| - Key> KeyMover;
|
| - typedef MoveHelper<ValueTypeHandler::kIsEnum,
|
| - ValueTypeHandler::kIsMessage,
|
| - ValueTypeHandler::kWireType ==
|
| - WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
|
| - Value> ValueMover;
|
| - entry_.reset(mf_->NewEntry());
|
| - ValueMover::Move(value_ptr_, entry_->mutable_value());
|
| - map_->erase(key_);
|
| - KeyMover::Move(&key_, entry_->mutable_key());
|
| - const bool result = entry_->MergePartialFromCodedStream(input);
|
| - if (result) UseKeyAndValueFromEntry();
|
| - if (entry_->GetArena() != NULL) entry_.release();
|
| - return result;
|
| - }
|
| -
|
| - MapField* const mf_;
|
| - Map* const map_;
|
| - Key key_;
|
| - Value* value_ptr_;
|
| - // On the fast path entry_ is not used. And, when entry_ is used, it's set
|
| - // to mf_->NewEntry(), so in the arena case we must call entry_.release.
|
| - google::protobuf::scoped_ptr<MapEntryLite> entry_;
|
| - };
|
| -
|
| protected:
|
| void set_has_key() { _has_bits_[0] |= 0x00000001u; }
|
| bool has_key() const { return (_has_bits_[0] & 0x00000001u) != 0; }
|
| @@ -538,32 +394,6 @@ class MapEntryLite : public MessageLite {
|
| GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntryLite);
|
| };
|
|
|
| -// Helpers for deterministic serialization =============================
|
| -
|
| -// This struct can be used with any generic sorting algorithm. If the Key
|
| -// type is relatively small and easy to copy then copying Keys into an
|
| -// array of SortItems can be beneficial. Then all the data the sorting
|
| -// algorithm needs to touch is in that one array.
|
| -template <typename Key, typename PtrToKeyValuePair> struct SortItem {
|
| - SortItem() {}
|
| - explicit SortItem(PtrToKeyValuePair p) : first(p->first), second(p) {}
|
| -
|
| - Key first;
|
| - PtrToKeyValuePair second;
|
| -};
|
| -
|
| -template <typename T> struct CompareByFirstField {
|
| - bool operator()(const T& a, const T& b) const {
|
| - return a.first < b.first;
|
| - }
|
| -};
|
| -
|
| -template <typename T> struct CompareByDerefFirst {
|
| - bool operator()(const T& a, const T& b) const {
|
| - return a->first < b->first;
|
| - }
|
| -};
|
| -
|
| } // namespace internal
|
| } // namespace protobuf
|
|
|
|
|