34 #ifndef GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__
35 #define GOOGLE_PROTOBUF_STUBS_MAP_UTIL_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) {
86 typename Collection::iterator
it = collection.find(
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) {
106 typename Collection::iterator
it = collection.find(
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) {
151 typename Collection::iterator
it = collection.find(
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) {
183 typename Collection::iterator
it = collection.find(
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>
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;
310 ret.first->second =
value;
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 =
592 ret.first->second =
value;
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>
623 typename Collection::value_type::second_type*
626 std::pair<typename Collection::iterator, bool> ret = collection->insert(vt);
630 return &ret.first->second;
635 template <
class Collection>
636 typename Collection::value_type::second_type*
638 Collection*
const collection,
639 const typename Collection::value_type::first_type&
key,
640 const typename Collection::value_type::second_type&
data) {
662 template <
class Collection>
664 Collection*
const collection,
665 const typename Collection::value_type::first_type&
key) {
666 typename Collection::iterator
it = collection->find(
key);
667 if (
it == collection->end()) {
670 typename Collection::value_type::second_type
v =
it->second;
671 collection->erase(
it);
679 template <
class MapContainer,
class KeyContainer>
681 KeyContainer* key_container) {
683 for (
typename MapContainer::const_iterator
it = map_container.begin();
684 it != map_container.end(); ++
it) {
685 key_container->insert(
it->first);
693 template <
class MapContainer,
class KeyContainer>
695 KeyContainer* key_container) {
697 for (
typename MapContainer::const_iterator
it = map_container.begin();
698 it != map_container.end(); ++
it) {
699 key_container->push_back(
it->first);
710 template <
class MapContainer,
class KeyType>
712 std::vector<KeyType>* key_container) {
724 if (key_container->empty()) {
725 key_container->reserve(map_container.size());
727 for (
typename MapContainer::const_iterator
it = map_container.begin();
728 it != map_container.end(); ++
it) {
729 key_container->push_back(
it->first);
737 template <
class MapContainer,
class ValueContainer>
739 ValueContainer* value_container) {
741 for (
typename MapContainer::const_iterator
it = map_container.begin();
742 it != map_container.end(); ++
it) {
743 value_container->push_back(
it->second);
754 template <
class MapContainer,
class ValueType>
756 std::vector<ValueType>* value_container) {
759 if (value_container->empty()) {
760 value_container->reserve(map_container.size());
762 for (
typename MapContainer::const_iterator
it = map_container.begin();
763 it != map_container.end(); ++
it) {
764 value_container->push_back(
it->second);
771 #endif // GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__