Esempio n. 1
0
 public override void Write(IRowOutputInterface output, IntLookup lookup)
 {
     output.WriteInt(base.IBalance);
     WriteTranslatePointer(this._iLeft, output, lookup);
     WriteTranslatePointer(this._iRight, output, lookup);
     WriteTranslatePointer(this._iParent, output, lookup);
 }
Esempio n. 2
0
 public override void Write(IRowOutputInterface output, IntLookup lookup)
 {
     output.WriteSize(this.storageSize);
     for (NodeAVL eavl = base.NPrimaryNode; eavl != null; eavl = eavl.nNext)
     {
         ((NodeAVLDisk)eavl).Write(output, lookup);
     }
     output.WriteData(base.RowData, base.table.ColTypes);
     output.WriteEnd();
 }
Esempio n. 3
0
        private void InitMessageTypesDictionary()
        {
            var messageTypes        = _messageTypes.ToArray();
            var messageTypePointers = messageTypes.Select(t => t.TypeHandle.Value.ToInt64()).ToArray();

            // -1 to ensure that when a diff is applied it's still positive
            _messageTypePointerDiff = messageTypePointers.Min() - 1;

            var keys   = messageTypePointers.Select(p => (int)(p - _messageTypePointerDiff)).ToArray();
            var values = messageTypes.Select((type, index) => index + 1).ToArray();

            _identifiers = new IntLookup <int>(keys, values);
        }
Esempio n. 4
0
        public void Test()
        {
            var values = Enumerable.Range(1, 100).ToDictionary(i => i, i => i + 1);

            var intLookup = new IntLookup <int>(values.Keys.ToArray(), values.Values.ToArray());

            foreach (var kvp in values)
            {
                int value;
                if (intLookup.TryGet(kvp.Key, out value))
                {
                    Assert.AreEqual(kvp.Value, value);
                }
            }
        }
Esempio n. 5
0
        public void Test()
        {
            var values = Enumerable.Range(1, 100).ToDictionary(i => i, i => i + 1);

            var intLookup = new IntLookup<int>(values.Keys.ToArray(), values.Values.ToArray());

            foreach (var kvp in values)
            {
                int value;
                if (intLookup.TryGet(kvp.Key, out value))
                {
                    Assert.AreEqual(kvp.Value, value);
                }
            }
        }
Esempio n. 6
0
        private static void WriteTranslatePointer(int pointer, IRowOutputInterface output, IntLookup lookup)
        {
            int i = 0;

            if (pointer != -1)
            {
                i = lookup.LookupFirstEqual(pointer);
            }
            output.WriteInt(i);
        }
Esempio n. 7
0
 public virtual void Write(IRowOutputInterface o, IntLookup lookup)
 {
 }
Esempio n. 8
-1
        public ActorRegistry(IReadOnlyCollection<Tuple<ActorDescriptor, IRingBuffer, ActorId>> actors)
        {
            if (actors.Count > ActorId.MaxValue)
            {
                throw new ArgumentException("To many actors");
            }

            var messageTypesOrdered = actors.Select(t => t.Item1)
                .SelectMany(d => d.HandledMessageTypes)
                .Distinct()
                .OrderBy(t => t.TypeHandle.Value.ToInt64())
                .ToArray();

            if (messageTypesOrdered.Length == 0)
            {
                throw new ArgumentException("The handled messages set is empty. This is a useless registry");
            }

            _messageTypeDiff = messageTypesOrdered.First().TypeHandle.Value.ToInt64() - 1;

            var ringsGroupedByMessageId = actors.SelectMany(
                t =>
                    t.Item1.HandledMessageTypes.Select(
                        messageType => new {MessageTypeId = GetMessageTypeId(messageType), Buffer = t.Item2}))
                .GroupBy(a => a.MessageTypeId)
                .ToArray();

            var buffers = new List<IRingBuffer>();
            AddPadding(buffers);

            var count = ringsGroupedByMessageId.Length;
            var keys = new int[count];
            var values = new Tuple<int, int>[count];
            var index = 0;

            foreach (var g in ringsGroupedByMessageId)
            {
                keys[index] = g.Key;
                var start = buffers.Count;
                buffers.AddRange(g.Select(tuple => tuple.Buffer));
                var end = buffers.Count;
                var length = end - start;

                values[index] = Tuple.Create(start, length);
                index += 1;
            }

            AddPadding(buffers);

            // create one table
            var bufferArray = buffers.ToArray();
            var valuesArray =
                values.Select(tuple => new ArraySegment<IRingBuffer>(bufferArray, tuple.Item1, tuple.Item2)).ToArray();

            _messageTypeToBuffers = new IntLookup<ArraySegment<IRingBuffer>>(keys, valuesArray);

            // by actor
            var max = actors.Max(t => t.Item3.Value);
            _buffersByActor = new IRingBuffer[max + 1];

            foreach (var actor in actors)
            {
                _buffersByActor[actor.Item3.Value] = actor.Item2;
            }
        }