[4] | 1 | /****************************************************************************** |
---|
| 2 | * QUANTA - A toolkit for High Performance Data Sharing |
---|
| 3 | * Copyright (C) 2003 Electronic Visualization Laboratory, |
---|
| 4 | * University of Illinois at Chicago |
---|
| 5 | * |
---|
| 6 | * All rights reserved. |
---|
| 7 | * |
---|
| 8 | * Redistribution and use in source and binary forms, with or without |
---|
| 9 | * modification, are permitted provided that the following conditions are met: |
---|
| 10 | * |
---|
| 11 | * * Redistributions of source code must retain the above copyright |
---|
| 12 | * notice, this list of conditions and the following disclaimer. |
---|
| 13 | * * Redistributions in binary form must reproduce the above |
---|
| 14 | * copyright notice, this list of conditions and the following disclaimer |
---|
| 15 | * in the documentation and/or other materials provided with the distribution. |
---|
| 16 | * * Neither the name of the University of Illinois at Chicago nor |
---|
| 17 | * the names of its contributors may be used to endorse or promote |
---|
| 18 | * products derived from this software without specific prior written permission. |
---|
| 19 | * |
---|
| 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
---|
| 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
---|
| 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
---|
| 23 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
---|
| 24 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
---|
| 25 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
---|
| 26 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
---|
| 27 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
---|
| 28 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
---|
| 29 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
---|
| 30 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
| 31 | * |
---|
| 32 | * Direct questions, comments etc about Quanta to cavern@evl.uic.edu |
---|
| 33 | *****************************************************************************/ |
---|
| 34 | |
---|
| 35 | #ifndef _QUANTA_DATAPACK_C_H |
---|
| 36 | #define _QUANTA_DATAPACK_C_H |
---|
| 37 | |
---|
| 38 | #define FLOAT_SIZE 4 |
---|
| 39 | #define DOUBLE_SIZE 8 |
---|
| 40 | #define INT_SIZE 4 |
---|
| 41 | #if (_MIPS_SZLONG==64) |
---|
| 42 | #define LONG_SIZE 8 |
---|
| 43 | #define UNSIGNED_LONG_SIZE 8 |
---|
| 44 | #else |
---|
| 45 | #define LONG_SIZE 4 |
---|
| 46 | #define UNSIGNED_LONG_SIZE 4 |
---|
| 47 | #endif |
---|
| 48 | #define INT32_SIZE 4 |
---|
| 49 | #define INT64_SIZE 8 |
---|
| 50 | #define CHAR_SIZE 1 |
---|
| 51 | |
---|
| 52 | typedef int int32; |
---|
| 53 | |
---|
| 54 | #ifdef WIN32 |
---|
| 55 | typedef __int64 int64; |
---|
| 56 | #elif (_MIPS_SZLONG==64) |
---|
| 57 | typedef long int64; |
---|
| 58 | #else |
---|
| 59 | typedef long long int64; |
---|
| 60 | #endif |
---|
| 61 | |
---|
| 62 | #ifdef _WIN32_WCE |
---|
| 63 | #ifndef __HAVE_WINSOCK2_H |
---|
| 64 | #include <winsock2.h> |
---|
| 65 | #define __HAVE_WINSOCK2_H |
---|
| 66 | #endif /* __HAVE_WINSOCK2_H */ |
---|
| 67 | #endif |
---|
| 68 | |
---|
| 69 | /** |
---|
| 70 | Data packing class. It is basically a glorified memcpy(). The idea is |
---|
| 71 | that you create an object to help you pack data for transmission over |
---|
| 72 | networks. |
---|
| 73 | |
---|
| 74 | Sending and packing data: First you create a QUANTAnet_datapack_c |
---|
| 75 | object. Then using the InitPack() method, assign to it a pre-allocated |
---|
| 76 | memory buffer (SEE BELOW FOR IMPORTANT NOTES.) |
---|
| 77 | Then using the various QUANTAnet_datapack_c::pack*() |
---|
| 78 | member functions, you can pack integers, chars, floats, and doubles |
---|
| 79 | into the buffer. The buffer is now ready for big-endian to |
---|
| 80 | little-endian transmission. (And vice-versa). |
---|
| 81 | |
---|
| 82 | Receiving and unpacking data: Similarly if you receive a buffer of |
---|
| 83 | data from the network, you assign this buffer to a |
---|
| 84 | QUANTAnet_datapack_c object using the InitUnpack() method. Finally, |
---|
| 85 | we unpack its constituent components using the |
---|
| 86 | QUANTAnet_datapack_c::unpack*() member functions. |
---|
| 87 | |
---|
| 88 | IMPORTANT NOTES: |
---|
| 89 | |
---|
| 90 | It is important to compute the length of the buffer using the various |
---|
| 91 | QUANTAnet_datapack_c::sizeof_*() methods where possible as additional |
---|
| 92 | buffer space is needed to encode platform-specific information. If in |
---|
| 93 | doubt always allocate 1 more byte than necessary. The sizeof_() calls |
---|
| 94 | will make sure that extra byte is included. |
---|
| 95 | |
---|
| 96 | To make your application as portable as possible, please take a look at |
---|
| 97 | packInt32 and packInt64 and counter functions that unpacks the data. |
---|
| 98 | These functions should be more portable than packInt and packLong functions |
---|
| 99 | since there is not specification about the size of int and lont int types |
---|
| 100 | in C or C++ language reference manual. |
---|
| 101 | |
---|
| 102 | For example, on SGI, int is going to be treated as 32bits no matter what |
---|
| 103 | kind of binary format you are using. However, long int is going to be treated |
---|
| 104 | as 32bits if you use 32 or n32 for your binary format, whereas it would take |
---|
| 105 | 64bits if you use 64 as your binary format. On Win32 and linux running on |
---|
| 106 | Intel processors, both int and long takes 32bit space. |
---|
| 107 | |
---|
| 108 | Finally remember the order in which you packed your data. You need to |
---|
| 109 | use the same order to unpack them correctly. |
---|
| 110 | |
---|
| 111 | @version: 12/1/1999 |
---|
| 112 | |
---|
| 113 | */ |
---|
| 114 | |
---|
| 115 | class QUANTAnet_datapack_c { |
---|
| 116 | |
---|
| 117 | |
---|
| 118 | public: |
---|
| 119 | QUANTAnet_datapack_c() { |
---|
| 120 | running = 0; size = 0; |
---|
| 121 | start = 0; |
---|
| 122 | } |
---|
| 123 | |
---|
| 124 | |
---|
| 125 | ///Datapack class return values |
---|
| 126 | //@{ |
---|
| 127 | /// Operation went ok |
---|
| 128 | static const int OK/* = 0*/; |
---|
| 129 | /// Operation failed |
---|
| 130 | static const int FAILED/* = -1*/; |
---|
| 131 | //@} |
---|
| 132 | |
---|
| 133 | /** |
---|
| 134 | Before we do any actual packing, we first call this method to attach the datapack object to some buffer |
---|
| 135 | |
---|
| 136 | @param buffer |
---|
| 137 | This buffer provided by the API user is where the packed data will be stored |
---|
| 138 | |
---|
| 139 | @param buffersize |
---|
| 140 | The size in bytes of the buffer above |
---|
| 141 | */ |
---|
| 142 | void initPack(char *buffer, int buffersize); |
---|
| 143 | |
---|
| 144 | /** |
---|
| 145 | Before we do any actual unpacking, we first call this method to attach the datapack object to some buffer |
---|
| 146 | |
---|
| 147 | @param buffer |
---|
| 148 | This buffer where the packed data is stored |
---|
| 149 | |
---|
| 150 | @param buffersize |
---|
| 151 | The size in bytes of the buffer above |
---|
| 152 | */ |
---|
| 153 | void initUnpack(char *buffer, int buffersize); |
---|
| 154 | |
---|
| 155 | /** |
---|
| 156 | Given a datapack class, this method gives us a pointer to the buffer where the packed data is stored |
---|
| 157 | |
---|
| 158 | @return |
---|
| 159 | A pointer to the beginning of the packed data stream |
---|
| 160 | |
---|
| 161 | |
---|
| 162 | */ |
---|
| 163 | char *getBuffer() { return (char *)start;} |
---|
| 164 | |
---|
| 165 | /** |
---|
| 166 | Gives us the size of the buffer attached to this datapack object |
---|
| 167 | |
---|
| 168 | @return |
---|
| 169 | Size in bytes of the attached buffer |
---|
| 170 | |
---|
| 171 | */ |
---|
| 172 | int getBufferMaxSize() { return size;} |
---|
| 173 | |
---|
| 174 | /** |
---|
| 175 | Gives us the size in bytes of available space left in the attached buffer |
---|
| 176 | |
---|
| 177 | @return |
---|
| 178 | Size in bytes of the remaining space available in the attached buffer |
---|
| 179 | */ |
---|
| 180 | int getBufferFilledSize() {return running - start;} |
---|
| 181 | |
---|
| 182 | /** |
---|
| 183 | Insert a variable of type float into the buffer |
---|
| 184 | |
---|
| 185 | @return |
---|
| 186 | OK or FAILED |
---|
| 187 | |
---|
| 188 | @param val |
---|
| 189 | The float variable to be packed |
---|
| 190 | */ |
---|
| 191 | int packFloat(float val); |
---|
| 192 | |
---|
| 193 | /** |
---|
| 194 | Insert a variable of type int into the buffer |
---|
| 195 | |
---|
| 196 | @return |
---|
| 197 | OK or FAILED |
---|
| 198 | |
---|
| 199 | @param val |
---|
| 200 | The int variable to be packed |
---|
| 201 | */ |
---|
| 202 | int packInt(int val) ; |
---|
| 203 | |
---|
| 204 | /** |
---|
| 205 | Insert a variable of type 32-bit integer into the buffer |
---|
| 206 | |
---|
| 207 | @return |
---|
| 208 | OK or FAILED |
---|
| 209 | |
---|
| 210 | |
---|
| 211 | @param val |
---|
| 212 | The 32bit integer variable to be packed |
---|
| 213 | */ |
---|
| 214 | int packInt32(int32 val); |
---|
| 215 | |
---|
| 216 | /** |
---|
| 217 | Insert a variable of type long into the buffer. Note that long takes 8 |
---|
| 218 | bytes when it is compiled with 64-bit compiler on SGI. |
---|
| 219 | |
---|
| 220 | @return |
---|
| 221 | OK or FAILED |
---|
| 222 | |
---|
| 223 | @param val |
---|
| 224 | The long variable to be packed |
---|
| 225 | */ |
---|
| 226 | int packLong(long val) ; |
---|
| 227 | |
---|
| 228 | /** |
---|
| 229 | Insert a variable of type 64-bit integer into the buffer |
---|
| 230 | |
---|
| 231 | @return |
---|
| 232 | OK or FAILED |
---|
| 233 | |
---|
| 234 | @param val |
---|
| 235 | The 64-bit integer variable to be packed |
---|
| 236 | */ |
---|
| 237 | int packInt64(int64 val); |
---|
| 238 | |
---|
| 239 | /** |
---|
| 240 | Insert a variable of type double into the buffer |
---|
| 241 | |
---|
| 242 | @return |
---|
| 243 | OK or FAILED |
---|
| 244 | |
---|
| 245 | @param val |
---|
| 246 | The double variable to be packed |
---|
| 247 | */ |
---|
| 248 | int packDouble(double val); |
---|
| 249 | |
---|
| 250 | |
---|
| 251 | #ifdef _WIN32_WCE |
---|
| 252 | /** |
---|
| 253 | Insert a variable of type char into the buffer |
---|
| 254 | |
---|
| 255 | @return |
---|
| 256 | OK or FAILED |
---|
| 257 | |
---|
| 258 | @param val |
---|
| 259 | The Unicode char variable to be packed |
---|
| 260 | */ |
---|
| 261 | int packChar(TCHAR val) ; |
---|
| 262 | #endif |
---|
| 263 | |
---|
| 264 | /** |
---|
| 265 | Insert a variable of type char into the buffer |
---|
| 266 | |
---|
| 267 | @return |
---|
| 268 | OK or FAILED |
---|
| 269 | |
---|
| 270 | @param val |
---|
| 271 | The char variable to be packed |
---|
| 272 | */ |
---|
| 273 | int packChar(char val) ; |
---|
| 274 | |
---|
| 275 | /** Pack a null-terminated character string. |
---|
| 276 | This convenience functions packs a null-terminated character |
---|
| 277 | string into the buffer. The length of the string in bytes is |
---|
| 278 | internally encoded. This reduces network traffic as only the |
---|
| 279 | required number of bytes are sent across the network. |
---|
| 280 | |
---|
| 281 | @param val null-terminated character string to pack |
---|
| 282 | @return OK or FAILED |
---|
| 283 | */ |
---|
| 284 | int packString(char* val); |
---|
| 285 | |
---|
| 286 | #ifdef _WIN32_WCE |
---|
| 287 | /** |
---|
| 288 | Pack raw characters into the buffer |
---|
| 289 | |
---|
| 290 | @return |
---|
| 291 | OK or FAILED |
---|
| 292 | |
---|
| 293 | @param val |
---|
| 294 | The Unicode char array to be packed |
---|
| 295 | @param sz |
---|
| 296 | Num chars to pack |
---|
| 297 | */ |
---|
| 298 | int pack(TCHAR* val, int sz) ; |
---|
| 299 | #endif |
---|
| 300 | |
---|
| 301 | /** |
---|
| 302 | Pack raw characters into the buffer |
---|
| 303 | |
---|
| 304 | @return |
---|
| 305 | OK or FAILED |
---|
| 306 | |
---|
| 307 | @param val |
---|
| 308 | The char array to be packed |
---|
| 309 | @param sz |
---|
| 310 | Num chars to pack |
---|
| 311 | */ |
---|
| 312 | int pack(char* val, int sz) ; |
---|
| 313 | |
---|
| 314 | /** |
---|
| 315 | Pack floats of a float array into the buffer |
---|
| 316 | |
---|
| 317 | @return |
---|
| 318 | OK or FAILED |
---|
| 319 | |
---|
| 320 | @param val |
---|
| 321 | The float array to be packed |
---|
| 322 | @param sz |
---|
| 323 | Num floats in the array |
---|
| 324 | */ |
---|
| 325 | int packFloatArray(float* val, int sz) ; |
---|
| 326 | |
---|
| 327 | /** |
---|
| 328 | Pack doubles of a double array into the buffer |
---|
| 329 | |
---|
| 330 | @return |
---|
| 331 | OK or FAILED |
---|
| 332 | |
---|
| 333 | @param val |
---|
| 334 | The double array to be packed |
---|
| 335 | @param sz |
---|
| 336 | Num doubles in the array |
---|
| 337 | */ |
---|
| 338 | int packDoubleArray(double* val, int sz) ; |
---|
| 339 | |
---|
| 340 | /** |
---|
| 341 | Pack an array with int type values into the buffer |
---|
| 342 | |
---|
| 343 | @return |
---|
| 344 | OK or FAILED |
---|
| 345 | |
---|
| 346 | @param val |
---|
| 347 | The int array to be packed |
---|
| 348 | @param sz |
---|
| 349 | Num int values in the array |
---|
| 350 | */ |
---|
| 351 | int packIntArray(int* val, int sz) ; |
---|
| 352 | |
---|
| 353 | /** |
---|
| 354 | Pack an array with int32 type values into the buffer |
---|
| 355 | |
---|
| 356 | @return |
---|
| 357 | OK or FAILED |
---|
| 358 | |
---|
| 359 | @param val |
---|
| 360 | The int32 array to be packed |
---|
| 361 | @param sz |
---|
| 362 | Num int32 values in the array |
---|
| 363 | */ |
---|
| 364 | int packInt32Array(int32* val, int sz) ; |
---|
| 365 | |
---|
| 366 | /** |
---|
| 367 | Pack an array with int64 type values into the buffer |
---|
| 368 | |
---|
| 369 | @return |
---|
| 370 | OK or FAILED |
---|
| 371 | |
---|
| 372 | @param val |
---|
| 373 | The int64 array to be packed |
---|
| 374 | @param sz |
---|
| 375 | Num int64 values in the array |
---|
| 376 | */ |
---|
| 377 | int packInt64Array(int64* val, int sz) ; |
---|
| 378 | |
---|
| 379 | /** |
---|
| 380 | Pack an array with long type values into the buffer |
---|
| 381 | |
---|
| 382 | @return |
---|
| 383 | OK or FAILED |
---|
| 384 | |
---|
| 385 | @param val |
---|
| 386 | The long array to be packed |
---|
| 387 | @param sz |
---|
| 388 | Num long values in the array |
---|
| 389 | */ |
---|
| 390 | int packLongArray(long* val, int sz) ; |
---|
| 391 | |
---|
| 392 | /** |
---|
| 393 | Insert a variable of type unsigned long into the buffer. Note that long takes 8 bytes when it is compiled with 64-bit compiler on SGI. |
---|
| 394 | |
---|
| 395 | @return |
---|
| 396 | OK or FAILED |
---|
| 397 | |
---|
| 398 | @param val |
---|
| 399 | The unsigned long variable to be packed |
---|
| 400 | */ |
---|
| 401 | |
---|
| 402 | int packUnsignedLong(unsigned long val); |
---|
| 403 | |
---|
| 404 | /** |
---|
| 405 | Extract a variable of type float from the buffer |
---|
| 406 | |
---|
| 407 | @return |
---|
| 408 | OK or FAILED |
---|
| 409 | |
---|
| 410 | @param Answer |
---|
| 411 | A user provided float variable where we store the extracted value |
---|
| 412 | */ |
---|
| 413 | int unpackFloat(float *Answer) ; |
---|
| 414 | |
---|
| 415 | /** |
---|
| 416 | Extract a variable of type int from the buffer |
---|
| 417 | |
---|
| 418 | @return |
---|
| 419 | OK or FAILED |
---|
| 420 | |
---|
| 421 | @param Answer |
---|
| 422 | A user provided int variable where we store the extracted value |
---|
| 423 | */ |
---|
| 424 | int unpackInt(int *Answer) ; |
---|
| 425 | |
---|
| 426 | /** |
---|
| 427 | Extract a variable of type 32bit integer from the buffer |
---|
| 428 | |
---|
| 429 | @return |
---|
| 430 | OK or FAILED |
---|
| 431 | |
---|
| 432 | @param Answer |
---|
| 433 | A user provided 32bit integer variable where we store the extracted value |
---|
| 434 | */ |
---|
| 435 | int unpackInt32(int32 *Answer) ; |
---|
| 436 | |
---|
| 437 | /** |
---|
| 438 | Extract a variable of type long from the buffer |
---|
| 439 | |
---|
| 440 | @return |
---|
| 441 | OK or FAILED |
---|
| 442 | |
---|
| 443 | @param Answer |
---|
| 444 | A user provided long variable where we store the extracted value |
---|
| 445 | */ |
---|
| 446 | int unpackLong(long *Answer) ; |
---|
| 447 | |
---|
| 448 | /** |
---|
| 449 | Extract a variable of type unsigned long from the buffer |
---|
| 450 | |
---|
| 451 | @return |
---|
| 452 | OK or FAILED |
---|
| 453 | |
---|
| 454 | @param Answer |
---|
| 455 | A user provided unsigned long variable where we store the extracted value |
---|
| 456 | */ |
---|
| 457 | int unpackUnsignedLong(unsigned long *Answer) ; |
---|
| 458 | |
---|
| 459 | |
---|
| 460 | /** |
---|
| 461 | Extract a variable of type 64-bit integer from the buffer |
---|
| 462 | |
---|
| 463 | @return |
---|
| 464 | OK or FAILED |
---|
| 465 | |
---|
| 466 | @param Answer |
---|
| 467 | A user provided 64-bit integer variable where we store the extracted value |
---|
| 468 | */ |
---|
| 469 | int unpackInt64(int64 *Answer) ; |
---|
| 470 | |
---|
| 471 | /** |
---|
| 472 | Extract a variable of type double from the buffer |
---|
| 473 | |
---|
| 474 | @return |
---|
| 475 | OK or FAILED |
---|
| 476 | |
---|
| 477 | @param Answer |
---|
| 478 | A user provided double variable where we store the extracted value |
---|
| 479 | */ |
---|
| 480 | int unpackDouble(double *Answer) ; |
---|
| 481 | |
---|
| 482 | |
---|
| 483 | #ifdef _WIN32_WCE |
---|
| 484 | /** |
---|
| 485 | Extract a variable of type char from the buffer |
---|
| 486 | |
---|
| 487 | @return |
---|
| 488 | OK or FAILED |
---|
| 489 | |
---|
| 490 | @param Answer |
---|
| 491 | A user provided Unicode char variable where we store the extracted value |
---|
| 492 | */ |
---|
| 493 | int unpackChar(TCHAR *Answer) ; |
---|
| 494 | #endif |
---|
| 495 | |
---|
| 496 | /** |
---|
| 497 | Extract a variable of type char from the buffer |
---|
| 498 | |
---|
| 499 | @return |
---|
| 500 | OK or FAILED |
---|
| 501 | |
---|
| 502 | @param Answer |
---|
| 503 | A user provided char variable where we store the extracted value |
---|
| 504 | */ |
---|
| 505 | int unpackChar(char *Answer) ; |
---|
| 506 | |
---|
| 507 | /** Pack a null-terminated character string. |
---|
| 508 | This convenience functions packs a null-terminated character |
---|
| 509 | string into the buffer. The length of the string in bytes is |
---|
| 510 | internally encoded when extracting the string. If sz indicates |
---|
| 511 | that val does not have enough space to unpack the string, then |
---|
| 512 | the unpack function will fail. The unpacked value does include |
---|
| 513 | the terminating null character '\\0'. |
---|
| 514 | |
---|
| 515 | @param val character buffer to stored unpacked string. |
---|
| 516 | @param sz size in bytes of the val buffer. |
---|
| 517 | @return OK or FAILED |
---|
| 518 | */ |
---|
| 519 | int unpackString(char* val, const int& sz); |
---|
| 520 | |
---|
| 521 | #ifdef _WIN32_WCE |
---|
| 522 | /** |
---|
| 523 | Extract the packed chars from the buffer |
---|
| 524 | |
---|
| 525 | @return |
---|
| 526 | OK or FAILED |
---|
| 527 | |
---|
| 528 | @param Answer |
---|
| 529 | A user provided Unicode char array where we store the extracted value |
---|
| 530 | */ |
---|
| 531 | int unpack(TCHAR *Answer, int sz) ; |
---|
| 532 | #endif |
---|
| 533 | |
---|
| 534 | /** |
---|
| 535 | Extract the packed chars from the buffer |
---|
| 536 | |
---|
| 537 | @return |
---|
| 538 | OK or FAILED |
---|
| 539 | |
---|
| 540 | @param Answer |
---|
| 541 | A user provided char array where we store the extracted value |
---|
| 542 | @param sz |
---|
| 543 | Size in bytes of the provided char array |
---|
| 544 | */ |
---|
| 545 | int unpack(char *Answer, int sz) ; |
---|
| 546 | |
---|
| 547 | /** |
---|
| 548 | Extract the packed float array from the buffer |
---|
| 549 | |
---|
| 550 | @return |
---|
| 551 | OK or FAILED |
---|
| 552 | |
---|
| 553 | @param Answer |
---|
| 554 | A user provided float array where the extracted floats are stored |
---|
| 555 | |
---|
| 556 | @param sz |
---|
| 557 | The size of the array in which the extracted floats are stored |
---|
| 558 | */ |
---|
| 559 | int unpackFloatArray(float* Answer, int sz); |
---|
| 560 | |
---|
| 561 | /** |
---|
| 562 | Extract the packed double array from the buffer |
---|
| 563 | |
---|
| 564 | @return |
---|
| 565 | OK or FAILED |
---|
| 566 | |
---|
| 567 | @param Answer |
---|
| 568 | A user provided double array where the extracted doubles are stored |
---|
| 569 | |
---|
| 570 | @param sz |
---|
| 571 | The size of the array in which the extracted doubles are stored |
---|
| 572 | */ |
---|
| 573 | int unpackDoubleArray(double* Answer, int sz); |
---|
| 574 | |
---|
| 575 | /** |
---|
| 576 | Extract the packed int array from the buffer |
---|
| 577 | |
---|
| 578 | @return |
---|
| 579 | OK or FAILED |
---|
| 580 | |
---|
| 581 | @param Answer |
---|
| 582 | A user provided int array where the extracted int values are stored |
---|
| 583 | |
---|
| 584 | @param sz |
---|
| 585 | The size of the array in which the extracted int values are stored |
---|
| 586 | */ |
---|
| 587 | int unpackIntArray(int* Answer, int sz); |
---|
| 588 | |
---|
| 589 | /** |
---|
| 590 | Extract the packed int32 array from the buffer |
---|
| 591 | |
---|
| 592 | @return |
---|
| 593 | OK or FAILED |
---|
| 594 | |
---|
| 595 | @param Answer |
---|
| 596 | A user provided array where the extracted int32 values are stored |
---|
| 597 | |
---|
| 598 | @param sz |
---|
| 599 | The size of the array in which the extracted int32 values are stored |
---|
| 600 | */ |
---|
| 601 | int unpackInt32Array(int32* Answer, int sz); |
---|
| 602 | |
---|
| 603 | /** |
---|
| 604 | Extract the packed int64 array from the buffer |
---|
| 605 | |
---|
| 606 | @return |
---|
| 607 | OK or FAILED |
---|
| 608 | |
---|
| 609 | @param Answer |
---|
| 610 | A user provided array where the extracted int64 values are stored |
---|
| 611 | |
---|
| 612 | @param sz |
---|
| 613 | The size of the array in which the extracted int64 values are stored |
---|
| 614 | */ |
---|
| 615 | int unpackInt64Array(int64* Answer, int sz); |
---|
| 616 | |
---|
| 617 | /** |
---|
| 618 | Extract the packed long array from the buffer |
---|
| 619 | |
---|
| 620 | @return |
---|
| 621 | OK or FAILED |
---|
| 622 | |
---|
| 623 | @param Answer |
---|
| 624 | A user provided array where the extracted long values are stored |
---|
| 625 | |
---|
| 626 | @param sz |
---|
| 627 | The size of the array in which the extracted long values are stored |
---|
| 628 | */ |
---|
| 629 | int unpackLongArray(long* Answer, int sz); |
---|
| 630 | |
---|
| 631 | /** |
---|
| 632 | This function tells us if there is enough incoming_size bytes in the buffer to perform the operation. |
---|
| 633 | |
---|
| 634 | @return OK or FAILED |
---|
| 635 | |
---|
| 636 | @param incoming_size |
---|
| 637 | The size in bytes of to be tested. |
---|
| 638 | */ |
---|
| 639 | int checkspace(unsigned int incoming_size); |
---|
| 640 | |
---|
| 641 | /** |
---|
| 642 | Gives us a cross-platform safe float size |
---|
| 643 | |
---|
| 644 | @return |
---|
| 645 | The number of bytes in an int (+ 1 byte for machine code storage) |
---|
| 646 | */ |
---|
| 647 | static int sizeof_float(unsigned int cnt=1){return FLOAT_SIZE * cnt;}; |
---|
| 648 | /** |
---|
| 649 | Gives us a cross-platform safe int size |
---|
| 650 | |
---|
| 651 | @return |
---|
| 652 | The number of bytes in an int (+ 1 byte for machine code storage) |
---|
| 653 | */ |
---|
| 654 | static int sizeof_int(unsigned int cnt=1){return INT_SIZE * cnt;}; |
---|
| 655 | |
---|
| 656 | /** |
---|
| 657 | Gives us a cross-platform safe 64-bit int size |
---|
| 658 | |
---|
| 659 | @return |
---|
| 660 | The number of bytes in an 64-bit int |
---|
| 661 | */ |
---|
| 662 | static int sizeof_int64(unsigned int cnt=1){return INT64_SIZE * cnt;}; |
---|
| 663 | |
---|
| 664 | /** |
---|
| 665 | Gives us a cross-platform safe 32-bit int size |
---|
| 666 | |
---|
| 667 | @return |
---|
| 668 | The number of bytes in an 32-bit int |
---|
| 669 | */ |
---|
| 670 | static int sizeof_int32(unsigned int cnt=1){return INT32_SIZE * cnt;}; |
---|
| 671 | |
---|
| 672 | /** |
---|
| 673 | Gives us a cross-platform safe long size |
---|
| 674 | |
---|
| 675 | @return |
---|
| 676 | The number of bytes in a long (+ 1 byte for machine code storage) |
---|
| 677 | */ |
---|
| 678 | static int sizeof_long(unsigned int cnt=1){return LONG_SIZE * cnt;}; |
---|
| 679 | |
---|
| 680 | /** |
---|
| 681 | Gives us a cross-platform safe unsigned long size |
---|
| 682 | |
---|
| 683 | @return |
---|
| 684 | The number of bytes in unsigned long (+ 1 byte for machine code storage) |
---|
| 685 | */ |
---|
| 686 | static int sizeof_unsignedLong(unsigned int cnt=1){return UNSIGNED_LONG_SIZE * cnt;}; |
---|
| 687 | |
---|
| 688 | /** |
---|
| 689 | Gives us a cross-platform safe char size |
---|
| 690 | |
---|
| 691 | @return |
---|
| 692 | The number of bytes in a char 1 byte for machine code storage) |
---|
| 693 | */ |
---|
| 694 | static int sizeof_char(unsigned int cnt=1){return CHAR_SIZE * cnt;}; |
---|
| 695 | |
---|
| 696 | /** |
---|
| 697 | Gives us a cross-platform safe double size |
---|
| 698 | |
---|
| 699 | @return |
---|
| 700 | The number of bytes in a double (+ 1 byte for machine code storage) |
---|
| 701 | */ |
---|
| 702 | static int sizeof_double(unsigned int cnt=1){return DOUBLE_SIZE * cnt;}; |
---|
| 703 | |
---|
| 704 | /** Gives us a cross-platform safe string size encoded with its length. |
---|
| 705 | @return The number of bytes used to encode a string. |
---|
| 706 | */ |
---|
| 707 | static int sizeof_string(unsigned int cnt=1) |
---|
| 708 | { return sizeof_int() + sizeof_char(cnt); } |
---|
| 709 | |
---|
| 710 | |
---|
| 711 | private: |
---|
| 712 | unsigned long size; |
---|
| 713 | unsigned char *running; |
---|
| 714 | unsigned char *start; |
---|
| 715 | |
---|
| 716 | }; |
---|
| 717 | |
---|
| 718 | #endif |
---|