OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [testsuite/] [g++.old-deja/] [g++.mike/] [p8018.C] - Blame information for rev 338

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 305 jeremybenn
// { dg-do run  }
2
// prms-id: 8018
3
 
4
class RefCount {
5
private:
6
  int nref;
7
 
8
public:
9
  RefCount() : nref(0) {}
10
  ~RefCount() {}
11
 
12
  int nrefs() const { return nref; }
13
  int reference() {
14
    nref++;
15
    return nref;
16
  }
17
  int unreference() {
18
    nref--;
19
    return nref;
20
  }
21
};
22
 
23
class A : public RefCount {
24
public:
25
  A() {}
26
  ~A() {}
27
};
28
 
29
class RefA {
30
private:
31
  A *p;
32
 
33
  void clear() {
34
    if (p) {
35
      p->unreference();
36
      if (!p->nrefs())
37
        delete p;
38
    }
39
  }
40
 
41
public:
42
  RefA(A* a) : p(a) { if (p) p->reference(); }
43
  RefA(const RefA& a) : p(a.p) { if (p) p->reference(); }
44
  ~RefA() { clear(); }
45
 
46
  A* operator->() { return p; }
47
 
48
  RefA& operator=(const RefA& a) {
49
    clear();
50
    p=a.p;
51
    if (p)
52
      p->reference();
53
    return *this;
54
  }
55
 
56
  RefA& operator=(A* a) {
57
    clear();
58
    p=a;
59
    if (p)
60
      p->reference();
61
    return *this;
62
  }
63
};
64
 
65
class AccRefA {
66
private:
67
  RefA a;
68
 
69
public:
70
  AccRefA(A* ap) : a(ap) {}
71
  AccRefA(const RefA& ar) : a(ar) {}
72
  ~AccRefA() {}
73
 
74
  operator RefA&() { return a; }
75
  RefA& result() { return a; }
76
};
77
 
78
int
79
main() {
80
  RefA a1 = new A;
81
  AccRefA aa1(a1);
82
  RefA a3 = aa1;
83
 
84
  if (a1->nrefs() != 3)
85
    return 1;
86
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.