variant.inc 27 KB

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