PageRenderTime 36ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/ATF2/control-software/epics-3.14.8/base/src/gdd/gddTest.cc

http://atf2flightsim.googlecode.com/
C++ | 541 lines | 462 code | 52 blank | 27 comment | 67 complexity | b0d976a0e54f43c4daec6ff40cb6e445 MD5 | raw file
Possible License(s): BSD-2-Clause, LGPL-2.0, IPL-1.0, BSD-3-Clause
  1. /*************************************************************************\
  2. * Copyright (c) 2002 The University of Chicago, as Operator of Argonne
  3. * National Laboratory.
  4. * Copyright (c) 2002 The Regents of the University of California, as
  5. * Operator of Los Alamos National Laboratory.
  6. * EPICS BASE Versions 3.13.7
  7. * and higher are distributed subject to a Software License Agreement found
  8. * in file LICENSE that is included with this distribution.
  9. \*************************************************************************/
  10. // Author: Jim Kowalkowski
  11. // Date: 2/96
  12. //
  13. // gddTest.cc,v 1.13 2002/07/15 20:34:14 jba Exp
  14. //
  15. #include <stdio.h>
  16. #define epicsExportSharedSymbols
  17. #include "gdd.h"
  18. // -----------------------test routines------------------------
  19. void gdd::dump(void) const
  20. {
  21. gddScalar* sdd;
  22. gddAtomic* add;
  23. gddContainer* cdd;
  24. if(isScalar())
  25. {
  26. sdd=(gddScalar*)this;
  27. sdd->dump();
  28. return;
  29. }
  30. if(isAtomic())
  31. {
  32. add=(gddAtomic*)this;
  33. add->dump();
  34. return;
  35. }
  36. if(isContainer())
  37. {
  38. cdd=(gddContainer*)this;
  39. cdd->dump();
  40. return;
  41. }
  42. }
  43. void gdd::dumpInfo(void) const
  44. {
  45. unsigned i;
  46. aitIndex f,c;
  47. unsigned long sz_tot,sz_data,sz_elem;
  48. const aitIndex max=20u;
  49. aitIndex prt_tot;
  50. sz_tot = getTotalSizeBytes();
  51. sz_data = getDataSizeBytes();
  52. sz_elem = getDataSizeElements();
  53. prt_tot=sz_elem>max?max:sz_elem;
  54. fprintf(stderr,"----------dump This=%p---------\n", this);
  55. fprintf(stderr," dimension=%u ", dimension());
  56. fprintf(stderr,"app-type=%u ", applicationType());
  57. if(isScalar()) fprintf(stderr,"Scalar\n");
  58. if(isAtomic()) fprintf(stderr,"Atomic\n");
  59. if(isContainer()) fprintf(stderr,"Container\n");
  60. fprintf(stderr," prim-type=%s",aitName[primitiveType()]);
  61. switch(primitiveType())
  62. {
  63. case aitEnumInvalid:
  64. fprintf(stderr,"(aitEnumInvalid)");
  65. break;
  66. case aitEnumInt8:
  67. fprintf(stderr,"(aitEnumInt8)");
  68. if(isScalar()) fprintf(stderr," value=0x%2.2x ",data.Int8);
  69. if(isAtomic()&&dataPointer())
  70. {
  71. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  72. aitInt8* i8=(aitInt8*)dataPointer();
  73. for(i=0;i<prt_tot;i++) fprintf(stderr,"0x%2.2x ",i8[i]);
  74. fprintf(stderr,">\n");
  75. }
  76. break;
  77. case aitEnumInt16:
  78. fprintf(stderr,"(aitEnumInt16)");
  79. if(isScalar()) fprintf(stderr," value=%hd ",data.Int16);
  80. if(isAtomic()&&dataPointer())
  81. {
  82. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  83. aitInt16* i16=(aitInt16*)dataPointer();
  84. for(i=0;i<prt_tot;i++) fprintf(stderr,"%hd ",i16[i]);
  85. fprintf(stderr,">\n");
  86. }
  87. break;
  88. case aitEnumInt32:
  89. fprintf(stderr,"(aitEnumInt32)");
  90. if(isScalar()) fprintf(stderr," value=%d ",data.Int32);
  91. if(isAtomic()&&dataPointer())
  92. {
  93. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  94. aitInt32* i32=(aitInt32*)dataPointer();
  95. for(i=0;i<prt_tot;i++) fprintf(stderr,"%d ",i32[i]);
  96. fprintf(stderr,">\n");
  97. }
  98. break;
  99. case aitEnumUint8:
  100. fprintf(stderr,"(aitEnumUint8)");
  101. if(isScalar()) fprintf(stderr," value=0x%2.2x ",data.Uint8);
  102. if(isAtomic()&&dataPointer())
  103. {
  104. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  105. aitUint8* ui8=(aitUint8*)dataPointer();
  106. for(i=0;i<prt_tot;i++) fprintf(stderr,"0x%2.2x ",ui8[i]);
  107. fprintf(stderr,">\n");
  108. }
  109. break;
  110. case aitEnumUint16:
  111. fprintf(stderr,"(aitEnumUint16)");
  112. if(isScalar()) fprintf(stderr," value=%hu ",data.Uint16);
  113. if(isAtomic()&&dataPointer())
  114. {
  115. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  116. aitUint16* ui16=(aitUint16*)dataPointer();
  117. for(i=0;i<prt_tot;i++) fprintf(stderr,"%hu ",ui16[i]);
  118. fprintf(stderr,">\n");
  119. }
  120. break;
  121. case aitEnumEnum16:
  122. fprintf(stderr,"(aitEnumEnum16)");
  123. if(isScalar()) fprintf(stderr," value=%hu ",data.Enum16);
  124. if(isAtomic()&&dataPointer())
  125. {
  126. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  127. aitEnum16* e16=(aitEnum16*)dataPointer();
  128. for(i=0;i<prt_tot;i++) fprintf(stderr,"%hu ",e16[i]);
  129. fprintf(stderr,">\n");
  130. }
  131. break;
  132. case aitEnumUint32:
  133. fprintf(stderr,"(aitEnumUint32)");
  134. if(isScalar()) fprintf(stderr," value=%u ",data.Uint32);
  135. if(isAtomic()&&dataPointer())
  136. {
  137. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  138. aitUint32* ui32=(aitUint32*)dataPointer();
  139. for(i=0;i<prt_tot;i++) fprintf(stderr,"%u ",ui32[i]);
  140. fprintf(stderr,">\n");
  141. }
  142. break;
  143. case aitEnumFloat32:
  144. fprintf(stderr,"(aitEnumFloat32)");
  145. if(isScalar()) fprintf(stderr," value=%f ",data.Float32);
  146. if(isAtomic()&&dataPointer())
  147. {
  148. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  149. aitFloat32* f32=(aitFloat32*)dataPointer();
  150. for(i=0;i<prt_tot;i++) fprintf(stderr,"%f ",f32[i]);
  151. fprintf(stderr,">\n");
  152. }
  153. break;
  154. case aitEnumFloat64:
  155. fprintf(stderr,"(aitEnumFloat64)");
  156. if(isScalar()) fprintf(stderr," value=%f ",data.Float64);
  157. if(isAtomic()&&dataPointer())
  158. {
  159. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  160. aitFloat64* f64=(aitFloat64*)dataPointer();
  161. for(i=0;i<prt_tot;i++) fprintf(stderr,"%f ",f64[i]);
  162. fprintf(stderr,">\n");
  163. }
  164. break;
  165. case aitEnumFixedString:
  166. fprintf(stderr,"(aitEnumFixedString)");
  167. if(isScalar())
  168. {
  169. if(data.FString)
  170. fprintf(stderr," value=<%s>\n",(char *)data.FString);
  171. else
  172. fprintf(stderr," value=<NULL>\n");
  173. }
  174. if(isAtomic()&&dataPointer())
  175. {
  176. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  177. aitFixedString* fs=(aitFixedString*)dataPointer();
  178. for(i=0;i<prt_tot;i++) fprintf(stderr,"<%s> ",fs[i].fixed_string);
  179. fprintf(stderr,">\n");
  180. }
  181. break;
  182. case aitEnumString:
  183. fprintf(stderr,"(aitEnumString)");
  184. if(isScalar())
  185. {
  186. aitString* str = (aitString*)dataAddress();
  187. fprintf(stderr,"\n");
  188. str->dump();
  189. }
  190. if(isAtomic()&&dataPointer())
  191. {
  192. fprintf(stderr,"\n %d values=<\n",(int)prt_tot);
  193. aitString* ss=(aitString*)dataPointer();
  194. for(i=0;i<prt_tot;i++)
  195. if(ss[i].string()) fprintf(stderr,"<%s> ",ss[i].string());
  196. fprintf(stderr,">\n");
  197. }
  198. break;
  199. case aitEnumContainer:
  200. fprintf(stderr,"(aitEnumContainer)");
  201. break;
  202. default: break;
  203. }
  204. fprintf(stderr," ref-count=%d\n",ref_cnt);
  205. fprintf(stderr," total-bytes=%ld,",sz_tot);
  206. fprintf(stderr," data-size=%ld,",sz_data);
  207. fprintf(stderr," element-count=%ld\n",sz_elem);
  208. if(!isScalar())
  209. {
  210. if(destruct)
  211. fprintf(stderr," destructor=%p\n", destruct);
  212. else
  213. fprintf(stderr," destructor=NULL\n");
  214. }
  215. for(i=0;i<dimension();i++)
  216. {
  217. getBound(i,f,c);
  218. fprintf(stderr," (%d) %p first=%d count=%d\n",i,&bounds[i],f,c);
  219. }
  220. if(isManaged()) fprintf(stderr," Managed");
  221. if(isFlat()) fprintf(stderr," Flat");
  222. if(isLocalDataFormat()) fprintf(stderr," LocalDataFormat");
  223. if(isNetworkDataFormat()) fprintf(stderr," NetworkDataFormat");
  224. if(isConstant()) fprintf(stderr," Constant");
  225. if(isNoRef()) fprintf(stderr," NoReferencing");
  226. fprintf(stderr,"\n");
  227. if(!isContainer() && !isScalar() && !isAtomic())
  228. fprintf(stderr,"--------------------------------------\n");
  229. }
  230. void gddScalar::dump(void) const
  231. {
  232. gdd::dumpInfo();
  233. fprintf(stderr,"--------------------------------------\n");
  234. }
  235. void gddAtomic::dump(void) const
  236. {
  237. gdd::dumpInfo();
  238. fprintf(stderr,"-------------------------------------\n");
  239. }
  240. void gddContainer::dump(void) const
  241. {
  242. const gdd* dd;
  243. const gddAtomic* add;
  244. const gddScalar* sdd;
  245. const gddContainer* cdd;
  246. fprintf(stderr,"----------dumping container:\n");
  247. gdd::dumpInfo();
  248. fprintf(stderr," total in container = %d\n",total());
  249. constGddCursor cur = this->getCursor();
  250. for(dd=cur.first();dd;dd=cur.next())
  251. {
  252. if(dd->isAtomic()) { add=(gddAtomic*)dd; add->dump(); }
  253. if(dd->isScalar()) { sdd=(gddScalar*)dd; sdd->dump(); }
  254. if(dd->isContainer()) { cdd=(gddContainer*)dd; cdd->dump(); }
  255. }
  256. }
  257. #ifdef NO_DUMP_TEST
  258. void gdd::test() { }
  259. #else
  260. void gdd::test()
  261. {
  262. aitInt32 i32[3] = { -32,4,3 };
  263. aitIndex bnds = 3;
  264. gddAtomic* add = (gddAtomic*)this;
  265. gddAtomic* dd = new gddAtomic(98,aitEnumInt32,1,3);
  266. reset(aitEnumInt32,1,&bnds);
  267. add->put(i32);
  268. fprintf(stderr,"----TESTING DD DUMP:\n");
  269. add->dump();
  270. // test copy(), copyInfo(), Dup()
  271. fprintf(stderr,"----TESTING COPYINFO(): (1)COPYINFO, (2)ORIGINAL\n");
  272. dd->copyInfo(this); dd->dump(); add->dump();
  273. fprintf(stderr,"----TESTING DUP(): (1)DUP, (2)ORIGINAL\n");
  274. dd->clear(); dd->Dup(this); dd->dump(); add->dump();
  275. fprintf(stderr,"----TESTING COPY(): (1)COPY, (2)ORIGINAL\n");
  276. dd->clear(); dd->copy(this); dd->dump(); add->dump();
  277. dd->unreference();
  278. // test flatten functions and Convert functions
  279. size_t sz = getTotalSizeBytes();
  280. aitUint8* buf = new aitUint8[sz];
  281. gddAtomic* pdd = (gddAtomic*)buf;
  282. flattenWithAddress(buf,sz);
  283. fprintf(stderr,"----TESTING FLATTENWITHADDRESS():\n");
  284. pdd->dump();
  285. fprintf(stderr,"----CONVERTADDRESSTOOFFSETS() THEN BACK AND DUMP:\n");
  286. pdd->convertAddressToOffsets();
  287. pdd->convertOffsetsToAddress();
  288. pdd->dump();
  289. pdd->unreference();
  290. delete buf;
  291. }
  292. #endif
  293. #ifndef NO_DUMP_TEST
  294. class gddAtomicDestr : public gddDestructor
  295. {
  296. public:
  297. gddAtomicDestr(void) { }
  298. void run(void*);
  299. };
  300. void gddAtomicDestr::run(void* v)
  301. {
  302. fprintf(stderr,"**** gddAtomicDestr::run from gddAtomic::test %p\n",v);
  303. }
  304. #endif
  305. #ifdef NO_DUMP_TEST
  306. void gddAtomic::test(void) { }
  307. #else
  308. void gddAtomic::test(void)
  309. {
  310. aitFloat32 f32[6] = { 32.0f,2.0f,1.0f, 7.0f,8.0f,9.0f };
  311. aitFloat64 f64[6] = { 64.0,5.0,4.0, 10.0,11.0,12.0 };
  312. aitInt8 i8[6] = { -8,2,1, 13,14,15 };
  313. aitInt16 i16[6] = { -16,3,2, 16,17,18 };
  314. aitInt32 i32[6] = { -32,4,3, 19,20,21 };
  315. aitUint8 ui8[6] = { 8,5,4, 22,23,24 };
  316. aitUint16 ui16[6] = { 16,6,5, 25,26,27 };
  317. aitUint32 ui32[6] = { 32,7,6, 28,29,30 };
  318. aitIndex bnds[2] = { 2,3 };
  319. // Rules:
  320. // reset() clear out everything and set data pointer to NULL
  321. // put() will auto allocate if data pointer is NULL, otherwise copy
  322. // putRef() will clear current data pointer and set new one
  323. // if the data pointer is NULL when put() is called, then a
  324. // generic gddDestructor will be created to delete the buffer
  325. reset(aitEnumFloat32,2,bnds);
  326. put(f32); dump();
  327. putRef(f32,new gddAtomicDestr); dump();
  328. reset(aitEnumFloat64,2,bnds);
  329. put(f64); dump();
  330. putRef(f64,new gddAtomicDestr); dump();
  331. reset(aitEnumInt8,2,bnds);
  332. put(i8); dump();
  333. putRef(i8,new gddAtomicDestr); dump();
  334. reset(aitEnumUint8,2,bnds);
  335. put(ui8); dump();
  336. putRef(ui8,new gddAtomicDestr); dump();
  337. reset(aitEnumInt16,2,bnds);
  338. put(i16); dump();
  339. putRef(i16,new gddAtomicDestr); dump();
  340. reset(aitEnumUint16,2,bnds);
  341. put(ui16); dump();
  342. putRef(ui16,new gddAtomicDestr); dump();
  343. reset(aitEnumInt32,2,bnds);
  344. put(i32); dump();
  345. putRef(i32,new gddAtomicDestr); dump();
  346. reset(aitEnumUint32,2,bnds);
  347. put(ui32); dump();
  348. putRef(ui32,new gddAtomicDestr); dump();
  349. }
  350. #endif
  351. #ifdef NO_DUMP_TEST
  352. void gddScalar::test(void) { }
  353. #else
  354. void gddScalar::test(void)
  355. {
  356. int i;
  357. aitFloat32 fa32,f32 = 32.0f;
  358. aitFloat64 fa64,f64 = 64.0;
  359. aitInt8 ia8,i8 = -8;
  360. aitInt16 ia16,i16 = -16;
  361. aitInt32 ia32,i32 = -32;
  362. aitUint8 uia8,ui8 = 8;
  363. aitUint16 uia16,ui16 = 16;
  364. aitUint32 uia32,ui32 = 32;
  365. // printf("get float32 = %f\n",fa32);
  366. // printf("op= float32 = %f\n",fa32);
  367. fprintf(stderr,"float32====");
  368. for(i=0;i<aitConvertTotal;i++)
  369. {
  370. setPrimType((aitEnum)i);
  371. put(f32);
  372. get(fa32);
  373. dump();
  374. *this=f32;
  375. fa32=*this;
  376. dump();
  377. }
  378. fprintf(stderr,"float64====");
  379. for(i=0;i<aitConvertTotal;i++)
  380. {
  381. setPrimType((aitEnum)i);
  382. put(f64); get(fa64); dump(); *this=f64; fa64=*this; dump();
  383. }
  384. fprintf(stderr,"int8====");
  385. for(i=0;i<aitConvertTotal;i++)
  386. {
  387. setPrimType((aitEnum)i);
  388. put(i8); get(ia8); dump(); *this=i8; ia8=*this; dump();
  389. }
  390. fprintf(stderr,"uint8====");
  391. for(i=0;i<aitConvertTotal;i++)
  392. {
  393. setPrimType((aitEnum)i);
  394. put(ui8); get(uia8); dump(); *this=ui8; uia8=*this; dump();
  395. }
  396. fprintf(stderr,"int16====");
  397. for(i=0;i<aitConvertTotal;i++)
  398. {
  399. setPrimType((aitEnum)i);
  400. put(i16); get(ia16); dump(); *this=i16; ia16=*this; dump();
  401. }
  402. fprintf(stderr,"uint16====");
  403. for(i=0;i<aitConvertTotal;i++)
  404. {
  405. setPrimType((aitEnum)i);
  406. put(ui16); get(uia16); dump(); *this=ui16; uia16=*this; dump();
  407. }
  408. fprintf(stderr,"int32====");
  409. for(i=0;i<aitConvertTotal;i++)
  410. {
  411. setPrimType((aitEnum)i);
  412. put(i32); get(ia32); dump(); *this=i32; ia32=*this; dump();
  413. }
  414. fprintf(stderr,"uint32====");
  415. for(i=0;i<aitConvertTotal;i++)
  416. {
  417. setPrimType((aitEnum)i);
  418. put(ui32); get(uia32); dump(); *this=ui32; uia32=*this; dump();
  419. }
  420. }
  421. #endif
  422. #ifdef NO_DUMP_TEST
  423. void gddContainer::test(void) { }
  424. #else
  425. void gddContainer::test(void)
  426. {
  427. gddScalar* sdd1 = new gddScalar(1,aitEnumInt32);
  428. gddScalar* sdd2 = new gddScalar(2,aitEnumInt16);
  429. gddAtomic* add1 = new gddAtomic(3,aitEnumFloat32,1,3);
  430. gddContainer* cdd1;
  431. aitInt16 i16 = 5;
  432. aitInt32 i32 = 6;
  433. aitFloat32 f32[3] = { 7.0f, 8.0f, 9.0f };
  434. aitUint8* buf;
  435. size_t sz;
  436. *sdd1=i32; *sdd2=i16; *add1=f32;
  437. // insert two scalers and an atomic into the container
  438. fprintf(stderr,"*INSERT %p %p %p\n",sdd1,sdd2,add1);
  439. clear();
  440. sdd1->reference(); add1->reference(); sdd2->reference();
  441. insert(sdd1); insert(sdd2); insert(add1); dump();
  442. fprintf(stderr,"=====TESTING CURSOR:\n");
  443. gddCursor cur = getCursor();
  444. gdd* dd;
  445. int i;
  446. for(i=0; (dd=cur[i]); i++) fprintf(stderr,"%p ",dd);
  447. fprintf(stderr,"\n");
  448. for(dd=cur.first();dd;dd=cur.next()) fprintf(stderr,"%p ",dd);
  449. fprintf(stderr,"\n");
  450. remove(0); remove(0); remove(0); dump();
  451. sdd1->reference(); add1->reference(); sdd2->reference();
  452. insert(add1); insert(sdd1); insert(sdd2); dump();
  453. sz = getTotalSizeBytes();
  454. buf = new aitUint8[sz];
  455. fprintf(stderr,"=====TESTING FLATTEN FUNCTION BUFFER=%p:\n",buf);
  456. flattenWithAddress(buf,sz);
  457. cdd1=(gddContainer*)buf;
  458. cdd1->dump();
  459. fprintf(stderr,"=====CHANGE ADDRESSES TO OFFSETS:\n");
  460. cdd1->convertAddressToOffsets();
  461. fprintf(stderr,"=====CHANGE OFFSETS TO ADDRESSES:\n");
  462. cdd1->convertOffsetsToAddress();
  463. fprintf(stderr,"=====RE-DUMP OF FLATTENED CONTAINER:\n");
  464. cdd1->dump();
  465. fprintf(stderr,"=====RE-DUMP OF ORIGINAL CONTAINER:\n");
  466. dump();
  467. cdd1->unreference();
  468. delete buf;
  469. // test copy(), Dup(), copyInfo()
  470. fprintf(stderr,"=======CREATING TEST CONTAINER FOR *COPY* TEST:\n");
  471. cdd1 = new gddContainer;
  472. fprintf(stderr,"=======COPYINFO():\n");
  473. cdd1->copyInfo(this); cdd1->dump();
  474. fprintf(stderr,"=======DUP():\n");
  475. cdd1->Dup(this); cdd1->dump();
  476. fprintf(stderr,"=======COPY():\n");
  477. cdd1->copy(this); cdd1->dump();
  478. fprintf(stderr,"=======UNREFERENCE THE TEST CONTAINER:\n");
  479. cdd1->unreference();
  480. fprintf(stderr,"=====DUMPING ORIGINAL:\n");
  481. dump();
  482. clear();
  483. fprintf(stderr,"=======TEST COMPLETE, DELETE STUFF:\n");
  484. fprintf(stderr," first scaler:\n "); sdd1->unreference();
  485. fprintf(stderr," first atomic:\n "); add1->unreference();
  486. fprintf(stderr," second scaler:\n "); sdd2->unreference();
  487. dump();
  488. }
  489. #endif