File: BigIntegerStorage.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (160 lines) | stat: -rw-r--r-- 6,965 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//------------------------------------------------------------------------------
// <copyright file="BigIntStorage.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
// <owner current="true" primary="true">Microsoft</owner>
// <owner current="true" primary="false">Microsoft</owner>
//------------------------------------------------------------------------------

namespace System.Data.Common {
    using System;
    using System.Xml;
    using System.Numerics;
    using System.Data.SqlTypes;
    using System.Collections;

    internal sealed class BigIntegerStorage : DataStorage {

        private BigInteger[] values;

        internal BigIntegerStorage(DataColumn column)
            : base(column, typeof(BigInteger), BigInteger.Zero, StorageType.BigInteger)
        {
        }

        override public Object Aggregate(int[] records, AggregateType kind) {
            throw ExceptionBuilder.AggregateException(kind, DataType);
        }

        override public int Compare(int recordNo1, int recordNo2) {
            BigInteger valueNo1 = values[recordNo1];
            BigInteger valueNo2 = values[recordNo2];

            if (valueNo1.IsZero || valueNo2.IsZero) {
                int bitCheck = CompareBits(recordNo1, recordNo2);
                if (0 != bitCheck) {
                    return bitCheck;
                }
            }

            return valueNo1.CompareTo(valueNo2);
        }

        public override int CompareValueTo(int recordNo, object value) {
            System.Diagnostics.Debug.Assert(0 <= recordNo, "Invalid record");
            System.Diagnostics.Debug.Assert(null != value, "null value");

            if (NullValue == value) {
                return (HasValue(recordNo) ? 1 : 0);
            }

            BigInteger valueNo1 = values[recordNo];
            if (valueNo1.IsZero && !HasValue(recordNo)) {
                return -1;
            }

            return valueNo1.CompareTo((BigInteger)value);
        }

        // supported implict casts
        internal static BigInteger ConvertToBigInteger(object value, IFormatProvider formatProvider) {
            if (value.GetType() == typeof(BigInteger)) { return (BigInteger)value; }
            else if (value.GetType() == typeof(String)) { return BigInteger.Parse((string)value, formatProvider); }
            else if (value.GetType() == typeof(Int64)) { return (BigInteger)(Int64)value; }
            else if (value.GetType() == typeof(Int32)) { return (BigInteger)(Int32)value; }
            else if (value.GetType() == typeof(Int16)) { return (BigInteger)(Int16)value; }
            else if (value.GetType() == typeof(SByte)) { return (BigInteger)(SByte)value; }
            else if (value.GetType() == typeof(UInt64)) { return (BigInteger)(UInt64)value; }
            else if (value.GetType() == typeof(UInt32)) { return (BigInteger)(UInt32)value; }
            else if (value.GetType() == typeof(UInt16)) { return (BigInteger)(UInt16)value; }
            else if (value.GetType() == typeof(Byte)) { return (BigInteger)(Byte)value; }
            else { throw ExceptionBuilder.ConvertFailed(value.GetType(), typeof(System.Numerics.BigInteger)); }
        }

        internal static object ConvertFromBigInteger(BigInteger value, Type type, IFormatProvider formatProvider) {
            if (type == typeof(string)) { return value.ToString("D", formatProvider); }
            else if (type == typeof(SByte)) { return checked((SByte)value); }
            else if (type == typeof(Int16)) { return checked((Int16)value); }
            else if (type == typeof(Int32)) { return checked((Int32)value); }
            else if (type == typeof(Int64)) { return checked((Int64)value); }
            else if (type == typeof(Byte)) { return checked((Byte)value); }
            else if (type == typeof(UInt16)) { return checked((UInt16)value); }
            else if (type == typeof(UInt32)) { return checked((UInt32)value); }
            else if (type == typeof(UInt64)) { return checked((UInt64)value); }
            else if (type == typeof(Single)) { return checked((Single)value); }
            else if (type == typeof(Double)) { return checked((Double)value); }
            else if (type == typeof(Decimal)) { return checked((Decimal)value); }
            else if (type == typeof(System.Numerics.BigInteger)) { return value; }
            else { throw ExceptionBuilder.ConvertFailed(typeof(System.Numerics.BigInteger), type); }
        }

        public override object ConvertValue(object value) {
            if (NullValue != value) {
                if (null != value) {
                    value = ConvertToBigInteger(value, this.FormatProvider);
                }
                else {
                    value = NullValue;
                }
            }
            return value;
        }

        override public void Copy(int recordNo1, int recordNo2) {
            CopyBits(recordNo1, recordNo2);
            values[recordNo2] = values[recordNo1];
        }

        override public Object Get(int record) {
            BigInteger value = values[record];
            if (!value.IsZero) {
                return value;
            }
            return GetBits(record);
        }

        override public void Set(int record, Object value) {
            System.Diagnostics.Debug.Assert(null != value, "null value");
            if (NullValue == value) {
                values[record] = BigInteger.Zero;
                SetNullBit(record, true);
            }
            else {
                values[record] = ConvertToBigInteger(value, this.FormatProvider);
                SetNullBit(record, false);
            }
        }

        override public void SetCapacity(int capacity) {
            BigInteger[] newValues = new BigInteger[capacity];
            if (null != values) {
                Array.Copy(values, 0, newValues, 0, Math.Min(capacity, values.Length));
            }
            values = newValues;
            base.SetCapacity(capacity);
        }

        override public object ConvertXmlToObject(string s) {
            return BigInteger.Parse(s, System.Globalization.CultureInfo.InvariantCulture);
        }

        override public string ConvertObjectToXml(object value) {
            return ((BigInteger)value).ToString("D", System.Globalization.CultureInfo.InvariantCulture);
        }

        override protected object GetEmptyStorage(int recordCount) {
            return new BigInteger[recordCount];
        }

        override protected void CopyValue(int record, object store, BitArray nullbits, int storeIndex) {
            BigInteger[] typedStore = (BigInteger[])store;
            typedStore[storeIndex] = values[record];
            nullbits.Set(storeIndex, !HasValue(record));
        }

        override protected void SetStorage(object store, BitArray nullbits) {
            values = (BigInteger[])store;
            SetNullStorage(nullbits);
        }
    }
}