Commit d74eabc8 authored by sadrul@chromium.org's avatar sadrul@chromium.org

ui: Fix removing a number from the SequentialIDGenerator.

Make sure when a number is released, the |min_available_slot_| is updated accordingly,
so that subsequent allocations are set correctly to the lowest available ID.

BUG=292929
R=sky@chromium.org

Review URL: https://codereview.chromium.org/23654045

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223517 0039d316-1c4b-4281-b951-d872f2087c98
parent 17bad1c6
...@@ -40,7 +40,7 @@ uint32 SequentialIDGenerator::GetGeneratedID(uint32 number) { ...@@ -40,7 +40,7 @@ uint32 SequentialIDGenerator::GetGeneratedID(uint32 number) {
if (find != number_to_id_.end()) if (find != number_to_id_.end())
return find->second; return find->second;
int id = GetNextAvailableSlot(); int id = GetNextAvailableID();
number_to_id_.insert(std::make_pair(number, id)); number_to_id_.insert(std::make_pair(number, id));
id_to_number_.insert(std::make_pair(id, number)); id_to_number_.insert(std::make_pair(id, number));
return id; return id;
...@@ -51,18 +51,17 @@ bool SequentialIDGenerator::HasGeneratedIDFor(uint32 number) const { ...@@ -51,18 +51,17 @@ bool SequentialIDGenerator::HasGeneratedIDFor(uint32 number) const {
} }
void SequentialIDGenerator::ReleaseGeneratedID(uint32 id) { void SequentialIDGenerator::ReleaseGeneratedID(uint32 id) {
if (id < min_available_id_) { UpdateNextAvailableIDAfterRelease(id);
min_available_id_ = id;
DCHECK_GE(min_available_id_, min_id_);
}
Remove(id, &id_to_number_, &number_to_id_); Remove(id, &id_to_number_, &number_to_id_);
} }
void SequentialIDGenerator::ReleaseNumber(uint32 number) { void SequentialIDGenerator::ReleaseNumber(uint32 number) {
DCHECK_GT(number_to_id_.count(number), 0U);
UpdateNextAvailableIDAfterRelease(number_to_id_[number]);
Remove(number, &number_to_id_, &id_to_number_); Remove(number, &number_to_id_, &id_to_number_);
} }
uint32 SequentialIDGenerator::GetNextAvailableSlot() { uint32 SequentialIDGenerator::GetNextAvailableID() {
const uint32 kMaxID = 128; const uint32 kMaxID = 128;
while (id_to_number_.count(min_available_id_) > 0 && while (id_to_number_.count(min_available_id_) > 0 &&
min_available_id_ < kMaxID) { min_available_id_ < kMaxID) {
...@@ -73,4 +72,11 @@ uint32 SequentialIDGenerator::GetNextAvailableSlot() { ...@@ -73,4 +72,11 @@ uint32 SequentialIDGenerator::GetNextAvailableSlot() {
return min_available_id_; return min_available_id_;
} }
void SequentialIDGenerator::UpdateNextAvailableIDAfterRelease(uint32 id) {
if (id < min_available_id_) {
min_available_id_ = id;
DCHECK_GE(min_available_id_, min_id_);
}
}
} // namespace ui } // namespace ui
...@@ -42,7 +42,9 @@ class UI_EXPORT SequentialIDGenerator { ...@@ -42,7 +42,9 @@ class UI_EXPORT SequentialIDGenerator {
private: private:
typedef base::hash_map<uint32, uint32> IDMap; typedef base::hash_map<uint32, uint32> IDMap;
uint32 GetNextAvailableSlot(); uint32 GetNextAvailableID();
void UpdateNextAvailableIDAfterRelease(uint32 id);
IDMap number_to_id_; IDMap number_to_id_;
IDMap id_to_number_; IDMap id_to_number_;
......
...@@ -38,4 +38,25 @@ TEST(SequentialIDGeneratorTest, AddRemove) { ...@@ -38,4 +38,25 @@ TEST(SequentialIDGeneratorTest, AddRemove) {
EXPECT_FALSE(generator.HasGeneratedIDFor(45)); EXPECT_FALSE(generator.HasGeneratedIDFor(45));
} }
TEST(SequentialIDGeneratorTest, RemoveMultipleNumbers) {
const uint32 kMinID = 4;
SequentialIDGenerator generator(kMinID);
EXPECT_EQ(4U, generator.GetGeneratedID(45));
EXPECT_EQ(5U, generator.GetGeneratedID(55));
EXPECT_EQ(6U, generator.GetGeneratedID(15));
generator.ReleaseNumber(45);
EXPECT_FALSE(generator.HasGeneratedIDFor(45));
generator.ReleaseNumber(15);
EXPECT_FALSE(generator.HasGeneratedIDFor(15));
EXPECT_EQ(5U, generator.GetGeneratedID(55));
EXPECT_EQ(4U, generator.GetGeneratedID(12));
generator.ReleaseNumber(12);
generator.ReleaseNumber(55);
EXPECT_EQ(4U, generator.GetGeneratedID(0));
}
} // namespace ui } // namespace ui
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment