#pragma once #include #include template bool operator ==(std::optional> a, std::optional> b) { return ((!a.has_value() || a.value().expired()) && (!b.has_value() || b.value().expired())) || ((a.has_value() && !a.value().expired()) && (b.has_value() && !b.value().expired()) && a.value().lock() == b.value().lock()); } template bool operator ==(std::weak_ptr a, std::weak_ptr b) { return (a.expired() && b.expired()) || (!a.expired() && !b.expired() && a.lock() == b.lock()); }