From Asbjørn, 8 Years ago, written in Delphi (Object Pascal).
Embed
  1. type
  2.   RangeEnumerator = record
  3.   strict private
  4.     FCurrent: integer;
  5.     FStop: integer;
  6.     FStep: integer;
  7.     FPadding: integer;
  8.   public
  9.     class function Create(const Start, Stop, Step: integer): RangeEnumerator; static; inline;
  10.  
  11.     function MoveNext: boolean; inline;
  12.  
  13.     property Current: integer read FCurrent;
  14.   end;
  15.  
  16.   RangeEnumerable = record
  17.   strict private
  18.     FEnumerator: RangeEnumerator;
  19.   public
  20.     class function Create(const Start, Stop, Step: integer): RangeEnumerable; static; inline;
  21.  
  22.     function GetEnumerator(): RangeEnumerator; inline;
  23.   end;
  24.  
  25. function Range(const Stop: integer): RangeEnumerable; inline;
  26. begin
  27.   result := RangeEnumerable.Create(0, Stop, 1);
  28. end;
  29.  
  30. { RangeEnumerator }
  31.  
  32. class function RangeEnumerator.Create(const Start, Stop, Step: integer): RangeEnumerator;
  33. begin
  34.   result.FCurrent := Start;
  35.   result.FStop := Stop;
  36.   result.FStep := Step;
  37. end;
  38.  
  39. function RangeEnumerator.MoveNext: boolean;
  40. var
  41.   next: integer;
  42. begin
  43.   next := FCurrent + FStep;
  44.  
  45.   result := (next < FStop);
  46.   if (not result) then
  47.     exit;
  48.  
  49.   FCurrent := next;
  50. end;
  51.  
  52. { RangeEnumerable }
  53.  
  54. class function RangeEnumerable.Create(const Start, Stop, Step: integer): RangeEnumerable;
  55. begin
  56.   result.FEnumerator := RangeEnumerator.Create(Start, Stop, Step);
  57. end;
  58.  
  59. function RangeEnumerable.GetEnumerator: RangeEnumerator;
  60. begin
  61.   result := FEnumerator;
  62. end;
  63.  
  64.  
  65. procedure MatrixMultRange(const A, B: TMatrix; out R: TMatrix);
  66. var
  67.   i, j, k: integer;
  68.   sum: double;
  69. begin
  70.   Assert(A.m = B.n);
  71.  
  72.   R := TMatrix.Create(A.n, B.m);
  73.  
  74.   for i in Range(A.n) do
  75.   begin
  76.     for j in Range(B.m) do
  77.     begin
  78.       sum := 0;
  79.       for k in Range(A.m) do
  80.       begin
  81.         sum := sum + A[i, k] * B[k, j];
  82.       end;
  83.       R[i, j] := sum;
  84.     end;
  85.   end;
  86. end;
  87.