Changeset 281 in Sophya for trunk/SophyaLib


Ignore:
Timestamp:
Apr 29, 1999, 2:39:34 PM (26 years ago)
Author:
ansari
Message:

comptage de refs simple

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/BaseTools/rcptr.h

    r280 r281  
    1919// the object is destroyed when the last Xp is destroyed.
    2020
    21 #include <list>
    22 
    2321template <class T>
    2422class RCPtr {
     
    2624  RCPtr(T* obj) {
    2725    x = obj;
     26    cnt = new int;
     27    *cnt = 1;
    2828  }
    2929 
    3030  RCPtr(RCPtr<T> const& other) {
    31     peers = other.peers;
    3231    x = other.x;
    33     peers.push_back((RCPtr<T>*)&other);
    34     for (peerlist::iterator i = peers.begin();
    35          i != peers.end(); i++) {
    36       (*i)->hello(this);
    37     }
     32    cnt = other.cnt;
     33    (*cnt)++;
    3834  }
    3935 
    4036  ~RCPtr() {
    41     for (peerlist::iterator i = peers.begin();
    42          i != peers.end(); i++) {
    43       (*i)->byebye(this);
     37    (*cnt)--;
     38    if (!*cnt) {
     39      delete x;
     40      delete cnt;
    4441    }
    45     if (peers.size() == 0) delete x;
    4642  }
    4743
     
    5046
    5147private:
    52   typedef list<RCPtr<T>*> peerlist;
    53 
    5448  T* x;                  // the object we are referring
    55   peerlist peers;        // the other smart pointers to the same object
    56 
    57   void hello(RCPtr<T>* newcomer) {
    58     peers.push_back(newcomer);
    59   }
    60 
    61   void byebye(RCPtr<T>* dying) {
    62     peers.remove(dying);
    63   }
     49  int* cnt;              // how many smart pointers ?
    6450};
    6551
Note: See TracChangeset for help on using the changeset viewer.