1464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/* 2464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved. 3464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 4464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 5464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * you may not use this file except in compliance with the License. 6464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * You may obtain a copy of the License at 7464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 8464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * http://www.apache.org/licenses/LICENSE-2.0 9464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 10464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software 11464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS, 12464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * See the License for the specific language governing permissions and 14464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * limitations under the License. 15464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com */ 16464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 17464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "gtest/gtest.h" 18464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#define ENABLE_OBJECT_COUNTER 19464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/port/refcount.h" 20464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 21464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comusing sfntly::RefCounted; 22464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comusing sfntly::Ptr; 23464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 24464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comclass Foo : public RefCounted<Foo> { 25464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.compublic: // put in something to make sure it's not empty 26464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com int foo_; 27464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com int foo() { return foo_; } 28464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}; 29464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 30246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.combool TestSmartPointer() { 31464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com // scope out allocation 32464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com { 33464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Ptr<Foo> p1; 34464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com p1 = new Foo(); 350e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), p1->ref_count_); 360e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_); 37464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 38464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Ptr<Foo> p2; 39464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com p2 = p1; 400e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(2), p1->ref_count_); 410e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(2), p2->ref_count_); 420e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_); 43464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 44464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Ptr<Foo> p3; 45464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com p3 = p1; 460e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(3), p1->ref_count_); 470e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(3), p2->ref_count_); 480e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(3), p3->ref_count_); 490e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_); 50464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 51464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com p2 = new Foo(); 520e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(2), p1->ref_count_); 530e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), p2->ref_count_); 540e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(2), p3->ref_count_); 550e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_); 56464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 57246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com p3.Release(); 580e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), p1->ref_count_); 59464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com EXPECT_EQ(NULL, p3.p_); 600e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_); 61464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 62464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com p2 = NULL; 630e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_); 64464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 65464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com p1 = p1; 660e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), p1->ref_count_); 670e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_); 68464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 69464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com p1 = &(*p1); 700e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), p1->ref_count_); 710e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_); 72464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 730e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com EXPECT_EQ(size_t(0), RefCounted<Foo>::object_counter_); 74464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com return true; 75464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 766a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com 776a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.comTEST(SmartPointer, All) { 786a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com ASSERT_TRUE(TestSmartPointer()); 796a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com} 80