variant.inc 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2001 by the Free Pascal development team
  4. This include file contains the implementation for variants
  5. support in FPC as far as it is part of the system unit
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. var
  13. variantmanager : tvariantmanager;
  14. { ---------------------------------------------------------------------
  15. Compiler helper routines.
  16. ---------------------------------------------------------------------}
  17. procedure fpc_variant_init(var v : tvardata);[Public,Alias:'FPC_VARIANT_INIT'];compilerproc;
  18. begin
  19. { calling the variant manager here is a problem because the static/global variants
  20. are initialized while the variant manager isn't assigned }
  21. fillchar(v,sizeof(variant),0);
  22. end;
  23. procedure fpc_variant_clear(var v : tvardata);[Public,Alias:'FPC_VARIANT_CLEAR'];compilerproc;
  24. begin
  25. if assigned(VarClearProc) then
  26. VarClearProc(v);
  27. end;
  28. { declare aliases for local use }
  29. procedure variant_init(var v: tvardata); external name 'FPC_VARIANT_INIT';
  30. procedure variant_clear(var v: tvardata); external name 'FPC_VARIANT_CLEAR';
  31. procedure variant_addref(var v : tvardata);[Public,Alias:'FPC_VARIANT_ADDREF'];
  32. begin
  33. if assigned(VarAddRefProc) then
  34. VarAddRefProc(v);
  35. end;
  36. {$ifdef FPC_VARIANTCOPY_FIXED}
  37. procedure fpc_variant_copy(var d: tvardata; const s : tvardata);[Public,Alias:'FPC_VARIANT_COPY']; compilerproc;
  38. begin
  39. if assigned(VarCopyProc) then
  40. VarCopyProc(d,s);
  41. end;
  42. procedure fpc_variant_copy_overwrite(constref source: tvardata; var dest : tvardata);[Public,Alias:'FPC_VARIANT_COPY_OVERWRITE']; compilerproc;
  43. begin
  44. dest.VType := varEmpty;
  45. if assigned(VarCopyProc) then
  46. VarCopyProc(dest,source);
  47. end;
  48. {$else FPC_VARIANTCOPY_FIXED}
  49. { using pointers as argument here makes life for the compiler easier }
  50. procedure fpc_variant_copy(d,s : pointer);[Public,Alias:'FPC_VARIANT_COPY']; compilerproc;
  51. begin
  52. if assigned(VarCopyProc) then
  53. VarCopyProc(tvardata(d^),tvardata(s^));
  54. end;
  55. { using pointers as argument here makes life for the compiler easier, overwrites target without finalizing }
  56. procedure fpc_variant_copy_overwrite(source, dest : pointer);[Public,Alias:'FPC_VARIANT_COPY_OVERWRITE']; compilerproc;
  57. begin
  58. tvardata(dest^).VType := varEmpty;
  59. if assigned(VarCopyProc) then
  60. VarCopyProc(tvardata(dest^),tvardata(source^));
  61. end;
  62. {$endif FPC_VARIANTCOPY_FIXED}
  63. Procedure fpc_write_text_variant(Len : Longint;var f : Text;const v : variant); iocheck; [Public,Alias:'FPC_WRITE_TEXT_VARIANT']; compilerproc;
  64. begin
  65. if (InOutRes<>0) then
  66. exit;
  67. case TextRec(f).mode of
  68. { fmAppend gets changed to fmOutPut in do_open (JM) }
  69. fmOutput:
  70. if len=-1 then
  71. variantmanager.write0variant(f,v)
  72. else
  73. variantmanager.writevariant(f,v,len);
  74. fmInput:
  75. InOutRes:=105
  76. else InOutRes:=103;
  77. end;
  78. end;
  79. procedure fpc_vararray_get(var d : variant;const s : variant;indices : plongint;len : sizeint);compilerproc;
  80. begin
  81. d:=variantmanager.vararrayget(s,len,indices);
  82. end;
  83. procedure fpc_vararray_put(var d : variant;const s : variant;indices : plongint;len : sizeint);compilerproc;
  84. begin
  85. variantmanager.vararrayput(d,s,len,indices);
  86. end;
  87. function fpc_variant_to_dynarray(const v : variant;typeinfo : pointer) : fpc_stub_dynarray;compilerproc;
  88. begin
  89. fpc_dynarray_clear(pointer(result),typeinfo);
  90. variantmanager.vartodynarray(pointer(result),v,typeinfo);
  91. end;
  92. function fpc_dynarray_to_variant(dynarr : pointer;typeinfo : pointer) : variant;compilerproc;
  93. begin
  94. variantmanager.varfromdynarray(result,dynarr,typeinfo);
  95. end;
  96. function fpc_variant_to_interface(const v : variant) : iinterface;compilerproc;
  97. begin
  98. variantmanager.vartointf(result,v);
  99. end;
  100. function fpc_interface_to_variant(const i : iinterface) : variant;compilerproc;
  101. begin
  102. variantmanager.varfromintf(result,i);
  103. end;
  104. function fpc_variant_to_idispatch(const v : variant) : idispatch;compilerproc;
  105. begin
  106. variantmanager.vartodisp(result,v);
  107. end;
  108. function fpc_idispatch_to_variant(const i : idispatch) : variant;compilerproc;
  109. begin
  110. variantmanager.varfromdisp(result,i);
  111. end;
  112. procedure fpc_dispinvoke_variant(dest : pvardata;var source : tvardata;
  113. calldesc : pcalldesc;params : pointer); compilerproc;
  114. begin
  115. variantmanager.dispinvoke(dest,source,calldesc,params);
  116. end;
  117. { ---------------------------------------------------------------------
  118. Overloaded operators.
  119. ---------------------------------------------------------------------}
  120. { Integer }
  121. operator :=(const source : byte) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  122. begin
  123. Variantmanager.varfromInt(Dest,Source,1);
  124. end;
  125. operator :=(const source : shortint) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  126. begin
  127. Variantmanager.varfromInt(Dest,Source,-1);
  128. end;
  129. operator :=(const source : word) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  130. begin
  131. Variantmanager.varfromInt(Dest,Source,2);
  132. end;
  133. operator :=(const source : smallint) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  134. begin
  135. Variantmanager.varfromInt(Dest,Source,-2);
  136. end;
  137. operator :=(const source : dword) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  138. begin
  139. Variantmanager.varfromInt(Dest,Source,4);
  140. end;
  141. operator :=(const source : longint) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  142. begin
  143. Variantmanager.varfromInt(Dest,Source,-4);
  144. end;
  145. operator :=(const source : qword) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  146. begin
  147. Variantmanager.varfromWord64(Dest,Source);
  148. end;
  149. operator :=(const source : int64) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  150. begin
  151. Variantmanager.varfromInt64(Dest,Source);
  152. end;
  153. { Boolean }
  154. operator :=(const source : boolean) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  155. begin
  156. Variantmanager.varfromBool(Dest,Source);
  157. end;
  158. operator :=(const source : wordbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  159. begin
  160. Variantmanager.varfromBool(Dest,Boolean(Source));
  161. end;
  162. operator :=(const source : longbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  163. begin
  164. Variantmanager.varfromBool(Dest,Boolean(Source));
  165. end;
  166. { Chars }
  167. operator :=(const source : char) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  168. begin
  169. VariantManager.VarFromPStr(Dest,Source);
  170. end;
  171. operator :=(const source : widechar) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  172. var
  173. ws : WideString;
  174. begin
  175. ws:=source;
  176. Variantmanager.varfromwstr(Dest,ws);
  177. end;
  178. { Strings }
  179. operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  180. begin
  181. VariantManager.VarFromPStr(Dest,Source);
  182. end;
  183. operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  184. begin
  185. VariantManager.VarFromLStr(Dest,Source);
  186. end;
  187. operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  188. begin
  189. VariantManager.VarFromWStr(Dest,Source);
  190. end;
  191. operator :=(const source : UTF8String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  192. begin
  193. VariantManager.VarFromWStr(Dest,UTF8Decode(Source));
  194. end;
  195. operator :=(const source : UCS4String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  196. begin
  197. VariantManager.VarFromWStr(Dest,UCS4StringToWideString(Source));
  198. end;
  199. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  200. operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  201. begin
  202. VariantManager.VarFromWStr(Dest,Source);
  203. end;
  204. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  205. { Floats }
  206. {$ifdef SUPPORT_SINGLE}
  207. operator :=(const source : single) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  208. begin
  209. VariantManager.VarFromReal(Dest,Source);
  210. end;
  211. {$endif SUPPORT_SINGLE}
  212. {$ifdef SUPPORT_DOUBLE}
  213. operator :=(const source : double) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  214. begin
  215. VariantManager.VarFromReal(Dest,Source);
  216. end;
  217. {$endif SUPPORT_DOUBLE}
  218. {$ifdef SUPPORT_EXTENDED}
  219. operator :=(const source : extended) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  220. begin
  221. VariantManager.VarFromReal(Dest,Source);
  222. end;
  223. {$endif SUPPORT_EXTENDED}
  224. {$ifdef SUPPORT_COMP}
  225. Operator :=(const source : comp) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  226. begin
  227. VariantManager.VarFromReal(Dest,Source);
  228. end;
  229. {$endif SUPPORT_COMP}
  230. {$ifndef FPUNONE}
  231. Operator :=(const source : real) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  232. begin
  233. VariantManager.VarFromReal(Dest,Source);
  234. end;
  235. {$endif}
  236. { Misc. }
  237. operator :=(const source : currency) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  238. begin
  239. VariantManager.VarFromCurr(Dest,Source);
  240. end;
  241. {$ifndef FPUNONE}
  242. operator :=(const source : tdatetime) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  243. begin
  244. VariantManager.VarFromTDateTime(Dest,Source);
  245. end;
  246. {$endif}
  247. operator :=(const source : terror) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  248. begin
  249. Variantmanager.varfromInt(Dest,Source,-sizeof(terror));
  250. end;
  251. {**********************************************************************
  252. from Variant assignments
  253. **********************************************************************}
  254. { Integer }
  255. operator :=(const source : variant) dest : byte;{$ifdef SYSTEMINLINE}inline;{$endif}
  256. begin
  257. dest:=variantmanager.vartoint(source);
  258. end;
  259. operator :=(const source : variant) dest : shortint;{$ifdef SYSTEMINLINE}inline;{$endif}
  260. begin
  261. dest:=variantmanager.vartoint(source);
  262. end;
  263. operator :=(const source : variant) dest : word;{$ifdef SYSTEMINLINE}inline;{$endif}
  264. begin
  265. dest:=variantmanager.vartoint(source);
  266. end;
  267. operator :=(const source : variant) dest : smallint;{$ifdef SYSTEMINLINE}inline;{$endif}
  268. begin
  269. dest:=variantmanager.vartoint(source);
  270. end;
  271. operator :=(const source : variant) dest : dword;{$ifdef SYSTEMINLINE}inline;{$endif}
  272. begin
  273. dest:=variantmanager.vartoint(source);
  274. end;
  275. operator :=(const source : variant) dest : longint;{$ifdef SYSTEMINLINE}inline;{$endif}
  276. begin
  277. dest:=variantmanager.vartoint(source);
  278. end;
  279. operator :=(const source : variant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif}
  280. begin
  281. dest:=variantmanager.vartoword64(source);
  282. end;
  283. operator :=(const source : variant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif}
  284. begin
  285. dest:=variantmanager.vartoint64(source);
  286. end;
  287. { Boolean }
  288. operator :=(const source : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  289. begin
  290. dest:=variantmanager.vartobool(source);
  291. end;
  292. operator :=(const source : variant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  293. begin
  294. dest:=variantmanager.vartobool(source);
  295. end;
  296. operator :=(const source : variant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  297. begin
  298. dest:=variantmanager.vartobool(source);
  299. end;
  300. { Chars }
  301. operator :=(const source : variant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif}
  302. Var
  303. S : String;
  304. begin
  305. VariantManager.VarToPStr(S,Source);
  306. If Length(S)>0 then
  307. Dest:=S[1];
  308. end;
  309. operator :=(const source : variant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif}
  310. Var
  311. S : WideString;
  312. begin
  313. VariantManager.vartowstr(S,Source);
  314. If Length(S)>0 then
  315. Dest:=S[1];
  316. end;
  317. { Strings }
  318. operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
  319. begin
  320. VariantManager.VarToPStr(Dest,Source);
  321. end;
  322. operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
  323. begin
  324. VariantManager.vartolstr(dest,source);
  325. end;
  326. operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
  327. begin
  328. variantmanager.vartowstr(dest,source);
  329. end;
  330. operator :=(const source : variant) dest : UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
  331. var
  332. temp : Widestring;
  333. begin
  334. VariantManager.VarToWStr(temp,Source);
  335. dest:=UTF8Encode(temp);
  336. end;
  337. {$ifdef dummy}
  338. operator :=(const source : variant) dest : UCS4String;{$ifdef SYSTEMINLINE}inline;{$endif}
  339. var
  340. temp : Widestring;
  341. begin
  342. VariantManager.VarToWStr(temp,Source);
  343. dest:=WideStringToUCS4String(temp);
  344. end;
  345. {$endif dummy}
  346. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  347. operator :=(const source : variant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
  348. var
  349. res : WideString;
  350. begin
  351. variantmanager.vartowstr(res,source);
  352. dest:=res;
  353. end;
  354. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  355. { Floats }
  356. {$ifdef SUPPORT_SINGLE}
  357. operator :=(const source : variant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
  358. begin
  359. dest:=variantmanager.vartoreal(source);
  360. end;
  361. {$endif SUPPORT_SINGLE}
  362. {$ifdef SUPPORT_DOUBLE}
  363. operator :=(const source : variant) dest : double;{$ifdef SYSTEMINLINE}inline;{$endif}
  364. begin
  365. dest:=variantmanager.vartoreal(source);
  366. end;
  367. {$endif SUPPORT_DOUBLE}
  368. {$ifdef SUPPORT_EXTENDED}
  369. operator :=(const source : variant) dest : extended;{$ifdef SYSTEMINLINE}inline;{$endif}
  370. begin
  371. dest:=variantmanager.vartoreal(source);
  372. end;
  373. {$endif SUPPORT_EXTENDED}
  374. {$ifdef SUPPORT_COMP}
  375. operator :=(const source : variant) dest : comp;{$ifdef SYSTEMINLINE}inline;{$endif}
  376. begin
  377. dest:=comp(variantmanager.vartoreal(source));
  378. end;
  379. {$endif SUPPORT_COMP}
  380. {$ifndef FPUNONE}
  381. operator :=(const source : variant) dest : real;{$ifdef SYSTEMINLINE}inline;{$endif}
  382. begin
  383. dest:=variantmanager.vartoreal(source);
  384. end;
  385. {$endif}
  386. { Misc. }
  387. operator :=(const source : variant) dest : currency;{$ifdef SYSTEMINLINE}inline;{$endif}
  388. begin
  389. dest:=variantmanager.vartocurr(source);
  390. end;
  391. {$ifndef FPUNONE}
  392. operator :=(const source : variant) dest : tdatetime;{$ifdef SYSTEMINLINE}inline;{$endif}
  393. begin
  394. dest:=variantmanager.vartotdatetime(source);
  395. end;
  396. {$endif}
  397. {$ifndef FPC_HASINTERNALOLEVARIANT2VARIANTCAST}
  398. operator :=(const source : olevariant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  399. begin
  400. tvardata(result):=tvardata(source);
  401. end;
  402. {$endif FPC_HASINTERNALOLEVARIANT2VARIANTCAST}
  403. operator :=(const source : variant) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  404. begin
  405. variantmanager.olevarfromvar(dest,source);
  406. end;
  407. operator :=(const source : variant) dest : terror;{$ifdef SYSTEMINLINE}inline;{$endif}
  408. begin
  409. dest:=variantmanager.vartoint(source);
  410. end;
  411. {**********************************************************************
  412. Operators
  413. **********************************************************************}
  414. operator or(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  415. begin
  416. dest:=op1;
  417. variantmanager.varop(dest,op2,opor);
  418. end;
  419. operator and(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  420. begin
  421. dest:=op1;
  422. variantmanager.varop(dest,op2,opand);
  423. end;
  424. operator xor(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  425. begin
  426. dest:=op1;
  427. variantmanager.varop(dest,op2,opxor);
  428. end;
  429. operator not(const op : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  430. begin
  431. dest:=op;
  432. variantmanager.varnot(dest);
  433. end;
  434. operator shl(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  435. begin
  436. dest:=op1;
  437. variantmanager.varop(dest,op2,opshiftleft);
  438. end;
  439. operator shr(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  440. begin
  441. dest:=op1;
  442. variantmanager.varop(dest,op2,opshiftright);
  443. end;
  444. operator +(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  445. begin
  446. dest:=op1;
  447. variantmanager.varop(dest,op2,opadd);
  448. end;
  449. operator -(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  450. begin
  451. dest:=op1;
  452. variantmanager.varop(dest,op2,opsubtract);
  453. end;
  454. operator *(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  455. begin
  456. dest:=op1;
  457. variantmanager.varop(dest,op2,opmultiply);
  458. end;
  459. operator /(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  460. begin
  461. dest:=op1;
  462. variantmanager.varop(dest,op2,opdivide);
  463. end;
  464. operator **(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  465. begin
  466. dest:=op1;
  467. variantmanager.varop(dest,op2,oppower);
  468. end;
  469. operator div(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  470. begin
  471. dest:=op1;
  472. variantmanager.varop(dest,op2,opintdivide);
  473. end;
  474. operator mod(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  475. begin
  476. dest:=op1;
  477. variantmanager.varop(dest,op2,opmodulus);
  478. end;
  479. operator -(const op : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  480. begin
  481. dest:=op;
  482. variantmanager.varneg(dest);
  483. end;
  484. operator =(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  485. begin
  486. dest:=variantmanager.cmpop(op1,op2,opcmpeq);
  487. end;
  488. operator <(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  489. begin
  490. dest:=variantmanager.cmpop(op1,op2,opcmplt);
  491. end;
  492. operator >(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  493. begin
  494. dest:=variantmanager.cmpop(op1,op2,opcmpgt);
  495. end;
  496. operator >=(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  497. begin
  498. dest:=variantmanager.cmpop(op1,op2,opcmpge);
  499. end;
  500. operator <=(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  501. begin
  502. dest:=variantmanager.cmpop(op1,op2,opcmple);
  503. end;
  504. procedure VarArrayRedim(var A: Variant; HighBound: SizeInt);
  505. begin
  506. variantmanager.vararrayredim(a,highbound);
  507. end;
  508. procedure VarArrayPut(var A: Variant; const Value: Variant; const Indices: array of Longint);
  509. begin
  510. if Length(Indices)>0 then
  511. variantmanager.vararrayput(A, Value, Length(Indices), @Indices[0])
  512. else
  513. variantmanager.vararrayput(A, Value, 0, nil);
  514. end;
  515. function VarArrayGet(const A: Variant; const Indices: array of Longint): Variant;
  516. begin
  517. if Length(Indices)>0 then
  518. Result:=variantmanager.vararrayget(A, Length(Indices), @Indices[0])
  519. else
  520. Result:=variantmanager.vararrayget(A, 0, nil);
  521. end;
  522. procedure VarCast(var dest : variant;const source : variant;vartype : longint);
  523. begin
  524. variantmanager.varcast(dest,source,vartype);
  525. end;
  526. {**********************************************************************
  527. from OLEVariant assignments
  528. **********************************************************************}
  529. { Integer }
  530. operator :=(const source : olevariant) dest : byte;{$ifdef SYSTEMINLINE}inline;{$endif}
  531. begin
  532. { cast away olevar to var conversion and avoid
  533. endless recursion }
  534. dest:=variantmanager.vartoint(variant(tvardata(source)));
  535. end;
  536. operator :=(const source : olevariant) dest : shortint;{$ifdef SYSTEMINLINE}inline;{$endif}
  537. begin
  538. dest:=variantmanager.vartoint(variant(tvardata(source)));
  539. end;
  540. operator :=(const source : olevariant) dest : word;{$ifdef SYSTEMINLINE}inline;{$endif}
  541. begin
  542. dest:=variantmanager.vartoint(variant(tvardata(source)));
  543. end;
  544. operator :=(const source : olevariant) dest : smallint;{$ifdef SYSTEMINLINE}inline;{$endif}
  545. begin
  546. dest:=variantmanager.vartoint(variant(tvardata(source)));
  547. end;
  548. operator :=(const source : olevariant) dest : dword;{$ifdef SYSTEMINLINE}inline;{$endif}
  549. begin
  550. dest:=variantmanager.vartoint(variant(tvardata(source)));
  551. end;
  552. operator :=(const source : olevariant) dest : longint;{$ifdef SYSTEMINLINE}inline;{$endif}
  553. begin
  554. dest:=variantmanager.vartoint(variant(tvardata(source)));
  555. end;
  556. operator :=(const source : olevariant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif}
  557. begin
  558. dest:=variantmanager.vartoint64(variant(tvardata(source)));
  559. end;
  560. operator :=(const source : olevariant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif}
  561. begin
  562. dest:=variantmanager.vartoword64(variant(tvardata(source)));
  563. end;
  564. { Boolean }
  565. operator :=(const source : olevariant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  566. begin
  567. dest:=variantmanager.vartobool(variant(tvardata(source)));
  568. end;
  569. operator :=(const source : olevariant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  570. begin
  571. dest:=variantmanager.vartobool(variant(tvardata(source)));
  572. end;
  573. operator :=(const source : olevariant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  574. begin
  575. dest:=variantmanager.vartobool(variant(tvardata(source)));
  576. end;
  577. { Chars }
  578. operator :=(const source : olevariant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif}
  579. var
  580. S : String;
  581. begin
  582. VariantManager.VarToPStr(S,Source);
  583. If Length(S)>0 then
  584. Dest:=S[1]
  585. else
  586. Dest:=#0;
  587. end;
  588. operator :=(const source : olevariant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif}
  589. Var
  590. WS : WideString;
  591. begin
  592. VariantManager.VarToWStr(WS,Source);
  593. If Length(WS)>0 then
  594. Dest:=WS[1]
  595. else
  596. Dest:=#0;
  597. end;
  598. { Strings }
  599. operator :=(const source : olevariant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
  600. begin
  601. variantmanager.vartopstr(dest,variant(tvardata(source)));
  602. end;
  603. operator :=(const source : olevariant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
  604. begin
  605. variantmanager.vartolstr(dest,variant(tvardata(source)));
  606. end;
  607. operator :=(const source : olevariant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
  608. begin
  609. variantmanager.vartowstr(dest,variant(tvardata(source)));
  610. end;
  611. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  612. operator :=(const source : olevariant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
  613. var
  614. res : WideString;
  615. begin
  616. variantmanager.vartowstr(res,variant(tvardata(source)));
  617. dest:=res;
  618. end;
  619. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  620. { Floats }
  621. {$ifdef SUPPORT_SINGLE}
  622. operator :=(const source : olevariant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
  623. begin
  624. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  625. end;
  626. {$endif SUPPORT_SINGLE}
  627. {$ifdef SUPPORT_DOUBLE}
  628. operator :=(const source : olevariant) dest : double;{$ifdef SYSTEMINLINE}inline;{$endif}
  629. begin
  630. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  631. end;
  632. {$endif SUPPORT_DOUBLE}
  633. {$ifdef SUPPORT_EXTENDED}
  634. operator :=(const source : olevariant) dest : extended;{$ifdef SYSTEMINLINE}inline;{$endif}
  635. begin
  636. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  637. end;
  638. {$endif SUPPORT_EXTENDED}
  639. {$ifdef SUPPORT_COMP}
  640. operator :=(const source : olevariant) dest : comp;{$ifdef SYSTEMINLINE}inline;{$endif}
  641. begin
  642. {$ifdef FPUNONE}
  643. dest:=comp(variantmanager.vartoint64(variant(tvardata(source))));
  644. {$else}
  645. dest:=comp(variantmanager.vartoreal(variant(tvardata(source))));
  646. {$endif}
  647. end;
  648. {$endif SUPPORT_COMP}
  649. {$ifndef FPUNONE}
  650. operator :=(const source : olevariant) dest : real;{$ifdef SYSTEMINLINE}inline;{$endif}
  651. begin
  652. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  653. end;
  654. {$endif}
  655. { Misc. }
  656. operator :=(const source : olevariant) dest : currency;{$ifdef SYSTEMINLINE}inline;{$endif}
  657. begin
  658. dest:=variantmanager.vartocurr(variant(tvardata(source)));
  659. end;
  660. {$ifndef FPUNONE}
  661. operator :=(const source : olevariant) dest : tdatetime;{$ifdef SYSTEMINLINE}inline;{$endif}
  662. begin
  663. dest:=variantmanager.vartotdatetime(variant(tvardata(source)));
  664. end;
  665. {$endif}
  666. operator :=(const source : olevariant) dest : terror;{$ifdef SYSTEMINLINE}inline;{$endif}
  667. begin
  668. dest:=variantmanager.vartoint(variant(tvardata(source)));
  669. end;
  670. {**********************************************************************
  671. to OLEVariant assignments
  672. **********************************************************************}
  673. operator :=(const source : byte) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  674. begin
  675. variantmanager.olevarfromint(dest,source,1);
  676. end;
  677. operator :=(const source : shortint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  678. begin
  679. variantmanager.olevarfromint(dest,source,-1);
  680. end;
  681. operator :=(const source : word) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  682. begin
  683. variantmanager.olevarfromint(dest,source,2);
  684. end;
  685. operator :=(const source : smallint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  686. begin
  687. variantmanager.olevarfromint(dest,source,-2);
  688. end;
  689. operator :=(const source : dword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  690. begin
  691. variantmanager.olevarfromint(dest,source,4);
  692. end;
  693. operator :=(const source : longint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  694. begin
  695. variantmanager.olevarfromint(dest,source,-4);
  696. end;
  697. operator :=(const source : qword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  698. begin
  699. variantmanager.olevarfromint(dest,source,8);
  700. end;
  701. operator :=(const source : int64) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  702. begin
  703. variantmanager.olevarfromint(dest,source,-8);
  704. end;
  705. { Boolean }
  706. operator :=(const source : boolean) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  707. begin
  708. variantmanager.varfromBool(variant(tvardata(dest)),Source);
  709. end;
  710. operator :=(const source : wordbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  711. begin
  712. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  713. end;
  714. operator :=(const source : longbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  715. begin
  716. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  717. end;
  718. { Chars }
  719. operator :=(const source : char) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  720. begin
  721. variantmanager.olevarfrompstr(dest,source);
  722. end;
  723. operator :=(const source : widechar) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  724. begin
  725. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  726. end;
  727. { Strings }
  728. operator :=(const source : shortstring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  729. begin
  730. variantmanager.olevarfrompstr(dest,source);
  731. end;
  732. operator :=(const source : ansistring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  733. begin
  734. variantmanager.olevarfromlstr(dest,source);
  735. end;
  736. operator :=(const source : widestring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  737. begin
  738. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  739. end;
  740. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  741. operator :=(const source : UnicodeString) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  742. begin
  743. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  744. end;
  745. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  746. { Floats }
  747. {$ifdef SUPPORT_SINGLE}
  748. operator :=(const source : single) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  749. begin
  750. variantmanager.varfromreal(variant(tvardata(dest)),source);
  751. end;
  752. {$endif SUPPORT_SINGLE}
  753. {$ifdef SUPPORT_DOUBLE}
  754. operator :=(const source : double) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  755. begin
  756. variantmanager.varfromreal(variant(tvardata(dest)),source);
  757. end;
  758. {$endif SUPPORT_DOUBLE}
  759. {$ifdef SUPPORT_EXTENDED}
  760. operator :=(const source : extended) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  761. begin
  762. variantmanager.varfromreal(variant(tvardata(dest)),source);
  763. end;
  764. {$endif SUPPORT_EXTENDED}
  765. {$ifdef SUPPORT_COMP}
  766. operator :=(const source : comp) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  767. begin
  768. variantmanager.varfromreal(variant(tvardata(dest)),source);
  769. end;
  770. {$endif SUPPORT_COMP}
  771. {$ifndef FPUNONE}
  772. operator :=(const source : real) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  773. begin
  774. variantmanager.varfromreal(variant(tvardata(dest)),source);
  775. end;
  776. {$endif}
  777. { Misc. }
  778. operator :=(const source : currency) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  779. begin
  780. variantmanager.varfromcurr(variant(tvardata(dest)),source);
  781. end;
  782. {$ifndef FPUNONE}
  783. operator :=(const source : tdatetime) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  784. begin
  785. variantmanager.varfromtdatetime(variant(tvardata(dest)),source);
  786. end;
  787. {$endif}
  788. operator :=(const source : terror) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  789. begin
  790. variantmanager.olevarfromint(dest,source,-sizeof(terror));
  791. end;
  792. function Unassigned: Variant; // Unassigned standard constant
  793. begin
  794. VarClearProc(TVarData(Result));
  795. TVarData(Result).VType := varempty;
  796. end;
  797. function Null: Variant; // Null standard constant
  798. begin
  799. VarClearProc(TVarData(Result));
  800. TVarData(Result).VType := varnull;
  801. end;
  802. {**********************************************************************
  803. Variant manager functions
  804. **********************************************************************}
  805. procedure GetVariantManager(var VarMgr: TVariantManager);
  806. begin
  807. VarMgr:=VariantManager;
  808. end;
  809. procedure SetVariantManager(const VarMgr: TVariantManager);
  810. begin
  811. VariantManager:=VarMgr;
  812. end;
  813. Function Pos (c : Char; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  814. begin
  815. Result:=Pos(c,ShortString(v));
  816. end;
  817. Function Pos (s : ShortString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  818. begin
  819. Result:=Pos(s,ShortString(v));
  820. end;
  821. Function Pos (const a : AnsiString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  822. begin
  823. Result:=Pos(a,AnsiString(v));
  824. end;
  825. Function Pos (const w : WideString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  826. begin
  827. Result:=Pos(w,WideString(v));
  828. end;
  829. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  830. Function Pos (const w : UnicodeString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  831. begin
  832. Result:=Pos(w,UnicodeString(v));
  833. end;
  834. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  835. Function Pos (const v : Variant; Const c : Char) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  836. begin
  837. Result:=Pos(ShortString(v),c);
  838. end;
  839. Function Pos (const v : Variant; Const s : ShortString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  840. begin
  841. Result:=Pos(ShortString(v),s);
  842. end;
  843. Function Pos (const v : Variant; Const a : AnsiString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  844. begin
  845. Result:=Pos(AnsiString(v),a);
  846. end;
  847. Function Pos (const v : Variant; Const w : WideString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  848. begin
  849. Result:=Pos(WideString(v),w);
  850. end;
  851. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  852. Function Pos (const v : Variant; Const w : UnicodeString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  853. begin
  854. Result:=Pos(UnicodeString(v),w);
  855. end;
  856. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  857. Function Pos (const v1 : Variant; Const v2 : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  858. begin
  859. Result:=Pos(WideString(v1),WideString(v2));
  860. end;