/AKdTopic/AKTools/akDataUtils.pas

https://github.com/aklabsus/locrep · Pascal · 234 lines · 186 code · 35 blank · 13 comment · 30 complexity · eaa8f076ecb1e5e5b81ca750dd6cae06 MD5 · raw file

  1. // AKTools akDataUtils unit.
  2. // Ìîäóëü, ñîäåðæàùèé ôóíêöèè ïî ðàáîòå ñ ðàçëè÷íûìè äàííûìè.
  3. //=============================================================================
  4. unit akDataUtils;
  5. interface
  6. uses SysUtils, Classes, Windows;
  7. // Âîçâðàùàåò ïîðÿäêîâûé íîìåð ýëåìåíòà ìàññèâà â êîòîðîì çàïèñàíî çíà÷åíèå
  8. // Data. Åñëè òàêîãî ýëåìåíòà íå íàéäåíî, òî âåðíåòñÿ -1.
  9. function DataInArray(Data: Integer; Arr: array of Integer): Integer; overload;
  10. function DataInArray(Data: Boolean; Arr: array of Boolean): Integer; overload;
  11. function DataInArray(Data: Double; Arr: array of Double): Integer; overload;
  12. function DataInArray(Data: string; Arr: array of string; IgnoreCase: Boolean): Integer; overload;
  13. function DataInArray(Data: string; Arr: TStrings; IgnoreCase: Boolean): Integer; overload;
  14. function DataInArray(Data: Pointer; Arr: TList): Integer; overload;
  15. // Âîçâðàùàåò ÷èñëî, çàïèñàííîå â áèòàõ first-last â value.
  16. function GetBits(value: Integer; first, last: Byte): DWORD;
  17. // Ñ÷èòàåò CRC32 óêàçàííîé ñòðîêè.
  18. function GetStringCRC(Str: string; UseZero: Boolean = true): Cardinal;
  19. // Åñëè çíà÷åíèå âåðíî ôóíêöèÿ âåðíåò v1, èíà÷å - v2
  20. function iifs(Expr: boolean; v1, v2: Integer): Integer; overload;
  21. function iifs(Expr: boolean; v1, v2: string): string; overload;
  22. function iifs(Expr: boolean; v1, v2: Boolean): Boolean; overload;
  23. function iif(Expr: boolean; v1, v2: variant): variant;
  24. // Ñðàâíèâàåò çíà÷åíèå äâóõ ïåðåìåííûõ. Âîçâðàùàåò :
  25. // îòðèöàòåëüíîå ÷èñëî - åñëè a ìåíüøå b
  26. // íîëü - îíè ðàíû
  27. // ïîëîæèòåëüíîå ÷èñëî - a áîëüøå b
  28. function UniCompare(val1, val2: string): Integer; overload;
  29. function UniCompare(val1, val2: TDateTime): Integer; overload;
  30. function UniCompare(val1, val2: Integer): Integer; overload;
  31. implementation
  32. const CRC32Polynomial = $EDB88320;
  33. var crc_32_tab: array[byte] of longword;
  34. function DataInArray(Data: string; Arr: array of string; IgnoreCase: Boolean): Integer;
  35. var i: Integer;
  36. begin
  37. Result := -1;
  38. for i := Low(Arr) to High(Arr) do
  39. if ((IgnoreCase) and (AnsiCompareText(Data, Arr[i]) = 0)) or
  40. ((not IgnoreCase) and (AnsiCompareStr(Data, Arr[i]) = 0)) then
  41. begin
  42. Result := i;
  43. Break;
  44. end;
  45. end;
  46. function DataInArray(Data: Integer; Arr: array of Integer): Integer;
  47. var i: Integer;
  48. begin
  49. Result := -1;
  50. for i := Low(Arr) to High(Arr) do
  51. if (Data = Arr[i]) then
  52. begin
  53. Result := i;
  54. Break;
  55. end;
  56. end;
  57. function DataInArray(Data: Boolean; Arr: array of Boolean): Integer;
  58. var i: Integer;
  59. begin
  60. Result := -1;
  61. for i := Low(Arr) to High(Arr) do
  62. if (Data = Arr[i]) then
  63. begin
  64. Result := i;
  65. Break;
  66. end;
  67. end;
  68. function DataInArray(Data: Double; Arr: array of Double): Integer;
  69. var i: Integer;
  70. begin
  71. Result := -1;
  72. for i := Low(Arr) to High(Arr) do
  73. if (Data = Arr[i]) then
  74. begin
  75. Result := i;
  76. Break;
  77. end;
  78. end;
  79. function DataInArray(Data: string; Arr: TStrings; IgnoreCase: Boolean): Integer; overload;
  80. var i: Integer;
  81. begin
  82. Result := -1;
  83. for i := 0 to Arr.Count - 1 do
  84. if ((AnsiCompareText(Arr[i], Data) = 0) and (IgnoreCase)) or
  85. ((CompareStr(Arr[i], Data) = 0) and (not IgnoreCase)) then
  86. begin
  87. Result := i;
  88. Break;
  89. end;
  90. end;
  91. function DataInArray(Data: Pointer; Arr: TList): Integer; overload;
  92. var i: Integer;
  93. begin
  94. Result := -1;
  95. for i := 0 to Arr.Count - 1 do
  96. if (Arr[i] = Data) then begin
  97. Result := i;
  98. Break;
  99. end;
  100. end;
  101. function GetBits(value: Integer; first, last: Byte): DWORD;
  102. var f, l: Integer;
  103. a1, a2: DWord;
  104. begin
  105. l := last; f := first;
  106. if f < 0 then f := 0;
  107. if l > 31 then l := 31;
  108. a1 := (value shr (f));
  109. a2 := a1 shl (31 - (l - f));
  110. Result := a2 shr (31 - (l - f))
  111. end;
  112. procedure BuildCRC32Table;
  113. {* (c) Burnashov Alexander alexburn@metrocom.ru *}
  114. var i, j: byte; crc: longword;
  115. begin
  116. for i := 0 to 255 do
  117. begin
  118. crc := i;
  119. for j := 8 downto 1 do
  120. if (crc and 1) <> 0 then
  121. crc := (crc shr 1) xor CRC32Polynomial
  122. else
  123. crc := crc shr 1;
  124. crc_32_tab[i] := crc;
  125. end;
  126. end;
  127. function UpdC32(octet: BYTE; crc: Cardinal): Cardinal;
  128. begin
  129. Result := crc_32_tab[BYTE(crc xor Cardinal(octet))] xor
  130. ((crc shr 8) and $00FFFFFF)
  131. end;
  132. function GetStringCRC(Str: string; UseZero: Boolean): Cardinal;
  133. const FirstRun: Boolean = true;
  134. type TAr = array[0..3] of byte;
  135. var
  136. l, crc: Cardinal;
  137. counter: SmallInt;
  138. ar: TAr absolute crc;
  139. am: TAr absolute l;
  140. begin
  141. if FirstRun then
  142. begin
  143. BuildCRC32Table;
  144. FirstRun := False;
  145. end;
  146. crc := $FFFFFFFF;
  147. for counter := 1 to Length(Str) do
  148. crc := UpdC32(Byte(Str[counter]), crc);
  149. am[0] := ar[3]; am[1] := ar[2]; am[2] := ar[1]; am[3] := ar[0];
  150. Result := l;
  151. if (Result = 0) and (not UseZero) then Result := 1;
  152. end;
  153. function iif(Expr: boolean; v1, v2: variant): variant;
  154. begin
  155. if Expr then
  156. Result := v1
  157. else
  158. Result := v2;
  159. end;
  160. function iifs(Expr: boolean; v1, v2: Integer): Integer; overload;
  161. begin
  162. if Expr then
  163. Result := v1
  164. else
  165. Result := v2;
  166. end;
  167. function iifs(Expr: boolean; v1, v2: string): string; overload;
  168. begin
  169. if Expr then
  170. Result := v1
  171. else
  172. Result := v2;
  173. end;
  174. function iifs(Expr: boolean; v1, v2: Boolean): Boolean; overload;
  175. begin
  176. if Expr then
  177. Result := v1
  178. else
  179. Result := v2;
  180. end;
  181. function UniCompare(val1, val2: string): Integer; overload;
  182. begin
  183. Result := CompareText(val1, val2);
  184. end;
  185. function UniCompare(val1, val2: TDateTime): Integer; overload;
  186. begin
  187. Result := 0;
  188. if val1 = val2 then Result := 0;
  189. if val1 > val2 then Result := 1;
  190. if val1 < val2 then Result := -1;
  191. end;
  192. function UniCompare(val1, val2: Integer): Integer; overload;
  193. begin
  194. Result := 0;
  195. if val1 = val2 then Result := 0;
  196. if val1 > val2 then Result := 1;
  197. if val1 < val2 then Result := -1;
  198. end;
  199. end.