OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2012 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 | 51 |
52 // reserveCapacityForSize should respect minimumTableSize. | 52 // reserveCapacityForSize should respect minimumTableSize. |
53 EXPECT_GE(initialCapacity, minimumTableSize); | 53 EXPECT_GE(initialCapacity, minimumTableSize); |
54 | 54 |
55 // Adding items up to size should never change the capacity. | 55 // Adding items up to size should never change the capacity. |
56 for (size_t i = 0; i < size; ++i) { | 56 for (size_t i = 0; i < size; ++i) { |
57 testSet.add(i + 1); // Avoid adding '0'. | 57 testSet.add(i + 1); // Avoid adding '0'. |
58 EXPECT_EQ(initialCapacity, testSet.capacity()); | 58 EXPECT_EQ(initialCapacity, testSet.capacity()); |
59 } | 59 } |
60 | 60 |
61 // Adding items up to less than half the capacity should not change the capaci
ty. | 61 // Adding items up to less than half the capacity should not change the |
| 62 // capacity. |
62 unsigned capacityLimit = initialCapacity / 2 - 1; | 63 unsigned capacityLimit = initialCapacity / 2 - 1; |
63 for (size_t i = size; i < capacityLimit; ++i) { | 64 for (size_t i = size; i < capacityLimit; ++i) { |
64 testSet.add(i + 1); | 65 testSet.add(i + 1); |
65 EXPECT_EQ(initialCapacity, testSet.capacity()); | 66 EXPECT_EQ(initialCapacity, testSet.capacity()); |
66 } | 67 } |
67 | 68 |
68 // Adding one more item increases the capacity. | 69 // Adding one more item increases the capacity. |
69 testSet.add(capacityLimit + 1); | 70 testSet.add(capacityLimit + 1); |
70 EXPECT_GT(testSet.capacity(), initialCapacity); | 71 EXPECT_GT(testSet.capacity(), initialCapacity); |
71 | 72 |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 set = std::move(other); | 269 set = std::move(other); |
269 EXPECT_EQ(0, counter); | 270 EXPECT_EQ(0, counter); |
270 | 271 |
271 counter = 0; | 272 counter = 0; |
272 HashSet<CountCopy> yetAnother(std::move(set)); | 273 HashSet<CountCopy> yetAnother(std::move(set)); |
273 EXPECT_EQ(0, counter); | 274 EXPECT_EQ(0, counter); |
274 } | 275 } |
275 | 276 |
276 class MoveOnly { | 277 class MoveOnly { |
277 public: | 278 public: |
278 // kEmpty and kDeleted have special meanings when MoveOnly is used as the key
of a hash table. | 279 // kEmpty and kDeleted have special meanings when MoveOnly is used as the key |
| 280 // of a hash table. |
279 enum { kEmpty = 0, kDeleted = -1, kMovedOut = -2 }; | 281 enum { kEmpty = 0, kDeleted = -1, kMovedOut = -2 }; |
280 | 282 |
281 explicit MoveOnly(int value = kEmpty, int id = 0) | 283 explicit MoveOnly(int value = kEmpty, int id = 0) |
282 : m_value(value), m_id(id) {} | 284 : m_value(value), m_id(id) {} |
283 MoveOnly(MoveOnly&& other) : m_value(other.m_value), m_id(other.m_id) { | 285 MoveOnly(MoveOnly&& other) : m_value(other.m_value), m_id(other.m_id) { |
284 other.m_value = kMovedOut; | 286 other.m_value = kMovedOut; |
285 other.m_id = 0; | 287 other.m_id = 0; |
286 } | 288 } |
287 MoveOnly& operator=(MoveOnly&& other) { | 289 MoveOnly& operator=(MoveOnly&& other) { |
288 m_value = other.m_value; | 290 m_value = other.m_value; |
289 m_id = other.m_id; | 291 m_id = other.m_id; |
290 other.m_value = kMovedOut; | 292 other.m_value = kMovedOut; |
291 other.m_id = 0; | 293 other.m_id = 0; |
292 return *this; | 294 return *this; |
293 } | 295 } |
294 | 296 |
295 int value() const { return m_value; } | 297 int value() const { return m_value; } |
296 // id() is used for distinguishing MoveOnlys with the same value(). | 298 // id() is used for distinguishing MoveOnlys with the same value(). |
297 int id() const { return m_id; } | 299 int id() const { return m_id; } |
298 | 300 |
299 private: | 301 private: |
300 MoveOnly(const MoveOnly&) = delete; | 302 MoveOnly(const MoveOnly&) = delete; |
301 MoveOnly& operator=(const MoveOnly&) = delete; | 303 MoveOnly& operator=(const MoveOnly&) = delete; |
302 | 304 |
303 int m_value; | 305 int m_value; |
304 int m_id; | 306 int m_id; |
305 }; | 307 }; |
306 | 308 |
307 struct MoveOnlyHashTraits : public GenericHashTraits<MoveOnly> { | 309 struct MoveOnlyHashTraits : public GenericHashTraits<MoveOnly> { |
308 // This is actually true, but we pretend that it's false to disable the optimi
zation. | 310 // This is actually true, but we pretend that it's false to disable the |
| 311 // optimization. |
309 static const bool emptyValueIsZero = false; | 312 static const bool emptyValueIsZero = false; |
310 | 313 |
311 static const bool hasIsEmptyValueFunction = true; | 314 static const bool hasIsEmptyValueFunction = true; |
312 static bool isEmptyValue(const MoveOnly& value) { | 315 static bool isEmptyValue(const MoveOnly& value) { |
313 return value.value() == MoveOnly::kEmpty; | 316 return value.value() == MoveOnly::kEmpty; |
314 } | 317 } |
315 static void constructDeletedValue(MoveOnly& slot, bool) { | 318 static void constructDeletedValue(MoveOnly& slot, bool) { |
316 slot = MoveOnly(MoveOnly::kDeleted); | 319 slot = MoveOnly(MoveOnly::kDeleted); |
317 } | 320 } |
318 static bool isDeletedValue(const MoveOnly& value) { | 321 static bool isDeletedValue(const MoveOnly& value) { |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 EXPECT_TRUE(oneTwoThree.contains(1)); | 488 EXPECT_TRUE(oneTwoThree.contains(1)); |
486 EXPECT_TRUE(oneTwoThree.contains(2)); | 489 EXPECT_TRUE(oneTwoThree.contains(2)); |
487 EXPECT_TRUE(oneTwoThree.contains(3)); | 490 EXPECT_TRUE(oneTwoThree.contains(3)); |
488 | 491 |
489 oneTwoThree = {3, 1, 1, 2, 1, 1, 3}; | 492 oneTwoThree = {3, 1, 1, 2, 1, 1, 3}; |
490 EXPECT_EQ(3u, oneTwoThree.size()); | 493 EXPECT_EQ(3u, oneTwoThree.size()); |
491 EXPECT_TRUE(oneTwoThree.contains(1)); | 494 EXPECT_TRUE(oneTwoThree.contains(1)); |
492 EXPECT_TRUE(oneTwoThree.contains(2)); | 495 EXPECT_TRUE(oneTwoThree.contains(2)); |
493 EXPECT_TRUE(oneTwoThree.contains(3)); | 496 EXPECT_TRUE(oneTwoThree.contains(3)); |
494 | 497 |
495 // Other ways of construction: as a function parameter and in a return stateme
nt. | 498 // Other ways of construction: as a function parameter and in a return |
| 499 // statement. |
496 EXPECT_TRUE(isOneTwoThree({1, 2, 3})); | 500 EXPECT_TRUE(isOneTwoThree({1, 2, 3})); |
497 EXPECT_TRUE(isOneTwoThree(returnOneTwoThree())); | 501 EXPECT_TRUE(isOneTwoThree(returnOneTwoThree())); |
498 } | 502 } |
499 | 503 |
500 } // anonymous namespace | 504 } // anonymous namespace |
501 | 505 |
502 } // namespace WTF | 506 } // namespace WTF |
OLD | NEW |