Skip to content

TFilterEnumerator

Ivan Semenkov edited this page Feb 13, 2021 · 2 revisions

Table of contents

About

Class provides filtering enumerator by TUnaryFunctor.

uses
  utils.enumerate;
  
type
  TFilterEnumerator<V; Iterator; Functor> = class

Iterator is a forward iterator implemented object.

Functor is a unary functor for filtering elements.

TOptionalValue

If macro {$USE_OPTIONAL} is defined, then all methods return a TOptionalValue wrapper, otherwise V.

uses
  utils.optional;

type
  TOptionalValue = {$IFDEF FPC}specialize{$ENDIF} TOptional<V>;

Create

A new enumerator can be created by call its constructor.

constructor Create (AIterator : Iterator; AFilter : Functor);

AIterator is a forward iterator implemented object.

AFilter is unary functor for filtering elements.

Example
uses
  container.list, utils.functor, utils.enumerate;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TGreaterZeroFunctor = class({$IFDEF FPC}specialize{$ENDIF} TUnaryFunctor<Integer, Boolean>)
  public
    function Call(AValue : Integer) : Boolean; override;
    begin
      Result := AValue > 0;
    end;
  end;
  
  TGreaterZeroFilterEnumerator = {$IFDEF FPC}specialize{$ENDIF} TFilterEnumerator<Integer,
    TIntegerList.TIterator, TGreaterZeroFunctor>;
  
var
  list : TIntegerList;
  enumerator : TGreaterZeroFilterEnumerator;
  filterFunctor : TGreaterZeroFunctor;
  
begin
  list := TIntegerList.Create;
  filterFunctor := TGreateZeroFunctor.Create;
  enumerator := TGreaterZeroFilterEnumerator.Create(list.FirstEntry, filterFunctor);
  
  FreeAndNil(enumerator);
  FreeAndNil(filterFunctor);
  FreeAndNil(list);
end;

Iterate

It is possible to iterate for TFilterEnumerator values using in operator. Each value would present as TFIlterEnumerator.TIterator object.

uses
  utils.enumerate;
  
type
  generic TFilterEnumerator<V; Iterator; Functor> = class
  type
    TIterator = class
  end;
Example
uses
  container.list, utils.functor, utils.enumerate;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TGreaterZeroFunctor = class({$IFDEF FPC}specialize{$ENDIF} TUnaryFunctor<Integer, Boolean>)
  public
    function Call(AValue : Integer) : Boolean; override;
    begin
      Result := AValue > 0;
    end;
  end;
  
  TGreaterZeroFilterEnumerator = {$IFDEF FPC}specialize{$ENDIF} TFilterEnumerator<Integer,
    TIntegerList.TIterator, TGreaterZeroFunctor>;
  
var
  list : TIntegerList;
  enumerator : TGreaterZeroFilterEnumerator;
  filterFunctor : TGreaterZeroFunctor;
  iterator : TGreaterZeroFilterEnumerator.TIterator;
  
begin
  list := TIntegerList.Create;
  filterFunctor := TGreateZeroFunctor.Create;
  enumerator := TGreaterZeroFilterEnumerator.Create(list.FirstEntry, filterFunctor);
  for iterator in enumerator do
    ;
  
  FreeAndNil(enumerator);
  FreeAndNil(filterFunctor);
  FreeAndNil(list);
end;

FirstEntry

Retrive the first entry.

function FirstEntry : TIterator;
Example
uses
  container.list, utils.functor, utils.enumerate;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TGreaterZeroFunctor = class({$IFDEF FPC}specialize{$ENDIF} TUnaryFunctor<Integer, Boolean>)
  public
    function Call(AValue : Integer) : Boolean; override;
    begin
      Result := AValue > 0;
    end;
  end;
  
  TGreaterZeroFilterEnumerator = {$IFDEF FPC}specialize{$ENDIF} TFilterEnumerator<Integer,
    TIntegerList.TIterator, TGreaterZeroFunctor>;
  
var
  list : TIntegerList;
  enumerator : TGreaterZeroFilterEnumerator;
  filterFunctor : TGreaterZeroFunctor;
  iterator : TGreaterZeroFilterEnumerator.TIterator;
  
