#pragma once

// Like option just for pointers. More efficent than option.
template <class T>
class OptionPtr
{
public:
    OptionPtr() {}
    OptionPtr(T *ptr) : ptr(ptr) {}

    bool is_present() { return ptr != nullptr; }

    T *get()
    {
        assert(is_present());
        return ptr;
    }

private:
    T *ptr = nullptr;
};

template <class T>
auto make_option_ptr(T *t)
{
    return OptionPtr<T>(t);
}