libcm is a C development framework with an emphasis on audio signal processing applications.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmSerialize.h 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. //| Copyright: (C) 2009-2020 Kevin Larke <contact AT larke DOT org>
  2. //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
  3. #ifndef cmSerialize_h
  4. #define cmSerialize_h
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. //( { file_desc:" An API for serializing data structures into byte streams and then deserializing them back into data structures." kw:[base]}
  9. // Result codes
  10. enum
  11. {
  12. kOkSrRC,
  13. kLHeapFailSrRC,
  14. kParamErrSrRC,
  15. kFormatViolationSrRC,
  16. };
  17. // type id
  18. enum
  19. {
  20. kArraySrFl = 0x80000000,
  21. kInvalidSrId = 0, // 0
  22. kCharSrId, // 1
  23. kUCharSrId, // 2
  24. kShortSrId, // 3
  25. kUShortSrId, // 4
  26. kIntSrId, // 5
  27. kUIntSrId, // 6
  28. kLongSrId, // 7
  29. kULongSrId, // 8
  30. kFloatSrId, // 9
  31. kDoubleSrId, // 10
  32. kBoolSrId, // 11
  33. kStructSrId, // 12 (all structTypeId's are >= kStructSrId)
  34. kCharVSrId = kCharSrId + kArraySrFl,
  35. kUCharVSrId = kUCharSrId + kArraySrFl,
  36. kShortVSrId = kShortSrId + kArraySrFl,
  37. kUShortVSrId = kUShortSrId + kArraySrFl,
  38. kIntVSrId = kIntSrId + kArraySrFl,
  39. kUIntVSrId = kUIntSrId + kArraySrFl,
  40. kLongVSrId = kLongSrId + kArraySrFl,
  41. kULongVSrId = kULongSrId + kArraySrFl,
  42. kFloatVSrId = kFloatSrId + kArraySrFl,
  43. kDoubleVSrId = kDoubleSrId + kArraySrFl,
  44. };
  45. typedef cmHandle_t cmSrH_t;
  46. typedef unsigned cmSrRC_t;
  47. extern cmSrH_t cmSrNullHandle;
  48. cmSrRC_t cmSrAlloc( cmSrH_t* hp, cmCtx_t* ctx );
  49. cmSrRC_t cmSrFree( cmSrH_t* hp );
  50. bool cmSrIsValid( cmSrH_t h );
  51. cmSrRC_t cmSrLastErrorCode( cmSrH_t h );
  52. cmSrRC_t cmSrGetAndClearLastErrorCode( cmSrH_t h );
  53. //
  54. // Serializer Format Interface
  55. //
  56. cmSrRC_t cmSrFmtReset( cmSrH_t h );
  57. cmSrRC_t cmSrFmtDefineStruct( cmSrH_t h, unsigned structTypeId );
  58. cmSrRC_t cmSrFmtStruct( cmSrH_t h, unsigned structTypeId );
  59. cmSrRC_t cmSrFmtChar( cmSrH_t h );
  60. cmSrRC_t cmSrFmtUChar( cmSrH_t h );
  61. cmSrRC_t cmSrFmtShort( cmSrH_t h );
  62. cmSrRC_t cmSrFmtUShort( cmSrH_t h );
  63. cmSrRC_t cmSrFmtLong( cmSrH_t h );
  64. cmSrRC_t cmSrFmtULong( cmSrH_t h );
  65. cmSrRC_t cmSrFmtInt( cmSrH_t h );
  66. cmSrRC_t cmSrFmtUInt( cmSrH_t h );
  67. cmSrRC_t cmSrFmtFloat( cmSrH_t h );
  68. cmSrRC_t cmSrFmtDouble( cmSrH_t h );
  69. cmSrRC_t cmSrFmtBool( cmSrH_t h );
  70. cmSrRC_t cmSrFmtStructV( cmSrH_t h, unsigned structTypeId );
  71. cmSrRC_t cmSrFmtCharV( cmSrH_t h );
  72. cmSrRC_t cmSrFmtUCharV( cmSrH_t h );
  73. cmSrRC_t cmSrFmtShortV( cmSrH_t h );
  74. cmSrRC_t cmSrFmtUShortV( cmSrH_t h );
  75. cmSrRC_t cmSrFmtLongV( cmSrH_t h );
  76. cmSrRC_t cmSrFmtULongV( cmSrH_t h );
  77. cmSrRC_t cmSrFmtIntV( cmSrH_t h );
  78. cmSrRC_t cmSrFmtUIntV( cmSrH_t h );
  79. cmSrRC_t cmSrFmtFloatV( cmSrH_t h );
  80. cmSrRC_t cmSrFmtDoubleV( cmSrH_t h );
  81. cmSrRC_t cmSrFmtBool( cmSrH_t h );
  82. // Combine a call to cmSrFmtDefineStruct() followed by multiple calls
  83. // to cmSrFmtXXX().
  84. // Notes:
  85. // 1. The arg. list must be terminated with a kInvalidSrId.
  86. // 2. Define primitive types using the appropriate id (kXXXSrId or kXXXVSrId)
  87. // 3. To define a structure field use the user defined structure type id.
  88. // 4. To define a structure array field use include the kArraySrFl flag as part of the id. (e.g. kMyStructId | kArraySrFl)
  89. cmSrRC_t cmSrDefFmt( cmSrH_t h, unsigned structTypeId, ... );
  90. cmSrRC_t cmSrFmtPrint( cmSrH_t h );
  91. //
  92. // Serializer Input (Write) Interface
  93. //
  94. cmSrRC_t cmSrWrReset( cmSrH_t h );
  95. cmSrRC_t cmSrWrStructBegin( cmSrH_t h, unsigned structTypeId );
  96. cmSrRC_t cmSrWrStructEnd( cmSrH_t h );
  97. cmSrRC_t cmSrWrStruct( cmSrH_t h, unsigned structTypeId, unsigned eleCnt );
  98. cmSrRC_t cmSrWrChar( cmSrH_t h, char val );
  99. cmSrRC_t cmSrWrUChar( cmSrH_t h, unsigned char val );
  100. cmSrRC_t cmSrWrShort( cmSrH_t h, short val );
  101. cmSrRC_t cmSrWrUShort( cmSrH_t h, unsigned short val );
  102. cmSrRC_t cmSrWrLong( cmSrH_t h, long val );
  103. cmSrRC_t cmSrWrULong( cmSrH_t h, unsigned long val );
  104. cmSrRC_t cmSrWrInt( cmSrH_t h, int val );
  105. cmSrRC_t cmSrWrUInt( cmSrH_t h, unsigned val );
  106. cmSrRC_t cmSrWrFloat( cmSrH_t h, float val );
  107. cmSrRC_t cmSrWrDouble( cmSrH_t h, double val );
  108. cmSrRC_t cmSrWrBool( cmSrH_t h, bool val );
  109. cmSrRC_t cmSrWrStr( cmSrH_t h, const cmChar_t* val );
  110. cmSrRC_t cmSrWrCharV( cmSrH_t h, const char* val, unsigned eleCnt );
  111. cmSrRC_t cmSrWrUCharV( cmSrH_t h, const unsigned char* val, unsigned eleCnt );
  112. cmSrRC_t cmSrWrShortV( cmSrH_t h, const short* val, unsigned eleCnt );
  113. cmSrRC_t cmSrWrUShortV( cmSrH_t h, const unsigned short* val, unsigned eleCnt );
  114. cmSrRC_t cmSrWrLongV( cmSrH_t h, const long* val, unsigned eleCnt );
  115. cmSrRC_t cmSrWrULongV( cmSrH_t h, const unsigned long* val, unsigned eleCnt );
  116. cmSrRC_t cmSrWrIntV( cmSrH_t h, const int* val, unsigned eleCnt );
  117. cmSrRC_t cmSrWrUIntV( cmSrH_t h, const unsigned* val, unsigned eleCnt );
  118. cmSrRC_t cmSrWrFloatV( cmSrH_t h, const float* val, unsigned eleCnt );
  119. cmSrRC_t cmSrWrDoubleV( cmSrH_t h, const double* val, unsigned eleCnt );
  120. cmSrRC_t cmSrWrBoolV( cmSrH_t h, const bool* val, unsigned eleCnt );
  121. void* cmSrWrAllocBuf( cmSrH_t h, unsigned* bufByteCntPtr );
  122. void* cmSrWrGetBuf( cmSrH_t h, unsigned* bufByteCntPtr );
  123. //
  124. // Serializer Output (Read) Interface
  125. //
  126. // cmSrRdProcessBuffer() validates the buffer and swaps its endianess if necessary.
  127. // This function must be called prior to cmSrRdSetup() however it should only be called
  128. // once on a given buffer. Multiple calls to cmSrRdSetup() however may be made on
  129. // the same buffer following the call to this function.
  130. cmSrRC_t cmSrRdProcessBuffer( cmSrH_t h, void* buf, unsigned bufByteCnt );
  131. // Prepare a buffer for reading.
  132. cmSrRC_t cmSrRdSetup( cmSrH_t h, const void* buf, unsigned bufByteCnt );
  133. cmSrRC_t cmSrRdStructBegin( cmSrH_t h, unsigned structId );
  134. cmSrRC_t cmSrRdStructEnd( cmSrH_t h );
  135. cmSrRC_t cmSrReadStruct( cmSrH_t h, unsigned structTypeId, unsigned* arrayCnt );
  136. cmSrRC_t cmSrReadChar( cmSrH_t h, char* valPtr );
  137. cmSrRC_t cmSrReadUChar( cmSrH_t h, unsigned char* valPtr );
  138. cmSrRC_t cmSrReadShort( cmSrH_t h, short* valPtr );
  139. cmSrRC_t cmSrReadUShort( cmSrH_t h, unsigned short* valPtr );
  140. cmSrRC_t cmSrReadLong( cmSrH_t h, long* valPtr);
  141. cmSrRC_t cmSrReadULong( cmSrH_t h, unsigned long* valPtr );
  142. cmSrRC_t cmSrReadInt( cmSrH_t h, int* valPtr);
  143. cmSrRC_t cmSrReadUInt( cmSrH_t h, unsigned* valPtr );
  144. cmSrRC_t cmSrReadFloat( cmSrH_t h, float* valPtr );
  145. cmSrRC_t cmSrReadDouble( cmSrH_t h, double* valPtr );
  146. cmSrRC_t cmSrReadBool( cmSrH_t h, bool* boolPtr );
  147. cmSrRC_t cmSrReadCharV( cmSrH_t h, char** valPtr, unsigned* eleCntPtr );
  148. cmSrRC_t cmSrReadUCharV( cmSrH_t h, unsigned char** valPtr, unsigned* eleCntPtr );
  149. cmSrRC_t cmSrReadShortV( cmSrH_t h, short** valPtr, unsigned* eleCntPtr );
  150. cmSrRC_t cmSrReadUShortV( cmSrH_t h, unsigned short** valPtr, unsigned* eleCntPtr );
  151. cmSrRC_t cmSrReadLongV( cmSrH_t h, long** valPtr, unsigned* eleCntPtr);
  152. cmSrRC_t cmSrReadULongV( cmSrH_t h, unsigned long** valPtr, unsigned* eleCntPtr );
  153. cmSrRC_t cmSrReadIntV( cmSrH_t h, int** valPtr, unsigned* eleCntPtr);
  154. cmSrRC_t cmSrReadUIntV( cmSrH_t h, unsigned** valPtr, unsigned* eleCntPtr );
  155. cmSrRC_t cmSrReadFloatV( cmSrH_t h, float** valPtr, unsigned* eleCntPtr );
  156. cmSrRC_t cmSrReadDoubleV( cmSrH_t h, double** valPtr, unsigned* eleCntPtr );
  157. cmSrRC_t cmSrReadBoolV( cmSrH_t h, bool** valPtr, unsigned* eleCntPtr );
  158. cmSrRC_t cmSrReadCharCV( cmSrH_t h, const char** valPtr, unsigned* eleCntPtr );
  159. cmSrRC_t cmSrReadUCharCV( cmSrH_t h, const unsigned char** valPtr, unsigned* eleCntPtr );
  160. cmSrRC_t cmSrReadShortCV( cmSrH_t h, const short** valPtr, unsigned* eleCntPtr );
  161. cmSrRC_t cmSrReadUShortCV( cmSrH_t h, const unsigned short** valPtr, unsigned* eleCntPtr );
  162. cmSrRC_t cmSrReadLongCV( cmSrH_t h, const long** valPtr, unsigned* eleCntPtr);
  163. cmSrRC_t cmSrReadULongCV( cmSrH_t h, const unsigned long** valPtr, unsigned* eleCntPtr );
  164. cmSrRC_t cmSrReadIntCV( cmSrH_t h, const int** valPtr, unsigned* eleCntPtr);
  165. cmSrRC_t cmSrReadUIntCV( cmSrH_t h, const unsigned** valPtr, unsigned* eleCntPtr );
  166. cmSrRC_t cmSrReadFloatCV( cmSrH_t h, const float** valPtr, unsigned* eleCntPtr );
  167. cmSrRC_t cmSrReadDoubleCV( cmSrH_t h, const double** valPtr, unsigned* eleCntPtr );
  168. cmSrRC_t cmSrReadBoolCV( cmSrH_t h, const bool** valPtr, unsigned* eleCntPtr );
  169. //
  170. // Abbreviated read functions.
  171. //
  172. // (Use cmSrLastErrorCode() to check for errors.)
  173. //
  174. // Same as cmSrReadFieldStruct but returns array element count or cmInvalidCnt on error.
  175. unsigned cmSrRdStruct( cmSrH_t h, unsigned structTypeId );
  176. char cmSrRdChar( cmSrH_t h );
  177. unsigned char cmSrRdUChar( cmSrH_t h );
  178. short cmSrRdShort( cmSrH_t h );
  179. unsigned short cmSrRdUShort( cmSrH_t h );
  180. long cmSrRdLong( cmSrH_t h );
  181. unsigned long cmSrRdULong( cmSrH_t h );
  182. int cmSrRdInt( cmSrH_t h );
  183. unsigned int cmSrRdUInt( cmSrH_t h );
  184. float cmSrRdFloat( cmSrH_t h );
  185. double cmSrRdDouble( cmSrH_t h );
  186. bool cmSrRdBool( cmSrH_t h );
  187. char* cmSrRdCharV( cmSrH_t h, unsigned* eleCntPtr);
  188. unsigned char* cmSrRdUCharV( cmSrH_t h, unsigned* eleCntPtr);
  189. short* cmSrRdShortV( cmSrH_t h, unsigned* eleCntPtr);
  190. unsigned short* cmSrRdUShortV( cmSrH_t h, unsigned* eleCntPtr);
  191. long* cmSrRdLongV( cmSrH_t h, unsigned* eleCntPtr);
  192. unsigned long* cmSrRdULongV( cmSrH_t h, unsigned* eleCntPtr);
  193. int* cmSrRdIntV( cmSrH_t h, unsigned* eleCntPtr);
  194. unsigned int* cmSrRdUIntV( cmSrH_t h, unsigned* eleCntPtr);
  195. float* cmSrRdFloatV( cmSrH_t h, unsigned* eleCntPtr);
  196. double* cmSrRdDoubleV( cmSrH_t h, unsigned* eleCntPtr);
  197. bool* cmSrRdBoolV( cmSrH_t h, unsigned* aleCntPtr);
  198. const char* cmSrRdCharCV( cmSrH_t h, unsigned* eleCntPtr);
  199. const unsigned char* cmSrRdUCharCV( cmSrH_t h, unsigned* eleCntPtr);
  200. const short* cmSrRdShortCV( cmSrH_t h, unsigned* eleCntPtr);
  201. const unsigned short* cmSrRdUShortCV( cmSrH_t h, unsigned* eleCntPtr);
  202. const long* cmSrRdLongCV( cmSrH_t h, unsigned* eleCntPtr);
  203. const unsigned long* cmSrRdULongCV( cmSrH_t h, unsigned* eleCntPtr);
  204. const int* cmSrRdIntCV( cmSrH_t h, unsigned* eleCntPtr);
  205. const unsigned int* cmSrRdUIntCV( cmSrH_t h, unsigned* eleCntPtr);
  206. const float* cmSrRdFloatCV( cmSrH_t h, unsigned* eleCntPtr);
  207. const double* cmSrRdDoubleCV( cmSrH_t h, unsigned* eleCntPtr);
  208. const bool* cmSrRdBoolCV( cmSrH_t h, unsigned* aleCntPtr);
  209. #if CM_FLOAT_SMP == 1
  210. #define kSampleSrId kFloatSrId
  211. #define kSampleVSrId kFloatSrId + kArraySrFl
  212. #define cmSrFmtSmp cmSrFmtFloat
  213. #define cmSrFmtSmpV cmSrFmtFloatV
  214. #define cmSrWrSmp cmSrWrFloat
  215. #define cmSrWrSmpV cmSrWrFloatV
  216. #define cmSrReadSmp cmSrReadFloat
  217. #define cmSrReadSmpV cmSrReadFloatV
  218. #define cmSrRdSmp cmSrRdFloat
  219. #define cmSrRdSmpV cmSrRdFloatV
  220. #else
  221. #define kSampleSrId kDoubleSrId
  222. #define kSampleVSrId kDoubleSrId + kArraySrFl
  223. #define cmSrFmtSmp cmSrFmtDouble
  224. #define cmSrFmtSmpV cmSrFmtDoubleV
  225. #define cmSrWrSmp cmSrWrDouble
  226. #define cmSrWrSmpV cmSrWrDoubleV
  227. #define cmSrReadSmp cmSrReadDouble
  228. #define cmSrReadSmpV cmSrReadDoubleV
  229. #define cmSrRdSmp cmSrRdDouble
  230. #define cmSrRdSmpV cmSrRdDoubleV
  231. #endif
  232. #if CM_FLOAT_REAL == 1
  233. #define kRealSrId kFloatSrId
  234. #define kRealVSrId kFloatSrId + kArraySrFl
  235. #define cmSrFmtReal cmSrFmtFloat
  236. #define cmSrFmtRealV cmSrFmtFloatV
  237. #define cmSrWrReal cmSrWrFloat
  238. #define cmSrWrRealV cmSrWrFloatV
  239. #define cmSrReadReal cmSrReadFloat
  240. #define cmSrReadRealV cmSrReadFloatV
  241. #define cmSrRdReal cmSrRdFloat
  242. #define cmSrRdRealV cmSrRdFloatV
  243. #else
  244. #define kRealSrId kDoubleSrId
  245. #define kRealVSrId kDoubleSrId + kArraySrFl
  246. #define cmSrFmtReal cmSrFmtDouble
  247. #define cmSrFmtRealV cmSrFmtDoubleV
  248. #define cmSrWrReal cmSrWrDouble
  249. #define cmSrWrRealV cmSrWrDoubleV
  250. #define cmSrReadReal cmSrReadDouble
  251. #define cmSrReadRealV cmSrReadDoubleV
  252. #define cmSrRdReal cmSrRdDouble
  253. #define cmSrRdRealV cmSrRdDoubleV
  254. #endif
  255. cmSrRC_t cmSrTest( cmCtx_t* ctx );
  256. //)
  257. #ifdef __cplusplus
  258. }
  259. #endif
  260. #endif