#pragma once #include #include "lib/ref_ptr.h" #include "object/kernel_object.h" class Process; class Thread; class Capability : public RefCounted { public: Capability(const RefPtr& obj, uint64_t permissions) : obj_(obj), permissions_(permissions) {} template Capability(const RefPtr& obj, uint64_t permissions) : Capability(StaticCastRefPtr(obj), permissions) {} template RefPtr obj(); uint64_t permissions() { return permissions_; } bool HasPermissions(uint64_t requested) { return (permissions_ & requested) == requested; } private: RefPtr obj_; uint64_t permissions_; }; template RefPtr Capability::obj() { if (obj_->TypeTag() != KernelObjectTag::type) { return nullptr; } return StaticCastRefPtr(obj_); }