Thrift-1366: Delphi generator, lirbrary and unit test.
Client: delphi
Patch: Kenjiro Fukumitsu

Adding delphi XE generator, lib and unit tests.



git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1185688 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/delphi/src/Thrift.Collections.pas b/lib/delphi/src/Thrift.Collections.pas
new file mode 100644
index 0000000..abc401f
--- /dev/null
+++ b/lib/delphi/src/Thrift.Collections.pas
@@ -0,0 +1,618 @@
+(*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements. See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership. The ASF licenses this file

+ * to you 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 Thrift.Collections;

+

+interface

+

+uses

+  Generics.Collections, Generics.Defaults, Thrift.Utils;

+

+type

+

+{$IF CompilerVersion < 21.0}

+  TArray<T> = array of T;

+{$IFEND}

+

+  IThriftContainer = interface

+    ['{93DEF5A0-D162-461A-AB22-5B4EE0734050}']

+    function ToString: string;

+  end;

+

+  IThriftDictionary<TKey,TValue> = interface(IThriftContainer)

+    ['{25EDD506-F9D1-4008-A40F-5940364B7E46}']

+    function GetEnumerator: TEnumerator<TPair<TKey,TValue>>;

+

+    function GetKeys: TDictionary<TKey,TValue>.TKeyCollection;

+    function GetValues: TDictionary<TKey,TValue>.TValueCollection;

+    function GetItem(const Key: TKey): TValue;

+    procedure SetItem(const Key: TKey; const Value: TValue);

+    function GetCount: Integer;

+

+    procedure Add(const Key: TKey; const Value: TValue);

+    procedure Remove(const Key: TKey);

+{$IF CompilerVersion >= 21.0}

+    function ExtractPair(const Key: TKey): TPair<TKey,TValue>;

+{$IFEND}

+    procedure Clear;

+    procedure TrimExcess;

+    function TryGetValue(const Key: TKey; out Value: TValue): Boolean;

+    procedure AddOrSetValue(const Key: TKey; const Value: TValue);

+    function ContainsKey(const Key: TKey): Boolean;

+    function ContainsValue(const Value: TValue): Boolean;

+    function ToArray: TArray<TPair<TKey,TValue>>;

+

+    property Items[const Key: TKey]: TValue read GetItem write SetItem; default;

+    property Count: Integer read GetCount;

+    property Keys: TDictionary<TKey,TValue>.TKeyCollection read GetKeys;

+    property Values: TDictionary<TKey,TValue>.TValueCollection read GetValues;

+  end;

+

+  TThriftDictionaryImpl<TKey,TValue> = class( TInterfacedObject, IThriftDictionary<TKey,TValue>)

+  private

+    FDictionaly : TDictionary<TKey,TValue>;

+  protected

+    function GetEnumerator: TEnumerator<TPair<TKey,TValue>>;

+

+    function GetKeys: TDictionary<TKey,TValue>.TKeyCollection;

+    function GetValues: TDictionary<TKey,TValue>.TValueCollection;

+    function GetItem(const Key: TKey): TValue;

+    procedure SetItem(const Key: TKey; const Value: TValue);

+    function GetCount: Integer;

+

+    procedure Add(const Key: TKey; const Value: TValue);

+    procedure Remove(const Key: TKey);

+{$IF CompilerVersion >= 21.0}

+    function ExtractPair(const Key: TKey): TPair<TKey,TValue>;

+{$IFEND}

+    procedure Clear;

+    procedure TrimExcess;

+    function TryGetValue(const Key: TKey; out Value: TValue): Boolean;

+    procedure AddOrSetValue(const Key: TKey; const Value: TValue);

+    function ContainsKey(const Key: TKey): Boolean;

+    function ContainsValue(const Value: TValue): Boolean;

+    function ToArray: TArray<TPair<TKey,TValue>>;

+    property Items[const Key: TKey]: TValue read GetItem write SetItem; default;

+    property Count: Integer read GetCount;

+    property Keys: TDictionary<TKey,TValue>.TKeyCollection read GetKeys;

+    property Values: TDictionary<TKey,TValue>.TValueCollection read GetValues;

+  public

+    constructor Create(ACapacity: Integer = 0);

+    destructor Destroy; override;

+  end;

+

+  IThriftList<T> = interface(IThriftContainer)

+    ['{29BEEE31-9CB4-401B-AA04-5148A75F473B}']

+    function GetEnumerator: TEnumerator<T>;

+    function GetCapacity: Integer;

+    procedure SetCapacity(Value: Integer);

+    function GetCount: Integer;

+    procedure SetCount(Value: Integer);

+    function GetItem(Index: Integer): T;

+    procedure SetItem(Index: Integer; const Value: T);

+    function Add(const Value: T): Integer;

+    procedure AddRange(const Values: array of T); overload;

+    procedure AddRange(const Collection: IEnumerable<T>); overload;

+    procedure AddRange(Collection: TEnumerable<T>); overload;

+    procedure Insert(Index: Integer; const Value: T);

+    procedure InsertRange(Index: Integer; const Values: array of T); overload;

+    procedure InsertRange(Index: Integer; const Collection: IEnumerable<T>); overload;

+    procedure InsertRange(Index: Integer; const Collection: TEnumerable<T>); overload;

+    function Remove(const Value: T): Integer;

+    procedure Delete(Index: Integer);

+    procedure DeleteRange(AIndex, ACount: Integer);

+    function Extract(const Value: T): T;

+{$IF CompilerVersion >= 21.0}

+    procedure Exchange(Index1, Index2: Integer);

+    procedure Move(CurIndex, NewIndex: Integer);

+    function First: T;

+    function Last: T;

+{$IFEND}

+    procedure Clear;

+    function Contains(const Value: T): Boolean;

+    function IndexOf(const Value: T): Integer;

+    function LastIndexOf(const Value: T): Integer;

+    procedure Reverse;

+    procedure Sort; overload;

+    procedure Sort(const AComparer: IComparer<T>); overload;

+    function BinarySearch(const Item: T; out Index: Integer): Boolean; overload;

+    function BinarySearch(const Item: T; out Index: Integer; const AComparer: IComparer<T>): Boolean; overload;

+    procedure TrimExcess;

+    function ToArray: TArray<T>;

+    property Capacity: Integer read GetCapacity write SetCapacity;

+    property Count: Integer read GetCount write SetCount;

+    property Items[Index: Integer]: T read GetItem write SetItem; default;

+  end;

+

+  TThriftListImpl<T> = class( TInterfacedObject, IThriftList<T>)

+  private

+    FList : TList<T>;

+  protected

+    function GetEnumerator: TEnumerator<T>;

+    function GetCapacity: Integer;

+    procedure SetCapacity(Value: Integer);

+    function GetCount: Integer;

+    procedure SetCount(Value: Integer);

+    function GetItem(Index: Integer): T;

+    procedure SetItem(Index: Integer; const Value: T);

+    function Add(const Value: T): Integer;

+    procedure AddRange(const Values: array of T); overload;

+    procedure AddRange(const Collection: IEnumerable<T>); overload;

+    procedure AddRange(Collection: TEnumerable<T>); overload;

+    procedure Insert(Index: Integer; const Value: T);

+    procedure InsertRange(Index: Integer; const Values: array of T); overload;

+    procedure InsertRange(Index: Integer; const Collection: IEnumerable<T>); overload;

+    procedure InsertRange(Index: Integer; const Collection: TEnumerable<T>); overload;

+    function Remove(const Value: T): Integer;

+    procedure Delete(Index: Integer);

+    procedure DeleteRange(AIndex, ACount: Integer);

+    function Extract(const Value: T): T;

+{$IF CompilerVersion >= 21.0}

+    procedure Exchange(Index1, Index2: Integer);

+    procedure Move(CurIndex, NewIndex: Integer);

+    function First: T;

+    function Last: T;

+{$IFEND}

+    procedure Clear;

+    function Contains(const Value: T): Boolean;

+    function IndexOf(const Value: T): Integer;

+    function LastIndexOf(const Value: T): Integer;

+    procedure Reverse;

+    procedure Sort; overload;

+    procedure Sort(const AComparer: IComparer<T>); overload;

+    function BinarySearch(const Item: T; out Index: Integer): Boolean; overload;

+    function BinarySearch(const Item: T; out Index: Integer; const AComparer: IComparer<T>): Boolean; overload;

+    procedure TrimExcess;

+    function ToArray: TArray<T>;

+    property Capacity: Integer read GetCapacity write SetCapacity;

+    property Count: Integer read GetCount write SetCount;

+    property Items[Index: Integer]: T read GetItem write SetItem; default;

+  public

+    constructor Create;

+    destructor Destroy; override;

+  end;

+

+  IHashSet<TValue> = interface(IThriftContainer)

+    ['{0923A3B5-D4D4-48A8-91AD-40238E2EAD66}']

+    function GetEnumerator: TEnumerator<TValue>;

+    function GetIsReadOnly: Boolean;

+    function GetCount: Integer;

+    property Count: Integer read GetCount;

+    property IsReadOnly: Boolean read GetIsReadOnly;

+    procedure Add( item: TValue);

+    procedure Clear;

+    function Contains( item: TValue): Boolean;

+    procedure CopyTo(var A: TArray<TValue>; arrayIndex: Integer);

+    function Remove( item: TValue ): Boolean;

+  end;

+

+  THashSetImpl<TValue> = class( TInterfacedObject, IHashSet<TValue>)

+  private

+    FDictionary : IThriftDictionary<TValue,Integer>;

+    FIsReadOnly: Boolean;

+  protected

+    function GetEnumerator: TEnumerator<TValue>;

+    function GetIsReadOnly: Boolean;

+    function GetCount: Integer;

+    property Count: Integer read GetCount;

+    property IsReadOnly: Boolean read FIsReadOnly;

+    procedure Add( item: TValue);

+    procedure Clear;

+    function Contains( item: TValue): Boolean;

+    procedure CopyTo(var A: TArray<TValue>; arrayIndex: Integer);

+    function Remove( item: TValue ): Boolean;

+  public

+    constructor Create;

+  end;

+

+implementation

+

+{ THashSetImpl<TValue> }

+

+procedure THashSetImpl<TValue>.Add(item: TValue);

+begin

+  if not FDictionary.ContainsKey(item) then

+  begin

+    FDictionary.Add( item, 0);

+  end;

+end;

+

+procedure THashSetImpl<TValue>.Clear;

+begin

+  FDictionary.Clear;

+end;

+

+function THashSetImpl<TValue>.Contains(item: TValue): Boolean;

+begin

+  Result := FDictionary.ContainsKey(item);

+end;

+

+procedure THashSetImpl<TValue>.CopyTo(var A: TArray<TValue>; arrayIndex: Integer);

+var

+  i : Integer;

+  Enumlator : TEnumerator<TValue>;

+begin

+  Enumlator := GetEnumerator;

+  while Enumlator.MoveNext do

+  begin

+    A[arrayIndex] := Enumlator.Current;

+    Inc(arrayIndex);

+  end;

+end;

+

+constructor THashSetImpl<TValue>.Create;

+begin

+  inherited;

+  FDictionary := TThriftDictionaryImpl<TValue,Integer>.Create;

+end;

+

+function THashSetImpl<TValue>.GetCount: Integer;

+begin

+  Result := FDictionary.Count;

+end;

+

+function THashSetImpl<TValue>.GetEnumerator: TEnumerator<TValue>;

+begin

+  Result := FDictionary.Keys.GetEnumerator;

+end;

+

+function THashSetImpl<TValue>.GetIsReadOnly: Boolean;

+begin

+  Result := FIsReadOnly;

+end;

+

+function THashSetImpl<TValue>.Remove(item: TValue): Boolean;

+begin

+  Result := False;

+  if FDictionary.ContainsKey( item ) then

+  begin

+    FDictionary.Remove( item );

+    Result := not FDictionary.ContainsKey( item );

+  end;

+end;

+

+{ TThriftDictionaryImpl<TKey, TValue> }

+

+procedure TThriftDictionaryImpl<TKey, TValue>.Add(const Key: TKey;

+  const Value: TValue);

+begin

+  FDictionaly.Add( Key, Value);

+end;

+

+procedure TThriftDictionaryImpl<TKey, TValue>.AddOrSetValue(const Key: TKey;

+  const Value: TValue);

+begin

+  FDictionaly.AddOrSetValue( Key, Value);

+end;

+

+procedure TThriftDictionaryImpl<TKey, TValue>.Clear;

+begin

+  FDictionaly.Clear;

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.ContainsKey(

+  const Key: TKey): Boolean;

+begin

+  Result := FDictionaly.ContainsKey( Key );

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.ContainsValue(

+  const Value: TValue): Boolean;

+begin

+  Result := FDictionaly.ContainsValue( Value );

+end;

+

+constructor TThriftDictionaryImpl<TKey, TValue>.Create(ACapacity: Integer);

+begin

+  FDictionaly := TDictionary<TKey,TValue>.Create( ACapacity );

+end;

+

+destructor TThriftDictionaryImpl<TKey, TValue>.Destroy;

+begin

+  FDictionaly.Free;

+  inherited;

+end;

+

+{$IF CompilerVersion >= 21.0}

+function TThriftDictionaryImpl<TKey, TValue>.ExtractPair(

+  const Key: TKey): TPair<TKey, TValue>;

+begin

+  Result := FDictionaly.ExtractPair( Key);

+end;

+{$IFEND}

+

+function TThriftDictionaryImpl<TKey, TValue>.GetCount: Integer;

+begin

+  Result := FDictionaly.Count;

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.GetEnumerator: TEnumerator<TPair<TKey, TValue>>;

+begin

+  Result := FDictionaly.GetEnumerator;

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.GetItem(const Key: TKey): TValue;

+begin

+  Result := FDictionaly.Items[Key];

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.GetKeys: TDictionary<TKey, TValue>.TKeyCollection;

+begin

+  Result := FDictionaly.Keys;

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.GetValues: TDictionary<TKey, TValue>.TValueCollection;

+begin

+  Result := FDictionaly.Values;

+end;

+

+procedure TThriftDictionaryImpl<TKey, TValue>.Remove(const Key: TKey);

+begin

+  FDictionaly.Remove( Key );

+end;

+

+procedure TThriftDictionaryImpl<TKey, TValue>.SetItem(const Key: TKey;

+  const Value: TValue);

+begin

+  FDictionaly.AddOrSetValue( Key, Value);

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.ToArray: TArray<TPair<TKey, TValue>>;

+{$IF CompilerVersion < 22.0}

+var

+  x : TPair<TKey, TValue>;

+  i : Integer;

+{$IFEND}

+begin

+{$IF CompilerVersion < 22.0}

+  SetLength(Result, Count);

+  i := 0;

+  for x in FDictionaly do

+  begin

+    Result[i] := x;

+    Inc( i );

+  end;

+{$ELSE}

+  Result := FDictionaly.ToArray;

+{$IFEND}

+end;

+

+procedure TThriftDictionaryImpl<TKey, TValue>.TrimExcess;

+begin

+  FDictionaly.TrimExcess;

+end;

+

+function TThriftDictionaryImpl<TKey, TValue>.TryGetValue(const Key: TKey;

+  out Value: TValue): Boolean;

+begin

+  Result := FDictionaly.TryGetValue( Key, Value);

+end;

+

+{ TThriftListImpl<T> }

+

+function TThriftListImpl<T>.Add(const Value: T): Integer;

+begin

+  Result := FList.Add( Value );

+end;

+

+procedure TThriftListImpl<T>.AddRange(Collection: TEnumerable<T>);

+begin

+  FList.AddRange( Collection );

+end;

+

+procedure TThriftListImpl<T>.AddRange(const Collection: IEnumerable<T>);

+begin

+  FList.AddRange( Collection );

+end;

+

+procedure TThriftListImpl<T>.AddRange(const Values: array of T);

+begin

+  FList.AddRange( Values );

+end;

+

+function TThriftListImpl<T>.BinarySearch(const Item: T;

+  out Index: Integer): Boolean;

+begin

+  Result := FList.BinarySearch( Item, Index);

+end;

+

+function TThriftListImpl<T>.BinarySearch(const Item: T; out Index: Integer;

+  const AComparer: IComparer<T>): Boolean;

+begin

+  Result := FList.BinarySearch( Item, Index, AComparer);

+end;

+

+procedure TThriftListImpl<T>.Clear;

+begin

+  FList.Clear;

+end;

+

+function TThriftListImpl<T>.Contains(const Value: T): Boolean;

+begin

+  Result := FList.Contains( Value );

+end;

+

+constructor TThriftListImpl<T>.Create;

+begin

+  FList := TList<T>.Create;

+end;

+

+procedure TThriftListImpl<T>.Delete(Index: Integer);

+begin

+  FList.Delete( Index )

+end;

+

+procedure TThriftListImpl<T>.DeleteRange(AIndex, ACount: Integer);

+begin

+  FList.DeleteRange( AIndex, ACount)

+end;

+

+destructor TThriftListImpl<T>.Destroy;

+begin

+  FList.Free;

+  inherited;

+end;

+

+{$IF CompilerVersion >= 21.0}

+procedure TThriftListImpl<T>.Exchange(Index1, Index2: Integer);

+begin

+  FList.Exchange( Index1, Index2 )

+end;

+{$IFEND}

+

+function TThriftListImpl<T>.Extract(const Value: T): T;

+begin

+  Result := FList.Extract( Value )

+end;

+

+{$IF CompilerVersion >= 21.0}

+function TThriftListImpl<T>.First: T;

+begin

+  Result := FList.First;

+end;

+{$IFEND}

+

+function TThriftListImpl<T>.GetCapacity: Integer;

+begin

+  Result := FList.Capacity;

+end;

+

+function TThriftListImpl<T>.GetCount: Integer;

+begin

+  Result := FList.Count;

+end;

+

+function TThriftListImpl<T>.GetEnumerator: TEnumerator<T>;

+begin

+  Result := FList.GetEnumerator;

+end;

+

+function TThriftListImpl<T>.GetItem(Index: Integer): T;

+begin

+  Result := FList[Index];

+end;

+

+function TThriftListImpl<T>.IndexOf(const Value: T): Integer;

+begin

+  Result := FList.IndexOf( Value );

+end;

+

+procedure TThriftListImpl<T>.Insert(Index: Integer; const Value: T);

+begin

+  FList.Insert( Index, Value);

+end;

+

+procedure TThriftListImpl<T>.InsertRange(Index: Integer;

+  const Collection: TEnumerable<T>);

+begin

+  FList.InsertRange( Index, Collection );

+end;

+

+procedure TThriftListImpl<T>.InsertRange(Index: Integer;

+  const Values: array of T);

+begin

+  FList.InsertRange( Index, Values);

+end;

+

+procedure TThriftListImpl<T>.InsertRange(Index: Integer;

+  const Collection: IEnumerable<T>);

+begin

+  FList.InsertRange( Index, Collection );

+end;

+

+{$IF CompilerVersion >= 21.0}

+function TThriftListImpl<T>.Last: T;

+begin

+  Result := FList.Last;

+end;

+{$IFEND}

+

+function TThriftListImpl<T>.LastIndexOf(const Value: T): Integer;

+begin

+  Result := FList.LastIndexOf( Value );

+end;

+

+{$IF CompilerVersion >= 21.0}

+procedure TThriftListImpl<T>.Move(CurIndex, NewIndex: Integer);

+begin

+  FList.Move( CurIndex,  NewIndex);

+end;

+{$IFEND}

+

+function TThriftListImpl<T>.Remove(const Value: T): Integer;

+begin

+  Result := FList.Remove( Value );

+end;

+

+procedure TThriftListImpl<T>.Reverse;

+begin

+  FList.Reverse;

+end;

+

+procedure TThriftListImpl<T>.SetCapacity(Value: Integer);

+begin

+  FList.Capacity := Value;

+end;

+

+procedure TThriftListImpl<T>.SetCount(Value: Integer);

+begin

+  FList.Count := Value;

+end;

+

+procedure TThriftListImpl<T>.SetItem(Index: Integer; const Value: T);

+begin

+  FList[Index] := Value;

+end;

+

+procedure TThriftListImpl<T>.Sort;

+begin

+  FList.Sort;

+end;

+

+procedure TThriftListImpl<T>.Sort(const AComparer: IComparer<T>);

+begin

+  FList.Sort;

+end;

+

+function TThriftListImpl<T>.ToArray: TArray<T>;

+{$IF CompilerVersion < 22.0}

+var

+  x : T;

+  i : Integer;

+{$IFEND}

+begin

+{$IF CompilerVersion < 22.0}

+  SetLength(Result, Count);

+  i := 0;

+  for x in FList do

+  begin

+    Result[i] := x;

+    Inc( i );

+  end;

+{$ELSE}

+  Result := FList.ToArray;

+{$IFEND}

+end;

+

+procedure TThriftListImpl<T>.TrimExcess;

+begin

+  FList.TrimExcess;

+end;

+

+end.