/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkMakeUnique.h" #include "SkVptr.h" #include "Test.h" namespace { struct Base { virtual ~Base() = default; virtual size_t val() const = 0; }; struct SubclassA : public Base { SubclassA(size_t val) : fVal(val) {} size_t val() const override { return fVal; } size_t fVal; }; struct SubclassB : public Base { SubclassB() {} size_t val() const override { return 42; } }; } DEF_TEST(Vptr, r) { std::unique_ptr<Base> a = skstd::make_unique<SubclassA>(21), b = skstd::make_unique<SubclassB>(), c = skstd::make_unique<SubclassA>(22), d = skstd::make_unique<SubclassB>(); // These 4 objects all have unique identities. REPORTER_ASSERT(r, a != b); REPORTER_ASSERT(r, a != c); REPORTER_ASSERT(r, a != d); REPORTER_ASSERT(r, b != c); REPORTER_ASSERT(r, b != d); REPORTER_ASSERT(r, c != d); // Only b and d have the same val(). REPORTER_ASSERT(r, a->val() != b->val()); REPORTER_ASSERT(r, a->val() != c->val()); REPORTER_ASSERT(r, a->val() != d->val()); REPORTER_ASSERT(r, b->val() != c->val()); REPORTER_ASSERT(r, b->val() == d->val()); REPORTER_ASSERT(r, c->val() != d->val()); // SkVptr() returns the same value for objects of the same concrete type. REPORTER_ASSERT(r, SkVptr(*a) == SkVptr(*c)); REPORTER_ASSERT(r, SkVptr(*b) == SkVptr(*d)); REPORTER_ASSERT(r, SkVptr(*a) != SkVptr(*b)); }