Delete PROJECTN ifdefs from Corelib (dotnet/coreclr#26058)
[mono-project.git] / netcore / System.Private.CoreLib / shared / System / UIntPtr.cs
blob4d33029c1d636d2a771bc37c2e226bb44ac0f40f
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 #if BIT64
11 using nuint = System.UInt64;
12 #else
13 using nuint = System.UInt32;
14 #endif
16 namespace System
18 [Serializable]
19 [CLSCompliant(false)]
20 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
21 public readonly struct UIntPtr : IEquatable<UIntPtr>, ISerializable
23 private readonly unsafe void* _value; // Do not rename (binary serialization)
25 [Intrinsic]
26 public static readonly UIntPtr Zero;
28 [Intrinsic]
29 [NonVersionable]
30 public unsafe UIntPtr(uint value)
32 _value = (void*)value;
35 [Intrinsic]
36 [NonVersionable]
37 public unsafe UIntPtr(ulong value)
39 #if BIT64
40 _value = (void*)value;
41 #else
42 _value = (void*)checked((uint)value);
43 #endif
46 [Intrinsic]
47 [NonVersionable]
48 public unsafe UIntPtr(void* value)
50 _value = value;
53 private unsafe UIntPtr(SerializationInfo info, StreamingContext context)
55 ulong l = info.GetUInt64("value");
57 if (Size == 4 && l > uint.MaxValue)
58 throw new ArgumentException(SR.Serialization_InvalidPtrValue);
60 _value = (void*)l;
63 void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
65 if (info == null)
66 throw new ArgumentNullException(nameof(info));
68 info.AddValue("value", ToUInt64());
71 public unsafe override bool Equals(object? obj)
73 if (obj is UIntPtr)
75 return (_value == ((UIntPtr)obj)._value);
77 return false;
80 unsafe bool IEquatable<UIntPtr>.Equals(UIntPtr other)
82 return _value == other._value;
85 public unsafe override int GetHashCode()
87 #if BIT64
88 ulong l = (ulong)_value;
89 return (unchecked((int)l) ^ (int)(l >> 32));
90 #else
91 return unchecked((int)_value);
92 #endif
95 [Intrinsic]
96 [NonVersionable]
97 public unsafe uint ToUInt32()
99 #if BIT64
100 return checked((uint)_value);
101 #else
102 return (uint)_value;
103 #endif
106 [Intrinsic]
107 [NonVersionable]
108 public unsafe ulong ToUInt64()
110 return (ulong)_value;
113 [Intrinsic]
114 [NonVersionable]
115 public static explicit operator UIntPtr(uint value)
117 return new UIntPtr(value);
120 [Intrinsic]
121 [NonVersionable]
122 public static explicit operator UIntPtr(ulong value)
124 return new UIntPtr(value);
127 [Intrinsic]
128 [NonVersionable]
129 public static unsafe explicit operator UIntPtr(void* value)
131 return new UIntPtr(value);
134 [Intrinsic]
135 [NonVersionable]
136 public static unsafe explicit operator void* (UIntPtr value)
138 return value._value;
141 [Intrinsic]
142 [NonVersionable]
143 public static unsafe explicit operator uint(UIntPtr value)
145 #if BIT64
146 return checked((uint)value._value);
147 #else
148 return (uint)value._value;
149 #endif
152 [Intrinsic]
153 [NonVersionable]
154 public static unsafe explicit operator ulong(UIntPtr value)
156 return (ulong)value._value;
159 [Intrinsic]
160 [NonVersionable]
161 public static unsafe bool operator ==(UIntPtr value1, UIntPtr value2)
163 return value1._value == value2._value;
166 [Intrinsic]
167 [NonVersionable]
168 public static unsafe bool operator !=(UIntPtr value1, UIntPtr value2)
170 return value1._value != value2._value;
173 [NonVersionable]
174 public static UIntPtr Add(UIntPtr pointer, int offset)
176 return pointer + offset;
179 [Intrinsic]
180 [NonVersionable]
181 public static unsafe UIntPtr operator +(UIntPtr pointer, int offset)
183 return new UIntPtr((nuint)pointer._value + (nuint)offset);
186 [NonVersionable]
187 public static UIntPtr Subtract(UIntPtr pointer, int offset)
189 return pointer - offset;
192 [Intrinsic]
193 [NonVersionable]
194 public static unsafe UIntPtr operator -(UIntPtr pointer, int offset)
196 return new UIntPtr((nuint)pointer._value - (nuint)offset);
199 public static int Size
201 [Intrinsic]
202 [NonVersionable]
205 return sizeof(nuint);
209 [Intrinsic]
210 [NonVersionable]
211 public unsafe void* ToPointer()
213 return _value;
216 public unsafe override string ToString()
218 return ((nuint)_value).ToString(CultureInfo.InvariantCulture);