Скачиваний:
31
Добавлен:
01.05.2014
Размер:
4 Кб
Скачать
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