Home | History | Annotate | Download | only in protobuf
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 #ifndef GOOGLE_PROTOBUF_MAP_FIELD_INL_H__
     32 #define GOOGLE_PROTOBUF_MAP_FIELD_INL_H__
     33 
     34 #include <memory>
     35 #ifndef _SHARED_PTR_H
     36 #include <google/protobuf/stubs/shared_ptr.h>
     37 #endif
     38 
     39 #include <google/protobuf/map.h>
     40 #include <google/protobuf/map_field.h>
     41 #include <google/protobuf/map_type_handler.h>
     42 
     43 namespace google {
     44 namespace protobuf {
     45 namespace internal {
     46 // UnwrapMapKey template
     47 template<typename T>
     48 T UnwrapMapKey(const MapKey& map_key);
     49 template<>
     50 inline int32 UnwrapMapKey<int32>(const MapKey& map_key) {
     51   return map_key.GetInt32Value();
     52 }
     53 template<>
     54 inline uint32 UnwrapMapKey<uint32>(const MapKey& map_key) {
     55   return map_key.GetUInt32Value();
     56 }
     57 template<>
     58 inline int64 UnwrapMapKey<int64>(const MapKey& map_key) {
     59   return map_key.GetInt64Value();
     60 }
     61 template<>
     62 inline uint64 UnwrapMapKey<uint64>(const MapKey& map_key) {
     63   return map_key.GetUInt64Value();
     64 }
     65 template<>
     66 inline bool UnwrapMapKey<bool>(const MapKey& map_key) {
     67   return map_key.GetBoolValue();
     68 }
     69 template<>
     70 inline string UnwrapMapKey<string>(const MapKey& map_key) {
     71   return map_key.GetStringValue();
     72 }
     73 
     74 // SetMapKey template
     75 template<typename T>
     76 inline void SetMapKey(MapKey* map_key, const T& value);
     77 template<>
     78 inline void SetMapKey<int32>(MapKey* map_key, const int32& value) {
     79   map_key->SetInt32Value(value);
     80 }
     81 template<>
     82 inline void SetMapKey<uint32>(MapKey* map_key, const uint32& value) {
     83   map_key->SetUInt32Value(value);
     84 }
     85 template<>
     86 inline void SetMapKey<int64>(MapKey* map_key, const int64& value) {
     87   map_key->SetInt64Value(value);
     88 }
     89 template<>
     90 inline void SetMapKey<uint64>(MapKey* map_key, const uint64& value) {
     91   map_key->SetUInt64Value(value);
     92 }
     93 template<>
     94 inline void SetMapKey<bool>(MapKey* map_key, const bool& value) {
     95   map_key->SetBoolValue(value);
     96 }
     97 template<>
     98 inline void SetMapKey<string>(MapKey* map_key, const string& value) {
     99   map_key->SetStringValue(value);
    100 }
    101 
    102 // ------------------------TypeDefinedMapFieldBase---------------
    103 template <typename Key, typename T>
    104 typename Map<Key, T>::const_iterator&
    105 TypeDefinedMapFieldBase<Key, T>::InternalGetIterator(
    106     const MapIterator* map_iter) const {
    107   return *reinterpret_cast<typename Map<Key, T>::const_iterator *>(
    108       map_iter->iter_);
    109 }
    110 
    111 template <typename Key, typename T>
    112 void TypeDefinedMapFieldBase<Key, T>::MapBegin(MapIterator* map_iter) const {
    113   InternalGetIterator(map_iter) = GetMap().begin();
    114   SetMapIteratorValue(map_iter);
    115 }
    116 
    117 template <typename Key, typename T>
    118 void TypeDefinedMapFieldBase<Key, T>::MapEnd(MapIterator* map_iter) const {
    119   InternalGetIterator(map_iter) = GetMap().end();
    120 }
    121 
    122 template <typename Key, typename T>
    123 bool TypeDefinedMapFieldBase<Key, T>::EqualIterator(const MapIterator& a,
    124                                                     const MapIterator& b)
    125     const {
    126   return InternalGetIterator(&a) == InternalGetIterator(&b);
    127 }
    128 
    129 template <typename Key, typename T>
    130 void TypeDefinedMapFieldBase<Key, T>::IncreaseIterator(MapIterator* map_iter)
    131     const {
    132   ++InternalGetIterator(map_iter);
    133   SetMapIteratorValue(map_iter);
    134 }
    135 
    136 template <typename Key, typename T>
    137 void TypeDefinedMapFieldBase<Key, T>::InitializeIterator(
    138     MapIterator* map_iter) const {
    139   map_iter->iter_ = new typename Map<Key, T>::const_iterator;
    140   GOOGLE_CHECK(map_iter->iter_ != NULL);
    141 }
    142 
    143 template <typename Key, typename T>
    144 void TypeDefinedMapFieldBase<Key, T>::DeleteIterator(MapIterator* map_iter)
    145     const {
    146   delete reinterpret_cast<typename Map<Key, T>::const_iterator *>(
    147       map_iter->iter_);
    148 }
    149 
    150 template <typename Key, typename T>
    151 void TypeDefinedMapFieldBase<Key, T>::CopyIterator(
    152     MapIterator* this_iter,
    153     const MapIterator& that_iter) const {
    154   InternalGetIterator(this_iter) = InternalGetIterator(&that_iter);
    155   this_iter->key_.SetType(that_iter.key_.type());
    156   // MapValueRef::type() fails when containing data is null. However, if
    157   // this_iter points to MapEnd, data can be null.
    158   this_iter->value_.SetType(
    159       static_cast<FieldDescriptor::CppType>(that_iter.value_.type_));
    160   SetMapIteratorValue(this_iter);
    161 }
    162 
    163 // ----------------------------------------------------------------------
    164 
    165 template <typename Key, typename T,
    166           WireFormatLite::FieldType kKeyFieldType,
    167           WireFormatLite::FieldType kValueFieldType,
    168           int default_enum_value>
    169 MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField()
    170     : default_entry_(NULL) {}
    171 
    172 template <typename Key, typename T,
    173           WireFormatLite::FieldType kKeyFieldType,
    174           WireFormatLite::FieldType kValueFieldType,
    175           int default_enum_value>
    176 MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField(
    177     Arena* arena)
    178     : TypeDefinedMapFieldBase<Key, T>(arena),
    179       MapFieldLite<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>(
    180           arena),
    181       default_entry_(NULL) {}
    182 
    183 template <typename Key, typename T,
    184           WireFormatLite::FieldType kKeyFieldType,
    185           WireFormatLite::FieldType kValueFieldType,
    186           int default_enum_value>
    187 MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField(
    188     const Message* default_entry)
    189     : default_entry_(down_cast<const EntryType*>(default_entry)) {}
    190 
    191 template <typename Key, typename T,
    192           WireFormatLite::FieldType kKeyFieldType,
    193           WireFormatLite::FieldType kValueFieldType,
    194           int default_enum_value>
    195 MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField(
    196     Arena* arena, const Message* default_entry)
    197     : TypeDefinedMapFieldBase<Key, T>(arena),
    198       MapFieldLite<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>(
    199           arena),
    200       default_entry_(down_cast<const EntryType*>(default_entry)) {}
    201 
    202 template <typename Key, typename T,
    203           WireFormatLite::FieldType kKeyFieldType,
    204           WireFormatLite::FieldType kValueFieldType,
    205           int default_enum_value>
    206 MapField<Key, T, kKeyFieldType, kValueFieldType,
    207          default_enum_value>::~MapField() {}
    208 
    209 template <typename Key, typename T,
    210           WireFormatLite::FieldType kKeyFieldType,
    211           WireFormatLite::FieldType kValueFieldType,
    212           int default_enum_value>
    213 int
    214 MapField<Key, T, kKeyFieldType, kValueFieldType,
    215          default_enum_value>::size() const {
    216   MapFieldBase::SyncMapWithRepeatedField();
    217   return MapFieldLiteType::GetInternalMap().size();
    218 }
    219 
    220 template <typename Key, typename T,
    221           WireFormatLite::FieldType kKeyFieldType,
    222           WireFormatLite::FieldType kValueFieldType,
    223           int default_enum_value>
    224 void
    225 MapField<Key, T, kKeyFieldType, kValueFieldType,
    226          default_enum_value>::Clear() {
    227   MapFieldBase::SyncMapWithRepeatedField();
    228   MapFieldLiteType::MutableInternalMap()->clear();
    229   MapFieldBase::SetMapDirty();
    230 }
    231 
    232 template <typename Key, typename T,
    233           WireFormatLite::FieldType kKeyFieldType,
    234           WireFormatLite::FieldType kValueFieldType,
    235           int default_enum_value>
    236 void MapField<Key, T, kKeyFieldType, kValueFieldType,
    237               default_enum_value>::SetMapIteratorValue(
    238                   MapIterator* map_iter) const {
    239   const Map<Key, T>& map = GetMap();
    240   typename Map<Key, T>::const_iterator iter =
    241       TypeDefinedMapFieldBase<Key, T>::InternalGetIterator(map_iter);
    242   if (iter == map.end()) return;
    243   SetMapKey(&map_iter->key_, iter->first);
    244   map_iter->value_.SetValue(&iter->second);
    245 }
    246 
    247 template <typename Key, typename T,
    248           WireFormatLite::FieldType kKeyFieldType,
    249           WireFormatLite::FieldType kValueFieldType,
    250           int default_enum_value>
    251 bool MapField<Key, T, kKeyFieldType, kValueFieldType,
    252               default_enum_value>::ContainsMapKey(
    253                   const MapKey& map_key) const {
    254   const Map<Key, T>& map = GetMap();
    255   const Key& key = UnwrapMapKey<Key>(map_key);
    256   typename Map<Key, T>::const_iterator iter = map.find(key);
    257   return iter != map.end();
    258 }
    259 
    260 template <typename Key, typename T,
    261           WireFormatLite::FieldType kKeyFieldType,
    262           WireFormatLite::FieldType kValueFieldType,
    263           int default_enum_value>
    264 bool MapField<Key, T, kKeyFieldType, kValueFieldType,
    265               default_enum_value>::InsertOrLookupMapValue(
    266                   const MapKey& map_key,
    267                   MapValueRef* val) {
    268   // Always use mutable map because users may change the map value by
    269   // MapValueRef.
    270   Map<Key, T>* map = MutableMap();
    271   const Key& key = UnwrapMapKey<Key>(map_key);
    272   typename Map<Key, T>::iterator iter = map->find(key);
    273   if (map->end() == iter) {
    274     val->SetValue(&((*map)[key]));
    275     return true;
    276   }
    277   // Key is already in the map. Make sure (*map)[key] is not called.
    278   // [] may reorder the map and iterators.
    279   val->SetValue(&(iter->second));
    280   return false;
    281 }
    282 
    283 template <typename Key, typename T,
    284           WireFormatLite::FieldType kKeyFieldType,
    285           WireFormatLite::FieldType kValueFieldType,
    286           int default_enum_value>
    287 bool MapField<Key, T, kKeyFieldType, kValueFieldType,
    288               default_enum_value>::DeleteMapValue(
    289                   const MapKey& map_key) {
    290   const Key& key = UnwrapMapKey<Key>(map_key);
    291   return MutableMap()->erase(key);
    292 }
    293 
    294 template <typename Key, typename T,
    295           WireFormatLite::FieldType kKeyFieldType,
    296           WireFormatLite::FieldType kValueFieldType,
    297           int default_enum_value>
    298 const Map<Key, T>&
    299 MapField<Key, T, kKeyFieldType, kValueFieldType,
    300          default_enum_value>::GetMap() const {
    301   MapFieldBase::SyncMapWithRepeatedField();
    302   return MapFieldLiteType::GetInternalMap();
    303 }
    304 
    305 template <typename Key, typename T,
    306           WireFormatLite::FieldType kKeyFieldType,
    307           WireFormatLite::FieldType kValueFieldType,
    308           int default_enum_value>
    309 Map<Key, T>*
    310 MapField<Key, T, kKeyFieldType, kValueFieldType,
    311          default_enum_value>::MutableMap() {
    312   MapFieldBase::SyncMapWithRepeatedField();
    313   Map<Key, T>* result = MapFieldLiteType::MutableInternalMap();
    314   MapFieldBase::SetMapDirty();
    315   return result;
    316 }
    317 
    318 template <typename Key, typename T,
    319           WireFormatLite::FieldType kKeyFieldType,
    320           WireFormatLite::FieldType kValueFieldType,
    321           int default_enum_value>
    322 void
    323 MapField<Key, T, kKeyFieldType, kValueFieldType,
    324          default_enum_value>::MergeFrom(
    325     const MapFieldLiteType& other) {
    326   const MapField& down_other = down_cast<const MapField&>(other);
    327   MapFieldBase::SyncMapWithRepeatedField();
    328   down_other.SyncMapWithRepeatedField();
    329   MapFieldLiteType::MergeFrom(other);
    330   MapFieldBase::SetMapDirty();
    331 }
    332 
    333 template <typename Key, typename T,
    334           WireFormatLite::FieldType kKeyFieldType,
    335           WireFormatLite::FieldType kValueFieldType,
    336           int default_enum_value>
    337 void
    338 MapField<Key, T, kKeyFieldType, kValueFieldType,
    339          default_enum_value>::Swap(
    340     MapFieldLiteType* other) {
    341   MapField* down_other = down_cast<MapField*>(other);
    342   std::swap(MapFieldBase::repeated_field_, down_other->repeated_field_);
    343   MapFieldLiteType::Swap(other);
    344   std::swap(MapFieldBase::state_, down_other->state_);
    345 }
    346 
    347 template <typename Key, typename T,
    348           WireFormatLite::FieldType kKeyFieldType,
    349           WireFormatLite::FieldType kValueFieldType,
    350           int default_enum_value>
    351 void
    352 MapField<Key, T, kKeyFieldType, kValueFieldType,
    353          default_enum_value>::SetEntryDescriptor(
    354     const Descriptor** descriptor) {
    355   MapFieldBase::entry_descriptor_ = descriptor;
    356 }
    357 
    358 template <typename Key, typename T,
    359           WireFormatLite::FieldType kKeyFieldType,
    360           WireFormatLite::FieldType kValueFieldType,
    361           int default_enum_value>
    362 void
    363 MapField<Key, T, kKeyFieldType, kValueFieldType,
    364          default_enum_value>::SetAssignDescriptorCallback(void (*callback)()) {
    365   MapFieldBase::assign_descriptor_callback_ = callback;
    366 }
    367 
    368 template <typename Key, typename T,
    369           WireFormatLite::FieldType kKeyFieldType,
    370           WireFormatLite::FieldType kValueFieldType,
    371           int default_enum_value>
    372 const Map<Key, T>&
    373 MapField<Key, T, kKeyFieldType, kValueFieldType,
    374          default_enum_value>::GetInternalMap() const {
    375   return MapFieldLiteType::GetInternalMap();
    376 }
    377 
    378 template <typename Key, typename T,
    379           WireFormatLite::FieldType kKeyFieldType,
    380           WireFormatLite::FieldType kValueFieldType,
    381           int default_enum_value>
    382 Map<Key, T>*
    383 MapField<Key, T, kKeyFieldType, kValueFieldType,
    384          default_enum_value>::MutableInternalMap() {
    385   return MapFieldLiteType::MutableInternalMap();
    386 }
    387 
    388 template <typename Key, typename T,
    389           WireFormatLite::FieldType kKeyFieldType,
    390           WireFormatLite::FieldType kValueFieldType,
    391           int default_enum_value>
    392 void
    393 MapField<Key, T, kKeyFieldType, kValueFieldType,
    394          default_enum_value>::SyncRepeatedFieldWithMapNoLock() const {
    395   if (MapFieldBase::repeated_field_ == NULL) {
    396     if (MapFieldBase::arena_ == NULL) {
    397       MapFieldBase::repeated_field_ = new RepeatedPtrField<Message>();
    398     } else {
    399       MapFieldBase::repeated_field_ =
    400           Arena::CreateMessage<RepeatedPtrField<Message> >(
    401               MapFieldBase::arena_);
    402     }
    403   }
    404   const Map<Key, T>& map = GetInternalMap();
    405   RepeatedPtrField<EntryType>* repeated_field =
    406       reinterpret_cast<RepeatedPtrField<EntryType>*>(
    407           MapFieldBase::repeated_field_);
    408 
    409   repeated_field->Clear();
    410 
    411   for (typename Map<Key, T>::const_iterator it = map.begin();
    412        it != map.end(); ++it) {
    413     InitDefaultEntryOnce();
    414     GOOGLE_CHECK(default_entry_ != NULL);
    415     EntryType* new_entry =
    416         down_cast<EntryType*>(default_entry_->New(MapFieldBase::arena_));
    417     repeated_field->AddAllocated(new_entry);
    418     (*new_entry->mutable_key()) = it->first;
    419     (*new_entry->mutable_value()) = it->second;
    420   }
    421 }
    422 
    423 template <typename Key, typename T,
    424           WireFormatLite::FieldType kKeyFieldType,
    425           WireFormatLite::FieldType kValueFieldType,
    426           int default_enum_value>
    427 void
    428 MapField<Key, T, kKeyFieldType, kValueFieldType,
    429          default_enum_value>::SyncMapWithRepeatedFieldNoLock() const {
    430   Map<Key, T>* map = const_cast<MapField*>(this)->MutableInternalMap();
    431   RepeatedPtrField<EntryType>* repeated_field =
    432       reinterpret_cast<RepeatedPtrField<EntryType>*>(
    433           MapFieldBase::repeated_field_);
    434   GOOGLE_CHECK(MapFieldBase::repeated_field_ != NULL);
    435   map->clear();
    436   for (typename RepeatedPtrField<EntryType>::iterator it =
    437            repeated_field->begin(); it != repeated_field->end(); ++it) {
    438     // Cast is needed because Map's api and internal storage is different when
    439     // value is enum. For enum, we cannot cast an int to enum. Thus, we have to
    440     // copy value. For other types, they have same exposed api type and internal
    441     // stored type. We should not introduce value copy for them. We achieve this
    442     // by casting to value for enum while casting to reference for other types.
    443     (*map)[it->key()] = static_cast<CastValueType>(it->value());
    444   }
    445 }
    446 
    447 template <typename Key, typename T,
    448           WireFormatLite::FieldType kKeyFieldType,
    449           WireFormatLite::FieldType kValueFieldType,
    450           int default_enum_value>
    451 int
    452 MapField<Key, T, kKeyFieldType, kValueFieldType,
    453          default_enum_value>::SpaceUsedExcludingSelfNoLock() const {
    454   int size = 0;
    455   if (MapFieldBase::repeated_field_ != NULL) {
    456     size += MapFieldBase::repeated_field_->SpaceUsedExcludingSelf();
    457   }
    458   Map<Key, T>* map = const_cast<MapField*>(this)->MutableInternalMap();
    459   size += sizeof(*map);
    460   for (typename Map<Key, T>::iterator it = map->begin();
    461        it != map->end(); ++it) {
    462     size += KeyTypeHandler::SpaceUsedInMap(it->first);
    463     size += ValueTypeHandler::SpaceUsedInMap(it->second);
    464   }
    465   return size;
    466 }
    467 
    468 template <typename Key, typename T,
    469           WireFormatLite::FieldType kKeyFieldType,
    470           WireFormatLite::FieldType kValueFieldType,
    471           int default_enum_value>
    472 void
    473 MapField<Key, T, kKeyFieldType, kValueFieldType,
    474          default_enum_value>::InitDefaultEntryOnce()
    475     const {
    476   if (default_entry_ == NULL) {
    477     MapFieldBase::InitMetadataOnce();
    478     GOOGLE_CHECK(*MapFieldBase::entry_descriptor_ != NULL);
    479     default_entry_ = down_cast<const EntryType*>(
    480         MessageFactory::generated_factory()->GetPrototype(
    481             *MapFieldBase::entry_descriptor_));
    482   }
    483 }
    484 
    485 }  // namespace internal
    486 }  // namespace protobuf
    487 
    488 }  // namespace google
    489 #endif  // GOOGLE_PROTOBUF_MAP_FIELD_INL_H__
    490