variant.inc 25 KB

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