Esempio n. 1
0
        public void Queue_EnqueueWithDupPriorities_DequeueReturnsByPriorityThenByOrderOfInsertion()
        {
            //Arrange
            var queue = new OrderedPriorityQueue <int, string>();

            //Act
            queue.Enqueue(1, "h");
            queue.Enqueue(2, "e");
            queue.Enqueue(2, "f");
            queue.Enqueue(2, "g");
            queue.Enqueue(3, "d");
            queue.Enqueue(5, "a");
            queue.Enqueue(4, "b");
            queue.Enqueue(4, "c");

            //Assert
            Assert.AreEqual("a", queue.Dequeue());
            Assert.AreEqual("b", queue.Dequeue());
            Assert.AreEqual("c", queue.Dequeue());
            Assert.AreEqual("d", queue.Dequeue());
            Assert.AreEqual("e", queue.Dequeue());
            Assert.AreEqual("f", queue.Dequeue());
            Assert.AreEqual("g", queue.Dequeue());
            Assert.AreEqual("h", queue.Dequeue());
        }
        public void Queue_EnqueueWithDupPriorities_DequeueReturnsByPriorityThenByOrderOfInsertion()
        {
            //Arrange
            var queue = new OrderedPriorityQueue<int, string>();

            //Act
            queue.Enqueue(1, "h");
            queue.Enqueue(2, "e");
            queue.Enqueue(2, "f");
            queue.Enqueue(2, "g");
            queue.Enqueue(3, "d");
            queue.Enqueue(5, "a");
            queue.Enqueue(4, "b");
            queue.Enqueue(4, "c");

            //Assert
            Assert.AreEqual("a", queue.Dequeue());
            Assert.AreEqual("b", queue.Dequeue());
            Assert.AreEqual("c", queue.Dequeue());
            Assert.AreEqual("d", queue.Dequeue());
            Assert.AreEqual("e", queue.Dequeue());
            Assert.AreEqual("f", queue.Dequeue());
            Assert.AreEqual("g", queue.Dequeue());
            Assert.AreEqual("h", queue.Dequeue());
        }
Esempio n. 3
0
        private void ProcessTime()
        {
            // TODO check for calls from different threads
            lock (_sync)
            {
                if (_seriesInfosByDates.Count == 0)
                {
                    return;
                }

                var pair = _seriesInfosByDates.Peek();

                while (pair.Key <= InnerAdapter.CurrentTime)
                {
                    _seriesInfosByDates.Dequeue();

                    UnSubscribe(pair.Value, true);
                    SendMarketDataFinished(pair.Value);

                    if (_seriesInfosByDates.Count == 0)
                    {
                        break;
                    }

                    pair = _seriesInfosByDates.Peek();
                }
            }
        }
