{ *************************************************************************** Copyright (c) 2016-2019 Kike Pérez Unit : Quick.Arrays.Helper Description : Array helpers Author : Kike Pérez Version : 1.0 Created : 24/03/2019 Modified : 29/03/2019 This file is part of QuickLib: https://github.com/exilon/QuickLib *************************************************************************** Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *************************************************************************** } unit Quick.Arrays.Helper; {$i QuickLib.inc} interface uses Generics.Defaults; type TArrayHelper = class public class function Count(var aArray : TArray) : Integer; class procedure Add(var aArray : TArray; aItem : T); static; class procedure Insert(var aArray : TArray; aItem : T; aIndex : Integer); static; class procedure Remove(var aArray : TArray; aIndex : Integer); static; class function Contains(var aArray : TArray; aItem : T) : Boolean; class function IndexOf(var aArray : TArray; aItem : T) : Integer; end; {$IFDEF FPC} TStringArray = TArray; {$ENDIF} TStringArrayHelper = record Helper for {$IFNDEF FPC}TArray{$ELSE}TStringArray{$ENDIF} function Count : Integer; procedure Add(const aValue : string); procedure Insert(const aValue : string; aIndex : Integer); procedure Remove(aIndex : Integer); function Contains(const aItem : string) : Boolean; function IndexOf(const aItem : string) : Integer; end; {$IFDEF FPC} TIntegerArray = TArray; {$ENDIF} TIntegerArrayHelper = record Helper for {$IFNDEF FPC}TArray{$ELSE}TIntegerArray{$ENDIF} function Count : Integer; procedure Add(aValue : Integer); procedure Insert(const aValue : Integer; aIndex : Integer); procedure Remove(aIndex : Integer); function Contains(aItem : Integer) : Boolean; function IndexOf(aItem : Integer) : Integer; end; implementation { TArray } class function TArrayHelper.Count(var aArray : TArray) : Integer; begin Result := High(aArray)+1; end; class procedure TArrayHelper.Add(var aArray : TArray; aItem : T); begin SetLength(aArray, Length(aArray) + 1); aArray[High(aArray)] := aItem; end; class procedure TArrayHelper.Remove(var aArray : TArray; aIndex : Integer); begin {$IFDEF DELPHIXE7_UP} System.Delete(aArray,aIndex,1); {$ELSE} TArrayUtil.Delete(aArray,aIndex); {$ENDIF} end; class procedure TArrayHelper.Insert(var aArray : TArray; aItem : T; aIndex : Integer); begin System.Insert(aItem,aArray,aIndex); end; class function TArrayHelper.Contains(var aArray : TArray; aItem : T) : Boolean; var icomparer : IEqualityComparer; i : Integer; begin Result := False; icomparer := TEqualityComparer.Default; for i := Low(aArray) to High(aArray) do begin if icomparer.Equals(aArray[i],aItem) then Exit(True); end; end; class function TArrayHelper.IndexOf(var aArray : TArray; aItem : T) : Integer; var icomparer : IEqualityComparer; i : Integer; begin icomparer := TEqualityComparer.Default; for i := Low(aArray) to High(aArray) do begin if icomparer.Equals(aArray[i],aItem) then Exit(i); end; Result := -1; end; { TStringArrayHelper } function TStringArrayHelper.Count : Integer; begin Result := TArrayHelper.Count(Self); end; procedure TStringArrayHelper.Add(const aValue : string); begin TArrayHelper.Add(Self,aValue); end; procedure TStringArrayHelper.Insert(const aValue : string; aIndex : Integer); begin TArrayHelper.Insert(Self,aValue,aIndex); end; procedure TStringArrayHelper.Remove(aIndex : Integer); begin TArrayHelper.Remove(Self,aIndex); end; function TStringArrayHelper.Contains(const aItem : string) : Boolean; begin Result := TArrayHelper.Contains(Self,aItem); end; function TStringArrayHelper.IndexOf(const aItem : string) : Integer; begin Result := TArrayHelper.IndexOf(Self,aItem); end; { TIntegerArrayHelper } function TIntegerArrayHelper.Count : Integer; begin Result := TArrayHelper.Count(Self); end; procedure TIntegerArrayHelper.Add(aValue : Integer); begin TArrayHelper.Add(Self,aValue); end; procedure TIntegerArrayHelper.Insert(const aValue : Integer; aIndex : Integer); begin TArrayHelper.Insert(Self,aValue,aIndex); end; procedure TIntegerArrayHelper.Remove(aIndex : Integer); begin TArrayHelper.Remove(Self,aIndex); end; function TIntegerArrayHelper.Contains(aItem : Integer) : Boolean; begin Result := TArrayHelper.Contains(Self,aItem); end; function TIntegerArrayHelper.IndexOf(aItem : Integer) : Integer; begin Result := TArrayHelper.IndexOf(Self,aItem); end; end.