-
Notifications
You must be signed in to change notification settings - Fork 7
TFilterEnumerator
Ivan Semenkov edited this page Feb 13, 2021
·
2 revisions
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.
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>;
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.
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;
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;
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;
Retrive the first entry.
function FirstEntry : TIterator;
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;
Return true if iterator has correct value.
function HasValue : Boolean;
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;
Retrieve the iterator for next entry.
function Next : TIterator;
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;
To get value use Value property.
property Value : {$IFNDEF USE_OPTIONAL}V{$ELSE}TOptionalValue{$ENDIF};
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;