template class ugcs::vsm::Reference_guard

Overview

Reference guard objects keep references for managed objects. More…

#include <reference_guard.h>

template <typename Class_ptr>
class Reference_guard
{
public:
    // classes

    class Hasher;

    // fields

    decltype(*std::declval<Class_ptr>() operator*)();

    // construction

    Reference_guard(std::nullptr_t ptr = nullptr);
    Reference_guard(const Class_ptr& ptr);
    Reference_guard(Class_ptr&& ptr);
    Reference_guard(const Reference_guard<Class_ptr>& ref);
    Reference_guard(Reference_guard<Class_ptr>&& ref);

    template <typename Src_class_ptr>
    Reference_guard(const Reference_guard<Src_class_ptr>& ref);

    template <typename Src_class_ptr>
    Reference_guard(Reference_guard<Src_class_ptr>&& ref);

    // methods

    Reference_guard<Class_ptr>& operator = (const Reference_guard<Class_ptr>& ref);
    Reference_guard<Class_ptr>& operator = (Reference_guard<Class_ptr>&& ref);
    Reference_guard<Class_ptr>& operator = (std::nullptr_t ref  __attribute__(unused));
    bool operator == (const Reference_guard<Class_ptr>& ref) const;
    bool operator != (const Reference_guard<Class_ptr>& ref) const;
    operator bool () const;
    Class_ptr operator -> ();
    const Class_ptr operator -> () const;
};

Detailed Documentation

Reference guard objects keep references for managed objects.

The managed object should have Add_ref() and Release_ref() methods which are called by the guarded object. Release_ref() can tear down the object when last reference is released. Both Add_ref() and Release_ref() should be thread-safe.

Parameters:

Class_ptr

Type for referenced object pointer. It can be either plain pointer or any smart pointer class.

Fields

decltype(*std::declval<Class_ptr>() operator*)()

Dereference is transparent.

Construction

Reference_guard(std::nullptr_t ptr = nullptr)

Construct an empty guard which doesn’t have managed object.

Reference_guard(const Class_ptr& ptr)

Construct guard object.

Reference_guard(Class_ptr&& ptr)

Construct guard by moving managed object to the guard.

Reference_guard(const Reference_guard<Class_ptr>& ref)

Copy guard object.

Reference_guard(Reference_guard<Class_ptr>&& ref)

Move guard object.

template <typename Src_class_ptr>
Reference_guard(const Reference_guard<Src_class_ptr>& ref)

Copy guard object.

template <typename Src_class_ptr>
Reference_guard(Reference_guard<Src_class_ptr>&& ref)

Move guard object.

Methods

Reference_guard<Class_ptr>& operator = (const Reference_guard<Class_ptr>& ref)

Copy assignment.

Reference_guard<Class_ptr>& operator = (Reference_guard<Class_ptr>&& ref)

Move assignment.

Reference_guard<Class_ptr>& operator = (std::nullptr_t ref  __attribute__(unused))

nullptr assignment.

bool operator == (const Reference_guard<Class_ptr>& ref) const

Guards are equal when managed object pointers are equal.

bool operator != (const Reference_guard<Class_ptr>& ref) const

Guards are not equal when managed object pointers are not equal.

operator bool () const

Guards yields to true when managed object does exist.

Class_ptr operator -> ()

Member access is transparent.

const Class_ptr operator -> () const

Member access is transparent.