variant.inc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982
  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.varfromInt(Dest,word(Source),2);
  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. begin
  268. dest:=widechar(variantmanager.vartoint(source));
  269. end;
  270. { Strings }
  271. operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
  272. begin
  273. VariantManager.VarToPStr(Dest,Source);
  274. end;
  275. operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
  276. begin
  277. VariantManager.vartolstr(dest,source);
  278. end;
  279. operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
  280. begin
  281. variantmanager.vartowstr(dest,source);
  282. end;
  283. { Floats }
  284. {$ifdef SUPPORT_SINGLE}
  285. operator :=(const source : variant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
  286. begin
  287. dest:=variantmanager.vartoreal(source);
  288. end;
  289. {$endif SUPPORT_SINGLE}
  290. {$ifdef SUPPORT_DOUBLE}
  291. operator :=(const source : variant) dest : double;{$ifdef SYSTEMINLINE}inline;{$endif}
  292. begin
  293. dest:=variantmanager.vartoreal(source);
  294. end;
  295. {$endif SUPPORT_DOUBLE}
  296. {$ifdef SUPPORT_EXTENDED}
  297. operator :=(const source : variant) dest : extended;{$ifdef SYSTEMINLINE}inline;{$endif}
  298. begin
  299. dest:=variantmanager.vartoreal(source);
  300. end;
  301. {$endif SUPPORT_EXTENDED}
  302. {$ifdef SUPPORT_COMP}
  303. operator :=(const source : variant) dest : comp;{$ifdef SYSTEMINLINE}inline;{$endif}
  304. begin
  305. dest:=comp(variantmanager.vartoreal(source));
  306. end;
  307. {$endif SUPPORT_COMP}
  308. {$ifndef VER2_0}
  309. operator :=(const source : variant) dest : real;{$ifdef SYSTEMINLINE}inline;{$endif}
  310. begin
  311. dest:=comp(variantmanager.vartoreal(source));
  312. end;
  313. {$endif VER2_0}
  314. { Misc. }
  315. operator :=(const source : variant) dest : currency;{$ifdef SYSTEMINLINE}inline;{$endif}
  316. begin
  317. dest:=variantmanager.vartocurr(source);
  318. end;
  319. operator :=(const source : variant) dest : tdatetime;{$ifdef SYSTEMINLINE}inline;{$endif}
  320. begin
  321. dest:=variantmanager.vartotdatetime(source);
  322. end;
  323. {$ifndef FPC_HASINTERNALOLEVARIANT2VARIANTCAST}
  324. operator :=(const source : olevariant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  325. begin
  326. tvardata(result):=tvardata(source);
  327. end;
  328. {$endif FPC_HASINTERNALOLEVARIANT2VARIANTCAST}
  329. operator :=(const source : variant) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  330. begin
  331. variantmanager.olevarfromvar(dest,source);
  332. end;
  333. operator :=(const source : variant) dest : terror;{$ifdef SYSTEMINLINE}inline;{$endif}
  334. begin
  335. dest:=variantmanager.vartoint(source);
  336. end;
  337. {**********************************************************************
  338. Operators
  339. **********************************************************************}
  340. operator or(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  341. begin
  342. dest:=op1;
  343. variantmanager.varop(dest,op2,opor);
  344. end;
  345. operator and(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  346. begin
  347. dest:=op1;
  348. variantmanager.varop(dest,op2,opand);
  349. end;
  350. operator xor(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  351. begin
  352. dest:=op1;
  353. variantmanager.varop(dest,op2,opxor);
  354. end;
  355. operator not(const op : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  356. begin
  357. dest:=op;
  358. variantmanager.varnot(dest);
  359. end;
  360. operator shl(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  361. begin
  362. dest:=op1;
  363. variantmanager.varop(dest,op2,opshiftleft);
  364. end;
  365. operator shr(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  366. begin
  367. dest:=op1;
  368. variantmanager.varop(dest,op2,opshiftright);
  369. end;
  370. operator +(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  371. begin
  372. dest:=op1;
  373. variantmanager.varop(dest,op2,opadd);
  374. end;
  375. operator -(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  376. begin
  377. dest:=op1;
  378. variantmanager.varop(dest,op2,opsubtract);
  379. end;
  380. operator *(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  381. begin
  382. dest:=op1;
  383. variantmanager.varop(dest,op2,opmultiply);
  384. end;
  385. operator /(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  386. begin
  387. dest:=op1;
  388. variantmanager.varop(dest,op2,opdivide);
  389. end;
  390. operator **(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  391. begin
  392. dest:=op1;
  393. variantmanager.varop(dest,op2,oppower);
  394. end;
  395. operator div(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  396. begin
  397. dest:=op1;
  398. variantmanager.varop(dest,op2,opintdivide);
  399. end;
  400. operator mod(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  401. begin
  402. dest:=op1;
  403. variantmanager.varop(dest,op2,opmodulus);
  404. end;
  405. operator -(const op : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  406. begin
  407. dest:=op;
  408. variantmanager.varneg(dest);
  409. end;
  410. operator =(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  411. begin
  412. dest:=variantmanager.cmpop(op1,op2,opcmpeq);
  413. end;
  414. operator <(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  415. begin
  416. dest:=variantmanager.cmpop(op1,op2,opcmplt);
  417. end;
  418. operator >(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  419. begin
  420. dest:=variantmanager.cmpop(op1,op2,opcmpgt);
  421. end;
  422. operator >=(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  423. begin
  424. dest:=variantmanager.cmpop(op1,op2,opcmpge);
  425. end;
  426. operator <=(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  427. begin
  428. dest:=variantmanager.cmpop(op1,op2,opcmplt);
  429. end;
  430. procedure VarArrayRedim(var A: Variant; HighBound: SizeInt);
  431. begin
  432. variantmanager.vararrayredim(a,highbound);
  433. end;
  434. procedure VarCast(var dest : variant;const source : variant;vartype : longint);
  435. begin
  436. variantmanager.varcast(dest,source,vartype);
  437. end;
  438. {**********************************************************************
  439. from OLEVariant assignments
  440. **********************************************************************}
  441. { Integer }
  442. operator :=(const source : olevariant) dest : byte;{$ifdef SYSTEMINLINE}inline;{$endif}
  443. begin
  444. { cast away olevar to var conversion and avoid
  445. endless recursion }
  446. dest:=variantmanager.vartoint(variant(tvardata(source)));
  447. end;
  448. operator :=(const source : olevariant) dest : shortint;{$ifdef SYSTEMINLINE}inline;{$endif}
  449. begin
  450. dest:=variantmanager.vartoint(variant(tvardata(source)));
  451. end;
  452. operator :=(const source : olevariant) dest : word;{$ifdef SYSTEMINLINE}inline;{$endif}
  453. begin
  454. dest:=variantmanager.vartoint(variant(tvardata(source)));
  455. end;
  456. operator :=(const source : olevariant) dest : smallint;{$ifdef SYSTEMINLINE}inline;{$endif}
  457. begin
  458. dest:=variantmanager.vartoint(variant(tvardata(source)));
  459. end;
  460. operator :=(const source : olevariant) dest : dword;{$ifdef SYSTEMINLINE}inline;{$endif}
  461. begin
  462. dest:=variantmanager.vartoint(variant(tvardata(source)));
  463. end;
  464. operator :=(const source : olevariant) dest : longint;{$ifdef SYSTEMINLINE}inline;{$endif}
  465. begin
  466. dest:=variantmanager.vartoint(variant(tvardata(source)));
  467. end;
  468. operator :=(const source : olevariant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif}
  469. begin
  470. dest:=variantmanager.vartoint64(variant(tvardata(source)));
  471. end;
  472. operator :=(const source : olevariant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif}
  473. begin
  474. dest:=variantmanager.vartoword64(variant(tvardata(source)));
  475. end;
  476. { Boolean }
  477. operator :=(const source : olevariant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  478. begin
  479. dest:=variantmanager.vartobool(variant(tvardata(source)));
  480. end;
  481. operator :=(const source : olevariant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  482. begin
  483. dest:=variantmanager.vartobool(variant(tvardata(source)));
  484. end;
  485. operator :=(const source : olevariant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  486. begin
  487. dest:=variantmanager.vartobool(variant(tvardata(source)));
  488. end;
  489. { Chars }
  490. operator :=(const source : olevariant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif}
  491. var
  492. S : String;
  493. begin
  494. VariantManager.VarToPStr(S,Source);
  495. If Length(S)>0 then
  496. Dest:=S[1]
  497. else
  498. Dest:=#0;
  499. end;
  500. operator :=(const source : olevariant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif}
  501. Var
  502. WS : WideString;
  503. begin
  504. VariantManager.VarToWStr(WS,Source);
  505. If Length(WS)>0 then
  506. Dest:=WS[1]
  507. else
  508. Dest:=#0;
  509. end;
  510. { Strings }
  511. operator :=(const source : olevariant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
  512. begin
  513. variantmanager.vartopstr(dest,variant(tvardata(source)));
  514. end;
  515. operator :=(const source : olevariant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
  516. begin
  517. variantmanager.vartolstr(dest,variant(tvardata(source)));
  518. end;
  519. operator :=(const source : olevariant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
  520. begin
  521. variantmanager.vartowstr(dest,variant(tvardata(source)));
  522. end;
  523. { Floats }
  524. {$ifdef SUPPORT_SINGLE}
  525. operator :=(const source : olevariant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
  526. begin
  527. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  528. end;
  529. {$endif SUPPORT_SINGLE}
  530. {$ifdef SUPPORT_DOUBLE}
  531. operator :=(const source : olevariant) dest : double;{$ifdef SYSTEMINLINE}inline;{$endif}
  532. begin
  533. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  534. end;
  535. {$endif SUPPORT_DOUBLE}
  536. {$ifdef SUPPORT_EXTENDED}
  537. operator :=(const source : olevariant) dest : extended;{$ifdef SYSTEMINLINE}inline;{$endif}
  538. begin
  539. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  540. end;
  541. {$endif SUPPORT_EXTENDED}
  542. {$ifdef SUPPORT_COMP}
  543. operator :=(const source : olevariant) dest : comp;{$ifdef SYSTEMINLINE}inline;{$endif}
  544. begin
  545. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  546. end;
  547. {$endif SUPPORT_COMP}
  548. {$ifndef VER2_0}
  549. operator :=(const source : olevariant) dest : real;{$ifdef SYSTEMINLINE}inline;{$endif}
  550. begin
  551. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  552. end;
  553. {$endif VER2_0}
  554. { Misc. }
  555. operator :=(const source : olevariant) dest : currency;{$ifdef SYSTEMINLINE}inline;{$endif}
  556. begin
  557. dest:=variantmanager.vartocurr(variant(tvardata(source)));
  558. end;
  559. operator :=(const source : olevariant) dest : tdatetime;{$ifdef SYSTEMINLINE}inline;{$endif}
  560. begin
  561. dest:=variantmanager.vartotdatetime(variant(tvardata(source)));
  562. end;
  563. operator :=(const source : olevariant) dest : terror;{$ifdef SYSTEMINLINE}inline;{$endif}
  564. begin
  565. dest:=variantmanager.vartoint(variant(tvardata(source)));
  566. end;
  567. {**********************************************************************
  568. to OLEVariant assignments
  569. **********************************************************************}
  570. operator :=(const source : byte) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  571. begin
  572. variantmanager.olevarfromint(dest,source,1);
  573. end;
  574. operator :=(const source : shortint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  575. begin
  576. variantmanager.olevarfromint(dest,source,-1);
  577. end;
  578. operator :=(const source : word) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  579. begin
  580. variantmanager.olevarfromint(dest,source,2);
  581. end;
  582. operator :=(const source : smallint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  583. begin
  584. variantmanager.olevarfromint(dest,source,-2);
  585. end;
  586. operator :=(const source : dword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  587. begin
  588. variantmanager.olevarfromint(dest,source,4);
  589. end;
  590. operator :=(const source : longint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  591. begin
  592. variantmanager.olevarfromint(dest,source,-4);
  593. end;
  594. operator :=(const source : qword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  595. begin
  596. variantmanager.olevarfromint(dest,source,8);
  597. end;
  598. operator :=(const source : int64) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  599. begin
  600. variantmanager.olevarfromint(dest,source,-8);
  601. end;
  602. { Boolean }
  603. operator :=(const source : boolean) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  604. begin
  605. variantmanager.varfromBool(variant(tvardata(dest)),Source);
  606. end;
  607. operator :=(const source : wordbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  608. begin
  609. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  610. end;
  611. operator :=(const source : longbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  612. begin
  613. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  614. end;
  615. { Chars }
  616. operator :=(const source : char) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  617. begin
  618. variantmanager.olevarfrompstr(dest,source);
  619. end;
  620. operator :=(const source : widechar) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  621. begin
  622. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  623. end;
  624. { Strings }
  625. operator :=(const source : shortstring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  626. begin
  627. variantmanager.olevarfrompstr(dest,source);
  628. end;
  629. operator :=(const source : ansistring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  630. begin
  631. variantmanager.olevarfromlstr(dest,source);
  632. end;
  633. operator :=(const source : widestring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  634. begin
  635. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  636. end;
  637. { Floats }
  638. {$ifdef SUPPORT_SINGLE}
  639. operator :=(const source : single) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  640. begin
  641. variantmanager.varfromreal(variant(tvardata(dest)),source);
  642. end;
  643. {$endif SUPPORT_SINGLE}
  644. {$ifdef SUPPORT_DOUBLE}
  645. operator :=(const source : double) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  646. begin
  647. variantmanager.varfromreal(variant(tvardata(dest)),source);
  648. end;
  649. {$endif SUPPORT_DOUBLE}
  650. {$ifdef SUPPORT_EXTENDED}
  651. operator :=(const source : extended) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  652. begin
  653. variantmanager.varfromreal(variant(tvardata(dest)),source);
  654. end;
  655. {$endif SUPPORT_EXTENDED}
  656. {$ifdef SUPPORT_COMP}
  657. operator :=(const source : comp) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  658. begin
  659. variantmanager.varfromreal(variant(tvardata(dest)),source);
  660. end;
  661. {$endif SUPPORT_COMP}
  662. {$ifndef VER2_0}
  663. operator :=(const source : real) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  664. begin
  665. variantmanager.varfromreal(variant(tvardata(dest)),source);
  666. end;
  667. {$endif VER2_0}
  668. { Misc. }
  669. operator :=(const source : currency) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  670. begin
  671. variantmanager.varfromcurr(variant(tvardata(dest)),source);
  672. end;
  673. operator :=(const source : tdatetime) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  674. begin
  675. variantmanager.varfromtdatetime(variant(tvardata(dest)),source);
  676. end;
  677. operator :=(const source : terror) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  678. begin
  679. variantmanager.olevarfromint(dest,source,-sizeof(terror));
  680. end;
  681. function Unassigned: Variant; // Unassigned standard constant
  682. begin
  683. VarClearProc(TVarData(Result));
  684. TVarData(Result).VType := varempty;
  685. end;
  686. function Null: Variant; // Null standard constant
  687. begin
  688. VarClearProc(TVarData(Result));
  689. TVarData(Result).VType := varnull;
  690. end;
  691. {**********************************************************************
  692. Variant manager functions
  693. **********************************************************************}
  694. procedure GetVariantManager(var VarMgr: TVariantManager);
  695. begin
  696. VarMgr:=VariantManager;
  697. end;
  698. procedure SetVariantManager(const VarMgr: TVariantManager);
  699. begin
  700. VariantManager:=VarMgr;
  701. end;
  702. procedure initvariantmanager;
  703. begin
  704. end;