#ifndef _GPD_XS_REF_INCLUDED
#define _GPD_XS_REF_INCLUDED

namespace gpd {

class Refcounted {
public:
    void ref() const;
    void unref() const;

protected:
    Refcounted();
    virtual ~Refcounted();

private:
    int count;
};

inline Refcounted::Refcounted() : count(1) { }
inline Refcounted::~Refcounted() { }

inline void Refcounted::ref() const {
    Refcounted *self = const_cast<Refcounted *>(this);

    ++self->count;
}

inline void Refcounted::unref() const {
    Refcounted *self = const_cast<Refcounted *>(this);

    if (!--self->count)
        delete self;
}

}

#endif