syshelph.inc 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. {%mainunit syshelpers.pp}
  2. Type
  3. generic TArray<T> = array of T;
  4. TStringArray = Array of string;
  5. TCharArray = Array of char;
  6. TEndian = ObjPas.TEndian;
  7. TByteBitIndex = 0..7;
  8. TShortIntBitIndex = 0..7;
  9. TWordBitIndex = 0..15;
  10. TSmallIntBitIndex = 0..15;
  11. TCardinalBitIndex = 0..31;
  12. TIntegerBitIndex = 0..31;
  13. TLongIntBitIndex = TIntegerBitIndex;
  14. TQwordBitIndex = 0..63;
  15. TInt64BitIndex = 0..63;
  16. {$IFDEF cpu16}
  17. TNativeUIntBitIndex = TWordBitIndex;
  18. TNativeIntBitIndex = TSmallIntBitIndex;
  19. {$ENDIF}
  20. {$IFDEF cpu32}
  21. TNativeUIntBitIndex = TCardinalBitIndex;
  22. TNativeIntBitIndex = TIntegerBitIndex;
  23. {$ENDIF}
  24. {$IFDEF cpu64}
  25. TNativeUIntBitIndex = TQWordBitIndex;
  26. TNativeIntBitIndex = TInt64BitIndex;
  27. {$ENDIF}
  28. Const
  29. CPUEndian = {$IFDEF FPC_LITTLE_ENDIAN}TEndian.Little{$ELSE}TEndian.Big{$ENDIF};
  30. Type
  31. TGuidHelper = record helper for TGUID
  32. Class function Create(const Data; BigEndian: Boolean): TGUID; overload; static;
  33. class function Create(const Data: array of Byte; AStartIndex: Cardinal; BigEndian: Boolean): TGUID; overload; static;
  34. Class Function Create(const Data; DataEndian: TEndian = CPUEndian): TGUID; overload; static; inline;
  35. Class Function Create(const B: TBytes; DataEndian: TEndian = CPUEndian): TGUID; overload; static; inline;
  36. Class Function Create(const B: TBytes; AStartIndex: Cardinal; DataEndian: TEndian = CPUEndian): TGUID; overload; static;
  37. Class Function Create(const S: string): TGUID; overload; static;
  38. Class Function Create(A: Integer; B: SmallInt; C: SmallInt; const D: TBytes): TGUID; overload; static;
  39. Class Function Create(A: Integer; B: SmallInt; C: SmallInt; D, E, F, G, H, I, J, K: Byte): TGUID; overload; static;
  40. Class Function Create(A: Cardinal; B: Word; C: Word; D, E, F, G, H, I, J, K: Byte): TGUID; overload; static;
  41. Class Function NewGuid: TGUID; static;
  42. Function ToByteArray(DataEndian: TEndian = CPUEndian): TBytes;
  43. Function ToString(SkipBrackets: Boolean = False): string;
  44. end;
  45. TCompareOption = system.TCompareOption;
  46. TCompareOptions = system.TCompareOptions;
  47. {$SCOPEDENUMS ON}
  48. TStringSplitOptions = (None, ExcludeEmpty, ExcludeLastEmpty);
  49. {$SCOPEDENUMS OFF}
  50. { TStringHelper }
  51. TStringHelper = Type Helper for AnsiString
  52. Private
  53. Function GetChar(AIndex : SizeInt) : Char;
  54. Function GetLength : SizeInt;
  55. public
  56. const Empty = '';
  57. // Methods
  58. Class Function Compare(const A: string; const B: string): Integer; overload; static; //inline;
  59. Class Function Compare(const A: string; const B: string; IgnoreCase: Boolean): Integer; overload; static; //inline; //deprecated 'Use same with TCompareOptions';
  60. Class Function Compare(const A: string; const B: string; Options: TCompareOptions): Integer; overload; static; // inline;
  61. Class Function Compare(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt): Integer; overload; static; // inline;
  62. Class Function Compare(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt; IgnoreCase: Boolean): Integer; overload; static; // inline; //deprecated 'Use same with TCompareOptions';
  63. Class Function Compare(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt; Options: TCompareOptions): Integer; overload; static;// inline;
  64. Class Function CompareOrdinal(const A: string; const B: string): Integer; overload; static;
  65. Class Function CompareOrdinal(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt): Integer; overload; static;
  66. Class Function CompareText(const A: string; const B: string): Integer; static; inline;
  67. Class Function Copy(const Str: string): string; inline; static;
  68. Class Function Create(AChar: Char; ACount: SizeInt): string; overload; inline; static;
  69. Class Function Create(const AValue: array of Char): string; overload; static;
  70. Class Function Create(const AValue: array of Char; StartIndex: SizeInt; ALen: SizeInt): string; overload; static;
  71. Class Function EndsText(const ASubText, AText: string): Boolean; static;
  72. Class Function Equals(const a: string; const b: string): Boolean; overload; static;
  73. Class Function Format(const AFormat: string; const args: array of const): string; overload; static;
  74. Class Function IsNullOrEmpty(const AValue: string): Boolean; static;
  75. Class Function IsNullOrWhiteSpace(const AValue: string): Boolean; static;
  76. Class Function Join(const Separator: string; const Values: array of const): string; overload; static;
  77. Class Function Join(const Separator: string; const Values: array of string): string; overload; static;
  78. Class Function Join(const Separator: string; const Values: array of string; StartIndex: SizeInt; ACount: SizeInt): string; overload; static;
  79. Class Function LowerCase(const S: string): string; overload; static; inline;
  80. Class Function Parse(const AValue: Boolean): string; overload; static; inline;
  81. Class Function Parse(const AValue: Extended): string; overload; static;inline;
  82. Class Function Parse(const AValue: Int64): string; overload; static; inline;
  83. Class Function Parse(const AValue: Integer): string; overload; static; inline;
  84. Class Function ToBoolean(const S: string): Boolean; overload; static; inline;
  85. Class Function ToDouble(const S: string): Double; overload; static; inline;
  86. Class Function ToExtended(const S: string): Extended; overload; static; inline;
  87. Class Function ToInt64(const S: string): Int64; overload; static; inline;
  88. Class Function ToInteger(const S: string): Integer; overload; static; inline;
  89. Class Function ToSingle(const S: string): Single; overload; static; inline;
  90. Class Function UpperCase(const S: string): string; overload; static; inline;
  91. Function CompareTo(const B: string): Integer;
  92. Function Contains(const AValue: string): Boolean;
  93. procedure CopyTo(SourceIndex: SizeInt; var destination: array of Char; DestinationIndex: SizeInt; ACount: SizeInt);
  94. Function CountChar(const C: Char): SizeInt;
  95. Function DeQuotedString: string; overload;
  96. Function DeQuotedString(const AQuoteChar: Char): string; overload;
  97. Function EndsWith(const AValue: string): Boolean; overload; inline;
  98. Function EndsWith(const AValue: string; IgnoreCase: Boolean): Boolean; overload;
  99. Function Equals(const AValue: string): Boolean; overload;
  100. Function Format(const args: array of const): string; overload;
  101. Function GetHashCode: Integer;
  102. Function IndexOf(AValue: Char): SizeInt; overload; inline;
  103. Function IndexOf(const AValue: string): SizeInt; overload; inline;
  104. Function IndexOf(AValue: Char; StartIndex: SizeInt): SizeInt; overload;
  105. Function IndexOf(const AValue: string; StartIndex: SizeInt): SizeInt; overload;
  106. Function IndexOf(AValue: Char; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  107. Function IndexOf(const AValue: string; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  108. Function IndexOfUnQuoted(const AValue: string; StartQuote, EndQuote: Char; StartIndex: SizeInt = 0): SizeInt; overload;
  109. Function IndexOfAny(const AnyOf: array of Char): SizeInt; overload;
  110. Function IndexOfAny(const AnyOf: array of Char; StartIndex: SizeInt): SizeInt; overload;
  111. Function IndexOfAny(const AnyOf: array of Char; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  112. Function IndexOfAny(const AnyOf: array of String): SizeInt; overload;
  113. Function IndexOfAny(const AnyOf: array of String; StartIndex: SizeInt): SizeInt; overload;
  114. Function IndexOfAny(const AnyOf: array of String; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  115. Function IndexOfAny(const AnyOf: array of String; StartIndex: SizeInt; ACount: SizeInt; Out AMatch : SizeInt): SizeInt; overload;
  116. Function IndexOfAnyUnquoted(const AnyOf: array of Char; StartQuote, EndQuote: Char): SizeInt; overload;
  117. Function IndexOfAnyUnquoted(const AnyOf: array of Char; StartQuote, EndQuote: Char; StartIndex: SizeInt): SizeInt; overload;
  118. Function IndexOfAnyUnquoted(const AnyOf: array of Char; StartQuote, EndQuote: Char; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  119. function IndexOfAnyUnquoted(const AnyOf: array of string; StartQuote, EndQuote: Char; StartIndex: SizeInt; Out Matched: SizeInt): SizeInt; overload;
  120. Function Insert(StartIndex: SizeInt; const AValue: string): string;
  121. Function IsDelimiter(const Delimiters: string; Index: SizeInt): Boolean;
  122. Function IsEmpty: Boolean;
  123. Function LastDelimiter(const Delims: string): SizeInt;
  124. Function LastIndexOf(AValue: Char): SizeInt; overload;
  125. Function LastIndexOf(const AValue: string): SizeInt; overload;
  126. Function LastIndexOf(AValue: Char; AStartIndex: SizeInt): SizeInt; overload;
  127. Function LastIndexOf(const AValue: string; AStartIndex: SizeInt): SizeInt; overload;
  128. Function LastIndexOf(AValue: Char; AStartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  129. Function LastIndexOf(const AValue: string; AStartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  130. Function LastIndexOfAny(const AnyOf: array of Char): SizeInt; overload;
  131. Function LastIndexOfAny(const AnyOf: array of Char; AStartIndex: SizeInt): SizeInt; overload;
  132. Function LastIndexOfAny(const AnyOf: array of Char; AStartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;
  133. Function PadLeft(ATotalWidth: SizeInt): string; overload; inline;
  134. Function PadLeft(ATotalWidth: SizeInt; PaddingChar: Char): string; overload; inline;
  135. Function PadRight(ATotalWidth: SizeInt): string; overload; inline;
  136. Function PadRight(ATotalWidth: SizeInt; PaddingChar: Char): string; overload; inline;
  137. Function QuotedString: string; overload;
  138. Function QuotedString(const AQuoteChar: Char): string; overload;
  139. Function Remove(StartIndex: SizeInt): string; overload; inline;
  140. Function Remove(StartIndex: SizeInt; ACount: SizeInt): string; overload; inline;
  141. Function Replace(OldChar: Char; NewChar: Char): string; overload;
  142. Function Replace(OldChar: Char; NewChar: Char; ReplaceFlags: TReplaceFlags): string; overload;
  143. Function Replace(const OldValue: string; const NewValue: string): string; overload;
  144. Function Replace(const OldValue: string; const NewValue: string; ReplaceFlags: TReplaceFlags): string; overload;
  145. Function Split(const Separators: array of Char): TStringArray; overload;
  146. Function Split(const Separators: array of Char; ACount: SizeInt): TStringArray; overload;
  147. Function Split(const Separators: array of Char; Options: TStringSplitOptions): TStringArray; overload;
  148. Function Split(const Separators: array of Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;
  149. Function Split(const Separators: array of string): TStringArray; overload;
  150. Function Split(const Separators: array of string; ACount: SizeInt): TStringArray; overload;
  151. Function Split(const Separators: array of string; Options: TStringSplitOptions): TStringArray; overload;
  152. Function Split(const Separators: array of string; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;
  153. Function Split(const Separators: array of Char; AQuote: Char): TStringArray; overload;
  154. Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char): TStringArray; overload;
  155. Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray; overload;
  156. Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt): TStringArray; overload;
  157. Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;
  158. Function Split(const Separators: array of string; AQuote: Char): TStringArray; overload;
  159. Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char): TStringArray; overload;
  160. Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray; overload;
  161. Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt): TStringArray; overload;
  162. Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;
  163. Function StartsWith(const AValue: string): Boolean; overload; inline;
  164. Function StartsWith(const AValue: string; IgnoreCase: Boolean): Boolean; overload;
  165. Function Substring(AStartIndex: SizeInt): string; overload;
  166. Function Substring(AStartIndex: SizeInt; ALen: SizeInt): string; overload;
  167. Function ToBoolean: Boolean; overload; inline;
  168. Function ToInteger: Integer; overload; inline;
  169. Function ToInt64: Int64; overload; inline;
  170. Function ToSingle: Single; overload; inline;
  171. Function ToDouble: Double; overload; inline;
  172. Function ToExtended: Extended; overload; inline;
  173. Function ToCharArray: TCharArray; overload;
  174. Function ToCharArray(AStartIndex: SizeInt; ALen: SizeInt): TCharArray; overload;
  175. Function ToLower: string; overload; inline;
  176. Function ToLowerInvariant: string;
  177. Function ToUpper: string; overload; inline;
  178. Function ToUpperInvariant: string; inline;
  179. Function Trim: string; overload;
  180. Function TrimLeft: string; overload;
  181. Function TrimRight: string; overload;
  182. Function Trim(const ATrimChars: array of Char): string; overload;
  183. Function TrimLeft(const ATrimChars: array of Char): string; overload;
  184. Function TrimRight(const ATrimChars: array of Char): string; overload;
  185. Function TrimEnd(const ATrimChars: array of Char): string; deprecated 'Use TrimRight';
  186. Function TrimStart(const ATrimChars: array of Char): string; deprecated 'Use TrimLeft';
  187. property Chars[AIndex: SizeInt]: Char read GetChar;
  188. property Length: SizeInt read GetLength;
  189. end;
  190. {$IFDEF FPC_HAS_TYPE_SINGLE}
  191. TSingleHelper = Type Helper for Single
  192. Private
  193. Function GetB(AIndex: Cardinal): Byte;
  194. Function GetW(AIndex: Cardinal): Word;
  195. Function GetE: QWord; inline;
  196. Function GetF: QWord; inline;
  197. Function GetS: Boolean; inline;
  198. procedure SetB(AIndex: Cardinal; const AValue: Byte);
  199. procedure SetW(AIndex: Cardinal; const AValue: Word);
  200. procedure SetE(AValue: QWord);
  201. procedure SetF(AValue: QWord);
  202. procedure SetS(AValue: Boolean);
  203. public
  204. {$push}
  205. {$R-}
  206. {$Q-}
  207. const
  208. Epsilon : Single = 1.4012984643248170709e-45;
  209. MaxValue : Single = 340282346638528859811704183484516925440.0;
  210. MinValue : Single = -340282346638528859811704183484516925440.0;
  211. PositiveInfinity : Single = 1.0/0.0;
  212. NegativeInfinity : Single = -1.0/0.0;
  213. NaN : Single = 0.0/0.0;
  214. {$POP}
  215. Class Function IsNan(const AValue: Single): Boolean; overload; inline; static;
  216. Class Function IsInfinity(const AValue: Single): Boolean; overload; inline; static;
  217. Class Function IsNegativeInfinity(const AValue: Single): Boolean; overload; inline; static;
  218. Class Function IsPositiveInfinity(const AValue: Single): Boolean; overload; inline; static;
  219. Class Function Parse(const AString: string): Single; overload; inline; static;
  220. Class Function Parse(const AString: string; const AFormatSettings: TFormatSettings): Single; overload; inline; static;
  221. Class Function Size: Integer; inline; static;
  222. Class Function ToString(const AValue: Single): string; overload; inline; static;
  223. Class Function ToString(const AValue: Single; const AFormatSettings: TFormatSettings): string; overload; inline; static;
  224. Class Function ToString(const AValue: Single; const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline; static;
  225. Class Function ToString(const AValue: Single; const AFormat: TFloatFormat; const APrecision, ADigits: Integer;
  226. const AFormatSettings: TFormatSettings): string; overload; inline; static;
  227. Class Function TryParse(const AString: string; out AValue: Single): Boolean; overload; inline; static;
  228. Class Function TryParse(const AString: string; out AValue: Single; const AFormatSettings: TFormatSettings): Boolean; overload; inline; static;
  229. Procedure BuildUp(const ASignFlag: Boolean; const AMantissa: QWord; const AExponent: Integer);
  230. Function Exponent: Integer;
  231. Function Fraction: Extended;
  232. Function IsInfinity: Boolean; overload; inline;
  233. Function IsNan: Boolean; overload; inline;
  234. Function IsNegativeInfinity: Boolean; overload; inline;
  235. Function IsPositiveInfinity: Boolean; overload; inline;
  236. Function Mantissa: QWord;
  237. Function SpecialType: TFloatSpecial;
  238. Function ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline;
  239. Function ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer; const AFormatSettings: TFormatSettings): string; overload; inline;
  240. Function ToString(const AFormatSettings: TFormatSettings): string; overload; inline;
  241. Function ToString: string; overload; inline;
  242. property Bytes[AIndex: Cardinal]: Byte read GetB write SetB;
  243. property Words[AIndex: Cardinal]: Word read GetW write SetW;
  244. property Sign: Boolean read GetS write SetS;
  245. property Exp: QWord read GetE write SetE;
  246. property Frac: QWord read GetF write SetF;
  247. end;
  248. {$ENDIF FPC_HAS_TYPE_SINGLE}
  249. {$IFDEF FPC_HAS_TYPE_DOUBLE}
  250. TDoubleHelper = Type Helper for Double
  251. private
  252. Function GetB(AIndex: Cardinal): Byte;
  253. Function GetW(AIndex: Cardinal): Word;
  254. Function GetE: QWord; inline;
  255. Function GetF: QWord; inline;
  256. Function GetS: Boolean; inline;
  257. procedure SetB(AIndex: Cardinal; const AValue: Byte);
  258. procedure SetW(AIndex: Cardinal; const AValue: Word);
  259. procedure SetE(AValue: QWord);
  260. procedure SetF(AValue: QWord);
  261. procedure SetS(AValue: Boolean);
  262. public
  263. const
  264. {$push}
  265. {$R-}
  266. {$Q-}
  267. Epsilon : Double = 4.9406564584124654418e-324;
  268. MaxValue : Double = 1.7976931348623157081e+308;
  269. MinValue : Double = -1.7976931348623157081e+308;
  270. PositiveInfinity : Double = 1.0/0.0;
  271. NegativeInfinity : Double = -1.0/0.0;
  272. NaN : Double = 0.0/0.0;
  273. {$POP}
  274. Class Function IsInfinity(const AValue: Double): Boolean; overload; inline; static;
  275. Class Function IsNan(const AValue: Double): Boolean; overload; inline; static;
  276. Class Function IsNegativeInfinity(const AValue: Double): Boolean; overload; inline; static;
  277. Class Function IsPositiveInfinity(const AValue: Double): Boolean; overload; inline; static;
  278. Class Function Parse(const AString: string): Double; overload; inline; static;
  279. Class Function Parse(const AString: string; const AFormatSettings: TFormatSettings): Double; overload; inline; static;
  280. Class Function Size: Integer; inline; static;
  281. Class Function ToString(const AValue: Double): string; overload; inline; static;
  282. Class Function ToString(const AValue: Double; const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline; static;
  283. Class Function ToString(const AValue: Double; const AFormat: TFloatFormat; const APrecision, ADigits: Integer; const AFormatSettings: TFormatSettings): string; overload; inline; static;
  284. Class Function ToString(const AValue: Double; const AFormatSettings: TFormatSettings): string; overload; inline; static;
  285. Class Function TryParse(const AString: string; out AValue: Double): Boolean; overload; inline; static;
  286. Class Function TryParse(const AString: string; out AValue: Double; const AFormatSettings: TFormatSettings): Boolean; overload; inline; static;
  287. Procedure BuildUp(const ASignFlag: Boolean; const AMantissa: QWord; const AExponent: Integer);
  288. Function Exponent: Integer;
  289. Function Fraction: Extended;
  290. Function IsInfinity: Boolean; overload; inline;
  291. Function IsNan: Boolean; overload; inline;
  292. Function IsNegativeInfinity: Boolean; overload; inline;
  293. Function IsPositiveInfinity: Boolean; overload; inline;
  294. Function Mantissa: QWord;
  295. Function SpecialType: TFloatSpecial;
  296. Function ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline;
  297. Function ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer; const AFormatSettings: TFormatSettings): string; overload; inline;
  298. Function ToString(const AFormatSettings: TFormatSettings): string; overload; inline;
  299. Function ToString: string; overload; inline;
  300. property Bytes[AIndex: Cardinal]: Byte read GetB write SetB; // 0..7
  301. property Words[AIndex: Cardinal]: Word read GetW write SetW; // 0..3
  302. property Sign: Boolean read GetS write SetS;
  303. property Exp: QWord read GetE write SetE;
  304. property Frac: QWord read GetF write SetF;
  305. end;
  306. {$ENDIF FPC_HAS_TYPE_DOUBLE}
  307. {$ifdef FPC_HAS_TYPE_EXTENDED}
  308. TExtendedHelper = Type Helper for Extended
  309. private
  310. Function GetB(AIndex: Cardinal): Byte;
  311. Function GetW(AIndex: Cardinal): Word;
  312. Function GetE: QWord; inline;
  313. Function GetF: QWord; inline;
  314. Function GetS: Boolean; inline;
  315. procedure SetB(AIndex: Cardinal; const AValue: Byte);
  316. procedure SetW(AIndex: Cardinal; const AValue: Word);
  317. procedure SetE(AValue: QWord);
  318. procedure SetF(AValue: QWord);
  319. procedure SetS(AValue: Boolean);
  320. public
  321. {$push}
  322. {$R-}
  323. {$Q-}
  324. const
  325. Epsilon : Extended = 3.64519953188247460253e-4951;
  326. MaxValue : Extended = 1.18973149535723176505e+4932;
  327. MinValue : Extended = -1.18973149535723176505e+4932;
  328. PositiveInfinity : Extended = 1.0/0.0;
  329. NegativeInfinity : Extended = -1.0/0.0;
  330. NaN : Extended = 0.0/0.0;
  331. {$POP}
  332. Class Function ToString(const AValue: Extended): string; overload; inline; static;
  333. Class Function ToString(const AValue: Extended; const AFormatSettings: TFormatSettings): string; overload; inline; static;
  334. Class Function ToString(const AValue: Extended; const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline; static;
  335. Class Function ToString(const AValue: Extended; const AFormat: TFloatFormat; const APrecision, ADigits: Integer; const AFormatSettings: TFormatSettings): string; overload; inline; static;
  336. Class Function Parse(const AString: string): Extended; overload; inline; static;
  337. Class Function Parse(const AString: string; const AFormatSettings: TFormatSettings): Extended; overload; inline; static;
  338. Class Function TryParse(const AString: string; out AValue: Extended): Boolean; overload; inline; static;
  339. Class Function TryParse(const AString: string; out AValue: Extended; const AFormatSettings: TFormatSettings): Boolean; overload; inline; static;
  340. Class Function IsNan(const AValue: Extended): Boolean; overload; inline; static;
  341. Class Function IsInfinity(const AValue: Extended): Boolean; overload; inline; static;
  342. Class Function IsNegativeInfinity(const AValue: Extended): Boolean; overload; inline; static;
  343. Class Function IsPositiveInfinity(const AValue: Extended): Boolean; overload; inline; static;
  344. Class Function Size: Integer; inline; static;
  345. procedure BuildUp(const ASignFlag: Boolean; const AMantissa: QWord; Const AExponent: Integer);
  346. Function Exponent: Integer;
  347. Function Fraction: Extended;
  348. Function IsInfinity: Boolean; overload; inline;
  349. Function IsNan: Boolean; overload; inline;
  350. Function IsNegativeInfinity: Boolean; overload; inline;
  351. Function IsPositiveInfinity: Boolean; overload; inline;
  352. Function Mantissa: QWord;
  353. Function SpecialType: TFloatSpecial;
  354. Function ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline;
  355. Function ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer; const AFormatSettings: TFormatSettings): string; overload; inline;
  356. Function ToString(const AFormatSettings: TFormatSettings): string; overload; inline;
  357. Function ToString: string; overload; inline;
  358. property Bytes[AIndex: Cardinal]: Byte read GetB write SetB;
  359. property Words[AIndex: Cardinal]: Word read GetW write SetW;
  360. property Sign: Boolean read GetS write SetS;
  361. property Exp: QWord read GetE write SetE;
  362. property Frac: QWord read GetF write SetF;
  363. end;
  364. {$ENDIF FPC_HAS_TYPE_EXTENDED}
  365. TByteHelper = Type Helper for Byte
  366. public
  367. const
  368. MaxValue = 255;
  369. MinValue = 0;
  370. public
  371. Class Function Parse(const AString: string): Byte; inline; static;
  372. Class Function Size: Integer; inline; static;
  373. Class Function ToString(const AValue: Byte): string; overload; inline; static;
  374. Class Function TryParse(const AString: string; out AValue: Byte): Boolean; inline; static;
  375. Public
  376. Function ToBoolean: Boolean; inline;
  377. Function ToDouble: Double; inline;
  378. Function ToExtended: Extended; inline;
  379. Function ToBinString:string;
  380. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  381. Function ToHexString: string; overload; inline;
  382. Function ToSingle: Single; inline;
  383. Function ToString: string; overload; inline;
  384. Function SetBit(const Index: TByteBitIndex) : Byte; inline;
  385. Function ClearBit(const Index: TByteBitIndex) : Byte; inline;
  386. Function ToggleBit(const Index: TByteBitIndex) : Byte; inline;
  387. Function TestBit(const Index:TByteBitIndex):Boolean; inline;
  388. end;
  389. TShortIntHelper = Type Helper for ShortInt
  390. public
  391. const
  392. MaxValue = 127;
  393. MinValue = -128;
  394. public
  395. Class Function Parse(const AString: string): ShortInt; inline; static;
  396. Class Function Size: Integer; inline; static;
  397. Class Function ToString(const AValue: ShortInt): string; overload; inline; static;
  398. Class Function TryParse(const AString: string; out AValue: ShortInt): Boolean; inline; static;
  399. public
  400. Function ToBoolean: Boolean; inline;
  401. Function ToDouble: Double; inline;
  402. Function ToExtended: Extended; inline;
  403. Function ToBinString:string; inline;
  404. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  405. Function ToHexString: string; overload; inline;
  406. Function ToSingle: Single; inline;
  407. Function ToString: string; overload; inline;
  408. Function SetBit(const Index: TShortIntBitIndex): Shortint; inline;
  409. Function ClearBit(const Index: TShortIntBitIndex): Shortint; inline;
  410. Function ToggleBit(const Index: TShortIntBitIndex): Shortint; inline;
  411. Function TestBit(const Index:TShortIntBitIndex):Boolean;
  412. end;
  413. TSmallIntHelper = Type Helper for SmallInt
  414. public
  415. const
  416. MaxValue = 32767;
  417. MinValue = -32768;
  418. public
  419. Class Function Parse(const AString: string): SmallInt; inline; static;
  420. Class Function Size: Integer; inline; static;
  421. Class Function ToString(const AValue: SmallInt): string; overload; inline; static;
  422. Class Function TryParse(const AString: string; out AValue: SmallInt): Boolean; inline; static;
  423. public
  424. Function ToString: string; overload; inline;
  425. Function ToBoolean: Boolean; inline;
  426. Function ToBinString:string; inline;
  427. Function ToHexString: string; overload; inline;
  428. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  429. Function ToSingle: Single; inline;
  430. Function ToDouble: Double; inline;
  431. Function ToExtended: Extended; inline;
  432. Function SetBit(const Index: TSmallIntBitIndex) : Smallint; inline;
  433. Function ClearBit(const Index: TSmallIntBitIndex) : Smallint; inline;
  434. Function ToggleBit(const Index: TSmallIntBitIndex) : Smallint; inline;
  435. Function TestBit(const Index:TSmallIntBitIndex):Boolean;
  436. end;
  437. TWordHelper = Type Helper for Word
  438. public
  439. const
  440. MaxValue = 65535;
  441. MinValue = 0;
  442. Public
  443. Class Function Parse(const AString: string): Word; inline; static;
  444. Class Function Size: Integer; inline; static;
  445. Class Function ToString(const AValue: Word): string; overload; inline; static;
  446. Class Function TryParse(const AString: string; out AValue: Word): Boolean; inline; static;
  447. Public
  448. Function ToBoolean: Boolean; inline;
  449. Function ToDouble: Double; inline;
  450. Function ToExtended: Extended; inline;
  451. Function ToBinString:string; inline;
  452. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  453. Function ToHexString: string; overload; inline;
  454. Function ToSingle: Single; inline;
  455. Function ToString: string; overload; inline;
  456. Function SetBit(const Index: TWordBitIndex) : Word; inline;
  457. Function ClearBit(const Index: TWordBitIndex) : Word; inline;
  458. Function ToggleBit(const Index: TWordBitIndex) : Word; inline;
  459. Function TestBit(const Index:TWordBitIndex):Boolean; inline;
  460. end;
  461. TCardinalHelper = Type Helper for Cardinal { for LongWord Type too }
  462. public
  463. const
  464. MaxValue = 4294967295;
  465. MinValue = 0;
  466. Public
  467. Class Function Parse(const AString: string): Cardinal; inline; static;
  468. Class Function Size: Integer; inline; static;
  469. Class Function ToString(const AValue: Cardinal): string; overload; inline; static;
  470. Class Function TryParse(const AString: string; out AValue: Cardinal): Boolean; inline; static;
  471. Public
  472. Function ToBoolean: Boolean; inline;
  473. Function ToDouble: Double; inline;
  474. Function ToExtended: Extended; inline;
  475. Function ToBinString:string; inline;
  476. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  477. Function ToHexString: string; overload; inline;
  478. Function ToSingle: Single; inline;
  479. Function ToString: string; overload; inline;
  480. Function SetBit(const Index: TCardinalBitIndex) : Cardinal; inline;
  481. Function ClearBit(const Index: TCardinalBitIndex) : Cardinal; inline;
  482. Function ToggleBit(const Index: TCardinalBitIndex) : Cardinal; inline;
  483. Function TestBit(const Index:TCardinalBitIndex):Boolean; inline;
  484. end;
  485. TIntegerHelper = Type Helper for Integer { for LongInt Type too }
  486. public
  487. const
  488. MaxValue = 2147483647;
  489. MinValue = -2147483648;
  490. Public
  491. Class Function Size: Integer; inline; static;
  492. Class Function ToString(const AValue: Integer): string; overload; inline; static;
  493. Class Function Parse(const AString: string): Integer; inline; static;
  494. Class Function TryParse(const AString: string; out AValue: Integer): Boolean; inline; static;
  495. Public
  496. Function ToBoolean: Boolean; inline;
  497. Function ToDouble: Double; inline;
  498. Function ToExtended: Extended; inline;
  499. Function ToBinString:string; inline;
  500. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  501. Function ToHexString: string; overload; inline;
  502. Function ToSingle: Single; inline;
  503. Function ToString: string; overload; inline;
  504. Function SetBit(const Index: TIntegerBitIndex) : Integer; inline;
  505. Function ClearBit(const Index: TIntegerBitIndex) : Integer; inline;
  506. Function ToggleBit(const Index: TIntegerBitIndex) : Integer; inline;
  507. Function TestBit(const Index:TIntegerBitIndex):Boolean; inline;
  508. end;
  509. TInt64Helper = Type Helper for Int64
  510. public
  511. const
  512. MaxValue = 9223372036854775807;
  513. MinValue = -9223372036854775808;
  514. Public
  515. Class Function Parse(const AString: string): Int64; inline; static;
  516. Class Function Size: Integer; inline; static;
  517. Class Function ToString(const AValue: Int64): string; overload; inline; static;
  518. Class Function TryParse(const AString: string; out AValue: Int64): Boolean; inline; static;
  519. Public
  520. Function ToBoolean: Boolean; inline;
  521. Function ToDouble: Double; inline;
  522. Function ToExtended: Extended; inline;
  523. Function ToBinString:string; inline;
  524. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  525. Function ToHexString: string; overload; inline;
  526. Function ToSingle: Single; inline;
  527. Function ToString: string; overload; inline;
  528. Function SetBit(const Index: TInt64BitIndex) : Int64; inline;
  529. Function ClearBit(const Index: TInt64BitIndex) : Int64; inline;
  530. Function ToggleBit(const Index: TInt64BitIndex) : Int64; inline;
  531. Function TestBit(const Index:TInt64BitIndex):Boolean; inline;
  532. end;
  533. TQWordHelper = Type Helper for QWord
  534. public
  535. const
  536. MaxValue = 18446744073709551615;
  537. MinValue = 0;
  538. Public
  539. Class Function Parse(const AString: string): QWord; inline; static;
  540. Class Function Size: Integer; inline; static;
  541. Class Function ToString(const AValue: QWord): string; overload; inline; static;
  542. Class Function TryParse(const AString: string; out AValue: QWord): Boolean; inline; static;
  543. Public
  544. Function ToBoolean: Boolean; inline;
  545. Function ToDouble: Double; inline;
  546. Function ToExtended: Extended; inline;
  547. Function ToBinString:string; inline;
  548. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  549. Function ToHexString: string; overload; inline;
  550. Function ToSingle: Single; inline;
  551. Function ToString: string; overload; inline;
  552. Function SetBit(const Index: TQwordBitIndex) : QWord; inline;
  553. Function ClearBit(const Index: TQwordBitIndex) : QWord; inline;
  554. Function ToggleBit(const Index: TQwordBitIndex) : QWord; inline;
  555. Function TestBit(const Index:TQwordBitIndex):Boolean; inline;
  556. end;
  557. TNativeIntHelper = Type Helper for NativeInt
  558. public
  559. const
  560. MaxValue = High(NativeInt);
  561. MinValue = Low(NativeInt);
  562. Public
  563. Class Function Parse(const AString: string): NativeInt; inline; static;
  564. Class Function Size: Integer; inline; static;
  565. Class Function ToString(const AValue: NativeInt): string; overload; inline; static;
  566. Class Function TryParse(const AString: string; out AValue: NativeInt): Boolean; inline; static;
  567. Public
  568. Function ToBoolean: Boolean; inline;
  569. Function ToDouble: Double; inline;
  570. Function ToExtended: Extended; inline;
  571. Function ToBinString:string; inline;
  572. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  573. Function ToHexString: string; overload; inline;
  574. Function ToSingle: Single; inline;
  575. Function ToString: string; overload; inline;
  576. Function SetBit(const Index: TNativeIntBitIndex) : NativeInt; inline;
  577. Function ClearBit(const Index: TNativeIntBitIndex) : NativeInt; inline;
  578. Function ToggleBit(const Index: TNativeIntBitIndex) : NativeInt; inline;
  579. Function TestBit(const Index:TNativeIntBitIndex):Boolean; inline;
  580. end;
  581. TNativeUIntHelper = Type Helper for NativeUInt
  582. public
  583. const
  584. MaxValue = High(NativeUInt);
  585. MinValue = 0;
  586. Public
  587. Class Function Parse(const AString: string): NativeUInt; inline; static;
  588. Class Function Size: Integer; inline; static;
  589. Class Function ToString(const AValue: NativeUInt): string; overload; inline; static;
  590. Class Function TryParse(const AString: string; out AValue: NativeUInt): Boolean; inline; static;
  591. Public
  592. Function ToBoolean: Boolean; inline;
  593. Function ToDouble: Double; inline;
  594. Function ToExtended: Extended; inline;
  595. Function ToBinString:string; inline;
  596. Function ToHexString(const AMinDigits: Integer): string; overload; inline;
  597. Function ToHexString: string; overload; inline;
  598. Function ToSingle: Single; inline;
  599. Function ToString: string; overload; inline;
  600. Function SetBit(const Index: TNativeUIntBitIndex) : NativeUint; inline;
  601. Function ClearBit(const Index: TNativeUIntBitIndex): NativeUint; inline;
  602. Function ToggleBit(const Index: TNativeUIntBitIndex) : NativeUint; inline;
  603. Function TestBit(const Index:TNativeUIntBitIndex) :Boolean; inline;
  604. end;
  605. {$SCOPEDENUMS ON}
  606. TUseBoolStrs = (False, True);
  607. {$SCOPEDENUMS OFF}
  608. TBooleanHelper = Type Helper for Boolean
  609. public
  610. Class Function Parse(const S: string): Boolean; inline; static;
  611. Class Function Size: Integer; inline; static;
  612. Class Function ToString(const AValue: Boolean; UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline; static;
  613. Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;
  614. Public
  615. Function ToInteger: Integer; inline;
  616. Function ToString(UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline;
  617. end;
  618. TByteBoolHelper = Type Helper for ByteBool
  619. public
  620. Class Function Parse(const S: string): Boolean; inline; static;
  621. Class Function Size: Integer; inline; static;
  622. Class Function ToString(const AValue: Boolean; UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline; static;
  623. Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;
  624. Public
  625. Function ToInteger: Integer; inline;
  626. Function ToString(UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline;
  627. end;
  628. TWordBoolHelper = Type Helper for WordBool
  629. public
  630. Class Function Parse(const S: string): Boolean; inline; static;
  631. Class Function Size: Integer; inline; static;
  632. Class Function ToString(const AValue: Boolean; UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline; static;
  633. Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;
  634. Public
  635. Function ToInteger: Integer; inline;
  636. Function ToString(UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline;
  637. end;
  638. TLongBoolHelper = Type Helper for LongBool
  639. public
  640. Class Function Parse(const S: string): Boolean; inline; static;
  641. Class Function Size: Integer; inline; static;
  642. Class Function ToString(const AValue: Boolean; UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline; static;
  643. Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;
  644. public
  645. Function ToInteger: Integer; inline;
  646. Function ToString(UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline;
  647. end;