Skip to content

Commit afdae11

Browse files
committed
Parameterise TPJEnvironmentVars enumerator methods
EnumNames and EnumVars methods take a callback and a Data parameter that is passed to callback method. This Data parameter was type pointer but in new parameterised methods Data is now parameterised. Callback method types were also parameterised. Original EnumNames and EnumVars methods were kept as overloads and revised to call one of the parameterised methods specialised to the Pointer type. Original callback types were revised to specialisations of new parameterised callbacks using Pointer type. Old methods and old types were deprecated. Closes #7. Closes #6.
1 parent 84650e6 commit afdae11

File tree

1 file changed

+98
-39
lines changed

1 file changed

+98
-39
lines changed

PJEnvVars.pas

Lines changed: 98 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -83,35 +83,39 @@ TPJEnvironmentVar = record
8383
/// records.</summary>
8484
TPJEnvironmentVarArray = array of TPJEnvironmentVar;
8585

86-
/// <summary>Type of callback method passed to the
87-
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames"/> method, to be called
88-
/// for each enumerated environment variable.</summary>
89-
/// <param name="VarName">string [in] Name of the current environment
90-
/// variable in the enumeration.</param>
91-
/// <param name="Data">Pointer [in] User-specified value that was passed to
92-
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames"/></param>
93-
/// <remarks>Either closures or normal methods can be assigned to
94-
/// <c>TPJEnvVarsEnum</c>.</remarks>
95-
TPJEnvVarsEnum = reference to procedure(const VarName: string; Data: Pointer);
96-
97-
/// <summary>Type of callback method passed to the
98-
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars"/> method, to be called
99-
/// for each enumerated environment variable.</summary>
100-
/// <param name="EnvVar"><see cref="PJEnvVars|TPJEnvironmentVar"/> [in]
101-
/// Information about the current environment variable in the enumeration.
102-
/// </param>
103-
/// <param name="Data">Pointer [in] User-specified value that was passed to
104-
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars"/></param>
105-
/// <remarks>Either closures or normal methods can be assigned to
106-
/// <c>TPJEnvVarsEnumEx</c>.</remarks>
107-
TPJEnvVarsEnumEx = reference to procedure(const EnvVar: TPJEnvironmentVar;
108-
Data: Pointer);
109-
11086
/// <summary>Static class providing class methods for interrogating,
11187
/// manipulating and modifying the environment variables available to the
11288
/// current process.</summary>
11389
/// <remarks>This class cannot be constructed.</remarks>
11490
TPJEnvironmentVars = class(TObject)
91+
public
92+
type
93+
/// <summary>Type of callback method passed to the
94+
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames&lt;T&gt;"/> method,
95+
/// to be called for each enumerated environment variable.</summary>
96+
/// <param name="VarName">string [in] Name of the current environment
97+
/// variable in the enumeration.</param>
98+
/// <param name="Data">Pointer [in] User-specified value that was passed
99+
/// to <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames&lt;T&gt;"/>
100+
/// </param>
101+
/// <remarks>Either closures or normal methods can be assigned to
102+
/// <c>TEnumNamesCallback&lt;T&gt;</c>.</remarks>
103+
TEnumNamesCallback<T> = reference to
104+
procedure(const VarName: string; Data: T);
105+
106+
/// <summary>Type of callback method passed to the
107+
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars&lt;T&gt;"/> method,
108+
/// to be called for each enumerated environment variable.</summary>
109+
/// <param name="EnvVar"><see cref="PJEnvVars|TPJEnvironmentVar"/> [in]
110+
/// Information about the current environment variable in the
111+
/// enumeration.</param>
112+
/// <param name="Data">Pointer [in] User-specified value that was passed
113+
/// to <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars&lt;T&gt;"/>
114+
/// </param>
115+
/// <remarks>Either closures or normal methods can be assigned to
116+
/// <c>TEnumVarsCallback&lt;T&gt;</c>.</remarks>
117+
TEnumVarsCallback<T> = reference to
118+
procedure(const EnvVar: TPJEnvironmentVar; Data: T);
115119
public
116120
/// <summary>Prevents construction of instances of this static class.
117121
/// </summary>
@@ -212,23 +216,50 @@ TPJEnvironmentVars = class(TObject)
212216
/// <returns>TStringDynArray. Dynamic array containing the environment
213217
/// variable names.</returns>
214218
class function GetAllNames: TStringDynArray; overload;
219+
215220
/// <summary>Enumerates the names of all environment variables in the
216221
/// current process.</summary>
217-
/// <param name="Callback"><see cref="PJEnvVars|TPJEnvVarsEnum"/> [in]
218-
/// Callback method called once for each environment variable, passing its
219-
/// name and the value of the <c>Data</c> pointer as parameters.</param>
220-
/// <param name="Data">Pointer [in] Data to be passed to <c>Callback</c>
222+
/// <param name="Callback"><see
223+
/// cref="PJEnvVars|TEnumNamesCallback&lt;T&gt;"/> [in] Closure called once
224+
/// for each environment variable, passing its name and <c>Data</c> as
225+
/// parameters.</param>
226+
/// <param name="Data">&lt;T&gt; [in] Data to be passed to <c>Callback</c>
221227
/// method each time it is called.</param>
222-
class procedure EnumNames(Callback: TPJEnvVarsEnum; Data: Pointer);
228+
/// <remarks>This is a parameterised method that enables the <c>Data</c>
229+
/// parameter to take on the desired type.</remarks>
230+
class procedure EnumNames<T>(Callback: TEnumNamesCallback<T>; Data: T);
231+
overload;
232+
233+
/// <summary>Enumerates the names of all environment variables in the
234+
/// current process.</summary>
235+
/// <remarks>This deprecated method is equivalent to calling
236+
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames&lt;Pointer&gt;"/>.
237+
/// </remarks>
238+
class procedure EnumNames(Callback: TEnumNamesCallback<Pointer>;
239+
Data: Pointer) overload;
240+
deprecated 'Use TPJEnvironmentVars.EnumNames<Pointer> instead';
241+
223242
/// <summary>Enumerates all the environment variables available to the
224243
/// current process.</summary>
225-
/// <param name="Callback"><see cref="PJEnvVars|TPJEnvVarsEnumEx"/> [in]
226-
/// Callback method called once for each environment variable, passing a
227-
/// record containing its name and value along with the the value of the
228-
/// <c>Data</c> pointer as parameters.</param>
229-
/// <param name="Data">Pointer [in] Data to be passed to <c>Callback</c>
244+
/// <param name="Callback"><see
245+
/// cref="PJEnvVars|TEnumVarsCallback&lt;T&gt;"/> [in] Closure called once
246+
/// for each environment variable, passing a record containing its name and
247+
/// value, along with <c>Data</c>, as parameters.</param>
248+
/// <param name="Data">&lt;T&gt; [in] Data to be passed to <c>Callback</c>
230249
/// method each time it is called.</param>
231-
class procedure EnumVars(Callback: TPJEnvVarsEnumEx; Data: Pointer);
250+
/// <remarks>This is a parameterised method that enables the <c>Data</c>
251+
/// parameter to take on the desired type.</remarks>
252+
class procedure EnumVars<T>(Callback: TEnumVarsCallback<T>; Data: T);
253+
overload;
254+
255+
/// <summary>Enumerates all the environment variables available to the
256+
/// current process.</summary>
257+
/// <remarks>This deprecated method is equivalent to calling
258+
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars&lt;Pointer&gt;"/>.
259+
/// </remarks>
260+
class procedure EnumVars(Callback: TEnumVarsCallback<Pointer>;
261+
Data: Pointer); overload;
262+
deprecated 'Use TPJEnvironmentVars.EnumVars<Pointer> instead';
232263
end;
233264

