private RouteComponent createReducer(bool counter) { if (!counter) { if (source.attributes.length() <= 0) { throw new IllegalRouteOperationException("Cannot accumulate null data"); } if (source.attributes.length() > 4) { throw new IllegalRouteOperationException("Cannot accumulate data longer than 4 bytes"); } } byte output = 4; DataAttributes attributes = new DataAttributes(new byte[] { output }, 1, 0, !counter && source.attributes.signed); DataTypeBase processor = counter ? new IntegralDataType(source, DATA_PROCESSOR, DataProcessor.NOTIFY, attributes) : source.dataProcessorCopy(source, attributes); byte[] config = new byte[] { 0x2, (byte)(((output - 1) & 0x3) | (((source.attributes.length() - 1) & 0x3) << 2) | (counter ? 0x10 : 0)) }; EditorImplBase editor = counter ? new CounterEditorInner(config, processor, state.bridge) as EditorImplBase : new AccumulatorEditorInner(config, processor, state.bridge) as EditorImplBase; DataTypeBase processorState = counter ? new IntegralDataType(null, DATA_PROCESSOR, Util.setRead(DataProcessor.STATE), attributes) : processor.dataProcessorStateCopy(source, attributes); return(postCreate(processorState, editor)); }
public IRouteBranchEnd Buffer() { if (source.attributes.length() <= 0) { throw new IllegalRouteOperationException("Cannot buffer null data"); } DataTypeBase processor = new IntegralDataType(source, DATA_PROCESSOR, DataProcessor.NOTIFY, new DataAttributes(new byte[] { }, 0, 0, false)); var config = new BufferConfig(source.attributes.length()); state.dataProcessors.AddLast(Tuple.Create( source.dataProcessorStateCopy(source, source.attributes), new NullEditor(config, processor, state.bridge) as EditorImplBase )); return(new RouteBranchEnd(this)); }