Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 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 23 matching lines...) Expand all Loading... | |
| 34 | 34 |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 TEST(DequeTest, Basic) | 37 TEST(DequeTest, Basic) |
| 38 { | 38 { |
| 39 Deque<int> intDeque; | 39 Deque<int> intDeque; |
| 40 EXPECT_TRUE(intDeque.isEmpty()); | 40 EXPECT_TRUE(intDeque.isEmpty()); |
| 41 EXPECT_EQ(0ul, intDeque.size()); | 41 EXPECT_EQ(0ul, intDeque.size()); |
| 42 } | 42 } |
| 43 | 43 |
| 44 void checkNumberSequence(Deque<int>& deque, int from, int to, bool increment) | 44 template<size_t inlineCapacity> |
| 45 void checkNumberSequence(Deque<int, inlineCapacity>& deque, int from, int to, bo ol increment) | |
| 45 { | 46 { |
| 46 Deque<int>::iterator it = increment ? deque.begin() : deque.end(); | 47 typename Deque<int, inlineCapacity>::iterator it = increment ? deque.begin() : deque.end(); |
| 47 int step = from < to ? 1 : -1; | 48 int step = from < to ? 1 : -1; |
| 48 for (int i = from; i != to + step; i += step) { | 49 for (int i = from; i != to + step; i += step) { |
| 49 if (!increment) | 50 if (!increment) |
| 50 --it; | 51 --it; |
| 51 | 52 |
| 52 EXPECT_EQ(i, *it); | 53 EXPECT_EQ(i, *it); |
| 53 | 54 |
| 54 if (increment) | 55 if (increment) |
| 55 ++it; | 56 ++it; |
| 56 } | 57 } |
| 57 EXPECT_EQ(increment ? deque.end() : deque.begin(), it); | 58 EXPECT_EQ(increment ? deque.end() : deque.begin(), it); |
| 58 } | 59 } |
| 59 | 60 |
| 60 void checkNumberSequenceReverse(Deque<int>& deque, int from, int to, bool increm ent) | 61 template<size_t inlineCapacity> |
| 62 void checkNumberSequenceReverse(Deque<int, inlineCapacity>& deque, int from, int to, bool increment) | |
| 61 { | 63 { |
| 62 Deque<int>::reverse_iterator it = increment ? deque.rbegin() : deque.rend(); | 64 typename Deque<int, inlineCapacity>::reverse_iterator it = increment ? deque .rbegin() : deque.rend(); |
| 63 int step = from < to ? 1 : -1; | 65 int step = from < to ? 1 : -1; |
| 64 for (int i = from; i != to + step; i += step) { | 66 for (int i = from; i != to + step; i += step) { |
| 65 if (!increment) | 67 if (!increment) |
| 66 --it; | 68 --it; |
| 67 | 69 |
| 68 EXPECT_EQ(i, *it); | 70 EXPECT_EQ(i, *it); |
| 69 | 71 |
| 70 if (increment) | 72 if (increment) |
| 71 ++it; | 73 ++it; |
| 72 } | 74 } |
| 73 EXPECT_EQ(increment ? deque.rend() : deque.rbegin(), it); | 75 EXPECT_EQ(increment ? deque.rend() : deque.rbegin(), it); |
| 74 } | 76 } |
| 75 | 77 |
| 76 TEST(DequeTest, Reverse) | 78 template<size_t inlineCapacity> |
| 79 void reverseTest() | |
| 77 { | 80 { |
| 78 Deque<int> intDeque; | 81 Deque<int, inlineCapacity> intDeque; |
| 79 intDeque.append(10); | 82 intDeque.append(10); |
| 80 intDeque.append(11); | 83 intDeque.append(11); |
| 81 intDeque.append(12); | 84 intDeque.append(12); |
| 82 intDeque.append(13); | 85 intDeque.append(13); |
| 83 | 86 |
| 84 checkNumberSequence(intDeque, 10, 13, true); | 87 checkNumberSequence(intDeque, 10, 13, true); |
| 85 checkNumberSequence(intDeque, 13, 10, false); | 88 checkNumberSequence(intDeque, 13, 10, false); |
| 86 checkNumberSequenceReverse(intDeque, 13, 10, true); | 89 checkNumberSequenceReverse(intDeque, 13, 10, true); |
| 87 checkNumberSequenceReverse(intDeque, 10, 13, false); | 90 checkNumberSequenceReverse(intDeque, 10, 13, false); |
| 88 | 91 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 102 checkNumberSequenceReverse(intDeque, 199, 11, true); | 105 checkNumberSequenceReverse(intDeque, 199, 11, true); |
| 103 checkNumberSequenceReverse(intDeque, 11, 199, false); | 106 checkNumberSequenceReverse(intDeque, 11, 199, false); |
| 104 | 107 |
| 105 for (int i = 0; i < 180; ++i) | 108 for (int i = 0; i < 180; ++i) |
| 106 EXPECT_EQ(i + 11, intDeque.takeFirst()); | 109 EXPECT_EQ(i + 11, intDeque.takeFirst()); |
| 107 checkNumberSequence(intDeque, 191, 199, true); | 110 checkNumberSequence(intDeque, 191, 199, true); |
| 108 checkNumberSequence(intDeque, 199, 191, false); | 111 checkNumberSequence(intDeque, 199, 191, false); |
| 109 checkNumberSequenceReverse(intDeque, 199, 191, true); | 112 checkNumberSequenceReverse(intDeque, 199, 191, true); |
| 110 checkNumberSequenceReverse(intDeque, 191, 199, false); | 113 checkNumberSequenceReverse(intDeque, 191, 199, false); |
| 111 | 114 |
| 112 Deque<int> intDeque2; | 115 Deque<int, inlineCapacity> intDeque2; |
| 113 swap(intDeque, intDeque2); | 116 swap(intDeque, intDeque2); |
| 114 | 117 |
| 115 checkNumberSequence(intDeque2, 191, 199, true); | 118 checkNumberSequence(intDeque2, 191, 199, true); |
| 116 checkNumberSequence(intDeque2, 199, 191, false); | 119 checkNumberSequence(intDeque2, 199, 191, false); |
| 117 checkNumberSequenceReverse(intDeque2, 199, 191, true); | 120 checkNumberSequenceReverse(intDeque2, 199, 191, true); |
| 118 checkNumberSequenceReverse(intDeque2, 191, 199, false); | 121 checkNumberSequenceReverse(intDeque2, 191, 199, false); |
| 119 | 122 |
| 120 intDeque.swap(intDeque2); | 123 intDeque.swap(intDeque2); |
| 121 | 124 |
| 122 checkNumberSequence(intDeque, 191, 199, true); | 125 checkNumberSequence(intDeque, 191, 199, true); |
| 123 checkNumberSequence(intDeque, 199, 191, false); | 126 checkNumberSequence(intDeque, 199, 191, false); |
| 124 checkNumberSequenceReverse(intDeque, 199, 191, true); | 127 checkNumberSequenceReverse(intDeque, 199, 191, true); |
| 125 checkNumberSequenceReverse(intDeque, 191, 199, false); | 128 checkNumberSequenceReverse(intDeque, 191, 199, false); |
| 126 | 129 |
| 127 intDeque.swap(intDeque2); | 130 intDeque.swap(intDeque2); |
| 128 | 131 |
| 129 checkNumberSequence(intDeque2, 191, 199, true); | 132 checkNumberSequence(intDeque2, 191, 199, true); |
| 130 checkNumberSequence(intDeque2, 199, 191, false); | 133 checkNumberSequence(intDeque2, 199, 191, false); |
| 131 checkNumberSequenceReverse(intDeque2, 199, 191, true); | 134 checkNumberSequenceReverse(intDeque2, 199, 191, true); |
| 132 checkNumberSequenceReverse(intDeque2, 191, 199, false); | 135 checkNumberSequenceReverse(intDeque2, 191, 199, false); |
| 133 } | 136 } |
| 134 | 137 |
| 138 TEST(DequeTest, Reverse) | |
| 139 { | |
| 140 reverseTest<0>(); | |
| 141 reverseTest<2>(); | |
| 142 } | |
| 143 | |
| 135 class DestructCounter { | 144 class DestructCounter { |
| 136 public: | 145 public: |
| 137 explicit DestructCounter(int i, int* destructNumber) | 146 explicit DestructCounter(int i, int* destructNumber) |
| 138 : m_i(i) | 147 : m_i(i) |
| 139 , m_destructNumber(destructNumber) | 148 , m_destructNumber(destructNumber) |
| 140 { } | 149 { } |
| 141 | 150 |
| 142 ~DestructCounter() { ++(*m_destructNumber); } | 151 ~DestructCounter() { ++(*m_destructNumber); } |
| 143 int get() const { return m_i; } | 152 int get() const { return m_i; } |
| 144 | 153 |
| 145 private: | 154 private: |
| 146 int m_i; | 155 int m_i; |
| 147 int* m_destructNumber; | 156 int* m_destructNumber; |
| 148 }; | 157 }; |
| 149 | 158 |
| 150 typedef WTF::Deque<OwnPtr<DestructCounter> > OwnPtrDeque; | 159 template<typename OwnPtrDeque> |
| 151 | 160 void ownPtrTest() |
| 152 TEST(DequeTest, OwnPtr) | |
| 153 { | 161 { |
| 154 int destructNumber = 0; | 162 int destructNumber = 0; |
| 155 OwnPtrDeque deque; | 163 OwnPtrDeque deque; |
| 156 deque.append(adoptPtr(new DestructCounter(0, &destructNumber))); | 164 deque.append(adoptPtr(new DestructCounter(0, &destructNumber))); |
| 157 deque.append(adoptPtr(new DestructCounter(1, &destructNumber))); | 165 deque.append(adoptPtr(new DestructCounter(1, &destructNumber))); |
| 158 EXPECT_EQ(2u, deque.size()); | 166 EXPECT_EQ(2u, deque.size()); |
| 159 | 167 |
| 160 OwnPtr<DestructCounter>& counter0 = deque.first(); | 168 OwnPtr<DestructCounter>& counter0 = deque.first(); |
| 161 EXPECT_EQ(0, counter0->get()); | 169 EXPECT_EQ(0, counter0->get()); |
| 162 int counter1 = deque.last()->get(); | 170 int counter1 = deque.last()->get(); |
| 163 EXPECT_EQ(1, counter1); | 171 EXPECT_EQ(1, counter1); |
| 164 EXPECT_EQ(0, destructNumber); | 172 EXPECT_EQ(0, destructNumber); |
| 165 | 173 |
| 166 size_t index = 0; | 174 size_t index = 0; |
| 167 for (OwnPtrDeque::iterator iter = deque.begin(); iter != deque.end(); ++iter ) { | 175 for (typename OwnPtrDeque::iterator iter = deque.begin(); iter != deque.end( ); ++iter) { |
| 168 OwnPtr<DestructCounter>& refCounter = *iter; | 176 OwnPtr<DestructCounter>& refCounter = *iter; |
| 169 EXPECT_EQ(index, static_cast<size_t>(refCounter->get())); | 177 EXPECT_EQ(index, static_cast<size_t>(refCounter->get())); |
| 170 EXPECT_EQ(index, static_cast<size_t>((*refCounter).get())); | 178 EXPECT_EQ(index, static_cast<size_t>((*refCounter).get())); |
| 171 index++; | 179 index++; |
| 172 } | 180 } |
| 173 EXPECT_EQ(0, destructNumber); | 181 EXPECT_EQ(0, destructNumber); |
| 174 | 182 |
| 175 OwnPtrDeque::iterator it = deque.begin(); | 183 typename OwnPtrDeque::iterator it = deque.begin(); |
| 176 for (index = 0; index < deque.size(); ++index) { | 184 for (index = 0; index < deque.size(); ++index) { |
| 177 OwnPtr<DestructCounter>& refCounter = *it; | 185 OwnPtr<DestructCounter>& refCounter = *it; |
| 178 EXPECT_EQ(index, static_cast<size_t>(refCounter->get())); | 186 EXPECT_EQ(index, static_cast<size_t>(refCounter->get())); |
| 179 index++; | 187 index++; |
| 180 ++it; | 188 ++it; |
| 181 } | 189 } |
| 182 EXPECT_EQ(0, destructNumber); | 190 EXPECT_EQ(0, destructNumber); |
| 183 | 191 |
| 184 EXPECT_EQ(0, deque.first()->get()); | 192 EXPECT_EQ(0, deque.first()->get()); |
| 185 deque.removeFirst(); | 193 deque.removeFirst(); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 208 OwnPtrDeque copyDeque; | 216 OwnPtrDeque copyDeque; |
| 209 deque.swap(copyDeque); | 217 deque.swap(copyDeque); |
| 210 EXPECT_EQ(0, destructNumber); | 218 EXPECT_EQ(0, destructNumber); |
| 211 EXPECT_EQ(count, copyDeque.size()); | 219 EXPECT_EQ(count, copyDeque.size()); |
| 212 EXPECT_EQ(0u, deque.size()); | 220 EXPECT_EQ(0u, deque.size()); |
| 213 | 221 |
| 214 copyDeque.clear(); | 222 copyDeque.clear(); |
| 215 EXPECT_EQ(count, static_cast<size_t>(destructNumber)); | 223 EXPECT_EQ(count, static_cast<size_t>(destructNumber)); |
| 216 } | 224 } |
| 217 | 225 |
| 226 TEST(DequeTest, OwnPtr) | |
| 227 { | |
| 228 ownPtrTest<WTF::Deque<OwnPtr<DestructCounter> > >(); | |
| 229 ownPtrTest<WTF::Deque<OwnPtr<DestructCounter>, 2> >(); | |
| 230 } | |
| 231 | |
| 232 | |
| 218 // WrappedInt class will fail if it was memmoved or memcpyed. | 233 // WrappedInt class will fail if it was memmoved or memcpyed. |
| 219 static HashSet<void*> constructedWrappedInts; | 234 static HashSet<void*> constructedWrappedInts; |
| 220 class WrappedInt { | 235 class WrappedInt { |
| 221 public: | 236 public: |
| 222 WrappedInt(int i = 0) | 237 WrappedInt(int i = 0) |
| 223 : m_originalThisPtr(this) | 238 : m_originalThisPtr(this) |
| 224 , m_i(i) | 239 , m_i(i) |
| 225 { | 240 { |
| 226 constructedWrappedInts.add(this); | 241 constructedWrappedInts.add(this); |
| 227 } | 242 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 246 constructedWrappedInts.remove(this); | 261 constructedWrappedInts.remove(this); |
| 247 } | 262 } |
| 248 | 263 |
| 249 int get() const { return m_i; } | 264 int get() const { return m_i; } |
| 250 | 265 |
| 251 private: | 266 private: |
| 252 void* m_originalThisPtr; | 267 void* m_originalThisPtr; |
| 253 int m_i; | 268 int m_i; |
| 254 }; | 269 }; |
| 255 | 270 |
| 256 TEST(DequeTest, SwapWithoutInlineCapacity) | 271 template<size_t inlineCapacity> |
| 272 void swapWithOrWithoutInlineCapacity() | |
| 257 { | 273 { |
| 258 Deque<WrappedInt> dequeA; | 274 Deque<WrappedInt, inlineCapacity> dequeA; |
| 259 dequeA.append(WrappedInt(1)); | 275 dequeA.append(WrappedInt(1)); |
| 260 Deque<WrappedInt> dequeB; | 276 Deque<WrappedInt, inlineCapacity> dequeB; |
| 261 dequeB.append(WrappedInt(2)); | 277 dequeB.append(WrappedInt(2)); |
| 262 | 278 |
| 263 ASSERT_EQ(dequeA.size(), dequeB.size()); | 279 ASSERT_EQ(dequeA.size(), dequeB.size()); |
| 264 dequeA.swap(dequeB); | 280 dequeA.swap(dequeB); |
| 265 | 281 |
| 266 ASSERT_EQ(1u, dequeA.size()); | 282 ASSERT_EQ(1u, dequeA.size()); |
| 267 EXPECT_EQ(2, dequeA.first().get()); | 283 EXPECT_EQ(2, dequeA.first().get()); |
| 268 ASSERT_EQ(1u, dequeB.size()); | 284 ASSERT_EQ(1u, dequeB.size()); |
| 269 EXPECT_EQ(1, dequeB.first().get()); | 285 EXPECT_EQ(1, dequeB.first().get()); |
| 270 | 286 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 290 dequeA.swap(dequeB); | 306 dequeA.swap(dequeB); |
| 291 | 307 |
| 292 ASSERT_EQ(1u, dequeA.size()); | 308 ASSERT_EQ(1u, dequeA.size()); |
| 293 EXPECT_EQ(1, dequeA.first().get()); | 309 EXPECT_EQ(1, dequeA.first().get()); |
| 294 ASSERT_EQ(3u, dequeB.size()); | 310 ASSERT_EQ(3u, dequeB.size()); |
| 295 EXPECT_EQ(2, dequeB.first().get()); | 311 EXPECT_EQ(2, dequeB.first().get()); |
| 296 | 312 |
| 297 dequeB.swap(dequeA); | 313 dequeB.swap(dequeA); |
| 298 } | 314 } |
| 299 | 315 |
| 316 TEST(DequeTest, SwapWithOrWithoutInlineCapacity) | |
| 317 { | |
| 318 swapWithOrWithoutInlineCapacity<0>(); | |
| 319 swapWithOrWithoutInlineCapacity<2>(); | |
| 320 } | |
| 321 | |
| 322 class LivenessCounter { | |
| 323 public: | |
| 324 void ref() { s_live++; } | |
| 325 void deref() { s_live--; } | |
| 326 | |
| 327 static unsigned s_live; | |
| 328 }; | |
| 329 | |
| 330 unsigned LivenessCounter::s_live = 0; | |
| 331 | |
| 332 bool fairlyPrime(int i) | |
| 333 { | |
| 334 return !(i % 2 || i % 3 || i % 5 || i % 7); | |
| 335 } | |
| 336 | |
| 337 template<size_t inlineCapacity> | |
| 338 void theBigSwapTest() | |
| 339 { | |
| 340 LivenessCounter::s_live = 0; | |
| 341 LivenessCounter counter; | |
| 342 EXPECT_EQ(0u, LivenessCounter::s_live); | |
| 343 | |
| 344 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque; | |
| 345 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque2; | |
| 346 deque.append(&counter); | |
| 347 deque2.append(&counter); | |
| 348 EXPECT_EQ(2u, LivenessCounter::s_live); | |
| 349 | |
| 350 for (unsigned i = 0; i < 13; i++) { | |
| 351 if (!fairlyPrime(i)) | |
| 352 continue; | |
| 353 for (unsigned j = i; j < 13; j++) { | |
| 354 if (!fairlyPrime(j)) | |
| 355 continue; | |
| 356 deque.clear(); | |
| 357 deque2.clear(); | |
| 358 EXPECT_EQ(0u, LivenessCounter::s_live); | |
| 359 for (unsigned k = 0; k < i; k++) | |
| 360 deque.append(&counter); | |
| 361 EXPECT_EQ(i, LivenessCounter::s_live); | |
| 362 EXPECT_EQ(i, deque.size()); | |
| 363 for (unsigned k = 0; k < j; k++) | |
| 364 deque.removeFirst(); | |
| 365 | |
| 366 EXPECT_EQ(i - j, LivenessCounter::s_live); | |
|
Ken Russell (switch to Gerrit)
2014/07/16 07:38:42
How does this work? It looks to me like in the nes
Erik Corry
2014/07/17 12:40:04
It doesn't work, but the fairlyPrime test that was
| |
| 367 EXPECT_EQ(i - j, deque.size()); | |
| 368 deque.swap(deque2); | |
| 369 EXPECT_EQ(i - j, LivenessCounter::s_live); | |
| 370 EXPECT_EQ(0u, deque.size()); | |
| 371 EXPECT_EQ(i - j, deque2.size()); | |
| 372 deque.swap(deque2); | |
| 373 EXPECT_EQ(i - j, LivenessCounter::s_live); | |
| 374 | |
| 375 deque2.append(&counter); | |
| 376 deque2.append(&counter); | |
| 377 deque2.append(&counter); | |
| 378 | |
| 379 for (unsigned k = 0; k < 13; k++) { | |
| 380 EXPECT_EQ(3 + i - j, LivenessCounter::s_live); | |
| 381 EXPECT_EQ(i - j, deque.size()); | |
| 382 EXPECT_EQ(3u, deque2.size()); | |
| 383 deque.swap(deque2); | |
| 384 EXPECT_EQ(3 + i - j, LivenessCounter::s_live); | |
| 385 EXPECT_EQ(i - j, deque2.size()); | |
| 386 EXPECT_EQ(3u, deque.size()); | |
| 387 deque.swap(deque2); | |
| 388 EXPECT_EQ(3 + i - j, LivenessCounter::s_live); | |
| 389 EXPECT_EQ(i - j, deque.size()); | |
| 390 EXPECT_EQ(3u, deque2.size()); | |
| 391 | |
| 392 deque2.removeFirst(); | |
| 393 deque2.append(&counter); | |
| 394 } | |
| 395 } | |
| 396 } | |
| 397 | |
| 398 } | |
| 399 | |
| 400 TEST(DequeTest, BigSwapTest) | |
| 401 { | |
| 402 theBigSwapTest<0>(); | |
| 403 theBigSwapTest<2>(); | |
| 404 theBigSwapTest<10>(); | |
| 405 } | |
| 406 | |
| 300 } // namespace | 407 } // namespace |
| OLD | NEW |