unit RequireEnsureUnit; interface uses Variants; procedure SetOld(Title: String; Value: Variant); function GetOld(Title: String): Variant; //procedure require(Values: array of Boolean); //procedure ensure(Values: array of Boolean); procedure require(Values: array of Variant); procedure ensure(Values: array of Variant); implementation uses Classes, //StringList SysUtils; //IntToStr (*---------------------------------------- procedure CheckRequireEnsure(Values: array of Boolean; ErrorMessage: String); var I: Integer; CheckLastValue: Boolean; begin if Length(Values) <= 1 then Exit; CheckLastValue := Values[Length(Values)-1]; for I := 0 to Length(Values) - 2 do begin if Values[I] <> CheckLastValue then Assert(False, ErrorMessage); end; end; procedure RequireEnsure(Values: array of Boolean; Message: String); begin //IDE実行中かどうかを判定する if DebugHook <> 0 then begin CheckRequireEnsure(Values, Message + ' error ide debug'); Exit; end; //DEBUGビルドかどうかを判定する {$IFDEF DEBUG} CheckRequireEnsure(Values, Message + ' error debug build'); {$ENDIF} end; procedure require(Values: array of Boolean); begin RequireEnsure(Values, 'require'); end; procedure ensure(Values: array of Boolean); begin RequireEnsure(Values, 'ensure'); end; //----------------------------------------*) procedure CheckRequireEnsure(Values: array of Variant; ErrorMessage: String); var I: Integer; CheckLastValue: Boolean; begin if Length(Values) = 0 then Exit; //最終引数がBooleanであることを確認 if VarType(Values[Length(Values)-1]) <> varBoolean then raise Exception.Create('CheckRequireEnsure Error. Args Last Value not Boolean'); if Length(Values) = 1 then Exit; CheckLastValue := Values[Length(Values)-1]; I := 0; while I <= Length(Values) - 2 do begin //Booleanであることを確認 if VarType(Values[I]) <> varBoolean then raise Exception.Create('CheckRequireEnsure Error. Args Value not Boolean'); if Values[I] <> CheckLastValue then begin if varType(Values[I+1]) = varString then begin Assert(False, ErrorMessage + ' ' + Values[I + 1]); Inc(I); end else begin Assert(False, ErrorMessage); end; end else begin if varType(Values[I+1]) = varString then begin Inc(I); end; end; //次の要素がStringなら一つとばす Inc(I); end; end; procedure RequireEnsure(Values: array of Variant; Message: String); begin //IDE実行中かどうかを判定する if DebugHook <> 0 then begin CheckRequireEnsure(Values, Message + ' error ide debug'); Exit; end; //DEBUGビルドかどうかを判定する {$IFDEF DEBUG} CheckRequireEnsure(Values, Message + ' error debug build'); {$ENDIF} end; procedure require(Values: array of Variant); begin RequireEnsure(Values, 'require'); end; procedure ensure(Values: array of Variant); begin RequireEnsure(Values, 'ensure'); end; //---------------------------------------- var uOldBuffer: TStringList; function OldBuffer: TStringList; begin if not Assigned(uOldBuffer) then uOldBuffer := TStringList.Create; Result := uOldBuffer; end; procedure SetOld(Title: String; Value: Variant); begin OldBuffer.Values[Title] := Value; end; function GetOld(Title: String): Variant; var Index: Integer; begin Result := OldBuffer.Values[Title]; Index := OldBuffer.IndexOfName(Title); if Index <> -1 then OldBuffer.Delete(Index); end; initialization uOldBuffer := nil; finalization if Assigned(uOldBuffer) then uOldBuffer.Free; end.