#ifndef HLIDAC_Ptr_h
#define HLIDAC_Ptr_h

#include <cstddef>
#include <stdexcept>

template <class T> class Ptr {
public:
	// nov len pro podmnn koprovn v ppad poteby
	void vytvoreni_jedinecne() {
		if (*refptr != 1) {
			--*refptr;
			refptr = new size_t(1);
			p = p? p->klonovani(): 0;
		}
	}

	// zbytek tdy vypad jako 'Ref_obsluha' krom jmna
	Ptr(): refptr(new size_t(1)), p(0) { }
	Ptr(T* t): refptr(new size_t(1)), p(t) { }
	Ptr(const Ptr& o): refptr(o.refptr), p(o.p) { ++*refptr; }

	Ptr& operator=(const Ptr&);    // impementovno obdobn jako na strnce ###14.2/261###
	~Ptr();                        // impementovno obdobn jako na strnce ###14.2/262###
	operator bool() const { return p; }
	T& operator*() const;          // impementovno obdobn jako na strnce ###14.2/261###
	T* operator->() const;         // impementovno obdobn jako na strnce ###14.2/261###

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

