variant.inc 30 KB

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