#pragma once #include <util/generic/ptr.h> template <typename T> class TNonDestroyingHolder: public THolder<T> { public: TNonDestroyingHolder(T* t = nullptr) noexcept : THolder<T>(t) { } TNonDestroyingHolder(TAutoPtr<T> t) noexcept : THolder<T>(t) { } ~TNonDestroyingHolder() { Y_VERIFY(!*this, "stored object must be explicitly released"); } }; template <class T> class TNonDestroyingAutoPtr: public TAutoPtr<T> { public: inline TNonDestroyingAutoPtr(T* t = 0) noexcept : TAutoPtr<T>(t) { } inline TNonDestroyingAutoPtr(const TAutoPtr<T>& t) noexcept : TAutoPtr<T>(t.Release()) { } inline ~TNonDestroyingAutoPtr() { Y_VERIFY(!*this, "stored object must be explicitly released"); } };