234265
/// <summary>Enumerator for all environment variables names in the current
@@ -259,6 +290,20 @@ TPJEnvVarsEnumerator = class(TObject)
259290
property Current: string read GetCurrent;
260291
end;
261292

293+
/// <summary>Type of callback method that can be passed to the
294+
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames"/> method.</summary>
295+
/// <remarks>Deprecated type retained for backwards compatibility only
296+
/// </remarks>
297+
TPJEnvVarsEnum = TPJEnvironmentVars.TEnumNamesCallback<Pointer>
298+
deprecated 'Use TPJEnvironmentVars.TEnumNamesCallback<Pointer> instead';
299+
300+
/// <summary>Type of callback method that can be passed to the
301+
/// <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars"/> method.</summary>
302+
/// <remarks>Deprecated type retained for backwards compatibility only
303+
/// </remarks>
304+
TPJEnvVarsEnumEx = TPJEnvironmentVars.TEnumVarsCallback<Pointer>
305+
deprecated 'Use TPJEnvironmentVars.TEnumVarsCallback<Pointer> instead';
306+
262307
/// <summary>Exception raised by <see cref="PJEnvVars|TPJEnvVars"/> when an
263308
/// error is encountered.</summary>
264309
EPJEnvVars = class(EOSError);
@@ -401,8 +446,15 @@ class function TPJEnvironmentVars.Delete(const VarName: string): Integer;
401446
Result := GetLastError;
402447
end;
403448

404-
class procedure TPJEnvironmentVars.EnumNames(Callback: TPJEnvVarsEnum;
405-
Data: Pointer);
449+
class procedure TPJEnvironmentVars.EnumNames(
450+
Callback: TEnumNamesCallback<Pointer>; Data: Pointer);
451+
begin
452+
Assert(Assigned(Callback));
453+
EnumNames<Pointer>(Callback, Data);
454+
end;
455+
456+
class procedure TPJEnvironmentVars.EnumNames<T>(Callback: TEnumNamesCallback<T>;
457+
Data: T);
406458
var
407459
Idx: Integer;
408460
EnvList: TStringList;
@@ -418,8 +470,15 @@ class procedure TPJEnvironmentVars.EnumNames(Callback: TPJEnvVarsEnum;
418470
end;
419471
end;
420472

421-
class procedure TPJEnvironmentVars.EnumVars(Callback: TPJEnvVarsEnumEx;
422-
Data: Pointer);
473+
class procedure TPJEnvironmentVars.EnumVars(
474+
Callback: TEnumVarsCallback<Pointer>; Data: Pointer);
475+
begin
476+
Assert(Assigned(Callback));
477+
EnumVars<Pointer>(Callback, Data);
478+
end;
479+
480+
class procedure TPJEnvironmentVars.EnumVars<T>(Callback: TEnumVarsCallback<T>;
481+
Data: T);
423482
var
424483
Idx: Integer;
425484
AllEnvVars: TPJEnvironmentVarArray;

0 commit comments

Comments
 (0)