| 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/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| 11 // Used to test depth subtyping. | 11 // Used to test depth subtyping. |
| 12 class ConDecLoggerParent { | 12 class ConDecLoggerParent { |
| 13 public: | 13 public: |
| 14 virtual ~ConDecLoggerParent() {} | 14 virtual ~ConDecLoggerParent() {} |
| 15 virtual void set_ptr(int* ptr) = 0; | 15 |
| 16 virtual void SetPtr(int* ptr) = 0; |
| 16 | 17 |
| 17 virtual int SomeMeth(int x) const = 0; | 18 virtual int SomeMeth(int x) const = 0; |
| 18 }; | 19 }; |
| 19 | 20 |
| 20 class ConDecLogger : public ConDecLoggerParent { | 21 class ConDecLogger : public ConDecLoggerParent { |
| 21 public: | 22 public: |
| 22 ConDecLogger() : ptr_(NULL) { } | 23 ConDecLogger() : ptr_(NULL) { } |
| 23 explicit ConDecLogger(int* ptr) { set_ptr(ptr); } | 24 explicit ConDecLogger(int* ptr) { SetPtr(ptr); } |
| 24 virtual ~ConDecLogger() { --*ptr_; } | 25 virtual ~ConDecLogger() { --*ptr_; } |
| 25 | 26 |
| 26 virtual void set_ptr(int* ptr) OVERRIDE { ptr_ = ptr; ++*ptr_; } | 27 virtual void SetPtr(int* ptr) OVERRIDE { ptr_ = ptr; ++*ptr_; } |
| 27 | 28 |
| 28 virtual int SomeMeth(int x) const OVERRIDE { return x; } | 29 virtual int SomeMeth(int x) const OVERRIDE { return x; } |
| 29 | 30 |
| 30 private: | 31 private: |
| 31 int* ptr_; | 32 int* ptr_; |
| 33 |
| 32 DISALLOW_COPY_AND_ASSIGN(ConDecLogger); | 34 DISALLOW_COPY_AND_ASSIGN(ConDecLogger); |
| 33 }; | 35 }; |
| 34 | 36 |
| 35 scoped_ptr<ConDecLogger> PassThru(scoped_ptr<ConDecLogger> logger) { | 37 scoped_ptr<ConDecLogger> PassThru(scoped_ptr<ConDecLogger> logger) { |
| 36 return logger.Pass(); | 38 return logger.Pass(); |
| 37 } | 39 } |
| 38 | 40 |
| 39 void GrabAndDrop(scoped_ptr<ConDecLogger> logger) { | 41 void GrabAndDrop(scoped_ptr<ConDecLogger> logger) { |
| 40 } | 42 } |
| 41 | 43 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 TEST(ScopedPtrTest, ScopedArray) { | 190 TEST(ScopedPtrTest, ScopedArray) { |
| 189 static const int kNumLoggers = 12; | 191 static const int kNumLoggers = 12; |
| 190 | 192 |
| 191 int constructed = 0; | 193 int constructed = 0; |
| 192 | 194 |
| 193 { | 195 { |
| 194 scoped_array<ConDecLogger> scoper(new ConDecLogger[kNumLoggers]); | 196 scoped_array<ConDecLogger> scoper(new ConDecLogger[kNumLoggers]); |
| 195 EXPECT_TRUE(scoper.get()); | 197 EXPECT_TRUE(scoper.get()); |
| 196 EXPECT_EQ(&scoper[0], scoper.get()); | 198 EXPECT_EQ(&scoper[0], scoper.get()); |
| 197 for (int i = 0; i < kNumLoggers; ++i) { | 199 for (int i = 0; i < kNumLoggers; ++i) { |
| 198 scoper[i].set_ptr(&constructed); | 200 scoper[i].SetPtr(&constructed); |
| 199 } | 201 } |
| 200 EXPECT_EQ(12, constructed); | 202 EXPECT_EQ(12, constructed); |
| 201 | 203 |
| 202 EXPECT_EQ(10, scoper.get()->SomeMeth(10)); | 204 EXPECT_EQ(10, scoper.get()->SomeMeth(10)); |
| 203 EXPECT_EQ(10, scoper[2].SomeMeth(10)); | 205 EXPECT_EQ(10, scoper[2].SomeMeth(10)); |
| 204 } | 206 } |
| 205 EXPECT_EQ(0, constructed); | 207 EXPECT_EQ(0, constructed); |
| 206 | 208 |
| 207 // Test reset() and release() | 209 // Test reset() and release() |
| 208 { | 210 { |
| 209 scoped_array<ConDecLogger> scoper; | 211 scoped_array<ConDecLogger> scoper; |
| 210 EXPECT_FALSE(scoper.get()); | 212 EXPECT_FALSE(scoper.get()); |
| 211 EXPECT_FALSE(scoper.release()); | 213 EXPECT_FALSE(scoper.release()); |
| 212 EXPECT_FALSE(scoper.get()); | 214 EXPECT_FALSE(scoper.get()); |
| 213 scoper.reset(); | 215 scoper.reset(); |
| 214 EXPECT_FALSE(scoper.get()); | 216 EXPECT_FALSE(scoper.get()); |
| 215 | 217 |
| 216 scoper.reset(new ConDecLogger[kNumLoggers]); | 218 scoper.reset(new ConDecLogger[kNumLoggers]); |
| 217 for (int i = 0; i < kNumLoggers; ++i) { | 219 for (int i = 0; i < kNumLoggers; ++i) { |
| 218 scoper[i].set_ptr(&constructed); | 220 scoper[i].SetPtr(&constructed); |
| 219 } | 221 } |
| 220 EXPECT_EQ(12, constructed); | 222 EXPECT_EQ(12, constructed); |
| 221 scoper.reset(); | 223 scoper.reset(); |
| 222 EXPECT_EQ(0, constructed); | 224 EXPECT_EQ(0, constructed); |
| 223 | 225 |
| 224 scoper.reset(new ConDecLogger[kNumLoggers]); | 226 scoper.reset(new ConDecLogger[kNumLoggers]); |
| 225 for (int i = 0; i < kNumLoggers; ++i) { | 227 for (int i = 0; i < kNumLoggers; ++i) { |
| 226 scoper[i].set_ptr(&constructed); | 228 scoper[i].SetPtr(&constructed); |
| 227 } | 229 } |
| 228 EXPECT_EQ(12, constructed); | 230 EXPECT_EQ(12, constructed); |
| 229 ConDecLogger* ptr = scoper.release(); | 231 ConDecLogger* ptr = scoper.release(); |
| 230 EXPECT_EQ(12, constructed); | 232 EXPECT_EQ(12, constructed); |
| 231 delete[] ptr; | 233 delete[] ptr; |
| 232 EXPECT_EQ(0, constructed); | 234 EXPECT_EQ(0, constructed); |
| 233 } | 235 } |
| 234 EXPECT_EQ(0, constructed); | 236 EXPECT_EQ(0, constructed); |
| 235 | 237 |
| 236 // Test swap(), == and != | 238 // Test swap(), == and != |
| 237 { | 239 { |
| 238 scoped_array<ConDecLogger> scoper1; | 240 scoped_array<ConDecLogger> scoper1; |
| 239 scoped_array<ConDecLogger> scoper2; | 241 scoped_array<ConDecLogger> scoper2; |
| 240 EXPECT_TRUE(scoper1 == scoper2.get()); | 242 EXPECT_TRUE(scoper1 == scoper2.get()); |
| 241 EXPECT_FALSE(scoper1 != scoper2.get()); | 243 EXPECT_FALSE(scoper1 != scoper2.get()); |
| 242 | 244 |
| 243 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; | 245 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; |
| 244 for (int i = 0; i < kNumLoggers; ++i) { | 246 for (int i = 0; i < kNumLoggers; ++i) { |
| 245 loggers[i].set_ptr(&constructed); | 247 loggers[i].SetPtr(&constructed); |
| 246 } | 248 } |
| 247 scoper1.reset(loggers); | 249 scoper1.reset(loggers); |
| 248 EXPECT_EQ(loggers, scoper1.get()); | 250 EXPECT_EQ(loggers, scoper1.get()); |
| 249 EXPECT_FALSE(scoper2.get()); | 251 EXPECT_FALSE(scoper2.get()); |
| 250 EXPECT_FALSE(scoper1 == scoper2.get()); | 252 EXPECT_FALSE(scoper1 == scoper2.get()); |
| 251 EXPECT_TRUE(scoper1 != scoper2.get()); | 253 EXPECT_TRUE(scoper1 != scoper2.get()); |
| 252 | 254 |
| 253 scoper2.swap(scoper1); | 255 scoper2.swap(scoper1); |
| 254 EXPECT_EQ(loggers, scoper2.get()); | 256 EXPECT_EQ(loggers, scoper2.get()); |
| 255 EXPECT_FALSE(scoper1.get()); | 257 EXPECT_FALSE(scoper1.get()); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 scoped_ptr<ConDecLoggerParent> scoper_parent; | 350 scoped_ptr<ConDecLoggerParent> scoper_parent; |
| 349 scoper_parent = UpcastUsingPassAs(scoper.Pass()); | 351 scoper_parent = UpcastUsingPassAs(scoper.Pass()); |
| 350 EXPECT_EQ(1, constructed); | 352 EXPECT_EQ(1, constructed); |
| 351 EXPECT_TRUE(scoper_parent.get()); | 353 EXPECT_TRUE(scoper_parent.get()); |
| 352 EXPECT_FALSE(scoper.get()); | 354 EXPECT_FALSE(scoper.get()); |
| 353 } | 355 } |
| 354 EXPECT_EQ(0, constructed); | 356 EXPECT_EQ(0, constructed); |
| 355 } | 357 } |
| 356 | 358 |
| 357 // TODO scoped_ptr_malloc | 359 // TODO scoped_ptr_malloc |
| OLD | NEW |