6export module zxfoundation.dgp.cap.types;
7import zxfoundation.base.types;
11namespace zxfoundation::dgp::cap {
14 enum class cap_type : u16 {
27 [[nodiscard]]
constexpr auto cap_type_name(cap_type t)
noexcept ->
const char* {
29 case cap_type::none:
return "none";
30 case cap_type::domain:
return "domain";
31 case cap_type::gate:
return "gate";
32 case cap_type::portal:
return "portal";
33 case cap_type::io_device:
return "io_device";
34 case cap_type::memory:
return "memory";
35 case cap_type::service:
return "service";
36 case cap_type::admin:
return "admin";
37 case cap_type::memory_extent:
return "memory_extent";
38 default:
return "unknown";
43 enum class cap_rights : u16 {
55 [[nodiscard]]
constexpr auto operator|(cap_rights a, cap_rights b)
noexcept -> cap_rights {
56 return static_cast<cap_rights>(
static_cast<u16>(a) |
static_cast<u16>(b));
59 [[nodiscard]]
constexpr auto operator&(cap_rights a, cap_rights b)
noexcept -> cap_rights {
60 return static_cast<cap_rights>(
static_cast<u16>(a) &
static_cast<u16>(b));
63 [[nodiscard]]
constexpr auto operator~(cap_rights r)
noexcept -> cap_rights {
64 return static_cast<cap_rights>(~
static_cast<u16>(r));
72 constexpr cap_token()
noexcept =
default;
73 constexpr explicit cap_token(u64 v)
noexcept : raw(v) {}
80 static constexpr auto make(
85 )
noexcept -> cap_token {
87 (
static_cast<u64>(rights) << 48) |
88 (
static_cast<u64>(gen) << 32) |
89 (
static_cast<u64>(obj_id) << 16) |
90 static_cast<u64>(type)
95 [[nodiscard]]
constexpr auto type()
const noexcept -> cap_type {
96 return static_cast<cap_type>(raw & 0xFFFFU);
100 [[nodiscard]]
constexpr auto object_id()
const noexcept -> u16 {
101 return static_cast<u16>((raw >> 16) & 0xFFFFU);
105 [[nodiscard]]
constexpr auto generation()
const noexcept -> u16 {
106 return static_cast<u16>((raw >> 32) & 0xFFFFU);
110 [[nodiscard]]
constexpr auto rights()
const noexcept -> cap_rights {
111 return static_cast<cap_rights>((raw >> 48) & 0xFFFFU);
115 [[nodiscard]]
constexpr auto has_right(cap_rights r)
const noexcept ->
bool {
116 return (
static_cast<u16>(rights()) &
static_cast<u16>(r)) != 0;
121 [[nodiscard]]
constexpr auto derive(cap_rights subset)
const noexcept -> cap_token {
122 return make(type(), object_id(), generation(),
127 [[nodiscard]]
constexpr explicit operator
bool()
const noexcept {
128 return raw != 0 && type() != cap_type::none;
132 [[nodiscard]]
constexpr auto operator==(cap_token o)
const noexcept ->
bool {
136 [[nodiscard]]
constexpr auto operator!=(cap_token o)
const noexcept ->
bool {
142 inline constexpr cap_token CAP_TOKEN_NULL{};
145 inline constexpr u64 CAP_ERROR_SENTINEL = ~0ULL;