DataFlow refactoring
This commit is contained in:
@@ -22,7 +22,7 @@ type
|
||||
end;
|
||||
|
||||
// Concrete data provider that manages a list of processors (listeners).
|
||||
TMycContainedDataProvider<T> = class abstract(TContainedObject, TDataProvider<T>.IDataProvider)
|
||||
TMycContainedDataProvider<T> = class abstract(TContainedObject, IDataProvider<T>)
|
||||
private
|
||||
FListeners: TMycNotifyList<IMycProcessor<T>>;
|
||||
public
|
||||
@@ -31,9 +31,9 @@ type
|
||||
// Notifies all linked processors.
|
||||
function Broadcast(const Value: T): TState;
|
||||
// Link a Processor
|
||||
function Link(const Processor: IMycProcessor<T>): TDataProvider<T>.TTag;
|
||||
function Link(const Processor: IMycProcessor<T>): TTag;
|
||||
// Unlink a linked strategy
|
||||
procedure Unlink(Tag: TDataProvider<T>.TTag);
|
||||
procedure Unlink(Tag: TTag);
|
||||
end;
|
||||
|
||||
TMycSequence<T> = class(TMycProcessor<T>, IMycDataSequence<T>)
|
||||
@@ -50,17 +50,17 @@ type
|
||||
end;
|
||||
|
||||
// Null object implementation for IDataProvider.
|
||||
TNullDataProvider<T> = class(TInterfacedObject, TDataProvider<T>.IDataProvider)
|
||||
TNullDataProvider<T> = class(TInterfacedObject, IDataProvider<T>)
|
||||
public
|
||||
function Link(const Receiver: IMycProcessor<T>): TDataProvider<T>.TTag;
|
||||
procedure Unlink(Tag: TDataProvider<T>.TTag);
|
||||
function Link(const Receiver: IMycProcessor<T>): TTag;
|
||||
procedure Unlink(Tag: TTag);
|
||||
end;
|
||||
|
||||
// Abstract base class for components that process data of type S and provide data of type T.
|
||||
TMycConverter<S, T> = class abstract(TMycProcessor<S>, TConverter<S, T>.IConverter)
|
||||
TMycConverter<S, T> = class abstract(TMycProcessor<S>, IConverter<S, T>)
|
||||
private
|
||||
FSender: TMycContainedDataProvider<T>;
|
||||
function GetSender: TDataProvider<T>.IDataProvider;
|
||||
function GetSender: IDataProvider<T>;
|
||||
protected
|
||||
function ProcessData(const Value: S): TState; override; abstract;
|
||||
// Broadcasts the given data to all linked processors.
|
||||
@@ -68,13 +68,13 @@ type
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
property Sender: TDataProvider<T>.IDataProvider read GetSender;
|
||||
property Sender: IDataProvider<T> read GetSender;
|
||||
end;
|
||||
|
||||
// Null object implementation for IConverter.
|
||||
TNullConverter<S, T> = class(TInterfacedObject, TConverter<S, T>.IConverter)
|
||||
TNullConverter<S, T> = class(TInterfacedObject, IConverter<S, T>)
|
||||
private
|
||||
function GetSender: TDataProvider<T>.IDataProvider;
|
||||
function GetSender: IDataProvider<T>;
|
||||
public
|
||||
function ProcessData(const Value: S): TState;
|
||||
end;
|
||||
@@ -174,8 +174,8 @@ type
|
||||
end;
|
||||
private
|
||||
FProcessor: TMycContainedProcessor<T>;
|
||||
FTag: TDataProvider<T>.TTag;
|
||||
FDataProvider: TDataProvider<T>;
|
||||
FTag: TTag;
|
||||
FDataProvider: IDataProvider<T>;
|
||||
FLookback: Int64;
|
||||
FChanged: TFlag;
|
||||
FLock: TLightweightMREW;
|
||||
@@ -225,12 +225,12 @@ type
|
||||
end;
|
||||
|
||||
// Endpoint that collects data into a series.
|
||||
TMycDataJoin<T> = class(TInterfacedObject, TDataProvider<TArray<T>>.IDataProvider)
|
||||
TMycDataJoin<T> = class(TInterfacedObject, IDataProvider<TArray<T>>)
|
||||
private
|
||||
FReceivers: array of record
|
||||
DataProvider: TDataProvider<T>;
|
||||
DataProvider: IDataProvider<T>;
|
||||
Processor: TMycContainedProcessor<T>;
|
||||
Tag: TDataProvider<T>.TTag;
|
||||
Tag: TTag;
|
||||
Queue: TQueue<T>;
|
||||
end;
|
||||
|
||||
@@ -241,16 +241,16 @@ type
|
||||
public
|
||||
constructor Create(const ADataProviders: TArray<TDataProvider<T>>);
|
||||
destructor Destroy; override;
|
||||
property Sender: TMycContainedDataProvider<TArray<T>> read FSender implements TDataProvider<TArray<T>>.IDataProvider;
|
||||
property Sender: TMycContainedDataProvider<TArray<T>> read FSender implements IDataProvider<TArray<T>>;
|
||||
end;
|
||||
|
||||
TMycComposedConverter<S, T> = class(TMycProcessor<S>, TConverter<S, T>.IConverter)
|
||||
TMycComposedConverter<S, T> = class(TMycProcessor<S>, IConverter<S, T>)
|
||||
private
|
||||
FProcessor: IMycProcessor<S>;
|
||||
FDataProvider: TDataProvider<T>;
|
||||
protected
|
||||
function ProcessData(const Value: S): TState; override;
|
||||
function GetSender: TDataProvider<T>.IDataProvider;
|
||||
function GetSender: IDataProvider<T>;
|
||||
public
|
||||
constructor Create(const AProcessor: IMycProcessor<S>; const ADataProvider: TDataProvider<T>);
|
||||
end;
|
||||
@@ -314,7 +314,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TMycContainedDataProvider<T>.Link(const Processor: IMycProcessor<T>): TDataProvider<T>.TTag;
|
||||
function TMycContainedDataProvider<T>.Link(const Processor: IMycProcessor<T>): TTag;
|
||||
begin
|
||||
// Add the Processor to the notification list
|
||||
FListeners.Lock;
|
||||
@@ -325,7 +325,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMycContainedDataProvider<T>.Unlink(Tag: TDataProvider<T>.TTag);
|
||||
procedure TMycContainedDataProvider<T>.Unlink(Tag: TTag);
|
||||
begin
|
||||
FListeners.Lock;
|
||||
try
|
||||
@@ -337,12 +337,12 @@ end;
|
||||
|
||||
{ TNullDataProvider<T> }
|
||||
|
||||
function TNullDataProvider<T>.Link(const Receiver: IMycProcessor<T>): TDataProvider<T>.TTag;
|
||||
function TNullDataProvider<T>.Link(const Receiver: IMycProcessor<T>): TTag;
|
||||
begin
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
procedure TNullDataProvider<T>.Unlink(Tag: TDataProvider<T>.TTag);
|
||||
procedure TNullDataProvider<T>.Unlink(Tag: TTag);
|
||||
begin
|
||||
// Do nothing in the null implementation.
|
||||
end;
|
||||
@@ -366,14 +366,14 @@ begin
|
||||
Result := FSender.Broadcast(Value);
|
||||
end;
|
||||
|
||||
function TMycConverter<S, T>.GetSender: TDataProvider<T>.IDataProvider;
|
||||
function TMycConverter<S, T>.GetSender: IDataProvider<T>;
|
||||
begin
|
||||
Result := FSender;
|
||||
end;
|
||||
|
||||
{ TNullConverter<S, T> }
|
||||
|
||||
function TNullConverter<S, T>.GetSender: TDataProvider<T>.IDataProvider;
|
||||
function TNullConverter<S, T>.GetSender: IDataProvider<T>;
|
||||
begin
|
||||
Result := TDataProvider<T>.Null;
|
||||
end;
|
||||
@@ -499,7 +499,6 @@ begin
|
||||
|
||||
FProcessor := TMycContainedProcessor<T>.Create(Self, ProcessData);
|
||||
FTag := FDataProvider.Link(FProcessor);
|
||||
|
||||
end;
|
||||
|
||||
destructor TMycDataEndpoint<T>.Destroy;
|
||||
@@ -930,7 +929,7 @@ begin
|
||||
FDataProvider := ADataProvider;
|
||||
end;
|
||||
|
||||
function TMycComposedConverter<S, T>.GetSender: TDataProvider<T>.IDataProvider;
|
||||
function TMycComposedConverter<S, T>.GetSender: IDataProvider<T>;
|
||||
begin
|
||||
Result := FDataProvider;
|
||||
end;
|
||||
|
||||
Reference in New Issue
Block a user