#pragma once #include #include "lib/ref_ptr.h" #include "object/kernel_object.h" class Process; class Thread; class Capability : public RefCounted { public: enum Type { UNDEFINED, PROCESS, THREAD, ADDRESS_SPACE, MEMORY_OBJECT, CHANNEL, PORT, }; Capability(const RefPtr& obj, Type type, uint64_t id, uint64_t permissions) : obj_(obj), type_(type), id_(id), permissions_(permissions) {} template Capability(const RefPtr& obj, Type type, uint64_t id, uint64_t permissions) : Capability(StaticCastRefPtr(obj), type, id, permissions) { } template RefPtr obj(); uint64_t id() { return id_; } void set_id(uint64_t id) { id_ = id; } bool CheckType(Type type) { return type_ == type; } uint64_t permissions() { return permissions_; } bool HasPermissions(uint64_t requested) { return (permissions_ & requested) == requested; } private: RefPtr obj_; Type type_; uint64_t id_; uint64_t permissions_; };