2020#include < ostream>
2121#include < string>
2222
23+ #include < ftl/match.h>
2324#include < ftl/optional.h>
2425
2526namespace android {
@@ -36,7 +37,6 @@ struct DisplayId {
3637 DisplayId& operator =(const DisplayId&) = default ;
3738
3839 static constexpr DisplayId fromValue (uint64_t value) { return DisplayId (value); }
39- constexpr bool isVirtual () const { return value & FLAG_VIRTUAL; }
4040
4141 uint64_t value;
4242
@@ -66,13 +66,6 @@ struct PhysicalDisplayId : DisplayId {
6666 // TODO: b/162612135 - Remove default constructor.
6767 PhysicalDisplayId () = default ;
6868
69- static constexpr ftl::Optional<PhysicalDisplayId> tryCast (DisplayId id) {
70- if (id.isVirtual ()) {
71- return std::nullopt ;
72- }
73- return PhysicalDisplayId (id);
74- }
75-
7669 // Returns a stable ID based on EDID and port information.
7770 static constexpr PhysicalDisplayId fromEdid (uint8_t port, uint16_t manufacturerId,
7871 uint32_t modelHash) {
@@ -90,8 +83,6 @@ struct PhysicalDisplayId : DisplayId {
9083 return PhysicalDisplayId (value);
9184 }
9285
93- constexpr uint8_t getPort () const { return static_cast <uint8_t >(value); }
94-
9586private:
9687 // Flag indicating that the ID is stable across reboots.
9788 static constexpr uint64_t FLAG_STABLE = 1ULL << 62 ;
@@ -112,13 +103,6 @@ struct VirtualDisplayId : DisplayId {
112103 // Flag indicating that this virtual display is backed by the GPU.
113104 static constexpr uint64_t FLAG_GPU = 1ULL << 61 ;
114105
115- static constexpr std::optional<VirtualDisplayId> tryCast (DisplayId id) {
116- if (id.isVirtual ()) {
117- return VirtualDisplayId (id);
118- }
119- return std::nullopt ;
120- }
121-
122106 static constexpr VirtualDisplayId fromValue (uint64_t value) {
123107 return VirtualDisplayId (SkipVirtualFlag{}, value);
124108 }
@@ -134,13 +118,6 @@ struct VirtualDisplayId : DisplayId {
134118struct HalVirtualDisplayId : VirtualDisplayId {
135119 explicit constexpr HalVirtualDisplayId (BaseId baseId) : VirtualDisplayId(baseId) {}
136120
137- static constexpr std::optional<HalVirtualDisplayId> tryCast (DisplayId id) {
138- if (id.isVirtual () && !(id.value & FLAG_GPU)) {
139- return HalVirtualDisplayId (id);
140- }
141- return std::nullopt ;
142- }
143-
144121 static constexpr HalVirtualDisplayId fromValue (uint64_t value) {
145122 return HalVirtualDisplayId (SkipVirtualFlag{}, value);
146123 }
@@ -152,13 +129,6 @@ struct HalVirtualDisplayId : VirtualDisplayId {
152129struct GpuVirtualDisplayId : VirtualDisplayId {
153130 explicit constexpr GpuVirtualDisplayId (BaseId baseId) : VirtualDisplayId(FLAG_GPU | baseId) {}
154131
155- static constexpr std::optional<GpuVirtualDisplayId> tryCast (DisplayId id) {
156- if (id.isVirtual () && (id.value & FLAG_GPU)) {
157- return GpuVirtualDisplayId (id);
158- }
159- return std::nullopt ;
160- }
161-
162132 static constexpr GpuVirtualDisplayId fromValue (uint64_t value) {
163133 return GpuVirtualDisplayId (SkipVirtualFlag{}, value);
164134 }
@@ -172,21 +142,54 @@ struct GpuVirtualDisplayId : VirtualDisplayId {
172142struct HalDisplayId : DisplayId {
173143 constexpr HalDisplayId (HalVirtualDisplayId other) : DisplayId(other) {}
174144 constexpr HalDisplayId (PhysicalDisplayId other) : DisplayId(other) {}
175-
176- static constexpr std::optional<HalDisplayId> tryCast (DisplayId id) {
177- if (GpuVirtualDisplayId::tryCast (id)) {
178- return std::nullopt ;
179- }
180- return HalDisplayId (id);
181- }
182-
183145 static constexpr HalDisplayId fromValue (uint64_t value) { return HalDisplayId (value); }
184146
185147private:
186148 using DisplayId::DisplayId;
187149 explicit constexpr HalDisplayId (DisplayId other) : DisplayId(other) {}
188150};
189151
152+ using DisplayIdVariant = std::variant<PhysicalDisplayId, GpuVirtualDisplayId, HalVirtualDisplayId>;
153+ using VirtualDisplayIdVariant = std::variant<GpuVirtualDisplayId, HalVirtualDisplayId>;
154+
155+ template <typename DisplayIdType>
156+ inline auto asDisplayIdOfType (DisplayIdVariant variant) -> ftl::Optional<DisplayIdType> {
157+ return ftl::match (
158+ variant,
159+ [](DisplayIdType id) -> ftl::Optional<DisplayIdType> { return ftl::Optional (id); },
160+ [](auto ) -> ftl::Optional<DisplayIdType> { return std::nullopt ; });
161+ }
162+
163+ template <typename Variant>
164+ inline auto asHalDisplayId (Variant variant) -> ftl::Optional<HalDisplayId> {
165+ return ftl::match (
166+ variant,
167+ [](GpuVirtualDisplayId) -> ftl::Optional<HalDisplayId> { return std::nullopt ; },
168+ [](auto id) -> ftl::Optional<HalDisplayId> {
169+ return ftl::Optional (static_cast <HalDisplayId>(id));
170+ });
171+ }
172+
173+ inline auto asPhysicalDisplayId (DisplayIdVariant variant) -> ftl::Optional<PhysicalDisplayId> {
174+ return asDisplayIdOfType<PhysicalDisplayId>(variant);
175+ }
176+
177+ inline auto asVirtualDisplayId (DisplayIdVariant variant) -> ftl::Optional<VirtualDisplayId> {
178+ return ftl::match (
179+ variant,
180+ [](GpuVirtualDisplayId id) -> ftl::Optional<VirtualDisplayId> {
181+ return ftl::Optional (static_cast <VirtualDisplayId>(id));
182+ },
183+ [](HalVirtualDisplayId id) -> ftl::Optional<VirtualDisplayId> {
184+ return ftl::Optional (static_cast <VirtualDisplayId>(id));
185+ },
186+ [](auto ) -> ftl::Optional<VirtualDisplayId> { return std::nullopt ; });
187+ }
188+
189+ inline auto asDisplayId (DisplayIdVariant variant) -> DisplayId {
190+ return ftl::match (variant, [](auto id) -> DisplayId { return static_cast <DisplayId>(id); });
191+ }
192+
190193static_assert (sizeof (DisplayId) == sizeof (uint64_t ));
191194static_assert (sizeof (HalDisplayId) == sizeof (uint64_t ));
192195static_assert (sizeof (VirtualDisplayId) == sizeof (uint64_t ));
0 commit comments