aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Horizon/Sdk/Sm/ServiceName.cs')
-rw-r--r--Ryujinx.Horizon/Sdk/Sm/ServiceName.cs98
1 files changed, 98 insertions, 0 deletions
diff --git a/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs b/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs
new file mode 100644
index 00000000..dbb30078
--- /dev/null
+++ b/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.Horizon.Sdk.Sm
+{
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ struct ServiceName
+ {
+ public static ServiceName Invalid { get; } = new ServiceName(0);
+
+ public bool IsInvalid => Packed == 0;
+
+ public int Length => sizeof(ulong);
+
+ public ulong Packed { get; }
+
+ public byte this[int index]
+ {
+ get
+ {
+ if ((uint)index >= sizeof(ulong))
+ {
+ throw new IndexOutOfRangeException();
+ }
+
+ return (byte)(Packed >> (index * 8));
+ }
+ }
+
+ private ServiceName(ulong packed)
+ {
+ Packed = packed;
+ }
+
+ public static ServiceName Encode(string name)
+ {
+ ulong packed = 0;
+
+ for (int index = 0; index < sizeof(ulong); index++)
+ {
+ if (index < name.Length)
+ {
+ packed |= (ulong)(byte)name[index] << (index * 8);
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ return new ServiceName(packed);
+ }
+
+ public override bool Equals(object obj)
+ {
+ return obj is ServiceName serviceName && serviceName.Equals(this);
+ }
+
+ public bool Equals(ServiceName other)
+ {
+ return other.Packed == Packed;
+ }
+
+ public override int GetHashCode()
+ {
+ return Packed.GetHashCode();
+ }
+
+ public static bool operator ==(ServiceName lhs, ServiceName rhs)
+ {
+ return lhs.Equals(rhs);
+ }
+
+ public static bool operator !=(ServiceName lhs, ServiceName rhs)
+ {
+ return !lhs.Equals(rhs);
+ }
+
+ public override string ToString()
+ {
+ string name = string.Empty;
+
+ for (int index = 0; index < sizeof(ulong); index++)
+ {
+ byte character = (byte)(Packed >> (index * 8));
+
+ if (character == 0)
+ {
+ break;
+ }
+
+ name += (char)character;
+ }
+
+ return name;
+ }
+ }
+}