URL
https://opencores.org/ocsvn/scarts/scarts/trunk
Subversion Repositories scarts
[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [testsuite/] [g++.old-deja/] [g++.mike/] [p8018.C] - Rev 12
Compare with Previous | Blame | View Log
// { dg-do run }
// prms-id: 8018
class RefCount {
private:
int nref;
public:
RefCount() : nref(0) {}
~RefCount() {}
int nrefs() const { return nref; }
int reference() {
nref++;
return nref;
}
int unreference() {
nref--;
return nref;
}
};
class A : public RefCount {
public:
A() {}
~A() {}
};
class RefA {
private:
A *p;
void clear() {
if (p) {
p->unreference();
if (!p->nrefs())
delete p;
}
}
public:
RefA(A* a) : p(a) { if (p) p->reference(); }
RefA(const RefA& a) : p(a.p) { if (p) p->reference(); }
~RefA() { clear(); }
A* operator->() { return p; }
RefA& operator=(const RefA& a) {
clear();
p=a.p;
if (p)
p->reference();
return *this;
}
RefA& operator=(A* a) {
clear();
p=a;
if (p)
p->reference();
return *this;
}
};
class AccRefA {
private:
RefA a;
public:
AccRefA(A* ap) : a(ap) {}
AccRefA(const RefA& ar) : a(ar) {}
~AccRefA() {}
operator RefA&() { return a; }
RefA& result() { return a; }
};
int
main() {
RefA a1 = new A;
AccRefA aa1(a1);
RefA a3 = aa1;
if (a1->nrefs() != 3)
return 1;
}