Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Project55;
- {$APPTYPE CONSOLE}
- uses
- Rtti,
- SysUtils,
- TypInfo;
- type
- TLogEntry = record
- msg: string;
- end;
- ILogger = interface
- procedure LogEntry(const entry: TLogEntry);
- end;
- ILoggerHelper = record {helper for ILogger}
- strict private
- this: ILogger; // not necessary if this was a real helper as Self would point to ILogger
- public
- procedure LogValue<T>(const value: T);
- end;
- TLogger = class(TInterfacedObject, ILogger)
- procedure LogEntry(const entry: TLogEntry);
- end;
- TLogEntryHelper = record helper for TLogEntry
- procedure LogValue<T>(const value: T);
- end;
- var
- GLogger: ILogger;
- function Logger: ILogger;
- begin
- Result := GLogger;
- end;
- { TLogger }
- procedure TLogger.LogEntry(const entry: TLogEntry);
- begin
- Writeln(entry.msg);
- end;
- procedure Main;
- var
- s: string;
- log: ILoggerHelper;
- begin
- log := ILoggerHelper(Logger());
- s := 'hello world';
- (*
- lea eax,[ebp-$08]
- mov edx,[ebp-$04]
- call ILoggerHelper.LogValue<System.string>
- *)
- log.LogValue(s);
- log.LogValue(Now);
- end;
- { ILoggerHelper }
- procedure ILoggerHelper.LogValue<T>(const value: T);
- var
- entry: TLogEntry;
- begin
- (*
- lea eax,[ebp-$0c]
- mov edx,[ebp-$08]
- call TLogEntryHelper.LogValue<System.string>
- *)
- entry.LogValue(value);
- this.LogEntry(entry);
- end;
- { TLogEntryHelper }
- procedure TLogEntryHelper.LogValue<T>(const value: T);
- var
- info: PTypeInfo;
- kind: TTypeKind;
- v: TValue;
- begin
- info := System.TypeInfo(T);
- kind := info.Kind;
- v := TValue.From<T>(value);
- case kind of
- tkFloat:
- begin
- if info = System.TypeInfo(TDateTime) then
- msg := DateTimeToStr(v.AsExtended)
- else
- msg := v.ToString;
- end;
- else
- msg := v.ToString;
- end;
- end;
- begin
- GLogger := TLogger.Create;
- Main;
- Readln;
- ReportMemoryLeaksOnShutdown := True;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement