mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Add a polymorphic_ptr<T> smart pointer data type. It's a somewhat silly
unique ownership smart pointer which is *deep* copyable by assuming it can call a T::clone() method to allocate a copy of the owned data. This is mostly useful with containers or other collections of uniquely owned data in C++98 where they *might* copy. With C++11 we can likely remove this in favor of move-only types and containers wrapped around those types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194315 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -35,6 +35,7 @@ set(ADTSources
|
||||
TripleTest.cpp
|
||||
TwineTest.cpp
|
||||
VariadicFunctionTest.cpp
|
||||
polymorphic_ptr_test.cpp
|
||||
)
|
||||
|
||||
# They cannot be compiled on MSVC9 due to its bug.
|
||||
|
71
unittests/ADT/polymorphic_ptr_test.cpp
Normal file
71
unittests/ADT/polymorphic_ptr_test.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
//===- llvm/unittest/ADT/polymorphic_ptr.h - polymorphic_ptr<T> tests -----===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "llvm/ADT/polymorphic_ptr.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(polymorphic_ptr_test, Basic) {
|
||||
struct S {
|
||||
S(int x) : x(x) {}
|
||||
int x;
|
||||
};
|
||||
|
||||
polymorphic_ptr<S> null;
|
||||
EXPECT_FALSE((bool)null);
|
||||
EXPECT_TRUE(!null);
|
||||
EXPECT_EQ((S*)0, null.get());
|
||||
|
||||
S *s = new S(42);
|
||||
polymorphic_ptr<S> p(s);
|
||||
EXPECT_TRUE((bool)p);
|
||||
EXPECT_FALSE(!p);
|
||||
EXPECT_TRUE(p != null);
|
||||
EXPECT_FALSE(p == null);
|
||||
EXPECT_TRUE(p == s);
|
||||
EXPECT_TRUE(s == p);
|
||||
EXPECT_FALSE(p != s);
|
||||
EXPECT_FALSE(s != p);
|
||||
EXPECT_EQ(s, &*p);
|
||||
EXPECT_EQ(s, p.operator->());
|
||||
EXPECT_EQ(s, p.get());
|
||||
EXPECT_EQ(42, p->x);
|
||||
|
||||
EXPECT_EQ(s, p.take());
|
||||
EXPECT_FALSE((bool)p);
|
||||
EXPECT_TRUE(!p);
|
||||
p = s;
|
||||
EXPECT_TRUE((bool)p);
|
||||
EXPECT_FALSE(!p);
|
||||
EXPECT_EQ(s, &*p);
|
||||
EXPECT_EQ(s, p.operator->());
|
||||
EXPECT_EQ(s, p.get());
|
||||
EXPECT_EQ(42, p->x);
|
||||
|
||||
polymorphic_ptr<S> p2((llvm_move(p)));
|
||||
EXPECT_FALSE((bool)p);
|
||||
EXPECT_TRUE(!p);
|
||||
EXPECT_TRUE((bool)p2);
|
||||
EXPECT_FALSE(!p2);
|
||||
EXPECT_EQ(s, &*p2);
|
||||
|
||||
using std::swap;
|
||||
swap(p, p2);
|
||||
EXPECT_TRUE((bool)p);
|
||||
EXPECT_FALSE(!p);
|
||||
EXPECT_EQ(s, &*p);
|
||||
EXPECT_FALSE((bool)p2);
|
||||
EXPECT_TRUE(!p2);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user