#ifndef GUARD_Ptr_h
#define GUARD_Ptr_h

#include <cstddef>
#include <stdexcept>

template<class T> class Ptr {
public:
	// new member to copy the object conditionally when needed
	void make_unique() {
		if (*refptr != 1) {
			--*refptr;
			refptr = new size_t(1);
			p = p? p->clone(): 0;
		}
	}

	// the rest of the class looks like `Ref_handle' except for its name
	Ptr(): refptr(new size_t(1)), p(0) { }
	Ptr(T* t): refptr(new size_t(1)), p(t) { }
	Ptr(const Ptr& h): refptr(h.refptr), p(h.p) { ++*refptr; }

	Ptr& operator=(const Ptr&);    // implemented analogously to 14.2/261
	~Ptr();                        // implemented analogously to 14.2/262
	operator bool() const { return p; }
	T& operator*() const;          // implemented analogously to 14.2/261
	T* operator->() const;         // implemented analogously to 14.2/261

private:
	T* p;
	size_t* refptr;
};

