Пример #1
0
        /// <summary>
        /// Merge clocks
        /// </summary>
        public VectorClock Merge(VectorClock clock)
        {
            int i = 0;
            int j = 0;

            var versions         = Versions.ToArray();
            var clockVersions    = clock.Versions.ToArray();
            var newClockVersions = List.empty <ClockEntry>();

            while (i < versions.Length && j < clockVersions.Length)
            {
                var v1 = versions[i];
                var v2 = clockVersions[j];

                if (v1.NodeId == v2.NodeId)
                {
                    var nc = new ClockEntry(v1.NodeId, (int)Math.Max(v1.Version, v2.Version));
                    newClockVersions = newClockVersions.Add(nc);

                    i++;
                    j++;
                }
                else if (v1.NodeId < v2.NodeId)
                {
                    newClockVersions = newClockVersions.Add(v1);
                    i++;
                }
                else
                {
                    newClockVersions = newClockVersions.Add(v2);
                    j++;
                }
            }

            // Okay now there may be leftovers on one or the other list remaining
            for (int k = i; k < versions.Length; k++)
            {
                newClockVersions = newClockVersions.Add(versions[k]);
            }
            for (int k = j; k < clockVersions.Length; k++)
            {
                newClockVersions = newClockVersions.Add(clockVersions[k]);
            }
            return(new VectorClock(newClockVersions));
        }