archiver.m
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:6k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. #import <simtools.h>
  2. #import <defobj.h>
  3. #import <defobj/Create.h>
  4. #include <swarmconfig.h>
  5. #define OBJNAME "myObj"
  6. #define STRVAL "Hello World"
  7. #define INTVAL -100
  8. #define UNSIGNEDVAL 100
  9. #define SHORTVAL -10
  10. #define USHORTVAL 10
  11. #define LONGVAL -10000
  12. #define LONGLONGVAL 1000000000000000LL
  13. #define ULONGLONGVAL 1000000000000ULL
  14. #define ULONGVAL 10000
  15. #define FLOATVAL 500.0
  16. #define DOUBLEVAL 500000.0
  17. #ifdef HAVE_LONGDOUBLE_ENCODING
  18. #define LONGDOUBLEVAL 5000000.0
  19. #endif
  20. #define COMPONENT_STRVAL "Foo Bar"
  21. @interface MyObj: CreateDrop
  22. {
  23.   const char *name;
  24. }
  25. + createBegin: aZone;
  26. - (const char *)getName;
  27. @end
  28. @implementation MyObj
  29. + createBegin: aZone
  30. {
  31.   MyObj *obj = [super createBegin: aZone];
  32.   obj->name = COMPONENT_STRVAL;
  33.   return obj;
  34. }
  35. - (const char *)getName
  36. {
  37.   return name;
  38. }
  39. @end
  40. @interface MyClass: CreateDrop
  41. {
  42.   const char *strVal;
  43.   int intVal;
  44.   unsigned unsignedVal;
  45.   short shortVal;
  46.   unsigned short ushortVal;
  47.   long longVal;
  48.   unsigned long ulongVal;
  49.   long long longLongVal;
  50.   unsigned long long unsignedLongLongVal;
  51.   float floatVal;
  52.   double doubleVal;
  53. #ifdef HAVE_LONGDOUBLE_ENCODING
  54.   long double longDoubleVal;
  55. #endif
  56.   BOOL deepFlag;
  57.   BOOL updateFlag;
  58. }
  59. - setDeepFlag: (BOOL)deepFlag;
  60. - setUpdateFlag: (BOOL)updateFlag;
  61. - updateArchiver: archiver;
  62. - (BOOL)checkObject;
  63. @end
  64. @implementation MyClass
  65. + createBegin: aZone
  66. {
  67.   MyClass *obj = [super createBegin: aZone];
  68.   obj->strVal = STRVAL;
  69.   obj->intVal = INTVAL;
  70.   obj->unsignedVal = UNSIGNEDVAL;
  71.   obj->shortVal = SHORTVAL;
  72.   obj->ushortVal = USHORTVAL;
  73.   obj->longVal = LONGVAL;
  74.   obj->ulongVal = ULONGVAL;
  75.   obj->longLongVal = LONGLONGVAL;
  76.   obj->unsignedLongLongVal = ULONGLONGVAL;
  77.   obj->floatVal = FLOATVAL;
  78.   obj->doubleVal = DOUBLEVAL;
  79. #ifdef HAVE_LONGDOUBLE_ENCODING
  80.   obj->longDoubleVal = LONGDOUBLEVAL;
  81. #endif
  82.   
  83.   obj->updateFlag = YES;
  84.   return obj;
  85. }
  86. - setDeepFlag: (BOOL)theDeepFlag
  87. {
  88.   deepFlag = theDeepFlag;
  89.   return self;
  90. }
  91. - setUpdateFlag: (BOOL)theUpdateFlag
  92. {
  93.   updateFlag = theUpdateFlag;
  94.   return self;
  95. }
  96. - updateArchiver: archiver
  97. {
  98.   if (updateFlag)
  99.     {
  100.       if (deepFlag)
  101.         [archiver putDeep: OBJNAME object: self];
  102.       else
  103.         [archiver putShallow: OBJNAME object: self];
  104.     }
  105.   return self;
  106. }
  107. - (BOOL)checkObject
  108. {
  109.   if (strcmp (strVal, STRVAL) != 0)
  110.     return NO;
  111.   if (intVal != INTVAL)
  112.     return NO;
  113.   if (unsignedVal != UNSIGNEDVAL)
  114.     return NO;
  115.   if (shortVal != SHORTVAL)
  116.     return NO;
  117.   if (ushortVal != USHORTVAL)
  118.     return NO;
  119.   if (longVal != LONGVAL)
  120.     return NO;
  121.   if (ulongVal != ULONGVAL)
  122.     return NO;
  123.   if (floatVal != FLOATVAL)
  124.     return NO;
  125.   if (doubleVal != DOUBLEVAL)
  126.     return NO;
  127. #ifdef HAVE_LONGDOUBLE_ENCODING
  128.   if (longDoubleVal != LONGDOUBLEVAL)
  129.     return NO;
  130. #endif
  131.   return YES;
  132. }
  133. @end
  134. @interface MyClassDeep: MyClass
  135. {
  136.   id objVal;
  137. }
  138. + createBegin: aZone;
  139. - (BOOL)checkObject;
  140. @end
  141. @implementation MyClassDeep
  142. + createBegin: aZone
  143. {
  144.   MyClassDeep *obj = [super createBegin: aZone];
  145.   obj->objVal = [MyObj create: aZone];
  146.   return obj;
  147. }
  148. - (BOOL)checkObject
  149. {
  150.   if (![super checkObject])
  151.     return NO;
  152.   
  153.   return strcmp ([objVal getName], COMPONENT_STRVAL) == 0;
  154. }
  155. @end
  156. #define DIM1COUNT 3
  157. #define DIM2COUNT 2
  158. @interface MyClassDeeper: MyClassDeep
  159. {
  160.   long longAryVal[DIM1COUNT][DIM2COUNT];
  161.   double doubleAryVal[DIM1COUNT][DIM2COUNT];
  162. }
  163. + createBegin: aZone;
  164. @end
  165. @implementation MyClassDeeper: MyClassDeep
  166. + createBegin: aZone
  167. {
  168.   unsigned i, j;
  169.   MyClassDeeper *obj = [super createBegin: aZone];
  170.   
  171.   for (i = 0; i < DIM1COUNT; i++)
  172.     for (j = 0; j < DIM2COUNT; j++)
  173.       {
  174.         obj->longAryVal[i][j] = (i + 1) * (j + 1);
  175.         obj->doubleAryVal[i][j] = (i + 1) * (j + 1);
  176.       }
  177.   return obj;
  178. }
  179. - (BOOL)checkObject
  180. {
  181.   unsigned i, j;
  182.   if (![super checkObject])
  183.     return NO;
  184.   for (i = 0; i < DIM1COUNT; i++)
  185.     for (j = 0; j < DIM2COUNT; j++)
  186.       {
  187.         if (longAryVal[i][j] != (i + 1) * (j + 1))
  188.           return NO;
  189.         if (doubleAryVal[i][j] != (i + 1) * (j + 1))
  190.           return NO;
  191.       }
  192.   return YES;
  193. }
  194. @end
  195. static id
  196. createArchiver (id aZone, BOOL hdf5Flag, BOOL inhibitLoadFlag, BOOL deepFlag)
  197. {
  198.   if (hdf5Flag)
  199.     {
  200.       return [[[[HDF5Archiver createBegin: aZone]
  201.                  setPath: (deepFlag ? "deep.hdf" : "shallow.hdf")]
  202.                 setInhibitLoadFlag: inhibitLoadFlag]
  203.                createEnd];             
  204.     }
  205.   else
  206.     {
  207.       return [[[[LispArchiver createBegin: aZone]
  208.                  setPath: (deepFlag ? "deep.scm" : "shallow.scm")]
  209.                 setInhibitLoadFlag: inhibitLoadFlag]
  210.                createEnd];
  211.     }
  212. }
  213. static BOOL
  214. checkArchiver (id aZone, BOOL hdf5Flag, BOOL deepFlag, BOOL updateFlag)
  215. {
  216.   id obj;
  217.   id archiver;
  218.   BOOL ret;
  219.   archiver = createArchiver (aZone, hdf5Flag, (updateFlag ? YES : NO), 
  220.                              deepFlag);
  221.   if (deepFlag)
  222.     obj = [[[[MyClassDeeper createBegin: aZone]
  223.               setUpdateFlag: updateFlag]
  224.              setDeepFlag: YES]
  225.             createEnd];
  226.   else
  227.     obj = [[[[MyClass createBegin: aZone]
  228.               setUpdateFlag: updateFlag]
  229.              setDeepFlag: NO]
  230.             createEnd];
  231.   [archiver registerClient: obj];
  232.   [archiver sync];
  233.   [obj drop];
  234.   
  235.   [archiver drop];
  236.   archiver = createArchiver (aZone, hdf5Flag, NO, deepFlag);
  237.   obj = [archiver getObject: OBJNAME];
  238.   if (!obj)
  239.     abort ();
  240.   ret = [obj checkObject];
  241.   [obj drop];
  242.   [archiver drop];
  243.   return ret;
  244. }
  245. int
  246. main (int argc, const char **argv)
  247. {
  248.   initSwarmBatch (argc, argv);
  249.   if (checkArchiver (globalZone, NO, NO, YES) == NO)
  250.     raiseEvent (InternalError, 
  251.                 "Shallow Lisp serialization with update failed");
  252.   if (checkArchiver (globalZone, NO, NO, NO) == NO)
  253.     raiseEvent (InternalError, 
  254.                 "Shallow Lisp serialization with no update failed");
  255.   if (checkArchiver (globalZone, NO, YES, YES) == NO)
  256.     raiseEvent (InternalError, 
  257.                 "Deep Lisp serialization with update failed");
  258.   if (checkArchiver (globalZone, NO, YES, NO) == NO)
  259.     raiseEvent (InternalError, 
  260.                 "Deep Lisp serialization with no update failed");
  261. #ifdef HAVE_HDF5
  262.   if (checkArchiver (globalZone, YES, NO, YES) == NO)
  263.     raiseEvent (InternalError, "Shallow HDF5 serialization failed");
  264.   if (checkArchiver (globalZone, YES, YES, YES) == NO)
  265.     raiseEvent (InternalError, "Deep HDF5 serialization failed");
  266. #endif
  267.   return 0;
  268. }