#pragma warning restore

        public void Evaluate(int SpreadMax)
        {
            SpreadMax = FInput.IsAnyInvalid() ? 0 : FInput.SliceCount;

            if (SpreadMax <= 0)
            {
                FMatch.FlushNil();
                FOutput.FlushNil();

                return;
            }
            FMatch.SliceCount = FOutput.SliceCount = 0;

            foreach (var message in FInput)
            {
                var match = new bool[FFilter.SliceCount];
                for (int i = 0; i < FFilter.SliceCount; i++)
                {
                    match[i] = message.Fields.Contains(FFilter[i]);
                }

                if (match.Any())
                {
                    FOutput.Add(message);
                    FMatch.AddRange(match);
                }
            }

            FOutput.Flush();
            FMatch.Flush();
        }
예제 #2
0
 public void UpdateOutput()
 {
     if (FUpdateHistOutput[0])
     {
         FStateIndexHistory.SliceCount = 0;
         FStateIndexHistory.AddRange(stateIndexHistory.ToList <int>());
     }
 }
예제 #3
0
파일: Store.cs 프로젝트: vnmone/vvvv-sdk
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            if (FClear[0])
            {
                FOut.SliceCount = 0;
            }

            if (FFlush[0])
            {
                FOut.AssignFrom(FIn);
            }

            if (PinChanged())
            {
                Spread <Spread <T> > buffer = new Spread <Spread <T> >(0);

                int incr = 0, sum = 0;
                while (!(sum >= FOut.SliceCount && (incr % FBinSize.SliceCount) == 0))
                {
                    buffer.Add((Spread <T>)FOut.GetRange(sum, FBinSize[incr]));
                    sum += FBinSize[incr];
                    incr++;
                }

                incr = 0;
                for (int i = 0; i < FId.SliceCount; i++)
                {
                    int binSize = 1;
                    try
                    {
                        binSize = buffer[FId[i]].SliceCount;
                    }
                    catch
                    {
                        binSize = FBinSize[FId[i]];
                    }
                    Alter(i, incr, binSize, ref buffer);
                    incr += binSize;
                }

                FOut.SliceCount = 0;
                foreach (Spread <T> t in buffer)
                {
                    FOut.AddRange(t);
                }
            }
        }
예제 #4
0
        public override void Evaluate(int SpreadMax)
        {
            if (!_changed)
            {
                return;
            }
            _changed = false;

            SpreadMax             = FFieldName.SliceCount = FFormularSelection.SliceCount;
            FFieldType.SliceCount = FBinDef.SliceCount = FDefaultSize.SliceCount = 0;

            var registry = MessageFormularRegistry.Context;

            for (int i = 0; i < SpreadMax; i++)
            {
                FFieldName[i].SliceCount = 0;

                var formularName = FFormularSelection[i].Name;
                var def          = registry[formularName];
                if (def != null)
                {
                    var descriptors = def.FieldDescriptors;

                    FFieldName[i].AssignFrom(from field in descriptors select field.Name);

                    FDefaultSize.AddRange(from field in descriptors select field.DefaultSize);
                    FFieldType.AddRange(from field in descriptors select TypeIdentity.Instance.FindAlias(field.Type));
                    FBinDef.AddRange(from field in descriptors select GetBinDefString(field.DefaultSize));
                }
            }

            FFieldType.Flush();
            FDefaultSize.Flush();
            FBinDef.Flush();
            FFieldName.Flush();
        }
