Ref
Keywords: classdesc

Next: Converting code using traditional Up: pack/unpack Previous: Graph serialisation Contents Index

##
Ref

Ref is a reference counted shared smart pointer implementation. When all references to an object are destroyed, the object it references is also destroyed. It is somewhat equivalent in functionality to Boosts `shared_ptr` or `intrusive_ptr`. Boost, however, is a big library, so the decision was made to avoid any dependencies of Classdesc or Eco Lab on Boost.

Ref performs entire object life cycle management. Initialising it with an object makes a copy, it does not pass control of the object to the ref. As such, it requires that its target type has a default constructor. Assigning, or copying a ref object duplicates the reference to a single object. Dereferencing works as with traditional pointers.

Synopsis:

    template <class T>
    class ref
    {
    public:
      ref(); // unitialised refs are NULL
      ref(const ref& x);
      ref(const T& x);  //copies x
      ref& operator=(const ref& x);
      ref& operator=(const T& x);  //copies x
      T* operator->();  //dereference operators
      T& operator*();
      void nullify();  //set reference to NULL
      bool nullref();  //returns true if invalid
      operator bool (); //returns true if valid
      bool operator==(const ref& x);
      bool operator==(const T* x); //true if x points to this's target
      bool operator==(const T& x); //true if x==this's target
    };

Packing a ref object automatically invokes the `pack_graph` algorithm.