OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [testsuite/] [g++.old-deja/] [g++.mike/] [p8018.C] - Rev 823

Go to most recent revision | 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;
}

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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