#pragma once #include #include #include #include namespace DB { class IStorage; class StoragePtr { private: /// Содержит IStorage. В деструкторе при необходимости вызывает IStorage::dropImpl() перед уничтожением IStorage. struct Wrapper { Wrapper(); Wrapper(IStorage * s); boost::scoped_ptr storage; ~Wrapper(); }; StoragePtr(boost::weak_ptr p) : ptr(p) {} boost::shared_ptr ptr; friend class IStorage; public: StoragePtr() {} StoragePtr(const StoragePtr & p) : ptr(p.ptr) {} StoragePtr& operator = (const StoragePtr & p) { ptr = p.ptr; return *this; } IStorage* get() const { if (!ptr) return NULL; else return ptr->storage.get(); } size_t use_count() const { return ptr.use_count(); } bool operator == (const IStorage * p) const { return get() == p; } IStorage* operator -> () const { return get(); } IStorage& operator * () const { return *get(); } operator IStorage* () const { return get(); } operator bool () const { return ptr; } bool operator ! () const { return !ptr; } }; }