#pragma once #include #include #include #include #include namespace Feather { template class Lockable { public: auto borrow() { return std::pair< T&, std::lock_guard>{object, mutex}; } auto borrow() const { return std::pair>{object, mutex}; } T& steal() { return object; } const T& steal() const { return object; } private: T object; mutable std::mutex mutex; }; template using LockableVector = Lockable>; template using LockableList = Lockable>; template using LockableMap = Lockable>; template using LockableArray = Lockable>; }