34 #ifndef GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__
35 #define GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__
43 #include <google/protobuf/stubs/common.h>
72 template <
class Collection>
73 const typename Collection::value_type::second_type&
75 const typename Collection::value_type::first_type&
key) {
76 typename Collection::const_iterator
it = collection.find(
key);
82 template <
class Collection>
83 typename Collection::value_type::second_type&
85 const typename Collection::value_type::first_type&
key) {
92 template <
class Collection>
93 const typename Collection::value_type::second_type&
95 const typename Collection::value_type::first_type&
key) {
96 typename Collection::const_iterator
it = collection.find(
key);
102 template <
class Collection>
103 typename Collection::value_type::second_type&
105 const typename Collection::value_type::first_type&
key) {
121 template <
class Collection>
122 const typename Collection::value_type::second_type&
124 const typename Collection::value_type::first_type&
key,
125 const typename Collection::value_type::second_type&
value) {
126 typename Collection::const_iterator
it = collection.find(
key);
127 if (
it == collection.end()) {
135 template <
class Collection>
136 const typename Collection::value_type::second_type*
138 const typename Collection::value_type::first_type&
key) {
139 typename Collection::const_iterator
it = collection.find(
key);
140 if (
it == collection.end()) {
147 template <
class Collection>
148 typename Collection::value_type::second_type*
150 const typename Collection::value_type::first_type&
key) {
152 if (
it == collection.end()) {
164 template <
class Collection>
165 typename Collection::value_type::second_type
167 const typename Collection::value_type::first_type&
key) {
168 typename Collection::const_iterator
it = collection.find(
key);
169 if (
it == collection.end()) {
170 return typename Collection::value_type::second_type();
179 template <
class Collection>
180 typename Collection::value_type::second_type
182 const typename Collection::value_type::first_type&
key) {
184 if (
it == collection.end()) {
185 return typename Collection::value_type::second_type();
192 template <
class Collection>
193 typename Collection::value_type::second_type::element_type*
195 const typename Collection::value_type::first_type&
key) {
196 typename Collection::const_iterator
it = collection.find(
key);
197 if (
it == collection.end()) {
202 return it->second.get();
206 template <
class Collection>
207 typename Collection::value_type::second_type::element_type&
209 const typename Collection::value_type::first_type&
key) {
210 typename Collection::const_iterator
it = collection.find(
key);
219 template <
class Collection,
class Key,
class Value>
220 bool FindCopy(
const Collection& collection,
223 typename Collection::const_iterator
it = collection.find(
key);
224 if (
it == collection.end()) {
238 template <
class Collection,
class Key>
240 return collection.find(
key) != collection.end();
245 template <
class Collection,
class Key,
class Value>
249 typedef typename Collection::const_iterator const_iterator;
250 std::pair<const_iterator, const_iterator>
range = collection.equal_range(
key);
266 template <
class Collection>
269 std::pair<typename Collection::iterator, bool>
ret = collection->insert(vt);
272 ret.first->second = vt.second;
279 template <
class Collection>
281 const typename Collection::value_type::first_type&
key,
282 const typename Collection::value_type::second_type&
value) {
289 template <
class Collection,
class InputIterator>
291 InputIterator
first, InputIterator last) {
301 template <
class Collection>
303 Collection*
const collection,
304 const typename Collection::value_type::first_type&
key,
305 const typename Collection::value_type::second_type&
value) {
306 std::pair<typename Collection::iterator, bool>
ret =
309 delete ret.first->second;
320 template <
class Collection>
323 return collection->insert(vt).second;
327 template <
class Collection>
329 Collection*
const collection,
330 const typename Collection::value_type::first_type&
key,
331 const typename Collection::value_type::second_type&
value) {
337 template <
class Collection>
341 <<
"duplicate value: " <<
value;
345 template <
class Collection>
353 template <
class Collection>
355 const typename Collection::value_type::first_type&
key,
356 const typename Collection::value_type::second_type&
data) {
358 <<
"duplicate key: " <<
key;
362 template <
class Collection>
364 Collection*
const collection,
365 const typename Collection::value_type::first_type&
key,
366 const typename Collection::value_type::second_type&
data) {
376 template <
class Collection>
378 Collection*
const collection,
379 const typename Collection::value_type::first_type&
key) {
381 std::pair<typename Collection::iterator, bool> res =
382 collection->insert(
value_type(
key,
typename value_type::second_type()));
384 return res.first->second;
394 template <
class Collection>
395 typename Collection::value_type::second_type&
398 return collection->insert(vt).first->second;
402 template <
class Collection>
403 typename Collection::value_type::second_type&
405 const typename Collection::value_type::first_type&
key,
406 const typename Collection::value_type::second_type&
value) {
421 template <
typename Sequence,
typename Collection>
423 const Sequence& sequence,
424 const typename Collection::value_type::second_type& increment,
425 Collection*
const count_map) {
426 for (
typename Sequence::const_iterator
it = sequence.begin();
427 it != sequence.end(); ++
it) {
428 typename Collection::value_type::second_type&
value =
430 typename Collection::value_type::second_type());
441 template <
class Collection>
442 typename Collection::value_type::second_type&
444 const typename Collection::value_type::first_type&
key) {
445 typedef typename std::iterator_traits<
446 typename Collection::value_type::second_type>
::value_type Element;
447 std::pair<typename Collection::iterator, bool>
ret =
450 static_cast<typename Collection::value_type::second_type
>(
nullptr)));
452 ret.first->second =
new Element();
454 return ret.first->second;
459 template <
class Collection,
class Arg>
460 typename Collection::value_type::second_type&
462 const typename Collection::value_type::first_type&
key,
464 typedef typename std::iterator_traits<
465 typename Collection::value_type::second_type>
::value_type Element;
466 std::pair<typename Collection::iterator, bool>
ret =
469 static_cast<typename Collection::value_type::second_type
>(
nullptr)));
471 ret.first->second =
new Element(
arg);
473 return ret.first->second;
495 template <
class Collection>
496 typename Collection::value_type::second_type::element_type*
498 Collection*
const collection,
499 const typename Collection::value_type::first_type&
key) {
500 typedef typename Collection::value_type::second_type
Value;
501 std::pair<typename Collection::iterator, bool>
ret =
504 ret.first->second.reset(
new typename Value::element_type);
506 return ret.first->second.get();
514 template <
class Collection,
class Arg>
515 typename Collection::value_type::second_type::element_type*
517 Collection*
const collection,
518 const typename Collection::value_type::first_type&
key,
520 typedef typename Collection::value_type::second_type
Value;
521 std::pair<typename Collection::iterator, bool>
ret =
524 ret.first->second.reset(
new typename Value::element_type(
arg));
526 return ret.first->second.get();
533 template <
class Collection>
534 typename Collection::value_type::second_type&
536 Collection*
const collection,
537 const typename Collection::value_type::first_type&
key) {
538 typedef typename Collection::value_type::second_type SharedPtr;
539 typedef typename Collection::value_type::second_type::element_type Element;
540 std::pair<typename Collection::iterator, bool>
ret =
543 ret.first->second.reset(
new Element());
545 return ret.first->second;
553 template <
class Collection,
class Arg>
554 typename Collection::value_type::second_type&
556 Collection*
const collection,
557 const typename Collection::value_type::first_type&
key,
559 typedef typename Collection::value_type::second_type SharedPtr;
560 typedef typename Collection::value_type::second_type::element_type Element;
561 std::pair<typename Collection::iterator, bool>
ret =
564 ret.first->second.reset(
new Element(
arg));
566 return ret.first->second;
580 template <
class Collection>
582 const typename Collection::value_type::first_type&
key,
583 const typename Collection::value_type::second_type&
value,
584 typename Collection::value_type::second_type*
previous) {
585 std::pair<typename Collection::iterator, bool>
ret =
599 template <
class Collection>
602 typename Collection::value_type::second_type*
previous) {
603 std::pair<typename Collection::iterator, bool>
ret = collection->insert(vt);
609 ret.first->second = vt.second;
622 template <
class Collection>
625 std::pair<typename Collection::iterator, bool>
ret = collection->insert(vt);
629 return &
ret.first->second;
634 template <
class Collection>
636 Collection*
const collection,
637 const typename Collection::value_type::first_type&
key,
638 const typename Collection::value_type::second_type&
data) {
660 template <
class Collection>
662 Collection*
const collection,
663 const typename Collection::value_type::first_type&
key) {
665 if (
it == collection->end()) {
668 typename Collection::value_type::second_type
v =
it->second;
669 collection->erase(
it);
677 template <
class MapContainer,
class KeyContainer>
679 KeyContainer* key_container) {
681 for (
typename MapContainer::const_iterator
it = map_container.begin();
682 it != map_container.end(); ++
it) {
683 key_container->insert(
it->first);
691 template <
class MapContainer,
class KeyContainer>
693 KeyContainer* key_container) {
695 for (
typename MapContainer::const_iterator
it = map_container.begin();
696 it != map_container.end(); ++
it) {
697 key_container->push_back(
it->first);
708 template <
class MapContainer,
class KeyType>
710 std::vector<KeyType>* key_container) {
722 if (key_container->empty()) {
723 key_container->reserve(map_container.size());
725 for (
typename MapContainer::const_iterator
it = map_container.begin();
726 it != map_container.end(); ++
it) {
727 key_container->push_back(
it->first);
735 template <
class MapContainer,
class ValueContainer>
737 ValueContainer* value_container) {
739 for (
typename MapContainer::const_iterator
it = map_container.begin();
740 it != map_container.end(); ++
it) {
741 value_container->push_back(
it->second);
752 template <
class MapContainer,
class ValueType>
754 std::vector<ValueType>* value_container) {
757 if (value_container->empty()) {
758 value_container->reserve(map_container.size());
760 for (
typename MapContainer::const_iterator
it = map_container.begin();
761 it != map_container.end(); ++
it) {
762 value_container->push_back(
it->second);
769 #endif // GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__