1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#pragma once
#define FRT \
__attribute__((swift_attr("import_reference"))) \
__attribute__((swift_attr("retain:immortal"))) \
__attribute__((swift_attr("release:immortal")))
int &getCopyCounter() {
static int copyCounter = 0;
return copyCounter;
}
class CopyTrackedBaseClass {
public:
CopyTrackedBaseClass(int x) : x(x), field(x + 1) {}
CopyTrackedBaseClass(const CopyTrackedBaseClass &other) : x(other.x), field(other.field) {
++getCopyCounter();
}
int getX() const {
return x;
}
int field;
int operator[](int x) const {
return x + field;
}
private:
int x;
} FRT;
class CopyTrackedDerivedClass: public CopyTrackedBaseClass {
public:
CopyTrackedDerivedClass(int x) : CopyTrackedBaseClass(x) {}
int getDerivedX() const {
return getX();
}
} FRT;
CopyTrackedDerivedClass *makeCopyTrackedDerivedClass(int x) {
return new CopyTrackedDerivedClass(x);
}
class NonEmptyBase {
public:
int getY() const {
return y;
}
private:
int y = 11;
} FRT;
class CopyTrackedDerivedDerivedClass: public NonEmptyBase, public CopyTrackedDerivedClass {
public:
CopyTrackedDerivedDerivedClass(int x) : CopyTrackedDerivedClass(x) {}
} FRT;
CopyTrackedDerivedDerivedClass *makeCopyTrackedDerivedDerivedClass(int x) {
return new CopyTrackedDerivedDerivedClass(x);
}
class BaseReturningFRTFromSubscript {
public:
CopyTrackedDerivedClass &operator[](int x) const {
return *new CopyTrackedDerivedClass(x);
}
} FRT;
BaseReturningFRTFromSubscript *makeBaseReturningFRTFromSubscript() {
return new BaseReturningFRTFromSubscript();
}
class DerivedFromBaseReturningFRTFromSubscript: public BaseReturningFRTFromSubscript {
public:
} FRT;
DerivedFromBaseReturningFRTFromSubscript *makeDerivedFromBaseReturningFRTFromSubscript() {
return new DerivedFromBaseReturningFRTFromSubscript();
}
class BaseReturningFRTFromSubscriptPointer {
public:
BaseReturningFRTFromSubscriptPointer(): value(new CopyTrackedDerivedClass(0)) {}
CopyTrackedDerivedClass *&operator[](int x) {
return value;
}
private:
CopyTrackedDerivedClass *value;
} FRT;
class DerivedFromBaseReturningFRTFromSubscriptPointer: public BaseReturningFRTFromSubscriptPointer {
public:
} FRT;
DerivedFromBaseReturningFRTFromSubscriptPointer *makeDerivedFromBaseReturningFRTFromSubscriptPointer() {
return new DerivedFromBaseReturningFRTFromSubscriptPointer();
}
|