libcm is a C development framework with an emphasis on audio signal processing applications.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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