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