webkit  2cdf99a9e3038c7e01b3c37e8ad903ecbe5eecf1
https://github.com/WebKit/webkit
map_field_inl.h
Go to the documentation of this file.
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
37 #endif
38 
39 #include <google/protobuf/map.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>
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>
113  InternalGetIterator(map_iter) = GetMap().begin();
114  SetMapIteratorValue(map_iter);
115 }
116 
117 template <typename Key, typename T>
119  InternalGetIterator(map_iter) = GetMap().end();
120 }
121 
122 template <typename Key, typename T>
124  const MapIterator& b)
125  const {
126  return InternalGetIterator(&a) == InternalGetIterator(&b);
127 }
128 
129 template <typename Key, typename T>
131  const {
132  ++InternalGetIterator(map_iter);
133  SetMapIteratorValue(map_iter);
134 }
135 
136 template <typename Key, typename T>
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>
145  const {
146  delete reinterpret_cast<typename Map<Key, T>::const_iterator *>(
147  map_iter->iter_);
148 }
149 
150 template <typename Key, typename T>
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>
170  : default_entry_(NULL) {}
171 
172 template <typename Key, typename T,
173  WireFormatLite::FieldType kKeyFieldType,
174  WireFormatLite::FieldType kValueFieldType,
175  int default_enum_value>
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>
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>
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 =
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>
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();
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>
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__
uint64 UnwrapMapKey< uint64 >(const MapKey &map_key)
Definition: map_field_inl.h:62
void SetMapKey< bool >(MapKey *map_key, const bool &value)
Definition: map_field_inl.h:94
FieldType
Definition: wire_format_lite.h:96
void MapBegin(MapIterator *map_iter) const
Definition: map_field_inl.h:112
#define size
Definition: float-mm.c:27
Definition: message.h:179
EGLStreamKHR EGLint EGLint EGLint size
Definition: eglext.h:984
void SetMapKey< string >(MapKey *map_key, const string &value)
Definition: map_field_inl.h:98
void MapEnd(MapIterator *map_iter) const
Definition: map_field_inl.h:118
iterator begin()
Definition: map.h:1475
void SetMapKey(MapKey *map_key, const T &value)
KeyMapEntryAccessorType * mutable_key()
Definition: map_entry_lite.h:110
typename detail::make_map< Ts... >::type map
Definition: Brigand.h:223
AVCFAssetRef CFArrayRef AVCFAssetLoadValuesCompletionCallback callback
Definition: AVFoundationCFSoftLinking.h:99
const Descriptor * descriptor
Definition: descriptor.cc:271
iterator end()
Definition: map.h:1479
void SetMapKey< uint64 >(MapKey *map_key, const uint64 &value)
Definition: map_field_inl.h:90
FieldDescriptor::CppType type() const
Definition: map.h:111
Definition: map.h:57
Definition: command_line_interface.h:56
MapField()
Definition: map_field_inl.h:169
void Clear()
Definition: repeated_field.h:1934
Definition: descriptor.h:172
int32 UnwrapMapKey< int32 >(const MapKey &map_key)
Definition: map_field_inl.h:50
volatile Atomic32 state_
Definition: map_field.h:150
Definition: map.h:1424
void clear()
Definition: map.h:1610
Clear
Definition: python_message.py:1326
const FieldDescriptor const OneofDescriptor value
Definition: descriptor.h:1717
Map< Key, T >::const_iterator & InternalGetIterator(const MapIterator *map_iter) const
Definition: map_field_inl.h:105
int32_t int32
Definition: port.h:130
TestSubObjConstructor T
Definition: TestTypedefs.idl:84
Definition: map.h:97
EGLAttrib * value
Definition: eglext.h:120
const_iterator find(const key_type &key) const
Definition: map.h:1528
T UnwrapMapKey(const MapKey &map_key)
Definition: map.h:297
uint32_t uint32
Definition: port.h:135
Definition: __init__.py:1
void SyncMapWithRepeatedField() const
Definition: map_field.cc:131
uint64_t uint64
Definition: port.h:136
GLboolean GLboolean GLboolean GLboolean a
Definition: gl2ext.h:306
T second
Definition: map.h:491
Definition: arena.h:218
Definition: document.h:393
result
Definition: target-blank-opener-post-window.php:5
ValueMapEntryAccessorType * mutable_value()
Definition: map_entry_lite.h:114
bool UnwrapMapKey< bool >(const MapKey &map_key)
Definition: map_field_inl.h:66
#define GOOGLE_CHECK(EXPRESSION)
Definition: logging.h:151
int64_t int64
Definition: port.h:131
const
Definition: upload.py:398
#define NULL
Definition: common_types.h:41
Key
Definition: keyboard.h:10
RepeatedPtrField< Message > * repeated_field_
Definition: map_field.h:139
void SetMapKey< int32 >(MapKey *map_key, const int32 &value)
Definition: map_field_inl.h:78
GLboolean GLboolean GLboolean b
Definition: gl2ext.h:306
const Key first
Definition: map.h:490
Definition: gflags_completions.h:115
int64 UnwrapMapKey< int64 >(const MapKey &map_key)
Definition: map_field_inl.h:58
To down_cast(From *f)
Definition: casts.h:81
CFArrayRef CFTypeRef key
Definition: AVFoundationCFSoftLinking.h:129
void SetMapKey< uint32 >(MapKey *map_key, const uint32 &value)
Definition: map_field_inl.h:82
Definition: map_field.h:327
GLuint GLsizei GLsizei GLfloat * val
Definition: gl2ext.h:3301
void swap(optional< T > &x, optional< T > &y) __NOEXCEPT_(__NOEXCEPT_(x.swap(y)))
Definition: Optional.h:1047
string UnwrapMapKey< string >(const MapKey &map_key)
Definition: map_field_inl.h:70
uint32 UnwrapMapKey< uint32 >(const MapKey &map_key)
Definition: map_field_inl.h:54
MergeFrom
Definition: python_message.py:1259
#define T(a)
Definition: row_common.cc:1964
bool EqualIterator(const MapIterator &a, const MapIterator &b) const
Definition: map_field_inl.h:123
Definition: map_entry_lite.h:63
void SetMapKey< int64 >(MapKey *map_key, const int64 &value)
Definition: map_field_inl.h:86