X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fsupport.cs;h=8cbbc14680557a301ba3dcb59834d1b2f8c09012;hb=acad24f57f6c36ae1cb2a6b17c52d00c0386e665;hp=2fc2f2a453773f3548f7bc54f3e9810cfa1313f0;hpb=58fdac7b8a191881c721c1e04592fc4a8b4b6ab1;p=mono.git diff --git a/mcs/mcs/support.cs b/mcs/mcs/support.cs index 2fc2f2a4537..8cbbc146805 100644 --- a/mcs/mcs/support.cs +++ b/mcs/mcs/support.cs @@ -8,12 +8,12 @@ // // Copyright 2001 Ximian, Inc (http://www.ximian.com) // Copyright 2003-2009 Novell, Inc +// Copyright 2011 Xamarin Inc // using System; using System.IO; using System.Text; -using System.Globalization; using System.Collections.Generic; namespace Mono.CSharp { @@ -36,7 +36,7 @@ namespace Mono.CSharp { return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode (obj); } } - +#if !NET_4_0 && !MONODROID public class Tuple : IEquatable> { public Tuple (T1 item1, T2 item2) @@ -64,13 +64,49 @@ namespace Mono.CSharp { #endregion } + public class Tuple : IEquatable> + { + public Tuple (T1 item1, T2 item2, T3 item3) + { + Item1 = item1; + Item2 = item2; + Item3 = item3; + } + + public T1 Item1 { get; private set; } + public T2 Item2 { get; private set; } + public T3 Item3 { get; private set; } + + public override int GetHashCode () + { + return Item1.GetHashCode () ^ Item2.GetHashCode () ^ Item3.GetHashCode (); + } + + #region IEquatable> Members + + public bool Equals (Tuple other) + { + return EqualityComparer.Default.Equals (Item1, other.Item1) && + EqualityComparer.Default.Equals (Item2, other.Item2) && + EqualityComparer.Default.Equals (Item3, other.Item3); + } + + #endregion + } + static class Tuple { public static Tuple Create (T1 item1, T2 item2) { return new Tuple (item1, item2); } + + public static Tuple Create (T1 item1, T2 item2, T3 item3) + { + return new Tuple (item1, item2, item3); + } } +#endif static class ArrayComparer { @@ -100,21 +136,28 @@ namespace Mono.CSharp { /// public class SeekableStreamReader : IDisposable { + public const int DefaultReadAheadSize = +#if FULL_AST + 65536 / 2; // Large buffer because of ReadChars of large literal string +#else + 4096 / 2; +#endif + StreamReader reader; Stream stream; - static char[] buffer; + char[] buffer; int read_ahead_length; // the length of read buffer int buffer_start; // in chars int char_count; // count of filled characters in buffer[] int pos; // index into buffer[] - public SeekableStreamReader (Stream stream, Encoding encoding) + public SeekableStreamReader (Stream stream, Encoding encoding, char[] sharedBuffer = null) { this.stream = stream; + this.buffer = sharedBuffer; - const int default_read_ahead = 2048; - InitializeStream (default_read_ahead); + InitializeStream (DefaultReadAheadSize); reader = new StreamReader (stream, encoding, true); } @@ -202,6 +245,18 @@ namespace Mono.CSharp { return pos < char_count; } + public char[] ReadChars (int fromPosition, int toPosition) + { + char[] chars = new char[toPosition - fromPosition]; + if (buffer_start <= fromPosition && toPosition <= buffer_start + buffer.Length) { + Array.Copy (buffer, fromPosition - buffer_start, chars, 0, chars.Length); + } else { + throw new NotImplementedException (); + } + + return chars; + } + public int Peek () { if ((pos >= char_count) && !ReadBuffer ()) @@ -267,4 +322,38 @@ namespace Mono.CSharp { } } } + + struct TypeNameParser + { + internal static string Escape(string name) + { + if (name == null) { + return null; + } + StringBuilder sb = null; + for (int pos = 0; pos < name.Length; pos++) { + char c = name[pos]; + switch (c) { + case '\\': + case '+': + case ',': + case '[': + case ']': + case '*': + case '&': + if (sb == null) { + sb = new StringBuilder(name, 0, pos, name.Length + 3); + } + sb.Append("\\").Append(c); + break; + default: + if (sb != null) { + sb.Append(c); + } + break; + } + } + return sb != null ? sb.ToString() : name; + } + } }