Скачиваний:
28
Добавлен:
01.05.2014
Размер:
4.16 Кб
Скачать
unit Filter;

interface

uses
Classes,
SerializableObject,
Instances,
Contnrs,
DmmTypes,
dmmConstants,
SysUtils,
Exceptions,
attribute;

type
TDMFilter = class( TDMSerializableObject )
public

protected
m_OutputFormat : TDMInstances;

m_OutputQueue : TQueue ;

m_InputFormat : TDMInstances;

protected
m_NewBatch : boolean ;

protected
constructor Create(); virtual;
function convertInstance(instance : TDMInstance) : TDMInstance; virtual;abstract;
function inputFormatPeek() : TDMInstances;
function getInputFormat() : TDMInstances;
procedure resetQueue();
procedure bufferInput(var instance : TDMInstance );
procedure setFilterOutputFormat(outputFormat : TDMInstances );virtual; abstract;
function getOptions() : AnsiString; virtual; abstract;
function outputFormatPeek(): TDMInstances;
procedure flushInput();
function numPendingOutput() : integer;
public
function useFilter(instances : TDMInstances) : TDMInstances; virtual;abstract;
function setInputFormat(instanceInfo : TDMInstances) : boolean ; virtual;
function input( instance : TDMInstance) : boolean; virtual;abstract;
function batchFinished() : boolean; virtual;abstract;
function getOutputFormat(): TDMInstances;
function output() : TDMInstance ;
procedure setFindNumBins(newFindNumBins : boolean); virtual;abstract;
protected
procedure push(instance : TDMInstance );
public
procedure ClearQueue();
destructor Destroy; override;
end;

implementation
constructor TDMFilter.Create();
begin
m_OutputFormat := nil;
m_OutputQueue := nil;
m_InputFormat := nil;
m_NewBatch := true;
end;


function TDMFilter.setInputFormat(instanceInfo : TDMInstances) : boolean;
begin
m_InputFormat := instanceInfo.attrCopyStructure();
m_OutputFormat := nil;
m_OutputQueue := TQueue.Create();
m_NewBatch := true;

end;

function TDMFilter.inputFormatPeek() : TDMInstances;
begin
result := m_InputFormat;
end;


function TDMFilter.getInputFormat() : TDMInstances;
begin
result := m_InputFormat;
end;

procedure TDMFilter.resetQueue();
begin
ClearQueue();
FreeAndNil(m_OutputQueue);
m_OutputQueue := TQueue.Create;
end;

procedure TDMFilter.bufferInput(var instance : TDMInstance );
begin
if (instance <> nil) then
begin
m_InputFormat.add(instance);
end;
end;


function TDMFilter.outputFormatPeek(): TDMInstances;
begin
result := m_OutputFormat;
end;


function TDMFilter.getOutputFormat(): TDMInstances;
begin
if (m_OutputFormat = nil) then
raise ENullPointerException.Create('Не определен формат выходной выборки');

result := m_OutputFormat;

end;

procedure TDMFilter.push(instance : TDMInstance );
begin
if (instance <> nil) then
begin
instance.setDataset(m_OutputFormat);
m_OutputQueue.push(instance);
end;
end;

procedure TDMFilter.flushInput();
begin
FreeAndNil(m_InputFormat);
end;

function TDMFilter.numPendingOutput() : integer;
begin
if (m_OutputFormat = nil) then
raise ENullPointerException.Create('Не определен формат выходной выборки');

result := m_OutputQueue.Count;
end;

function TDMFilter.output() : TDMInstance ;
begin
if (m_OutputFormat = nil) then
raise ENullPointerException.Create('Не определен выходной формат вектора');

if (m_OutputQueue.Count = 0) then
begin
result := nil;
exit;
end;
result := m_OutputQueue.pop();
end;

procedure TDMFilter.ClearQueue();
var
inst: TDMInstance;
begin
while (m_OutputQueue.Count <> 0) do
begin
inst := m_OutputQueue.Pop();
FreeAndNil(inst);
end;
end;

destructor TDMFilter.Destroy;
begin

ClearQueue();
FreeAndNil(m_OutputQueue);
FreeAndNil(m_InputFormat);
end;
end.
Соседние файлы в папке FilterModule