Fix StyleCop warning SA1121 (use built-in types)
[mono-project.git] / netcore / System.Private.CoreLib / shared / System / UIntPtr.cs
blob8818733858d0df09194465eb076dfe843ab6e6a3
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 using System.Globalization;
6 using System.Runtime.CompilerServices;
7 using System.Runtime.Serialization;
8 using System.Runtime.Versioning;
10 #pragma warning disable SA1121 // explicitly using type aliases instead of built-in types
11 #if BIT64
12 using nuint = System.UInt64;
13 #else
14 using nuint = System.UInt32;
15 #endif
17 namespace System
19 [Serializable]
20 [CLSCompliant(false)]
21 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
22 public readonly struct UIntPtr : IEquatable<UIntPtr>, ISerializable
24 private readonly unsafe void* _value; // Do not rename (binary serialization)
26 [Intrinsic]
27 public static readonly UIntPtr Zero;
29 [Intrinsic]
30 [NonVersionable]
31 public unsafe UIntPtr(uint value)
33 _value = (void*)value;
36 [Intrinsic]
37 [NonVersionable]
38 public unsafe UIntPtr(ulong value)
40 #if BIT64
41 _value = (void*)value;
42 #else
43 _value = (void*)checked((uint)value);
44 #endif
47 [Intrinsic]
48 [NonVersionable]
49 public unsafe UIntPtr(void* value)
51 _value = value;
54 private unsafe UIntPtr(SerializationInfo info, StreamingContext context)
56 ulong l = info.GetUInt64("value");
58 if (Size == 4 && l > uint.MaxValue)
59 throw new ArgumentException(SR.Serialization_InvalidPtrValue);
61 _value = (void*)l;
64 void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
66 if (info == null)
67 throw new ArgumentNullException(nameof(info));
69 info.AddValue("value", ToUInt64());
72 public unsafe override bool Equals(object? obj)
74 if (obj is UIntPtr)
76 return (_value == ((UIntPtr)obj)._value);
78 return false;
81 unsafe bool IEquatable<UIntPtr>.Equals(UIntPtr other)
83 return _value == other._value;
86 public unsafe override int GetHashCode()
88 #if BIT64
89 ulong l = (ulong)_value;
90 return (unchecked((int)l) ^ (int)(l >> 32));
91 #else
92 return unchecked((int)_value);
93 #endif
96 [Intrinsic]
97 [NonVersionable]
98 public unsafe uint ToUInt32()
100 #if BIT64
101 return checked((uint)_value);
102 #else
103 return (uint)_value;
104 #endif
107 [Intrinsic]
108 [NonVersionable]
109 public unsafe ulong ToUInt64()
111 return (ulong)_value;
114 [Intrinsic]
115 [NonVersionable]
116 public static explicit operator UIntPtr(uint value)
118 return new UIntPtr(value);
121 [Intrinsic]
122 [NonVersionable]
123 public static explicit operator UIntPtr(ulong value)
125 return new UIntPtr(value);
128 [Intrinsic]
129 [NonVersionable]
130 public static unsafe explicit operator UIntPtr(void* value)
132 return new UIntPtr(value);
135 [Intrinsic]
136 [NonVersionable]
137 public static unsafe explicit operator void* (UIntPtr value)
139 return value._value;
142 [Intrinsic]
143 [NonVersionable]
144 public static unsafe explicit operator uint(UIntPtr value)
146 #if BIT64
147 return checked((uint)value._value);
148 #else
149 return (uint)value._value;
150 #endif
153 [Intrinsic]
154 [NonVersionable]
155 public static unsafe explicit operator ulong(UIntPtr value)
157 return (ulong)value._value;
160 [Intrinsic]
161 [NonVersionable]
162 public static unsafe bool operator ==(UIntPtr value1, UIntPtr value2)
164 return value1._value == value2._value;
167 [Intrinsic]
168 [NonVersionable]
169 public static unsafe bool operator !=(UIntPtr value1, UIntPtr value2)
171 return value1._value != value2._value;
174 [NonVersionable]
175 public static UIntPtr Add(UIntPtr pointer, int offset)
177 return pointer + offset;
180 [Intrinsic]
181 [NonVersionable]
182 public static unsafe UIntPtr operator +(UIntPtr pointer, int offset)
184 return new UIntPtr((nuint)pointer._value + (nuint)offset);
187 [NonVersionable]
188 public static UIntPtr Subtract(UIntPtr pointer, int offset)
190 return pointer - offset;
193 [Intrinsic]
194 [NonVersionable]
195 public static unsafe UIntPtr operator -(UIntPtr pointer, int offset)
197 return new UIntPtr((nuint)pointer._value - (nuint)offset);
200 public static int Size
202 [Intrinsic]
203 [NonVersionable]
206 return sizeof(nuint);
210 [Intrinsic]
211 [NonVersionable]
212 public unsafe void* ToPointer()
214 return _value;
217 public unsafe override string ToString()
219 return ((nuint)_value).ToString(CultureInfo.InvariantCulture);