@@ -617,7 +617,7 @@ template <ResizeNonSooMode kMode>
617
617
void ResizeNonSooImpl (CommonFields& common, const PolicyFunctions& policy,
618
618
size_t new_capacity, HashtablezInfoHandle infoz) {
619
619
ABSL_SWISSTABLE_ASSERT (IsValidCapacity (new_capacity));
620
- ABSL_SWISSTABLE_ASSERT (new_capacity > policy.soo_capacity );
620
+ ABSL_SWISSTABLE_ASSERT (new_capacity > policy.soo_capacity () );
621
621
622
622
const size_t old_capacity = common.capacity ();
623
623
[[maybe_unused]] ctrl_t * old_ctrl = common.control ();
@@ -643,7 +643,7 @@ void ResizeNonSooImpl(CommonFields& common, const PolicyFunctions& policy,
643
643
size_t total_probe_length = 0 ;
644
644
ResetCtrl (common, slot_size);
645
645
ABSL_SWISSTABLE_ASSERT (kMode != ResizeNonSooMode::kGuaranteedEmpty ||
646
- old_capacity == policy.soo_capacity );
646
+ old_capacity == policy.soo_capacity () );
647
647
ABSL_SWISSTABLE_ASSERT (kMode != ResizeNonSooMode::kGuaranteedAllocated ||
648
648
old_capacity > 0 );
649
649
if constexpr (kMode == ResizeNonSooMode::kGuaranteedAllocated ) {
@@ -670,17 +670,17 @@ void ResizeEmptyNonAllocatedTableImpl(CommonFields& common,
670
670
const PolicyFunctions& policy,
671
671
size_t new_capacity, bool force_infoz) {
672
672
ABSL_SWISSTABLE_ASSERT (IsValidCapacity (new_capacity));
673
- ABSL_SWISSTABLE_ASSERT (new_capacity > policy.soo_capacity );
674
- ABSL_SWISSTABLE_ASSERT (!force_infoz || policy.soo_capacity > 0 );
675
- ABSL_SWISSTABLE_ASSERT (common.capacity () <= policy.soo_capacity );
673
+ ABSL_SWISSTABLE_ASSERT (new_capacity > policy.soo_capacity () );
674
+ ABSL_SWISSTABLE_ASSERT (!force_infoz || policy.soo_enabled );
675
+ ABSL_SWISSTABLE_ASSERT (common.capacity () <= policy.soo_capacity () );
676
676
ABSL_SWISSTABLE_ASSERT (common.empty ());
677
677
const size_t slot_size = policy.slot_size ;
678
678
HashtablezInfoHandle infoz;
679
679
const bool should_sample =
680
680
policy.is_hashtablez_eligible && (force_infoz || ShouldSampleNextTable ());
681
681
if (ABSL_PREDICT_FALSE (should_sample)) {
682
682
infoz = ForcedTrySample (slot_size, policy.key_size , policy.value_size ,
683
- policy.soo_capacity );
683
+ policy.soo_capacity () );
684
684
}
685
685
ResizeNonSooImpl<ResizeNonSooMode::kGuaranteedEmpty >(common, policy,
686
686
new_capacity, infoz);
@@ -694,8 +694,8 @@ void InsertOldSooSlotAndInitializeControlBytes(CommonFields& c,
694
694
const PolicyFunctions& policy,
695
695
size_t hash, ctrl_t * new_ctrl,
696
696
void * new_slots) {
697
- ABSL_SWISSTABLE_ASSERT (c.size () == policy.soo_capacity );
698
- ABSL_SWISSTABLE_ASSERT (policy.soo_capacity == SooCapacity () );
697
+ ABSL_SWISSTABLE_ASSERT (c.size () == policy.soo_capacity () );
698
+ ABSL_SWISSTABLE_ASSERT (policy.soo_enabled );
699
699
size_t new_capacity = c.capacity ();
700
700
701
701
c.generate_new_seed ();
@@ -717,12 +717,21 @@ enum class ResizeFullSooTableSamplingMode {
717
717
kForceSampleNoResizeIfUnsampled ,
718
718
};
719
719
720
+ void AssertSoo ([[maybe_unused]] CommonFields& common,
721
+ [[maybe_unused]] const PolicyFunctions& policy) {
722
+ ABSL_SWISSTABLE_ASSERT (policy.soo_enabled );
723
+ ABSL_SWISSTABLE_ASSERT (common.capacity () == policy.soo_capacity ());
724
+ }
725
+ void AssertFullSoo ([[maybe_unused]] CommonFields& common,
726
+ [[maybe_unused]] const PolicyFunctions& policy) {
727
+ AssertSoo (common, policy);
728
+ ABSL_SWISSTABLE_ASSERT (common.size () == policy.soo_capacity ());
729
+ }
730
+
720
731
void ResizeFullSooTable (CommonFields& common, const PolicyFunctions& policy,
721
732
size_t new_capacity,
722
733
ResizeFullSooTableSamplingMode sampling_mode) {
723
- ABSL_SWISSTABLE_ASSERT (common.capacity () == policy.soo_capacity );
724
- ABSL_SWISSTABLE_ASSERT (common.size () == policy.soo_capacity );
725
- ABSL_SWISSTABLE_ASSERT (policy.soo_capacity == SooCapacity ());
734
+ AssertFullSoo (common, policy);
726
735
const size_t slot_size = policy.slot_size ;
727
736
const size_t slot_align = policy.slot_align ;
728
737
@@ -731,7 +740,7 @@ void ResizeFullSooTable(CommonFields& common, const PolicyFunctions& policy,
731
740
ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled ) {
732
741
if (ABSL_PREDICT_FALSE (policy.is_hashtablez_eligible )) {
733
742
infoz = ForcedTrySample (slot_size, policy.key_size , policy.value_size ,
734
- policy.soo_capacity );
743
+ policy.soo_capacity () );
735
744
}
736
745
737
746
if (!infoz.IsSampled ()) {
@@ -1218,11 +1227,11 @@ size_t GrowToNextCapacityAndPrepareInsert(CommonFields& common,
1218
1227
ABSL_SWISSTABLE_ASSERT (common.growth_left () == 0 );
1219
1228
const size_t old_capacity = common.capacity ();
1220
1229
ABSL_SWISSTABLE_ASSERT (old_capacity == 0 ||
1221
- old_capacity > policy.soo_capacity );
1230
+ old_capacity > policy.soo_capacity () );
1222
1231
1223
1232
const size_t new_capacity = NextCapacity (old_capacity);
1224
1233
ABSL_SWISSTABLE_ASSERT (IsValidCapacity (new_capacity));
1225
- ABSL_SWISSTABLE_ASSERT (new_capacity > policy.soo_capacity );
1234
+ ABSL_SWISSTABLE_ASSERT (new_capacity > policy.soo_capacity () );
1226
1235
1227
1236
ctrl_t * old_ctrl = common.control ();
1228
1237
void * old_slots = common.slot_array ();
@@ -1238,7 +1247,7 @@ size_t GrowToNextCapacityAndPrepareInsert(CommonFields& common,
1238
1247
policy.is_hashtablez_eligible && ShouldSampleNextTable ();
1239
1248
if (ABSL_PREDICT_FALSE (should_sample)) {
1240
1249
infoz = ForcedTrySample (slot_size, policy.key_size , policy.value_size ,
1241
- policy.soo_capacity );
1250
+ policy.soo_capacity () );
1242
1251
}
1243
1252
}
1244
1253
const bool has_infoz = infoz.IsSampled ();
@@ -1291,7 +1300,7 @@ size_t GrowToNextCapacityAndPrepareInsert(CommonFields& common,
1291
1300
find_info = find_first_non_full (common, new_hash);
1292
1301
SetCtrlInLargeTable (common, find_info.offset , new_h2, policy.slot_size );
1293
1302
}
1294
- ABSL_SWISSTABLE_ASSERT (old_capacity > policy.soo_capacity );
1303
+ ABSL_SWISSTABLE_ASSERT (old_capacity > policy.soo_capacity () );
1295
1304
(*policy.dealloc )(alloc, old_capacity, old_ctrl, slot_size, slot_align,
1296
1305
has_infoz);
1297
1306
}
@@ -1415,9 +1424,9 @@ GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert(
1415
1424
1416
1425
// Resizes empty non-allocated table to the capacity to fit new_size elements.
1417
1426
// Requires:
1418
- // 1. `c.capacity() == policy.soo_capacity`.
1427
+ // 1. `c.capacity() == policy.soo_capacity() `.
1419
1428
// 2. `c.empty()`.
1420
- // 3. `new_size > policy.soo_capacity`.
1429
+ // 3. `new_size > policy.soo_capacity() `.
1421
1430
// The table will be attempted to be sampled.
1422
1431
void ReserveEmptyNonAllocatedTableToFitNewSize (CommonFields& common,
1423
1432
const PolicyFunctions& policy,
@@ -1435,20 +1444,20 @@ void ReserveEmptyNonAllocatedTableToFitNewSize(CommonFields& common,
1435
1444
// allocated backing array.
1436
1445
//
1437
1446
// Requires:
1438
- // 1. `c.capacity() > policy.soo_capacity` OR `!c.empty()`.
1447
+ // 1. `c.capacity() > policy.soo_capacity() ` OR `!c.empty()`.
1439
1448
// Reserving already allocated tables is considered to be a rare case.
1440
1449
ABSL_ATTRIBUTE_NOINLINE void ReserveAllocatedTable (
1441
1450
CommonFields& common, const PolicyFunctions& policy, size_t new_size) {
1442
1451
const size_t cap = common.capacity ();
1443
1452
ValidateMaxSize (new_size, policy.slot_size );
1444
1453
ABSL_ASSUME (new_size > 0 );
1445
1454
const size_t new_capacity = SizeToCapacity (new_size);
1446
- if (cap == policy.soo_capacity ) {
1455
+ if (cap == policy.soo_capacity () ) {
1447
1456
ABSL_SWISSTABLE_ASSERT (!common.empty ());
1448
1457
ResizeFullSooTable (common, policy, new_capacity,
1449
1458
ResizeFullSooTableSamplingMode::kNoSampling );
1450
1459
} else {
1451
- ABSL_SWISSTABLE_ASSERT (cap > policy.soo_capacity );
1460
+ ABSL_SWISSTABLE_ASSERT (cap > policy.soo_capacity () );
1452
1461
// TODO(b/382423690): consider using GrowToNextCapacity, when applicable.
1453
1462
ResizeAllocatedTableWithSeedChange (common, policy, new_capacity);
1454
1463
}
@@ -1486,16 +1495,14 @@ size_t GrowSooTableToNextCapacityAndPrepareInsert(CommonFields& common,
1486
1495
const PolicyFunctions& policy,
1487
1496
size_t new_hash,
1488
1497
ctrl_t soo_slot_ctrl) {
1489
- ABSL_SWISSTABLE_ASSERT (common.capacity () == policy.soo_capacity );
1490
- ABSL_SWISSTABLE_ASSERT (policy.soo_capacity == SooCapacity ());
1498
+ AssertSoo (common, policy);
1491
1499
if (ABSL_PREDICT_FALSE (soo_slot_ctrl == ctrl_t ::kEmpty )) {
1492
1500
// The table is empty, it is only used for forced sampling of SOO tables.
1493
1501
return GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert (
1494
1502
common, policy, new_hash);
1495
1503
}
1496
- ABSL_SWISSTABLE_ASSERT (common.size () == policy.soo_capacity );
1504
+ ABSL_SWISSTABLE_ASSERT (common.size () == policy.soo_capacity () );
1497
1505
static constexpr size_t kNewCapacity = NextCapacity (SooCapacity ());
1498
- ABSL_SWISSTABLE_ASSERT (kNewCapacity > policy.soo_capacity );
1499
1506
const size_t slot_size = policy.slot_size ;
1500
1507
const size_t slot_align = policy.slot_align ;
1501
1508
common.set_capacity (kNewCapacity );
@@ -1560,9 +1567,7 @@ size_t GrowSooTableToNextCapacityAndPrepareInsert(CommonFields& common,
1560
1567
1561
1568
void GrowFullSooTableToNextCapacityForceSampling (
1562
1569
CommonFields& common, const PolicyFunctions& policy) {
1563
- ABSL_SWISSTABLE_ASSERT (common.capacity () == policy.soo_capacity );
1564
- ABSL_SWISSTABLE_ASSERT (common.size () == policy.soo_capacity );
1565
- ABSL_SWISSTABLE_ASSERT (policy.soo_capacity == SooCapacity ());
1570
+ AssertFullSoo (common, policy);
1566
1571
ResizeFullSooTable (
1567
1572
common, policy, NextCapacity (SooCapacity ()),
1568
1573
ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled );
@@ -1573,18 +1578,18 @@ void Rehash(CommonFields& common, const PolicyFunctions& policy, size_t n) {
1573
1578
1574
1579
auto clear_backing_array = [&]() {
1575
1580
ClearBackingArray (common, policy, policy.get_char_alloc (common),
1576
- /* reuse=*/ false , policy.soo_capacity > 0 );
1581
+ /* reuse=*/ false , policy.soo_enabled );
1577
1582
};
1578
1583
1579
1584
const size_t slot_size = policy.slot_size ;
1580
1585
1581
1586
if (n == 0 ) {
1582
- if (cap <= policy.soo_capacity ) return ;
1587
+ if (cap <= policy.soo_capacity () ) return ;
1583
1588
if (common.empty ()) {
1584
1589
clear_backing_array ();
1585
1590
return ;
1586
1591
}
1587
- if (common.size () <= policy.soo_capacity ) {
1592
+ if (common.size () <= policy.soo_capacity () ) {
1588
1593
// When the table is already sampled, we keep it sampled.
1589
1594
if (common.infoz ().IsSampled ()) {
1590
1595
static constexpr size_t kInitialSampledCapacity =
@@ -1618,7 +1623,7 @@ void Rehash(CommonFields& common, const PolicyFunctions& policy, size_t n) {
1618
1623
NormalizeCapacity (n | SizeToCapacity (common.size ()));
1619
1624
// n == 0 unconditionally rehashes as per the standard.
1620
1625
if (n == 0 || new_capacity > cap) {
1621
- if (cap == policy.soo_capacity ) {
1626
+ if (cap == policy.soo_capacity () ) {
1622
1627
if (common.empty ()) {
1623
1628
ResizeEmptyNonAllocatedTableImpl (common, policy, new_capacity,
1624
1629
/* force_infoz=*/ false );
@@ -1640,7 +1645,7 @@ void Copy(CommonFields& common, const PolicyFunctions& policy,
1640
1645
absl::FunctionRef<void (void *, const void *)> copy_fn) {
1641
1646
const size_t size = other.size ();
1642
1647
ABSL_SWISSTABLE_ASSERT (size > 0 );
1643
- const size_t soo_capacity = policy.soo_capacity ;
1648
+ const size_t soo_capacity = policy.soo_capacity () ;
1644
1649
const size_t slot_size = policy.slot_size ;
1645
1650
if (size <= soo_capacity) {
1646
1651
ABSL_SWISSTABLE_ASSERT (size == 1 );
@@ -1714,17 +1719,17 @@ void ReserveTableToFitNewSize(CommonFields& common,
1714
1719
const PolicyFunctions& policy, size_t new_size) {
1715
1720
common.reset_reserved_growth (new_size);
1716
1721
common.set_reservation_size (new_size);
1717
- ABSL_SWISSTABLE_ASSERT (new_size > policy.soo_capacity );
1722
+ ABSL_SWISSTABLE_ASSERT (new_size > policy.soo_capacity () );
1718
1723
const size_t cap = common.capacity ();
1719
- if (ABSL_PREDICT_TRUE (common.empty () && cap <= policy.soo_capacity )) {
1724
+ if (ABSL_PREDICT_TRUE (common.empty () && cap <= policy.soo_capacity () )) {
1720
1725
return ReserveEmptyNonAllocatedTableToFitNewSize (common, policy, new_size);
1721
1726
}
1722
1727
1723
- ABSL_SWISSTABLE_ASSERT (!common.empty () || cap > policy.soo_capacity );
1728
+ ABSL_SWISSTABLE_ASSERT (!common.empty () || cap > policy.soo_capacity () );
1724
1729
ABSL_SWISSTABLE_ASSERT (cap > 0 );
1725
1730
const size_t max_size_before_growth =
1726
- cap <= policy.soo_capacity ? policy.soo_capacity
1727
- : common.size () + common.growth_left ();
1731
+ cap <= policy.soo_capacity () ? policy.soo_capacity ()
1732
+ : common.size () + common.growth_left ();
1728
1733
if (new_size <= max_size_before_growth) {
1729
1734
return ;
1730
1735
}
0 commit comments