Exemplo n.º 1
0
        // This method only gets called if we are explicitly specifying base via argument to to_i
        private static object ParseInteger(RubyContext/*!*/ context, string/*!*/ str, int @base) {
            if (@base == 0) {
                return ParseInteger(context, str);
            }

            if (str.Length == 0) {
                return ScriptingRuntimeHelpers.Int32ToObject(0);
            }

            bool isNegative = false;
            str = ParseSign(str, ref isNegative);

            Tokenizer.BignumParser parser = new Tokenizer.BignumParser();
            parser.Position = 0;
            parser.Buffer = str.ToCharArray();
            BigInteger result = parser.Parse(str.Length, @base);
            int intValue;
            if (result.AsInt32(out intValue))
                return ScriptingRuntimeHelpers.Int32ToObject(isNegative ? -intValue : intValue);
            else
                return isNegative ? BigInteger.Negate(result) : result;
        }
Exemplo n.º 2
0
        private void TestBigInt(string/*!*/ number, int @base, int repeat) {
            Stopwatch optimizedTime = new Stopwatch();
            Stopwatch universalTime = new Stopwatch();

            StringBuilder n = new StringBuilder(number);
            for (int j = 0; j < repeat; j++) {
                n.Append(number);
            }
            number = n.ToString();

            for (int i = 0; i < number.Length - 1; i++) {
                string sub = number.Substring(i);
                string s = sub.Replace("_", "").ToUpper();
                BigInteger b;
                Tokenizer.BignumParser p = new Tokenizer.BignumParser();
                p.Position = 0;
                p.Buffer = s.ToCharArray();

                optimizedTime.Start();
                b = p.Parse(s.Length, @base);
                optimizedTime.Stop();

                Assert(b.ToString((uint)@base) == s.TrimStart('0'));

                p.Position = 0;

                universalTime.Start();
                b = p.ParseDefault(s.Length, (uint)@base);
                universalTime.Stop();

                Assert(b.ToString((uint)@base) == s.TrimStart('0'));
            }

            if (repeat != 0) {
                Console.WriteLine("{0}: optimized = {1}ms, universal = {2}ms",
                    @base,
                    optimizedTime.ElapsedMilliseconds,
                    universalTime.ElapsedMilliseconds);
            }
        }