begin
  list := TIntegerList.Create;
  filterFunctor := TGreateZeroFunctor.Create;
  enumerator := TGreaterZeroFilterEnumerator.Create(list.FirstEntry, filterFunctor);
  
  iterator := enumerator.FirstEntry;
  while iterator.HasValue do
  begin
  
  	iterator := iterator.Next;
  end;
  
  
  FreeAndNil(enumerator);
  FreeAndNil(filterFunctor);
  FreeAndNil(list);
end;

TIterator

HasValue

Return true if iterator has correct value.

function HasValue : Boolean;
Example
uses
  container.list, utils.functor, utils.enumerate;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TGreaterZeroFunctor = class({$IFDEF FPC}specialize{$ENDIF} TUnaryFunctor<Integer, Boolean>)
  public
    function Call(AValue : Integer) : Boolean; override;
    begin
      Result := AValue > 0;
    end;
  end;
  
  TGreaterZeroFilterEnumerator = {$IFDEF FPC}specialize{$ENDIF} TFilterEnumerator<Integer,
    TIntegerList.TIterator, TGreaterZeroFunctor>;
  
var
  list : TIntegerList;
  enumerator : TGreaterZeroFilterEnumerator;
  filterFunctor : TGreaterZeroFunctor;
  iterator : TGreaterZeroFilterEnumerator.TIterator;
  
begin
  list := TIntegerList.Create;
  filterFunctor := TGreateZeroFunctor.Create;
  enumerator := TGreaterZeroFilterEnumerator.Create(list.FirstEntry, filterFunctor);
  for iterator in enumerator do
  begin
    if iterator.HasValue then
      ;
    
  end;
  
  FreeAndNil(enumerator);
  FreeAndNil(filterFunctor);
  FreeAndNil(list);
end;
Next

Retrieve the iterator for next entry.

function Next : TIterator;
Example
uses
  container.list, utils.functor, utils.enumerate;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TGreaterZeroFunctor = class({$IFDEF FPC}specialize{$ENDIF} TUnaryFunctor<Integer, Boolean>)
  public
    function Call(AValue : Integer) : Boolean; override;
    begin
      Result := AValue > 0;
    end;
  end;
  
  TGreaterZeroFilterEnumerator = {$IFDEF FPC}specialize{$ENDIF} TFilterEnumerator<Integer,
    TIntegerList.TIterator, TGreaterZeroFunctor>;
  
var
  list : TIntegerList;
  enumerator : TGreaterZeroFilterEnumerator;
  filterFunctor : TGreaterZeroFunctor;
  iterator : TGreaterZeroFilterEnumerator.TIterator;
  
begin
  list := TIntegerList.Create;
  filterFunctor := TGreateZeroFunctor.Create;
  enumerator := TGreaterZeroFilterEnumerator.Create(list.FirstEntry, filterFunctor);
  for iterator in enumerator do
  begin
    
    if iterator.Next.HasValue then
      ;
  end;
  
  FreeAndNil(enumerator);
  FreeAndNil(filterFunctor);
  FreeAndNil(list);
end;
Value

To get value use Value property.

property Value : {$IFNDEF USE_OPTIONAL}V{$ELSE}TOptionalValue{$ENDIF};
Example
uses
  container.list, utils.functor, utils.enumerate;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TGreaterZeroFunctor = class({$IFDEF FPC}specialize{$ENDIF} TUnaryFunctor<Integer, Boolean>)
  public
    function Call(AValue : Integer) : Boolean; override;
    begin
      Result := AValue > 0;
    end;
  end;
  
  TGreaterZeroFilterEnumerator = {$IFDEF FPC}specialize{$ENDIF} TFilterEnumerator<Integer,
    TIntegerList.TIterator, TGreaterZeroFunctor>;
  
var
  list : TIntegerList;
  enumerator : TGreaterZeroFilterEnumerator;
  filterFunctor : TGreaterZeroFunctor;
  iterator : TGreaterZeroFilterEnumerator.TIterator;
  
begin
  list := TIntegerList.Create;
  filterFunctor := TGreateZeroFunctor.Create;
  enumerator := TGreaterZeroFilterEnumerator.Create(list.FirstEntry, filterFunctor);
  for iterator in enumerator do
  begin
    writeln(iterator.Value);
    
  end;
  
  FreeAndNil(enumerator);
  FreeAndNil(filterFunctor);
  FreeAndNil(list);
end;
Clone this wiki locally