variant.inc 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062
  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 VarArrayPut(var A: Variant; const Value: Variant; const Indices: array of SizeInt);
  442. begin
  443. if Length(Indices)>0 then
  444. variantmanager.vararrayput(A, Value, Length(Indices), @Indices[0])
  445. else
  446. variantmanager.vararrayput(A, Value, 0, nil);
  447. end;
  448. function VarArrayGet(const A: Variant; const Indices: array of SizeInt): Variant;
  449. begin
  450. if Length(Indices)>0 then
  451. Result:=variantmanager.vararrayget(A, Length(Indices), @Indices[0])
  452. else
  453. Result:=variantmanager.vararrayget(A, 0, nil);
  454. end;
  455. procedure VarCast(var dest : variant;const source : variant;vartype : longint);
  456. begin
  457. variantmanager.varcast(dest,source,vartype);
  458. end;
  459. {**********************************************************************
  460. from OLEVariant assignments
  461. **********************************************************************}
  462. { Integer }
  463. operator :=(const source : olevariant) dest : byte;{$ifdef SYSTEMINLINE}inline;{$endif}
  464. begin
  465. { cast away olevar to var conversion and avoid
  466. endless recursion }
  467. dest:=variantmanager.vartoint(variant(tvardata(source)));
  468. end;
  469. operator :=(const source : olevariant) dest : shortint;{$ifdef SYSTEMINLINE}inline;{$endif}
  470. begin
  471. dest:=variantmanager.vartoint(variant(tvardata(source)));
  472. end;
  473. operator :=(const source : olevariant) dest : word;{$ifdef SYSTEMINLINE}inline;{$endif}
  474. begin
  475. dest:=variantmanager.vartoint(variant(tvardata(source)));
  476. end;
  477. operator :=(const source : olevariant) dest : smallint;{$ifdef SYSTEMINLINE}inline;{$endif}
  478. begin
  479. dest:=variantmanager.vartoint(variant(tvardata(source)));
  480. end;
  481. operator :=(const source : olevariant) dest : dword;{$ifdef SYSTEMINLINE}inline;{$endif}
  482. begin
  483. dest:=variantmanager.vartoint(variant(tvardata(source)));
  484. end;
  485. operator :=(const source : olevariant) dest : longint;{$ifdef SYSTEMINLINE}inline;{$endif}
  486. begin
  487. dest:=variantmanager.vartoint(variant(tvardata(source)));
  488. end;
  489. operator :=(const source : olevariant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif}
  490. begin
  491. dest:=variantmanager.vartoint64(variant(tvardata(source)));
  492. end;
  493. operator :=(const source : olevariant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif}
  494. begin
  495. dest:=variantmanager.vartoword64(variant(tvardata(source)));
  496. end;
  497. { Boolean }
  498. operator :=(const source : olevariant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  499. begin
  500. dest:=variantmanager.vartobool(variant(tvardata(source)));
  501. end;
  502. operator :=(const source : olevariant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  503. begin
  504. dest:=variantmanager.vartobool(variant(tvardata(source)));
  505. end;
  506. operator :=(const source : olevariant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  507. begin
  508. dest:=variantmanager.vartobool(variant(tvardata(source)));
  509. end;
  510. { Chars }
  511. operator :=(const source : olevariant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif}
  512. var
  513. S : String;
  514. begin
  515. VariantManager.VarToPStr(S,Source);
  516. If Length(S)>0 then
  517. Dest:=S[1]
  518. else
  519. Dest:=#0;
  520. end;
  521. operator :=(const source : olevariant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif}
  522. Var
  523. WS : WideString;
  524. begin
  525. VariantManager.VarToWStr(WS,Source);
  526. If Length(WS)>0 then
  527. Dest:=WS[1]
  528. else
  529. Dest:=#0;
  530. end;
  531. { Strings }
  532. operator :=(const source : olevariant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
  533. begin
  534. variantmanager.vartopstr(dest,variant(tvardata(source)));
  535. end;
  536. operator :=(const source : olevariant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
  537. begin
  538. variantmanager.vartolstr(dest,variant(tvardata(source)));
  539. end;
  540. operator :=(const source : olevariant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
  541. begin
  542. variantmanager.vartowstr(dest,variant(tvardata(source)));
  543. end;
  544. { Floats }
  545. {$ifdef SUPPORT_SINGLE}
  546. operator :=(const source : olevariant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
  547. begin
  548. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  549. end;
  550. {$endif SUPPORT_SINGLE}
  551. {$ifdef SUPPORT_DOUBLE}
  552. operator :=(const source : olevariant) dest : double;{$ifdef SYSTEMINLINE}inline;{$endif}
  553. begin
  554. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  555. end;
  556. {$endif SUPPORT_DOUBLE}
  557. {$ifdef SUPPORT_EXTENDED}
  558. operator :=(const source : olevariant) dest : extended;{$ifdef SYSTEMINLINE}inline;{$endif}
  559. begin
  560. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  561. end;
  562. {$endif SUPPORT_EXTENDED}
  563. {$ifdef SUPPORT_COMP}
  564. operator :=(const source : olevariant) dest : comp;{$ifdef SYSTEMINLINE}inline;{$endif}
  565. begin
  566. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  567. end;
  568. {$endif SUPPORT_COMP}
  569. {$ifndef VER2_0}
  570. operator :=(const source : olevariant) dest : real;{$ifdef SYSTEMINLINE}inline;{$endif}
  571. begin
  572. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  573. end;
  574. {$endif VER2_0}
  575. { Misc. }
  576. operator :=(const source : olevariant) dest : currency;{$ifdef SYSTEMINLINE}inline;{$endif}
  577. begin
  578. dest:=variantmanager.vartocurr(variant(tvardata(source)));
  579. end;
  580. operator :=(const source : olevariant) dest : tdatetime;{$ifdef SYSTEMINLINE}inline;{$endif}
  581. begin
  582. dest:=variantmanager.vartotdatetime(variant(tvardata(source)));
  583. end;
  584. operator :=(const source : olevariant) dest : terror;{$ifdef SYSTEMINLINE}inline;{$endif}
  585. begin
  586. dest:=variantmanager.vartoint(variant(tvardata(source)));
  587. end;
  588. {**********************************************************************
  589. to OLEVariant assignments
  590. **********************************************************************}
  591. operator :=(const source : byte) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  592. begin
  593. variantmanager.olevarfromint(dest,source,1);
  594. end;
  595. operator :=(const source : shortint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  596. begin
  597. variantmanager.olevarfromint(dest,source,-1);
  598. end;
  599. operator :=(const source : word) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  600. begin
  601. variantmanager.olevarfromint(dest,source,2);
  602. end;
  603. operator :=(const source : smallint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  604. begin
  605. variantmanager.olevarfromint(dest,source,-2);
  606. end;
  607. operator :=(const source : dword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  608. begin
  609. variantmanager.olevarfromint(dest,source,4);
  610. end;
  611. operator :=(const source : longint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  612. begin
  613. variantmanager.olevarfromint(dest,source,-4);
  614. end;
  615. operator :=(const source : qword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  616. begin
  617. variantmanager.olevarfromint(dest,source,8);
  618. end;
  619. operator :=(const source : int64) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  620. begin
  621. variantmanager.olevarfromint(dest,source,-8);
  622. end;
  623. { Boolean }
  624. operator :=(const source : boolean) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  625. begin
  626. variantmanager.varfromBool(variant(tvardata(dest)),Source);
  627. end;
  628. operator :=(const source : wordbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  629. begin
  630. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  631. end;
  632. operator :=(const source : longbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  633. begin
  634. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  635. end;
  636. { Chars }
  637. operator :=(const source : char) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  638. begin
  639. variantmanager.olevarfrompstr(dest,source);
  640. end;
  641. operator :=(const source : widechar) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  642. begin
  643. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  644. end;
  645. { Strings }
  646. operator :=(const source : shortstring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  647. begin
  648. variantmanager.olevarfrompstr(dest,source);
  649. end;
  650. operator :=(const source : ansistring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  651. begin
  652. variantmanager.olevarfromlstr(dest,source);
  653. end;
  654. operator :=(const source : widestring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  655. begin
  656. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  657. end;
  658. { Floats }
  659. {$ifdef SUPPORT_SINGLE}
  660. operator :=(const source : single) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  661. begin
  662. variantmanager.varfromreal(variant(tvardata(dest)),source);
  663. end;
  664. {$endif SUPPORT_SINGLE}
  665. {$ifdef SUPPORT_DOUBLE}
  666. operator :=(const source : double) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  667. begin
  668. variantmanager.varfromreal(variant(tvardata(dest)),source);
  669. end;
  670. {$endif SUPPORT_DOUBLE}
  671. {$ifdef SUPPORT_EXTENDED}
  672. operator :=(const source : extended) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  673. begin
  674. variantmanager.varfromreal(variant(tvardata(dest)),source);
  675. end;
  676. {$endif SUPPORT_EXTENDED}
  677. {$ifdef SUPPORT_COMP}
  678. operator :=(const source : comp) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  679. begin
  680. variantmanager.varfromreal(variant(tvardata(dest)),source);
  681. end;
  682. {$endif SUPPORT_COMP}
  683. {$ifndef VER2_0}
  684. operator :=(const source : real) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  685. begin
  686. variantmanager.varfromreal(variant(tvardata(dest)),source);
  687. end;
  688. {$endif VER2_0}
  689. { Misc. }
  690. operator :=(const source : currency) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  691. begin
  692. variantmanager.varfromcurr(variant(tvardata(dest)),source);
  693. end;
  694. operator :=(const source : tdatetime) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  695. begin
  696. variantmanager.varfromtdatetime(variant(tvardata(dest)),source);
  697. end;
  698. operator :=(const source : terror) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  699. begin
  700. variantmanager.olevarfromint(dest,source,-sizeof(terror));
  701. end;
  702. function Unassigned: Variant; // Unassigned standard constant
  703. begin
  704. VarClearProc(TVarData(Result));
  705. TVarData(Result).VType := varempty;
  706. end;
  707. function Null: Variant; // Null standard constant
  708. begin
  709. VarClearProc(TVarData(Result));
  710. TVarData(Result).VType := varnull;
  711. end;
  712. {**********************************************************************
  713. Variant manager functions
  714. **********************************************************************}
  715. procedure GetVariantManager(var VarMgr: TVariantManager);
  716. begin
  717. VarMgr:=VariantManager;
  718. end;
  719. procedure SetVariantManager(const VarMgr: TVariantManager);
  720. begin
  721. VariantManager:=VarMgr;
  722. end;
  723. procedure initvariantmanager;
  724. begin
  725. end;
  726. Function Pos (c : Char; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  727. begin
  728. Result:=Pos(c,ShortString(v));
  729. end;
  730. Function Pos (s : ShortString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  731. begin
  732. Result:=Pos(s,ShortString(v));
  733. end;
  734. Function Pos (a : AnsiString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  735. begin
  736. Result:=Pos(a,AnsiString(v));
  737. end;
  738. Function Pos (w : WideString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  739. begin
  740. Result:=Pos(w,WideString(v));
  741. end;
  742. Function Pos (v : Variant; Const c : Char) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  743. begin
  744. Result:=Pos(ShortString(v),c);
  745. end;
  746. Function Pos (v : Variant; Const s : ShortString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  747. begin
  748. Result:=Pos(ShortString(v),s);
  749. end;
  750. Function Pos (v : Variant; Const a : AnsiString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  751. begin
  752. Result:=Pos(AnsiString(v),a);
  753. end;
  754. Function Pos (v : Variant; Const w : WideString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  755. begin
  756. Result:=Pos(WideString(v),w);
  757. end;
  758. Function Pos (v1 : Variant; Const v2 : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  759. begin
  760. Result:=Pos(WideString(v1),WideString(v2));
  761. end;