|
@@ -28,6 +28,8 @@ uses sysutils;
|
|
{$ENDIF FPC_DOTTEDUNITS}
|
|
{$ENDIF FPC_DOTTEDUNITS}
|
|
|
|
|
|
Type
|
|
Type
|
|
|
|
+ TNull = record
|
|
|
|
+ end;
|
|
|
|
|
|
{ TNullable }
|
|
{ TNullable }
|
|
|
|
|
|
@@ -44,6 +46,10 @@ Type
|
|
// Make things more readable
|
|
// Make things more readable
|
|
Type
|
|
Type
|
|
TMyType = specialize TNullable<T>;
|
|
TMyType = specialize TNullable<T>;
|
|
|
|
+ // Return if it has value and if so unpack
|
|
|
|
+ function Unpack(out aDest: T): Boolean;
|
|
|
|
+ // Return value if present, else return fallback
|
|
|
|
+ function ValueOr(const Fallback: T): T;
|
|
// Clear value, no value present after this.
|
|
// Clear value, no value present after this.
|
|
procedure Clear;
|
|
procedure Clear;
|
|
// Is a value present ?
|
|
// Is a value present ?
|
|
@@ -62,9 +68,16 @@ Type
|
|
class operator Explicit(aValue: T): TMyType;
|
|
class operator Explicit(aValue: T): TMyType;
|
|
class operator Explicit(aValue: TMyType): T;
|
|
class operator Explicit(aValue: TMyType): T;
|
|
class operator := (aValue: T): TMyType;
|
|
class operator := (aValue: T): TMyType;
|
|
|
|
+ class operator := (aValue: TNull): TMyType;
|
|
class operator := (aValue: TMyType): T;
|
|
class operator := (aValue: TMyType): T;
|
|
|
|
+ class operator Not (aValue: TMyType): Boolean;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{$Push}
|
|
|
|
+{$WriteableConst Off}
|
|
|
|
+const null: TNull = ();
|
|
|
|
+{$Pop}
|
|
|
|
+
|
|
implementation
|
|
implementation
|
|
|
|
|
|
{$IFDEF FPC_DOTTEDUNITS}
|
|
{$IFDEF FPC_DOTTEDUNITS}
|
|
@@ -110,6 +123,21 @@ begin
|
|
FHasValue:=True;
|
|
FHasValue:=True;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function TNullable.Unpack(out aDest: T): Boolean;
|
|
|
|
+begin
|
|
|
|
+ Result := HasValue;
|
|
|
|
+ if Result then
|
|
|
|
+ aDest := GetValue;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TNullable.ValueOr(const Fallback: T): T;
|
|
|
|
+begin
|
|
|
|
+ if HasValue then
|
|
|
|
+ Result := GetValue
|
|
|
|
+ else
|
|
|
|
+ Result := Fallback;
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TNullable.Clear;
|
|
procedure TNullable.Clear;
|
|
begin
|
|
begin
|
|
HasValue:=False;
|
|
HasValue:=False;
|
|
@@ -143,6 +171,12 @@ begin
|
|
Result.Value:=aValue;
|
|
Result.Value:=aValue;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+class operator TNullable.:=(aValue: TNull): TMyType;
|
|
|
|
+begin
|
|
|
|
+ Result := Default(TMyType);
|
|
|
|
+ Result.Clear;
|
|
|
|
+end;
|
|
|
|
+
|
|
class operator TNullable.:= (aValue: TMyType): T;
|
|
class operator TNullable.:= (aValue: TMyType): T;
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -150,4 +184,9 @@ begin
|
|
Result:=aValue.Value;
|
|
Result:=aValue.Value;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+class operator TNullable.Not(aValue: TMyType): Boolean;
|
|
|
|
+begin
|
|
|
|
+ Result := Not aValue.HasValue;
|
|
|
|
+end;
|
|
|
|
+
|
|
end.
|
|
end.
|