File: ObjectReferenceStack.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (112 lines) | stat: -rw-r--r-- 3,317 bytes parent folder | download | duplicates (7)
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
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------

namespace System.Runtime.Serialization
{
    using System;
    using System.Xml;
    using System.Collections.Generic;

    struct ObjectReferenceStack
    {
        const int MaximumArraySize = 16;
        const int InitialArraySize = 4;

        int count;
        object[] objectArray;
        bool[] isReferenceArray;
        Dictionary<object, object> objectDictionary;

        internal void Push(object obj)
        {
            if (objectArray == null)
            {
                objectArray = new object[InitialArraySize];
                objectArray[count++] = obj;
            }
            else if (count < MaximumArraySize)
            {
                if (count == objectArray.Length)
                    Array.Resize<object>(ref objectArray, objectArray.Length * 2);
                objectArray[count++] = obj;
            }
            else
            {
                if (objectDictionary == null)
                    objectDictionary = new Dictionary<object, object>();

                objectDictionary.Add(obj, null);
                count++;
            }
        }

        internal void EnsureSetAsIsReference(object obj)
        {
            if (count == 0)
                return;
            if (count > MaximumArraySize)
            {
                if (objectDictionary == null)
                {
                    Fx.Assert("Object reference stack in invalid state");
                }
                objectDictionary.Remove(obj);
            }
            else
            {
                if ((objectArray != null) && objectArray[count - 1] == obj)
                {
                    if (isReferenceArray == null)
                    {
                        isReferenceArray = new bool[InitialArraySize];
                    }
                    else if (count == isReferenceArray.Length)
                    {

                        Array.Resize<bool>(ref isReferenceArray, isReferenceArray.Length * 2);
                    }
                    isReferenceArray[count - 1] = true;
                }
            }
        }

        internal void Pop(object obj)
        {
            if (count > MaximumArraySize)
            {
                if (objectDictionary == null)
                {
                    Fx.Assert("Object reference stack in invalid state");
                }
                objectDictionary.Remove(obj);
            }
            count--;
        }

        internal bool Contains(object obj)
        {
            int currentCount = count;
            if (currentCount > MaximumArraySize)
            {
                if (objectDictionary != null && objectDictionary.ContainsKey(obj))
                    return true;
                currentCount = MaximumArraySize;
            }
            for (int i = (currentCount - 1); i >= 0; i--)
            {
                if (Object.ReferenceEquals(obj, objectArray[i]) && isReferenceArray != null && !isReferenceArray[i])
                    return true;
            }
            return false;
        }

        internal int Count
        {
            get { return count; }
        }

    }

}