OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/scoped_ptr.h" | |
6 | |
5 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
6 #include "base/memory/scoped_ptr.h" | 8 #include "base/bind.h" |
9 #include "base/callback.h" | |
7 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
8 | 11 |
9 namespace { | 12 namespace { |
10 | 13 |
11 // Used to test depth subtyping. | 14 // Used to test depth subtyping. |
12 class ConDecLoggerParent { | 15 class ConDecLoggerParent { |
13 public: | 16 public: |
14 virtual ~ConDecLoggerParent() {} | 17 virtual ~ConDecLoggerParent() {} |
15 | 18 |
16 virtual void SetPtr(int* ptr) = 0; | 19 virtual void SetPtr(int* ptr) = 0; |
(...skipping 10 matching lines...) Expand all Loading... | |
27 virtual void SetPtr(int* ptr) OVERRIDE { ptr_ = ptr; ++*ptr_; } | 30 virtual void SetPtr(int* ptr) OVERRIDE { ptr_ = ptr; ++*ptr_; } |
28 | 31 |
29 virtual int SomeMeth(int x) const OVERRIDE { return x; } | 32 virtual int SomeMeth(int x) const OVERRIDE { return x; } |
30 | 33 |
31 private: | 34 private: |
32 int* ptr_; | 35 int* ptr_; |
33 | 36 |
34 DISALLOW_COPY_AND_ASSIGN(ConDecLogger); | 37 DISALLOW_COPY_AND_ASSIGN(ConDecLogger); |
35 }; | 38 }; |
36 | 39 |
40 struct CountingDeleter { | |
41 explicit CountingDeleter(int* count) : count_(count) {} | |
42 inline void operator()(double* ptr) const { | |
43 (*count_)++; | |
44 } | |
45 int* count_; | |
46 }; | |
47 | |
48 // Used to test assignment of convertible deleters. | |
49 struct CountingDeleterChild : public CountingDeleter { | |
50 explicit CountingDeleterChild(int* count) : CountingDeleter(count) {} | |
51 }; | |
52 | |
53 class OverloadedNewAndDelete { | |
54 public: | |
55 void* operator new(size_t size) { | |
56 g_new_count++; | |
57 return malloc(size); | |
58 } | |
59 | |
60 void operator delete(void* ptr) { | |
61 g_delete_count++; | |
62 free(ptr); | |
63 } | |
64 | |
65 static void ResetCounters() { | |
66 g_new_count = 0; | |
67 g_delete_count = 0; | |
68 } | |
69 | |
70 static int new_count() { return g_new_count; } | |
71 static int delete_count() { return g_delete_count; } | |
72 | |
73 private: | |
74 static int g_new_count; | |
75 static int g_delete_count; | |
76 }; | |
77 | |
78 int OverloadedNewAndDelete::g_new_count = 0; | |
79 int OverloadedNewAndDelete::g_delete_count = 0; | |
80 | |
37 scoped_ptr<ConDecLogger> PassThru(scoped_ptr<ConDecLogger> logger) { | 81 scoped_ptr<ConDecLogger> PassThru(scoped_ptr<ConDecLogger> logger) { |
38 return logger.Pass(); | 82 return logger.Pass(); |
39 } | 83 } |
40 | 84 |
41 void GrabAndDrop(scoped_ptr<ConDecLogger> logger) { | 85 void GrabAndDrop(scoped_ptr<ConDecLogger> logger) { |
42 } | 86 } |
43 | 87 |
44 // Do not delete this function! It's existence is to test that you can | 88 // Do not delete this function! It's existence is to test that you can |
45 // return a temporarily constructed version of the scoper. | 89 // return a temporarily constructed version of the scoper. |
46 scoped_ptr<ConDecLogger> TestReturnOfType(int* constructed) { | 90 scoped_ptr<ConDecLogger> TestReturnOfType(int* constructed) { |
47 return scoped_ptr<ConDecLogger>(new ConDecLogger(constructed)); | 91 return scoped_ptr<ConDecLogger>(new ConDecLogger(constructed)); |
48 } | 92 } |
49 | 93 |
50 scoped_ptr<ConDecLoggerParent> UpcastUsingPassAs( | 94 scoped_ptr<ConDecLoggerParent> UpcastUsingPassAs( |
51 scoped_ptr<ConDecLogger> object) { | 95 scoped_ptr<ConDecLogger> object) { |
52 return object.PassAs<ConDecLoggerParent>(); | 96 return object.PassAs<ConDecLoggerParent>(); |
53 } | 97 } |
54 | 98 |
55 } // namespace | 99 } // namespace |
56 | 100 |
57 TEST(ScopedPtrTest, ScopedPtr) { | 101 TEST(ScopedPtrTest, ScopedPtr) { |
58 int constructed = 0; | 102 int constructed = 0; |
59 | 103 |
104 // Ensure size of scoped_ptr<> doesn't increase unexpectedly. | |
105 COMPILE_ASSERT(sizeof(int*) == sizeof(scoped_ptr<int>), | |
106 scoped_ptr_larger_than_raw_ptr); | |
gromer
2012/12/14 16:57:26
Absurd nitpick: "larger than" doesn't match the ac
awong
2012/12/15 00:19:08
Done
| |
107 | |
60 { | 108 { |
61 scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed)); | 109 scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed)); |
62 EXPECT_EQ(1, constructed); | 110 EXPECT_EQ(1, constructed); |
63 EXPECT_TRUE(scoper.get()); | 111 EXPECT_TRUE(scoper.get()); |
64 | 112 |
65 EXPECT_EQ(10, scoper->SomeMeth(10)); | 113 EXPECT_EQ(10, scoper->SomeMeth(10)); |
66 EXPECT_EQ(10, scoper.get()->SomeMeth(10)); | 114 EXPECT_EQ(10, scoper.get()->SomeMeth(10)); |
67 EXPECT_EQ(10, (*scoper).SomeMeth(10)); | 115 EXPECT_EQ(10, (*scoper).SomeMeth(10)); |
68 } | 116 } |
69 EXPECT_EQ(0, constructed); | 117 EXPECT_EQ(0, constructed); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
178 EXPECT_EQ(1, constructed); | 226 EXPECT_EQ(1, constructed); |
179 EXPECT_TRUE(scoper.get()); | 227 EXPECT_TRUE(scoper.get()); |
180 | 228 |
181 scoped_ptr<const ConDecLogger> scoper_const; | 229 scoped_ptr<const ConDecLogger> scoper_const; |
182 scoper_const = scoper.Pass(); | 230 scoper_const = scoper.Pass(); |
183 EXPECT_EQ(1, constructed); | 231 EXPECT_EQ(1, constructed); |
184 EXPECT_TRUE(scoper_const.get()); | 232 EXPECT_TRUE(scoper_const.get()); |
185 EXPECT_FALSE(scoper.get()); | 233 EXPECT_FALSE(scoper.get()); |
186 } | 234 } |
187 EXPECT_EQ(0, constructed); | 235 EXPECT_EQ(0, constructed); |
236 | |
237 // Test assignment to a scoped_ptr deleter of parent type. | |
238 { | |
239 // Custom deleters never touch these value. | |
240 double dummy_value, dummy_value2; | |
241 int deletes = 0; | |
242 int alternate_deletes = 0; | |
243 scoped_ptr<double, CountingDeleter> scoper(&dummy_value, | |
244 CountingDeleter(&deletes)); | |
245 scoped_ptr<double, CountingDeleterChild> scoper_child( | |
246 &dummy_value2, CountingDeleterChild(&alternate_deletes)); | |
247 | |
248 EXPECT_TRUE(scoper); | |
249 EXPECT_TRUE(scoper_child); | |
250 EXPECT_EQ(0, deletes); | |
251 EXPECT_EQ(0, alternate_deletes); | |
252 | |
253 // Test this compiles and correctly overwrites the deleter state. | |
254 scoper = scoper_child.Pass(); | |
255 EXPECT_TRUE(scoper); | |
256 EXPECT_FALSE(scoper_child); | |
257 EXPECT_EQ(1, deletes); | |
258 EXPECT_EQ(0, alternate_deletes); | |
259 | |
260 scoper.reset(); | |
261 EXPECT_FALSE(scoper); | |
262 EXPECT_FALSE(scoper_child); | |
263 EXPECT_EQ(1, deletes); | |
264 EXPECT_EQ(1, alternate_deletes); | |
265 | |
266 scoper_child.reset(&dummy_value); | |
267 EXPECT_TRUE(scoper_child); | |
268 EXPECT_EQ(1, deletes); | |
269 EXPECT_EQ(1, alternate_deletes); | |
270 scoped_ptr<double, CountingDeleter> scoper_construct(scoper_child.Pass()); | |
271 EXPECT_TRUE(scoper_construct); | |
272 EXPECT_FALSE(scoper_child); | |
273 EXPECT_EQ(1, deletes); | |
274 EXPECT_EQ(1, alternate_deletes); | |
275 | |
276 scoper_construct.reset(); | |
277 EXPECT_EQ(1, deletes); | |
278 EXPECT_EQ(2, alternate_deletes); | |
279 } | |
280 } | |
281 | |
282 TEST(ScopedPtrTest, ScopedPtrWithArray) { | |
283 static const int kNumLoggers = 12; | |
284 | |
285 int constructed = 0; | |
286 | |
287 { | |
288 scoped_ptr<ConDecLogger[]> scoper(new ConDecLogger[kNumLoggers]); | |
289 EXPECT_TRUE(scoper); | |
290 EXPECT_EQ(&scoper[0], scoper.get()); | |
291 for (int i = 0; i < kNumLoggers; ++i) { | |
292 scoper[i].SetPtr(&constructed); | |
293 } | |
294 EXPECT_EQ(12, constructed); | |
295 | |
296 EXPECT_EQ(10, scoper.get()->SomeMeth(10)); | |
297 EXPECT_EQ(10, scoper[2].SomeMeth(10)); | |
298 } | |
299 EXPECT_EQ(0, constructed); | |
300 | |
301 // Test reset() and release() | |
302 { | |
303 scoped_ptr<ConDecLogger[]> scoper; | |
304 EXPECT_FALSE(scoper.get()); | |
305 EXPECT_FALSE(scoper.release()); | |
306 EXPECT_FALSE(scoper.get()); | |
307 scoper.reset(); | |
308 EXPECT_FALSE(scoper.get()); | |
309 | |
310 scoper.reset(new ConDecLogger[kNumLoggers]); | |
311 for (int i = 0; i < kNumLoggers; ++i) { | |
312 scoper[i].SetPtr(&constructed); | |
313 } | |
314 EXPECT_EQ(12, constructed); | |
315 scoper.reset(); | |
316 EXPECT_EQ(0, constructed); | |
317 | |
318 scoper.reset(new ConDecLogger[kNumLoggers]); | |
319 for (int i = 0; i < kNumLoggers; ++i) { | |
320 scoper[i].SetPtr(&constructed); | |
321 } | |
322 EXPECT_EQ(12, constructed); | |
323 ConDecLogger* ptr = scoper.release(); | |
324 EXPECT_EQ(12, constructed); | |
325 delete[] ptr; | |
326 EXPECT_EQ(0, constructed); | |
327 } | |
328 EXPECT_EQ(0, constructed); | |
329 | |
330 // Test swap(), ==, !=, and type-safe Boolean. | |
331 { | |
332 scoped_ptr<ConDecLogger[]> scoper1; | |
333 scoped_ptr<ConDecLogger[]> scoper2; | |
334 EXPECT_TRUE(scoper1 == scoper2.get()); | |
335 EXPECT_FALSE(scoper1 != scoper2.get()); | |
336 | |
337 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; | |
338 for (int i = 0; i < kNumLoggers; ++i) { | |
339 loggers[i].SetPtr(&constructed); | |
340 } | |
341 scoper1.reset(loggers); | |
342 EXPECT_TRUE(scoper1); | |
343 EXPECT_EQ(loggers, scoper1.get()); | |
344 EXPECT_FALSE(scoper2); | |
345 EXPECT_FALSE(scoper2.get()); | |
346 EXPECT_FALSE(scoper1 == scoper2.get()); | |
347 EXPECT_TRUE(scoper1 != scoper2.get()); | |
348 | |
349 scoper2.swap(scoper1); | |
350 EXPECT_EQ(loggers, scoper2.get()); | |
351 EXPECT_FALSE(scoper1.get()); | |
352 EXPECT_FALSE(scoper1 == scoper2.get()); | |
353 EXPECT_TRUE(scoper1 != scoper2.get()); | |
354 } | |
355 EXPECT_EQ(0, constructed); | |
356 | |
357 { | |
358 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; | |
359 scoped_ptr<ConDecLogger[]> scoper(loggers); | |
360 EXPECT_TRUE(scoper); | |
361 for (int i = 0; i < kNumLoggers; ++i) { | |
362 scoper[i].SetPtr(&constructed); | |
363 } | |
364 EXPECT_EQ(kNumLoggers, constructed); | |
365 | |
366 // Test Pass() with constructor; | |
367 scoped_ptr<ConDecLogger[]> scoper2(scoper.Pass()); | |
368 EXPECT_EQ(kNumLoggers, constructed); | |
369 | |
370 // Test Pass() with assignment; | |
371 scoped_ptr<ConDecLogger[]> scoper3; | |
372 scoper3 = scoper2.Pass(); | |
373 EXPECT_EQ(kNumLoggers, constructed); | |
374 EXPECT_FALSE(scoper); | |
375 EXPECT_FALSE(scoper2); | |
376 EXPECT_TRUE(scoper3); | |
377 } | |
378 EXPECT_EQ(0, constructed); | |
188 } | 379 } |
189 | 380 |
190 TEST(ScopedPtrTest, ScopedArray) { | 381 TEST(ScopedPtrTest, ScopedArray) { |
191 static const int kNumLoggers = 12; | 382 static const int kNumLoggers = 12; |
192 | 383 |
193 int constructed = 0; | 384 int constructed = 0; |
194 | 385 |
195 { | 386 { |
196 scoped_array<ConDecLogger> scoper(new ConDecLogger[kNumLoggers]); | 387 scoped_array<ConDecLogger> scoper(new ConDecLogger[kNumLoggers]); |
197 EXPECT_TRUE(scoper.get()); | 388 EXPECT_TRUE(scoper.get()); |
(...skipping 30 matching lines...) Expand all Loading... | |
228 scoper[i].SetPtr(&constructed); | 419 scoper[i].SetPtr(&constructed); |
229 } | 420 } |
230 EXPECT_EQ(12, constructed); | 421 EXPECT_EQ(12, constructed); |
231 ConDecLogger* ptr = scoper.release(); | 422 ConDecLogger* ptr = scoper.release(); |
232 EXPECT_EQ(12, constructed); | 423 EXPECT_EQ(12, constructed); |
233 delete[] ptr; | 424 delete[] ptr; |
234 EXPECT_EQ(0, constructed); | 425 EXPECT_EQ(0, constructed); |
235 } | 426 } |
236 EXPECT_EQ(0, constructed); | 427 EXPECT_EQ(0, constructed); |
237 | 428 |
238 // Test swap(), == and != | 429 // Test swap(), ==, !=, and type-safe Boolean. |
239 { | 430 { |
240 scoped_array<ConDecLogger> scoper1; | 431 scoped_array<ConDecLogger> scoper1; |
241 scoped_array<ConDecLogger> scoper2; | 432 scoped_array<ConDecLogger> scoper2; |
242 EXPECT_TRUE(scoper1 == scoper2.get()); | 433 EXPECT_TRUE(scoper1 == scoper2.get()); |
243 EXPECT_FALSE(scoper1 != scoper2.get()); | 434 EXPECT_FALSE(scoper1 != scoper2.get()); |
244 | 435 |
245 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; | 436 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; |
246 for (int i = 0; i < kNumLoggers; ++i) { | 437 for (int i = 0; i < kNumLoggers; ++i) { |
247 loggers[i].SetPtr(&constructed); | 438 loggers[i].SetPtr(&constructed); |
248 } | 439 } |
249 scoper1.reset(loggers); | 440 scoper1.reset(loggers); |
441 EXPECT_TRUE(scoper1); | |
250 EXPECT_EQ(loggers, scoper1.get()); | 442 EXPECT_EQ(loggers, scoper1.get()); |
443 EXPECT_FALSE(scoper2); | |
251 EXPECT_FALSE(scoper2.get()); | 444 EXPECT_FALSE(scoper2.get()); |
252 EXPECT_FALSE(scoper1 == scoper2.get()); | 445 EXPECT_FALSE(scoper1 == scoper2.get()); |
253 EXPECT_TRUE(scoper1 != scoper2.get()); | 446 EXPECT_TRUE(scoper1 != scoper2.get()); |
254 | 447 |
255 scoper2.swap(scoper1); | 448 scoper2.swap(scoper1); |
256 EXPECT_EQ(loggers, scoper2.get()); | 449 EXPECT_EQ(loggers, scoper2.get()); |
257 EXPECT_FALSE(scoper1.get()); | 450 EXPECT_FALSE(scoper1.get()); |
258 EXPECT_FALSE(scoper1 == scoper2.get()); | 451 EXPECT_FALSE(scoper1 == scoper2.get()); |
259 EXPECT_TRUE(scoper1 != scoper2.get()); | 452 EXPECT_TRUE(scoper1 != scoper2.get()); |
260 } | 453 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
349 | 542 |
350 scoped_ptr<ConDecLoggerParent> scoper_parent; | 543 scoped_ptr<ConDecLoggerParent> scoper_parent; |
351 scoper_parent = UpcastUsingPassAs(scoper.Pass()); | 544 scoper_parent = UpcastUsingPassAs(scoper.Pass()); |
352 EXPECT_EQ(1, constructed); | 545 EXPECT_EQ(1, constructed); |
353 EXPECT_TRUE(scoper_parent.get()); | 546 EXPECT_TRUE(scoper_parent.get()); |
354 EXPECT_FALSE(scoper.get()); | 547 EXPECT_FALSE(scoper.get()); |
355 } | 548 } |
356 EXPECT_EQ(0, constructed); | 549 EXPECT_EQ(0, constructed); |
357 } | 550 } |
358 | 551 |
552 TEST(ScopedPtrTest, CustomDeleter) { | |
553 double dummy_value; // Custom deleter never touches this value. | |
554 int deletes = 0; | |
555 int alternate_deletes = 0; | |
556 | |
557 // Normal delete support. | |
558 { | |
559 deletes = 0; | |
560 scoped_ptr<double, CountingDeleter> scoper(&dummy_value, | |
561 CountingDeleter(&deletes)); | |
562 EXPECT_EQ(0, deletes); | |
563 EXPECT_TRUE(scoper.get()); | |
564 } | |
565 EXPECT_EQ(1, deletes); | |
566 | |
567 // Test reset() and release(). | |
568 deletes = 0; | |
569 { | |
570 scoped_ptr<double, CountingDeleter> scoper(NULL, | |
571 CountingDeleter(&deletes)); | |
572 EXPECT_FALSE(scoper.get()); | |
573 EXPECT_FALSE(scoper.release()); | |
574 EXPECT_FALSE(scoper.get()); | |
575 scoper.reset(); | |
576 EXPECT_FALSE(scoper.get()); | |
577 EXPECT_EQ(0, deletes); | |
578 | |
579 scoper.reset(&dummy_value); | |
580 scoper.reset(); | |
581 EXPECT_EQ(1, deletes); | |
582 | |
583 scoper.reset(&dummy_value); | |
584 EXPECT_EQ(&dummy_value, scoper.release()); | |
585 } | |
586 EXPECT_EQ(1, deletes); | |
587 | |
588 // Test get_deleter(). | |
589 deletes = 0; | |
590 alternate_deletes = 0; | |
591 { | |
592 scoped_ptr<double, CountingDeleter> scoper(&dummy_value, | |
593 CountingDeleter(&deletes)); | |
594 // Call deleter manually. | |
595 EXPECT_EQ(0, deletes); | |
596 scoper.get_deleter()(&dummy_value); | |
597 EXPECT_EQ(1, deletes); | |
598 | |
599 // Deleter is still there after reset. | |
600 scoper.reset(); | |
601 EXPECT_EQ(2, deletes); | |
602 scoper.get_deleter()(&dummy_value); | |
603 EXPECT_EQ(3, deletes); | |
604 | |
605 // Deleter can be assigned into (matches C++11 unique_ptr<> spec). | |
606 scoper.get_deleter() = CountingDeleter(&alternate_deletes); | |
607 scoper.reset(&dummy_value); | |
608 EXPECT_EQ(0, alternate_deletes); | |
609 | |
610 } | |
611 EXPECT_EQ(3, deletes); | |
612 EXPECT_EQ(1, alternate_deletes); | |
613 | |
614 // Test operator= deleter support. | |
615 deletes = 0; | |
616 alternate_deletes = 0; | |
617 { | |
618 double dummy_value2; | |
619 scoped_ptr<double, CountingDeleter> scoper(&dummy_value, | |
620 CountingDeleter(&deletes)); | |
621 scoped_ptr<double, CountingDeleter> scoper2( | |
622 &dummy_value2, | |
623 CountingDeleter(&alternate_deletes)); | |
624 EXPECT_EQ(0, deletes); | |
625 EXPECT_EQ(0, alternate_deletes); | |
626 | |
627 // Pass the second deleter through a constructor and an operator=. Then | |
628 // reinitialize the empty scopers to ensure that each one is deleting | |
629 // properly. | |
630 scoped_ptr<double, CountingDeleter> scoper3(scoper2.Pass()); | |
631 scoper = scoper3.Pass(); | |
632 EXPECT_EQ(1, deletes); | |
633 | |
634 scoper2.reset(&dummy_value2); | |
635 scoper3.reset(&dummy_value2); | |
636 EXPECT_EQ(0, alternate_deletes); | |
637 | |
638 } | |
639 EXPECT_EQ(1, deletes); | |
640 EXPECT_EQ(3, alternate_deletes); | |
641 | |
642 // Test swap(), ==, !=, and type-safe Boolean. | |
643 { | |
644 scoped_ptr<double, CountingDeleter> scoper1(NULL, | |
645 CountingDeleter(&deletes)); | |
646 scoped_ptr<double, CountingDeleter> scoper2(NULL, | |
647 CountingDeleter(&deletes)); | |
648 EXPECT_TRUE(scoper1 == scoper2.get()); | |
649 EXPECT_FALSE(scoper1 != scoper2.get()); | |
650 | |
651 scoper1.reset(&dummy_value); | |
652 EXPECT_TRUE(scoper1); | |
653 EXPECT_EQ(&dummy_value, scoper1.get()); | |
654 EXPECT_FALSE(scoper2); | |
655 EXPECT_FALSE(scoper2.get()); | |
656 EXPECT_FALSE(scoper1 == scoper2.get()); | |
657 EXPECT_TRUE(scoper1 != scoper2.get()); | |
658 | |
659 scoper2.swap(scoper1); | |
660 EXPECT_EQ(&dummy_value, scoper2.get()); | |
661 EXPECT_FALSE(scoper1.get()); | |
662 EXPECT_FALSE(scoper1 == scoper2.get()); | |
663 EXPECT_TRUE(scoper1 != scoper2.get()); | |
664 } | |
665 } | |
666 | |
667 // Sanity check test for overloaded new and delete operators. Does not do full | |
668 // coverage of reset/release/Pass() operations as that is redundant with the | |
669 // above. | |
670 TEST(ScopedPtrTest, OverloadedNewAndDelete) { | |
671 { | |
672 OverloadedNewAndDelete::ResetCounters(); | |
673 scoped_ptr<OverloadedNewAndDelete> scoper(new OverloadedNewAndDelete()); | |
674 EXPECT_TRUE(scoper.get()); | |
675 | |
676 scoped_ptr<OverloadedNewAndDelete> scoper2(scoper.Pass()); | |
677 } | |
678 EXPECT_EQ(1, OverloadedNewAndDelete::delete_count()); | |
679 EXPECT_EQ(1, OverloadedNewAndDelete::new_count()); | |
680 } | |
681 | |
359 // TODO scoped_ptr_malloc | 682 // TODO scoped_ptr_malloc |
OLD | NEW |