Enum


SUBMITTED BY: Guest

DATE: Aug. 1, 2014, 10:03 a.m.

FORMAT: C#

SIZE: 6.8 kB

HITS: 24901

  1. using System;
  2. //using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.IO;
  5. namespace Gibbed.IO
  6. {
  7. public static partial class StreamHelpers
  8. {
  9. #region Cache
  10. private static class EnumTypeCache
  11. {
  12. /*private static Dictionary<Type, EnumUnderlyingType> _Lookup;
  13. static EnumTypeCache()
  14. {
  15. _Lookup = new Dictionary<Type, EnumUnderlyingType>();
  16. }*/
  17. private static TypeCode TranslateType(Type type)
  18. {
  19. if (type.IsEnum == true)
  20. {
  21. var underlyingType = Enum.GetUnderlyingType(type);
  22. var underlyingTypeCode = Type.GetTypeCode(underlyingType);
  23. switch (underlyingTypeCode)
  24. {
  25. case TypeCode.SByte:
  26. case TypeCode.Byte:
  27. case TypeCode.Int16:
  28. case TypeCode.UInt16:
  29. case TypeCode.Int32:
  30. case TypeCode.UInt32:
  31. case TypeCode.Int64:
  32. case TypeCode.UInt64:
  33. {
  34. return underlyingTypeCode;
  35. }
  36. }
  37. }
  38. throw new ArgumentException("unknown enum type", "type");
  39. }
  40. public static TypeCode Get(Type type)
  41. {
  42. /*if (Lookup.ContainsKey(type) == true)
  43. {
  44. return Lookup[type];
  45. }*/
  46. return /*Lookup[type] =*/ TranslateType(type);
  47. }
  48. }
  49. #endregion
  50. #region ReadValueEnum
  51. public static T ReadValueEnum<T>(this Stream stream, Endian endian)
  52. {
  53. var type = typeof(T);
  54. object value;
  55. switch (EnumTypeCache.Get(type))
  56. {
  57. case TypeCode.SByte:
  58. {
  59. value = stream.ReadValueS8();
  60. break;
  61. }
  62. case TypeCode.Byte:
  63. {
  64. value = stream.ReadValueU8();
  65. break;
  66. }
  67. case TypeCode.Int16:
  68. {
  69. value = stream.ReadValueS16(endian);
  70. break;
  71. }
  72. case TypeCode.UInt16:
  73. {
  74. value = stream.ReadValueU16(endian);
  75. break;
  76. }
  77. case TypeCode.Int32:
  78. {
  79. value = stream.ReadValueS32(endian);
  80. break;
  81. }
  82. case TypeCode.UInt32:
  83. {
  84. value = stream.ReadValueU32(endian);
  85. break;
  86. }
  87. case TypeCode.Int64:
  88. {
  89. value = stream.ReadValueS64(endian);
  90. break;
  91. }
  92. case TypeCode.UInt64:
  93. {
  94. value = stream.ReadValueU64(endian);
  95. break;
  96. }
  97. default:
  98. {
  99. throw new NotSupportedException();
  100. }
  101. }
  102. return (T)Enum.ToObject(type, value);
  103. }
  104. public static T ReadValueEnum<T>(this Stream stream)
  105. {
  106. return stream.ReadValueEnum<T>(Endian.Little);
  107. }
  108. #endregion
  109. #region WriteValueEnum
  110. public static void WriteValueEnum<T>(this Stream stream, object value, Endian endian)
  111. {
  112. var type = typeof(T);
  113. switch (EnumTypeCache.Get(type))
  114. {
  115. case TypeCode.SByte:
  116. {
  117. stream.WriteValueS8((sbyte)value);
  118. break;
  119. }
  120. case TypeCode.Byte:
  121. {
  122. stream.WriteValueU8((byte)value);
  123. break;
  124. }
  125. case TypeCode.Int16:
  126. {
  127. stream.WriteValueS16((short)value, endian);
  128. break;
  129. }
  130. case TypeCode.UInt16:
  131. {
  132. stream.WriteValueU16((ushort)value, endian);
  133. break;
  134. }
  135. case TypeCode.Int32:
  136. {
  137. stream.WriteValueS32((int)value, endian);
  138. break;
  139. }
  140. case TypeCode.UInt32:
  141. {
  142. stream.WriteValueU32((uint)value, endian);
  143. break;
  144. }
  145. case TypeCode.Int64:
  146. {
  147. stream.WriteValueS64((long)value, endian);
  148. break;
  149. }
  150. case TypeCode.UInt64:
  151. {
  152. stream.WriteValueU64((ulong)value, endian);
  153. break;
  154. }
  155. default:
  156. {
  157. throw new NotSupportedException();
  158. }
  159. }
  160. }
  161. public static void WriteValueEnum<T>(this Stream stream, object value)
  162. {
  163. stream.WriteValueEnum<T>(value, Endian.Little);
  164. }
  165. #endregion
  166. #region Obsolete
  167. [Obsolete("use Endian enum instead of boolean to represent endianness")]
  168. [EditorBrowsable(EditorBrowsableState.Never)]
  169. public static T ReadValueEnum<T>(this Stream stream, bool littleEndian)
  170. {
  171. return stream.ReadValueEnum<T>(littleEndian == true ? Endian.Little : Endian.Big);
  172. }
  173. [Obsolete("use Endian enum instead of boolean to represent endianness")]
  174. [EditorBrowsable(EditorBrowsableState.Never)]
  175. public static void WriteValueEnum<T>(this Stream stream, object value, bool littleEndian)
  176. {
  177. stream.WriteValueEnum<T>(value, littleEndian == true ? Endian.Little : Endian.Big);
  178. }
  179. #endregion
  180. }
  181. }

comments powered by Disqus