URL
https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk
Only display areas with differences |
Details |
Blame |
View Log
Rev 305 |
Rev 338 |
// { dg-do run }
|
// { dg-do run }
|
// prms-id: 8018
|
// prms-id: 8018
|
|
|
class RefCount {
|
class RefCount {
|
private:
|
private:
|
int nref;
|
int nref;
|
|
|
public:
|
public:
|
RefCount() : nref(0) {}
|
RefCount() : nref(0) {}
|
~RefCount() {}
|
~RefCount() {}
|
|
|
int nrefs() const { return nref; }
|
int nrefs() const { return nref; }
|
int reference() {
|
int reference() {
|
nref++;
|
nref++;
|
return nref;
|
return nref;
|
}
|
}
|
int unreference() {
|
int unreference() {
|
nref--;
|
nref--;
|
return nref;
|
return nref;
|
}
|
}
|
};
|
};
|
|
|
class A : public RefCount {
|
class A : public RefCount {
|
public:
|
public:
|
A() {}
|
A() {}
|
~A() {}
|
~A() {}
|
};
|
};
|
|
|
class RefA {
|
class RefA {
|
private:
|
private:
|
A *p;
|
A *p;
|
|
|
void clear() {
|
void clear() {
|
if (p) {
|
if (p) {
|
p->unreference();
|
p->unreference();
|
if (!p->nrefs())
|
if (!p->nrefs())
|
delete p;
|
delete p;
|
}
|
}
|
}
|
}
|
|
|
public:
|
public:
|
RefA(A* a) : p(a) { if (p) p->reference(); }
|
RefA(A* a) : p(a) { if (p) p->reference(); }
|
RefA(const RefA& a) : p(a.p) { if (p) p->reference(); }
|
RefA(const RefA& a) : p(a.p) { if (p) p->reference(); }
|
~RefA() { clear(); }
|
~RefA() { clear(); }
|
|
|
A* operator->() { return p; }
|
A* operator->() { return p; }
|
|
|
RefA& operator=(const RefA& a) {
|
RefA& operator=(const RefA& a) {
|
clear();
|
clear();
|
p=a.p;
|
p=a.p;
|
if (p)
|
if (p)
|
p->reference();
|
p->reference();
|
return *this;
|
return *this;
|
}
|
}
|
|
|
RefA& operator=(A* a) {
|
RefA& operator=(A* a) {
|
clear();
|
clear();
|
p=a;
|
p=a;
|
if (p)
|
if (p)
|
p->reference();
|
p->reference();
|
return *this;
|
return *this;
|
}
|
}
|
};
|
};
|
|
|
class AccRefA {
|
class AccRefA {
|
private:
|
private:
|
RefA a;
|
RefA a;
|
|
|
public:
|
public:
|
AccRefA(A* ap) : a(ap) {}
|
AccRefA(A* ap) : a(ap) {}
|
AccRefA(const RefA& ar) : a(ar) {}
|
AccRefA(const RefA& ar) : a(ar) {}
|
~AccRefA() {}
|
~AccRefA() {}
|
|
|
operator RefA&() { return a; }
|
operator RefA&() { return a; }
|
RefA& result() { return a; }
|
RefA& result() { return a; }
|
};
|
};
|
|
|
int
|
int
|
main() {
|
main() {
|
RefA a1 = new A;
|
RefA a1 = new A;
|
AccRefA aa1(a1);
|
AccRefA aa1(a1);
|
RefA a3 = aa1;
|
RefA a3 = aa1;
|
|
|
if (a1->nrefs() != 3)
|
if (a1->nrefs() != 3)
|
return 1;
|
return 1;
|
}
|
}
|
|
|
© copyright 1999-2024
OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.