Esempio n. 4
0
        public void Queue_Enqueue_DequeueReturnsByPriority()
        {
            //Arrange
            var queue = new OrderedPriorityQueue <int, string>();

            //Act
            queue.Enqueue(1, "e");
            queue.Enqueue(2, "d");
            queue.Enqueue(3, "c");
            queue.Enqueue(5, "a");
            queue.Enqueue(4, "b");

            //Assert
            Assert.AreEqual("a", queue.Dequeue());
            Assert.AreEqual("b", queue.Dequeue());
            Assert.AreEqual("c", queue.Dequeue());
            Assert.AreEqual("d", queue.Dequeue());
            Assert.AreEqual("e", queue.Dequeue());
        }
        public void Queue_Enqueue_DequeueReturnsByPriority()
        {
            //Arrange
            var queue = new OrderedPriorityQueue<int, string>();

            //Act
            queue.Enqueue(1, "e");
            queue.Enqueue(2, "d");
            queue.Enqueue(3, "c");
            queue.Enqueue(5, "a");
            queue.Enqueue(4, "b");

            //Assert
            Assert.AreEqual("a", queue.Dequeue());
            Assert.AreEqual("b", queue.Dequeue());
            Assert.AreEqual("c", queue.Dequeue());
            Assert.AreEqual("d", queue.Dequeue());
            Assert.AreEqual("e", queue.Dequeue());
        }
        private void OnConnectorMarketTimeChanged(TimeSpan value)
        {
            if (_seriesByDates.Count == 0)
            {
                return;
            }

            var pair = _seriesByDates.Peek();

            while (pair.Key <= Connector.CurrentTime)
            {
                _seriesByDates.Dequeue();
                Stop(pair.Value);

                if (_seriesByDates.Count == 0)
                {
                    break;
                }

                pair = _seriesByDates.Peek();
            }
        }
            bool IEnumerator.MoveNext()
            {
                while (true)
                {
                    var action = _actions.TryDequeue();

                    if (action == null)
                    {
                        break;
                    }

                    var type    = action.Item1;
                    var storage = action.Item2;

                    switch (type)
                    {
                    case ActionType.Add:
                    {
                        var enu      = storage.Load(_date).GetEnumerator();
                        var lastTime = Current == null ? DateTimeOffset.MinValue : Current.GetServerTime();

                        var hasValues = true;

                        // пропускаем данные, что меньше времени последнего сообщения (lastTime)
                        while (true)
                        {
                            if (!enu.MoveNext())
                            {
                                hasValues = false;
                                break;
                            }

                            var msg = (Message)enu.Current;

                            if (msg.GetServerTime() >= lastTime)
                            {
                                break;
                            }
                        }

                        // данных в хранилище нет больше последней даты
                        if (hasValues)
                        {
                            _enumerators.Enqueue(GetServerTime(enu), Tuple.Create(enu, storage));
                        }
                        else
                        {
                            enu.DoDispose();
                        }

                        break;
                    }

                    case ActionType.Remove:
                    {
                        _enumerators.RemoveWhere(p => p.Value.Item2 == storage);
                        break;
                    }

                    case ActionType.Clear:
                    {
                        _enumerators.Clear();
                        break;
                    }

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }

                if (_enumerators.Count == 0)
                {
                    return(false);
                }

                var pair = _enumerators.Dequeue();

                var enumerator = pair.Value.Item1;

                Current = (T)enumerator.Current;

                if (enumerator.MoveNext())
                {
                    _enumerators.Enqueue(GetServerTime(enumerator), pair.Value);
                }
                else
                {
                    enumerator.DoDispose();
                }

                return(true);
            }
            bool IEnumerator.MoveNext()
            {
                while (true)
                {
                    var action = _actions.TryDequeue();

                    if (action == null)
                    {
                        break;
                    }

                    var type    = action.Item1;
                    var storage = action.Item2;

                    switch (type)
                    {
                    case ActionTypes.Add:
                    {
                        var loaded = storage.Load(_date);

                        if (!_storage.PassThroughOrderBookInrement && loaded is IEnumerable <QuoteChangeMessage> quotes)
                        {
                            loaded = quotes.BuildIfNeed();
                        }

                        var enu      = loaded.GetEnumerator();
                        var lastTime = Current?.GetServerTime() ?? DateTimeOffset.MinValue;

                        var hasValues = true;

                        // пропускаем данные, что меньше времени последнего сообщения (lastTime)
                        while (true)
                        {
                            if (!enu.MoveNext())
                            {
                                hasValues = false;
                                break;
                            }

                            var msg = enu.Current;

                            if (msg.GetServerTime() >= lastTime)
                            {
                                break;
                            }
                        }

                        // данных в хранилище нет больше последней даты
                        if (hasValues)
                        {
                            _enumerators.Enqueue(GetServerTime(enu), Tuple.Create(enu, storage, action.Item3));
                        }
                        else
                        {
                            enu.DoDispose();
                        }

                        break;
                    }

                    case ActionTypes.Remove:
                    {
                        _enumerators.RemoveWhere(p => p.Value.Item2 == storage);
                        break;
                    }

                    case ActionTypes.Clear:
                    {
                        _enumerators.Clear();
                        break;
                    }

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }

                if (_enumerators.Count == 0)
                {
                    return(false);
                }

                var pair = _enumerators.Dequeue();

                var enumerator = pair.Value.Item1;

                Current = TrySetTransactionId(enumerator.Current, pair.Value.Item3);

                if (enumerator.MoveNext())
                {
                    _enumerators.Enqueue(GetServerTime(enumerator), pair.Value);
                }
                else
                {
                    enumerator.DoDispose();
                }

                return(true);
            }