Skip to content

TAccumulate

Ivan Semenkov edited this page Feb 1, 2021 · 3 revisions

Table of contents

About

Accumulate iterable object data using functor.

uses
  utils.functional;
  
type
  generic TAccumulate<V; Iterator; Functor> = class

Iterator is a forward iterator implemented object.

Create

A new accumulate object can be created by call its constructor.

constructor Create (AIterator : Iterator; AInitial : V);

AIterator is a forward iterator implemented object.

AInitial is initial accumulate value.

Example
uses
  container.list, utils.functor, utils.functional;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TSumFunctor = class({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Integer, Integer>)
  public
    function Call(AValue1, AValue2 : Integer) : Integer; override;
    begin
      Result := AValue1 + AValue2;
    end;
  end;
  
  TIntegerSumAccumulate = {$IFDEF FPC}specialize{$ENDIF} TAccumulate<Integer, 
    TIntegerList.TIterator, TSumFunctor>;

var
  list : TIntegerList;
  accumalate : TIntegerSumAccumulate;
  
begin
  list := TIntegerList.Create;
  accumulate := TIntegerSumAccumulate.Create(list.FirstEntry, 0);
    
  FreeAndNil(accumulate);
  FreeAndNil(list);
end;

Value

To get value use Value property.

property Value : V;
Example
uses
  container.list, utils.functor, utils.functional;
  
type
  TIntegerList = {$IFDEF FPC}specialize{$ENDIF} TList<Integer, TCompareFunctorInteger>;
  
  TSumFunctor = class({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Integer, Integer>)
  public
    function Call(AValue1, AValue2 : Integer) : Integer; override;
    begin
      Result := AValue1 + AValue2;
    end;
  end;
  
  TIntegerSumAccumulate = {$IFDEF FPC}specialize{$ENDIF} TAccumulate<Integer, 
    TIntegerList.TIterator, TSumFunctor>;

var
  list : TIntegerList;
  accumalate : TIntegerSumAccumulate;
  
begin
  list := TIntegerList.Create;
  accumulate := TIntegerSumAccumulate.Create(list.FirstEntry, 0);
  writeln(accumulate.Value);  
    
  FreeAndNil(accumulate);
  FreeAndNil(list);
end;

Default addition functors

There are defined some default addition functors.

TAdditionByteFunctor

uses
  utils.functional;
  
type
  TAdditionByteFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Byte, Byte>)

TAdditionShortIntFunctor

uses
  utils.functional;
  
type
  TAdditionByteFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<ShortInt, ShortInt>)

TAdditionWordFunctor

uses
  utils.functional;
  
type
  TAdditionWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Word, Word>)

TAdditionSmallIntFunctor

uses
  utils.functional;
  
type
  TAdditionSmallIntFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<SmallInt, SmallInt>)

TAdditionIntegerFunctor

uses
  utils.functional;
  
type
  TAdditionIntegerFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Integer, Integer>)

TAdditionDWordFunctor

This functor available for FreePascal compiler only!

uses
  utils.functional;
  
type
  TAdditionDWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<DWord, DWord>)

TAdditionCardinalFunctor

uses
  utils.functional;
  
type
  TAdditionCardinalFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Cardinal, Cardinal>)

TAdditionLongWordFunctor

uses
  utils.functional;
  
type
  TAdditionLongWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<LongWord, LongWord>)

TAdditionLongIntFunctor

uses
  utils.functional;
  
type
  TAdditionLongIntFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<LongInt, LongInt>)

TAdditionQWordFunctor

This functor available for FreePascal compiler only!

uses
  utils.functional;
  
type
  TAdditionQWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<QWord, QWord>)

TAdditionInt64Functor

uses
  utils.functional;
  
type
  TAdditionInt64Functor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Int64, Int64>)

TAdditionSingleFunctor

uses
  utils.functional;
  
type
  TAdditionSingleFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Single, Single>)

TAdditionRealFunctor

uses
  utils.functional;
  
type
  TAdditionRealFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Real, Real>)

TAdditionDoubleFunctor

uses
  utils.functional;
  
type
  TAdditionDoubleFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Double, Double>)

TAdditionExtendedFunctor

uses
  utils.functional;
  
type
  TAdditionExtendedFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Extended, Extended>)

TAdditionCurrencyFunctor

uses
  utils.functional;
  
type
  TAdditionCurrencyFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Currency, Currency>)

TAdditionStringFunctor

uses
  utils.functional;
  
type
  TAdditionStringFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<String, String>)

TAdditionWideStringFunctor

uses
  utils.functional;
  
type
  TAdditionWideStringFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<WideString, WideString>)

Default multiplication functors

There are defined some default multiplication functors.

TMultiplicationByteFunctor

uses
  utils.functional;
  
type
  TMultiplicationByteFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Byte, Byte>)

TMultiplicationShortIntFunctor

uses
  utils.functional;
  
type
  TMultiplicationShortIntFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<ShortInt, ShortInt>)

TMultiplicationWordFunctor

uses
  utils.functional;
  
type
  TMultiplicationWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Word, Word>)

TMultiplicationSmallIntFunctor

uses
  utils.functional;
  
type
  TMultiplicationSmallIntFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<SmallInt, SmallInt>)

TMultiplicationIntegerFunctor

uses
  utils.functional;
  
type
  TMultiplicationIntegerFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Integer, Integer>)

TMultiplicationDWordFunctor

This functor available for FreePascal compiler only!

uses
  utils.functional;
  
type
  TMultiplicationDWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<DWord, DWord>)

TMultiplicationCardinalFunctor

uses
  utils.functional;
  
type
  TMultiplicationCardinalFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Cardinal, Cardinal>)

TMultiplicationLongWordFunctor

uses
  utils.functional;
  
type
  TMultiplicationLongWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<LongWord, LongWord>)

TMultiplicationLongIntFunctor

uses
  utils.functional;
  
type
  TMultiplicationLongIntFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<LongInt, LongInt>)

TMultiplicationQWordFunctor

This functor available for FreePascal compiler only!

uses
  utils.functional;
  
type
  TMultiplicationQWordFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<QWord, QWord>)

TMultiplicationInt64Functor

uses
  utils.functional;
  
type
  TMultiplicationInt64Functor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Int64, Int64>)

TMultiplicationSingleFunctor

uses
  utils.functional;
  
type
  TMultiplicationSingleFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Single, Single>)

TMultiplicationRealFunctor

uses
  utils.functional;
  
type
  TMultiplicationRealFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Real, Real>)

TMultiplicationDoubleFunctor

uses
  utils.functional;
  
type
  TMultiplicationDoubleFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Double, Double>)

TMultiplicationExtendedFunctor

uses
  utils.functional;
  
type
  TMultiplicationExtendedFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Extended, Extended>)

TMultiplicationCurrencyFunctor

uses
  utils.functional;
  
type
  TMultiplicationCurrencyFunctor = class
    ({$IFDEF FPC}specialize{$ENDIF} TBinaryFunctor<Currency, Currency>)