예제 #5
0
        public void Evaluate(int SpreadMax)
        {
            FOutOnData.SliceCount       = FOutElementCount.SliceCount = 1;
            FOutMemoryStream.SliceCount = FOutActiveChunkIndex.SliceCount = 0;

            if (FChunkManager.IsConnected && FChunkManager.SliceCount > 0 && FChunkManager[0] != null)
            {
                ChunkManager chunkManager = FChunkManager[0];

                // create chunkaccessdata list for all requested chunks
                if (FIndex.IsChanged || FDownsampling.IsChanged || FDownsamplingOffset.IsChanged)
                {
                    IEnumerable <int>      currentChunks    = FIndex;
                    List <int>             currentChunkList = FIndex.ToList();
                    List <ChunkAccessData> chunksToAdd      = new List <ChunkAccessData>();
                    for (int i = 0; i < FIndex.SliceCount; i++)
                    {
                        int    streamLimit              = FLimit[i];
                        int    streamDownsampling       = FDownsampling[i];
                        int    streamDownsamplingOffset = FDownsamplingOffset[i];
                        double streamLocktime           = FLockTime[i];
                        chunksToAdd.Add(new ChunkAccessData(FIndex[i], streamLimit, streamDownsampling, streamDownsamplingOffset, streamLocktime));
                    }

                    // now remove chunks that are already active (with the same LOD)
                    chunksToAdd.RemoveAll(chunkToAdd => ActiveChunks.Exists(activeChunk => chunkToAdd.chunkId == activeChunk.chunkId &&
                                                                            chunkToAdd.streamDownsampling == activeChunk.streamDownsampling &&
                                                                            chunkToAdd.streamDownsamplingOffset == activeChunk.streamDownsamplingOffset
                                                                            ));
                    // remove chunks that are locked
                    chunksToAdd.RemoveAll(chunkToAdd => LockedChunks.Exists(lockedChunk => chunkToAdd.chunkId == lockedChunk.chunkId));

                    // create list of chunks wo dont need anymore
                    var chunksToRemove = ActiveChunks.Select(activeChunk => activeChunk.chunkId).Except(currentChunks).ToList();

                    // update list of locked chunks
                    var chunksToLock = ActiveChunks.Where(activeChunk => chunksToRemove.Contains(activeChunk.chunkId) && activeChunk.streamFinished).ToList();
                    chunksToLock.ForEach(activeChunk => activeChunk.StartLock());
                    LockedChunks.AddRange(chunksToLock);
                    LockedChunks.RemoveAll(lockedChunk => lockedChunk.isLocked == false);

                    // finally add remaining chunkaccessdata items to active list ..
                    ActiveChunks.AddRange(chunksToAdd);
                    // and remove chunkaccessdata items we dont need anymore
                    ActiveChunks.RemoveAll(activeChunk => chunksToRemove.Contains(activeChunk.chunkId));

                    // start reading process for new chunks (if not already happened)
                    if (chunkManager.ChunkReader != null)
                    {
                        foreach (ChunkAccessData chunkAccessData in chunksToAdd)
                        {
                            Chunk chunk = chunkManager.GetChunk(chunkAccessData.chunkId);
                            chunkManager.ChunkReader.Read(chunk);
                        }
                    }
                }

                // add chunkdata streams to a list
                FOutElementCount[0] = 0;
                List <Stream> streams = new List <Stream>();
                foreach (ChunkAccessData activeChunk in ActiveChunks)
                {
                    Chunk chunk = chunkManager.GetChunk(activeChunk.chunkId);

                    if (!activeChunk.streamFinished && chunk.finishedLoading)
                    {
                        Stream stream = chunk.MemoryStream;

                        // logic for limited stream output
                        if (activeChunk.streamLimit > -1)
                        {
                            int bytesToRead = chunkManager.BytesPerElement * activeChunk.streamLimit;
                            stream = new SkipStream(stream, activeChunk.streamPosition);
                            stream = new TakeStream(stream, bytesToRead * activeChunk.streamDownsampling);
                        }

                        // logic for picking every nth element
                        if (activeChunk.streamDownsampling > 1)
                        {
                            stream = new ModuloStream(stream, chunkManager.BytesPerElement, activeChunk.streamDownsampling, activeChunk.streamDownsamplingOffset);
                        }

                        // calculate number of appended elements
                        int bytesRead = (int)stream.Length;
                        FOutElementCount[0] += (bytesRead / chunkManager.BytesPerElement);

                        // update streamposition and set flag if position is at end
                        activeChunk.streamPosition += bytesRead * activeChunk.streamDownsampling;
                        if (activeChunk.streamPosition >= chunk.MemoryStream.Length)
                        {
                            activeChunk.streamFinished = true;
                        }

                        // add stream to list
                        streams.Add(stream);
                    }
                }

                // aggregate streams if needed
                if (streams.Count > 1)
                {
                    FOutMemoryStream.Add(new AggregatedStream(streams));
                }
                else if (streams.Count == 1)
                {
                    FOutMemoryStream.Add(streams[0]);
                }

                // bang on data
                FOutOnData[0] = (FOutElementCount[0] > 0) ? true : false;

                // output active chunk ids
                FOutActiveChunkIndex.AddRange(ActiveChunks.Select(activeChunk => activeChunk.chunkId));
            }
            else
            {
                FOutMemoryStream.Add(new MemoryComStream(new byte[sizeof(Single)]));   // workaround to prevent DynamicBufer (raw) from throwing exceptions
            }
        }