// Copyright (c) 1997 by Bill Reck <breck@magna.com.au> // This code may be used royalty-free as long as // this notice appears in the product. class null_rep {}; // Exception class used below template <class REP, class ACCESS = REP*> class Handle { public: Handle(REP *rep = 0) : rep_(rep) { // Claim a reference if ( rep_ != 0 ) rep_->incrRefCount(); } Handle(const Handle<REP, ACCESS> &that) : rep_(that.rep_) { // Claim a reference if ( rep_ != 0 ) rep_->incrRefCount(); } ~Handle() { // Release a reference if ( rep_ != 0 ) rep_->decrRefCount(); } const Handle<REP, ACCESS> &operator = ( const Handle<REP, ACCESS> &rhs) { // Claim a reference to the RHS and // release the old LHS reference REP *oldRep = rep_; rep_ = rhs.rep_; if ( rep_ != 0 ) rep_->incrRefCount(); if ( oldRep != 0 ) oldRep->decrRefCount(); return(*this); } ACCESS operator->() const { if ( rep_ == 0 ) throw null_rep(); return(rep_); // Construct an ACCESS object } bool isNull() const { return(rep_ == 0); } private: REP *rep_; }; //End of File