По мотивам - Коротко. Про контроль типов.
Так вот вам "идейка":
Заготовочка - https://bitbucket.org/ingword/mindstream/commits/8d43980ff7c2bf1825c1e0dc60e7db36499e7c37
Так сказать - "следите за обновлениями".
P.S. Ну и ещё там есть:
(+) https://bitbucket.org/ingword/mindstream/commits/1734dc8f4d07510e62190294de535347a7672493
И ещё:
(+) https://bitbucket.org/ingword/mindstream/commits/7f34f5efa542db681a08d702d38cc32e6441ad6c
И ещё:
И вот ещё куда стоит посмотреть:
Особенно вот сюда:
(+) https://bitbucket.org/ingword/mindstream/commits/2291e3309b5ee49de09d0e219298859dbb721a8b
Так вот вам "идейка":
// TmsShapeClassName type TmsShapeClassName = record rValue : String; class operator Implicit(const aValue: String): TmsShapeClassName; class operator Explicit(const aSelf: TmsShapeClassName): String; end;//TmsShapeClassName ... class operator TmsShapeClassName.Implicit(const aValue: String): TmsShapeClassName; begin Result.rValue := aValue; end; class operator TmsShapeClassName.Explicit(const aSelf: TmsShapeClassName): String; begin Result := aSelf.rValue; end;Пока - всё.
Заготовочка - https://bitbucket.org/ingword/mindstream/commits/8d43980ff7c2bf1825c1e0dc60e7db36499e7c37
Так сказать - "следите за обновлениями".
P.S. Ну и ещё там есть:
TmsColorRec = record rIsSet : Boolean; rValue : TAlphaColor; class operator Implicit(aValue: TAlphaColor): TmsColorRec; end;//TmsColorRec TmsPixelRec = record rIsSet : Boolean; rValue : Pixel; class operator Implicit(aValue: Pixel): TmsPixelRec; end;//TmsPixelRec TmsRadiusRec = record rIsSet : Boolean; rValue : Pixel; class operator Implicit(aValue: Pixel): TmsRadiusRec; end;//TmsRadiusRec TmsStrokeDash = record rIsSet : Boolean; rValue : TStrokeDash; class operator Implicit(aValue: TStrokeDash): TmsStrokeDash; end;//TmsStrokeDash ...(+) https://bitbucket.org/ingword/mindstream/commits/4c28381d98f5a01d82b7e01b2e4456f81b05a72a
(+) https://bitbucket.org/ingword/mindstream/commits/1734dc8f4d07510e62190294de535347a7672493
И ещё:
type TmsShapeClassName = record rValue : String; class operator Implicit(const aValue: String): TmsShapeClassName; class operator Explicit(const aSelf: TmsShapeClassName): String; overload; class operator Implicit(const aSelf: TmsShapeClassName): String; overload; function EQ(const aValue: String): Boolean; overload; function EQ(const aValue: TmsShapeClassName): Boolean; overload; end;//TmsShapeClassName ... // TmsShapeClassName class operator TmsShapeClassName.Implicit(const aValue: String): TmsShapeClassName; const cPref = 'Tms'; begin Result.rValue := aValue; if ANSIStartsText(cPref, Result.rValue) then Result.rValue := Copy(Result.rValue, Length(cPref) + 1, Length(Result.rValue) - Length(cPref)); end; class operator TmsShapeClassName.Explicit(const aSelf: TmsShapeClassName): String; begin Result := aSelf.rValue; end; class operator TmsShapeClassName.Implicit(const aSelf: TmsShapeClassName): String; begin Result := aSelf.rValue; end; function TmsShapeClassName.EQ(const aValue: String): Boolean; begin Result := (Self.rValue = aValue); end; function TmsShapeClassName.EQ(const aValue: TmsShapeClassName): Boolean; begin Result := (Self.rValue = aValue.rValue); end;
(+) https://bitbucket.org/ingword/mindstream/commits/7f34f5efa542db681a08d702d38cc32e6441ad6c
И ещё:
type TmsShapeClassName = record rValue : String; class operator Implicit(const aValue: String): TmsShapeClassName; class operator Explicit(const aSelf: TmsShapeClassName): String; overload; class operator Implicit(const aSelf: TmsShapeClassName): String; overload; class operator Equal(const A: TmsShapeClassName; const B: String): Boolean; // function EQ(const aValue: String): Boolean; overload; function EQ(const aValue: TmsShapeClassName): Boolean; overload; end;//TmsShapeClassName ... // TmsShapeClassName class operator TmsShapeClassName.Implicit(const aValue: String): TmsShapeClassName; const cPref = 'Tms'; begin Result.rValue := aValue; if ANSIStartsText(cPref, Result.rValue) then Result.rValue := Copy(Result.rValue, Length(cPref) + 1, Length(Result.rValue) - Length(cPref)); end; class operator TmsShapeClassName.Explicit(const aSelf: TmsShapeClassName): String; begin Result := aSelf.rValue; end; class operator TmsShapeClassName.Implicit(const aSelf: TmsShapeClassName): String; begin Result := aSelf.rValue; end; class operator TmsShapeClassName.Equal(const A: TmsShapeClassName; const B: String): Boolean; begin Result := (A.rValue = B); end; (*function TmsShapeClassName.EQ(const aValue: String): Boolean; begin Result := (Self.rValue = aValue); end;*) function TmsShapeClassName.EQ(const aValue: TmsShapeClassName): Boolean; begin Result := (Self.rValue = aValue.rValue); end;
И вот ещё куда стоит посмотреть:
TPointF = record class function Create(const AX, AY: Single): TPointF; overload; static; inline; class function Create(const APoint: TPoint): TPointF; overload; static; inline; class operator Add(const APoint1, APoint2: TPointF): TPointF; class operator Subtract(const APoint1, APoint2: TPointF): TPointF; class operator Equal(const APoint1, APoint2: TPointF): Boolean; class operator NotEqual(const APoint1, APoint2: TPointF): Boolean; class operator Implicit(const APoint: TPoint): TPointF; class operator Negative(const APoint: TPointF): TPointF; class operator Multiply(const APoint1, APoint2: TPointF): TPointF; class operator Multiply(const APoint: TPointF; const AFactor: Single): TPointF; class operator Multiply(const AFactor: Single; const APoint: TPointF): TPointF; class operator Divide(const APoint: TPointF; const AFactor: Single): TPointF; class function PointInCircle(const Point, Center: TPointF; const Radius: Integer): Boolean; static; inline; function Distance(const APoint: TPointF): Single; // 3D cross-product with Z = 0 function CrossProduct(const APoint: TPointF): Single; function DotProduct(const APoint: TPointF): Single; inline; procedure Offset(const APoint: TPointF); overload; inline; procedure Offset(const ADeltaX, ADeltaY: Single); overload; inline; procedure Offset(const APoint: TPoint); overload; inline; procedure SetLocation(const X, Y: Single); overload; deprecated 'Use ":=" assignment instead'; procedure SetLocation(const P: TPointF); overload; deprecated 'Use ":=" assignment instead'; procedure SetLocation(const P: TPoint); overload; deprecated 'Use ":=" assignment instead'; function Subtract(const Point: TPointF): TPointF; overload; deprecated 'Use TPointF.Offset instead'; function Subtract(const Point: TPoint): TPointF; overload; deprecated 'Use TPointF.Offset instead'; function Add(const Point: TPointF): TPointF; overload; deprecated 'Use TPointF.Offset instead'; function Add(const Point: TPoint): TPointF; overload; deprecated 'Use TPointF.Offset instead'; function Scale(const AFactor: Single): TPointF; deprecated; function EqualsTo(const Point: TPointF; const Epsilon: Single = 0): Boolean; function IsZero: Boolean; function Ceiling: TPoint; function Truncate: TPoint; function Round: TPoint; function Normalize: TPointF; function Length: Single; function Rotate(const AAngle: Single): TPointF; function Reflect(const APoint: TPointF): TPointF; inline; function MidPoint(const APoint: TPointF): TPointF; inline; function AngleCosine(const APoint: TPointF): Single; function Angle(const APoint: TPointF): Single; case Integer of 0: (V: TPointFType;); 1: (X: Single; Y: Single;); end;
Особенно вот сюда:
class operator TPointF.Equal(const APoint1, APoint2: TPointF): Boolean; begin Result := SameValue(APoint1.X, APoint2.X) and SameValue(APoint1.Y, APoint2.Y); end; function TPointF.EqualsTo(const Point: TPointF; const Epsilon: Single): Boolean; begin Result := SameValue(X, Point.X, Epsilon) and SameValue(Y, Point.Y, Epsilon); end; class operator TPointF.NotEqual(const APoint1, APoint2: TPointF): Boolean; begin Result := not (APoint1 = APoint2); end; class operator TPointF.Implicit(const APoint: TPoint): TPointF; begin Result.X := APoint.X; Result.Y := APoint.Y; end;Оператор сравнения с учётом Epsilon хорош. Не правда ли?
(+) https://bitbucket.org/ingword/mindstream/commits/2291e3309b5ee49de09d0e219298859dbb721a8b
Комментариев нет:
Отправить комментарий