Ejemplo n.º 1
0
        public override string ToString()
        {
            IdentityHashSet <ICoreMap> calledSet = ToStringCalled.Value;

            if (calledSet == null)
            {
                calledSet = new IdentityHashSet <ICoreMap>();
            }

            if (calledSet.Contains(this))
            {
                return("[...]");
            }

            calledSet.Add(this);

            var s = new StringBuilder("[");

            for (int i = 0; i < psize; i++)
            {
                s.Append(keys[i].Name);
                s.Append('=');
                s.Append(values[i]);
                if (i < psize - 1)
                {
                    s.Append(' ');
                }
            }
            s.Append(']');

            bool createdCalledSet = calledSet == null || calledSet.IsEmpty();

            if (createdCalledSet)
            {
                ToStringCalled.Dispose(); /*remove();*/
            }
            else
            {
                // Remove the object from the already called set so that
                // potential later calls in this object graph have something
                // more description than [...]
                calledSet.Remove(this);
            }
            return(s.ToString());
        }
Ejemplo n.º 2
0
        public override int GetHashCode()
        {
            IdentityHashSet <ICoreMap> calledSet = HashCodeCalled.Value;
            bool createdCalledSet = (calledSet == null);

            if (createdCalledSet)
            {
                calledSet            = new IdentityHashSet <ICoreMap>();
                HashCodeCalled.Value = calledSet;
            }

            if (calledSet.Contains(this))
            {
                return(0);
            }

            calledSet.Add(this);

            int keysCode   = 0;
            int valuesCode = 0;

            for (int i = 0; i < psize; i++)
            {
                keysCode   += (i < keys.Length && values[i] != null ? keys[i].GetHashCode() : 0);
                valuesCode += (i < values.Length && values[i] != null ? values[i].GetHashCode() : 0);
            }

            if (createdCalledSet)
            {
                HashCodeCalled.Value = null;
            }
            else
            {
                // Remove the object after processing is complete so that if
                // there are multiple instances of this CoreMap in the overall
                // object graph, they each have their hash code calculated.
                // TODO: can we cache this for later?
                calledSet.Remove(this);
            }
            return(keysCode * 37 + valuesCode);
        }