51
51
#endif
52
52
53
53
#include " google/protobuf/stubs/common.h"
54
+ #include " absl/base/attributes.h"
54
55
#include " absl/container/btree_map.h"
55
56
#include " absl/hash/hash.h"
56
57
#include " absl/meta/type_traits.h"
@@ -1135,7 +1136,7 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1135
1136
}
1136
1137
}
1137
1138
1138
- Map& operator =(Map&& other) noexcept {
1139
+ Map& operator =(Map&& other) noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND {
1139
1140
if (this != &other) {
1140
1141
if (arena () != other.arena ()) {
1141
1142
*this = other;
@@ -1300,38 +1301,44 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1300
1301
friend class Map ;
1301
1302
};
1302
1303
1303
- iterator begin () { return iterator (this ); }
1304
- iterator end () { return iterator (); }
1305
- const_iterator begin () const { return const_iterator (this ); }
1306
- const_iterator end () const { return const_iterator (); }
1307
- const_iterator cbegin () const { return begin (); }
1308
- const_iterator cend () const { return end (); }
1304
+ iterator begin () ABSL_ATTRIBUTE_LIFETIME_BOUND { return iterator (this ); }
1305
+ iterator end () ABSL_ATTRIBUTE_LIFETIME_BOUND { return iterator (); }
1306
+ const_iterator begin () const ABSL_ATTRIBUTE_LIFETIME_BOUND {
1307
+ return const_iterator (this );
1308
+ }
1309
+ const_iterator end () const ABSL_ATTRIBUTE_LIFETIME_BOUND {
1310
+ return const_iterator ();
1311
+ }
1312
+ const_iterator cbegin () const ABSL_ATTRIBUTE_LIFETIME_BOUND {
1313
+ return begin ();
1314
+ }
1315
+ const_iterator cend () const ABSL_ATTRIBUTE_LIFETIME_BOUND { return end (); }
1309
1316
1310
1317
using Base::empty;
1311
1318
using Base::size;
1312
1319
1313
1320
// Element access
1314
1321
template <typename K = key_type>
1315
- T& operator [](const key_arg<K>& key) {
1322
+ T& operator [](const key_arg<K>& key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
1316
1323
return try_emplace (key).first ->second ;
1317
1324
}
1318
1325
template <
1319
1326
typename K = key_type,
1320
1327
// Disable for integral types to reduce code bloat.
1321
1328
typename = typename std::enable_if<!std::is_integral<K>::value>::type>
1322
- T& operator [](key_arg<K>&& key) {
1329
+ T& operator [](key_arg<K>&& key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
1323
1330
return try_emplace (std::forward<K>(key)).first ->second ;
1324
1331
}
1325
1332
1326
1333
template <typename K = key_type>
1327
- const T& at (const key_arg<K>& key) const {
1334
+ const T& at (const key_arg<K>& key) const ABSL_ATTRIBUTE_LIFETIME_BOUND {
1328
1335
const_iterator it = find (key);
1329
1336
ABSL_CHECK (it != end ()) << " key not found: " << static_cast <Key>(key);
1330
1337
return it->second ;
1331
1338
}
1332
1339
1333
1340
template <typename K = key_type>
1334
- T& at (const key_arg<K>& key) {
1341
+ T& at (const key_arg<K>& key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
1335
1342
iterator it = find (key);
1336
1343
ABSL_CHECK (it != end ()) << " key not found: " << static_cast <Key>(key);
1337
1344
return it->second ;
@@ -1344,11 +1351,12 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1344
1351
}
1345
1352
1346
1353
template <typename K = key_type>
1347
- const_iterator find (const key_arg<K>& key) const {
1354
+ const_iterator find (const key_arg<K>& key) const
1355
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
1348
1356
return const_cast <Map*>(this )->find (key);
1349
1357
}
1350
1358
template <typename K = key_type>
1351
- iterator find (const key_arg<K>& key) {
1359
+ iterator find (const key_arg<K>& key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
1352
1360
auto res = this ->FindHelper (key);
1353
1361
return iterator (static_cast <Node*>(res.node ), this , res.bucket );
1354
1362
}
@@ -1360,7 +1368,7 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1360
1368
1361
1369
template <typename K = key_type>
1362
1370
std::pair<const_iterator, const_iterator> equal_range (
1363
- const key_arg<K>& key) const {
1371
+ const key_arg<K>& key) const ABSL_ATTRIBUTE_LIFETIME_BOUND {
1364
1372
const_iterator it = find (key);
1365
1373
if (it == end ()) {
1366
1374
return std::pair<const_iterator, const_iterator>(it, it);
@@ -1371,7 +1379,8 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1371
1379
}
1372
1380
1373
1381
template <typename K = key_type>
1374
- std::pair<iterator, iterator> equal_range (const key_arg<K>& key) {
1382
+ std::pair<iterator, iterator> equal_range (const key_arg<K>& key)
1383
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
1375
1384
iterator it = find (key);
1376
1385
if (it == end ()) {
1377
1386
return std::pair<iterator, iterator>(it, it);
@@ -1383,7 +1392,8 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1383
1392
1384
1393
// insert
1385
1394
template <typename K, typename ... Args>
1386
- std::pair<iterator, bool > try_emplace (K&& k, Args&&... args) {
1395
+ std::pair<iterator, bool > try_emplace (K&& k, Args&&... args)
1396
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
1387
1397
// Inserts a new element into the container if there is no element with the
1388
1398
// key in the container.
1389
1399
// The new element is:
@@ -1395,16 +1405,18 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1395
1405
std::forward<K>(k),
1396
1406
std::forward<Args>(args)...);
1397
1407
}
1398
- std::pair<iterator, bool > insert (init_type&& value) {
1408
+ std::pair<iterator, bool > insert (init_type&& value)
1409
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
1399
1410
return try_emplace (std::move (value.first ), std::move (value.second ));
1400
1411
}
1401
1412
template <typename P, RequiresInsertable<P> = 0 >
1402
- std::pair<iterator, bool > insert (P&& value) {
1413
+ std::pair<iterator, bool > insert (P&& value) ABSL_ATTRIBUTE_LIFETIME_BOUND {
1403
1414
return try_emplace (std::forward<P>(value).first ,
1404
1415
std::forward<P>(value).second );
1405
1416
}
1406
1417
template <typename ... Args>
1407
- std::pair<iterator, bool > emplace (Args&&... args) {
1418
+ std::pair<iterator, bool > emplace (Args&&... args)
1419
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
1408
1420
return EmplaceInternal (Rank0{}, std::forward<Args>(args)...);
1409
1421
}
1410
1422
template <class InputIt >
@@ -1435,7 +1447,7 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1435
1447
}
1436
1448
}
1437
1449
1438
- iterator erase (iterator pos) {
1450
+ iterator erase (iterator pos) ABSL_ATTRIBUTE_LIFETIME_BOUND {
1439
1451
auto next = std::next (pos);
1440
1452
ABSL_DCHECK_EQ (pos.m_ , static_cast <Base*>(this ));
1441
1453
auto * node = static_cast <Node*>(pos.node_ );
@@ -1475,7 +1487,7 @@ class Map : private internal::KeyMapBase<internal::KeyForBase<Key>> {
1475
1487
}
1476
1488
1477
1489
// Assign
1478
- Map& operator =(const Map& other) {
1490
+ Map& operator =(const Map& other) ABSL_ATTRIBUTE_LIFETIME_BOUND {
1479
1491
if (this != &other) {
1480
1492
clear ();
1481
1493
insert (other.begin (), other.end ());
0 commit comments