2
0

variant.inc 27 KB

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