The Labs \ Source Viewer \ SSCLI \ System \ UIntPtr

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*============================================================
  16. **
  17. ** Class:  UIntPtr
  18. **
  19. **
  20. ** Purpose: Platform independent integer
  21. **
  22. **
  23. ===========================================================*/
  24. namespace System
  25. {
  26.    
  27.     using System;
  28.     using System.Globalization;
  29.     using System.Runtime.Serialization;
  30.    
  31.     [Serializable(), CLSCompliant(false)]
  32.     [System.Runtime.InteropServices.ComVisible(true)]
  33.     public struct UIntPtr : ISerializable
  34.     {
  35.        
  36.         unsafe private void* m_value;
  37.        
  38.         public static readonly UIntPtr Zero;
  39.        
  40.        
  41.         unsafe public UIntPtr(uint value)
  42.         {
  43.             m_value = (void*)value;
  44.         }
  45.        
  46.         unsafe public UIntPtr(ulong value)
  47.         {
  48.             #if WIN32
  49.             m_value = (void*)checked((uint)value);
  50.             #else
  51.             m_value = (void*)value;
  52.             #endif
  53.         }
  54.        
  55.         [CLSCompliant(false)]
  56.         unsafe public UIntPtr(void* value)
  57.         {
  58.             m_value = value;
  59.         }
  60.        
  61.         unsafe private UIntPtr(SerializationInfo info, StreamingContext context)
  62.         {
  63.             ulong l = info.GetUInt64("value");
  64.            
  65.             if (Size == 4 && l > UInt32.MaxValue) {
  66.                 throw new ArgumentException(Environment.GetResourceString("Serialization_InvalidPtrValue"));
  67.             }
  68.            
  69.             m_value = (void*)l;
  70.         }
  71.        
  72.         unsafe void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  73.         {
  74.             if (info == null) {
  75.                 throw new ArgumentNullException("info");
  76.             }
  77.             info.AddValue("value", (ulong)m_value);
  78.         }
  79.        
  80.         unsafe public override bool Equals(object obj)
  81.         {
  82.             if (obj is UIntPtr) {
  83.                 return (m_value == ((UIntPtr)obj).m_value);
  84.             }
  85.             return false;
  86.         }
  87.        
  88.         unsafe public override int GetHashCode()
  89.         {
  90.             return unchecked((int)((long)m_value)) & 2147483647;
  91.         }
  92.        
  93.         unsafe public uint ToUInt32()
  94.         {
  95.             #if WIN32
  96.             return (uint)m_value;
  97.             #else
  98.             return checked((uint)m_value);
  99.             #endif
  100.         }
  101.        
  102.         unsafe public ulong ToUInt64()
  103.         {
  104.             return (ulong)m_value;
  105.         }
  106.        
  107.         unsafe public override string ToString()
  108.         {
  109.             #if WIN32
  110.             return ((uint)m_value).ToString(CultureInfo.InvariantCulture);
  111.             #else
  112.             return ((ulong)m_value).ToString(CultureInfo.InvariantCulture);
  113.             #endif
  114.         }
  115.        
  116.         public static explicit operator UIntPtr(uint value)
  117.         {
  118.             return new UIntPtr(value);
  119.         }
  120.        
  121.         public static explicit operator UIntPtr(ulong value)
  122.         {
  123.             return new UIntPtr(value);
  124.         }
  125.        
  126.         unsafe public static explicit operator uint(UIntPtr value)
  127.         {
  128.             #if WIN32
  129.             return (uint)value.m_value;
  130.             #else
  131.             return checked((uint)value.m_value);
  132.             #endif
  133.            
  134.         }
  135.        
  136.         unsafe public static explicit operator ulong(UIntPtr value)
  137.         {
  138.             return (ulong)value.m_value;
  139.         }
  140.        
  141.         [CLSCompliant(false)]
  142.         unsafe public static explicit operator UIntPtr(void* value)
  143.         {
  144.             return new UIntPtr(value);
  145.         }
  146.        
  147.         [CLSCompliant(false)]
  148.         unsafe public static explicit operator void*(UIntPtr value)
  149.         {
  150.             return value.ToPointer();
  151.         }
  152.        
  153.        
  154.         unsafe public static bool operator ==(UIntPtr value1, UIntPtr value2)
  155.         {
  156.             return value1.m_value == value2.m_value;
  157.         }
  158.        
  159.         unsafe public static bool operator !=(UIntPtr value1, UIntPtr value2)
  160.         {
  161.             return value1.m_value != value2.m_value;
  162.         }
  163.        
  164.         public static int Size {
  165.             get {
  166.                 #if WIN32
  167.                 return 4;
  168.                 #else
  169.                 return 8;
  170.                 #endif
  171.             }
  172.         }
  173.        
  174.         [CLSCompliant(false)]
  175.         unsafe public void* ToPointer()
  176.         {
  177.             return m_value;
  178.         }
  179.        
  180.     }
  181. }

Developer Fusion