2 #ifndef vsl_binary_explicit_io_h_ 3 #define vsl_binary_explicit_io_h_ 34 #include <vxl_config.h> 37 # include <vcl_msvc_warnings.h> 43 #if VXL_LITTLE_ENDIAN == VXL_BIG_ENDIAN 44 extern "There is a problem with the ENDIAN indication macros.";
46 #if VXL_LITTLE_ENDIAN+VXL_BIG_ENDIAN != 1 47 extern "There is a problem with the ENDIAN indication macros.";
81 inline void vsl_swap_bytes(
char*,
unsigned, std::size_t = 1) {
return; }
83 inline void vsl_swap_bytes(
char * ptr,
unsigned nbyte, std::size_t nelem = 1)
91 unsigned nbyte2 = nbyte/2;
92 for (std::size_t n = 0; n < nelem; n++ ) {
94 ptr2 = ptr1 + nbyte - 1;
95 for (
unsigned i = 0; i < nbyte2; i++ ) {
110 #if VXL_LITTLE_ENDIAN 111 std::memcpy(dest, source, nbyte * nelem);
114 assert(source != dest);
120 const unsigned nbyte_x_2 = nbyte*2;
123 for (std::size_t n = 0; n < nelem; n++ )
125 for (
unsigned i = 0; i < nbyte; i++ )
135 #ifndef DOXYGEN_SHOULD_SKIP_THIS 137 inline const char * vsl_type_string(T ) { return #T; } 139 macro (
unsigned short);
141 macro (
unsigned int);
143 macro (
unsigned long);
144 #if VXL_HAS_INT_64 && !VXL_INT_64_IS_LONG 151 macro(std::ptrdiff_t);
155 #endif // DOXYGEN_SHOULD_SKIP_THIS 163 #define VSL_MAX_ARBITRARY_INT_BUFFER_LENGTH(size_of_type) \ 164 ((((size_of_type) * 8)/7) + (((((size_of_type) * 8) % 7) == 0) ? 0: 1)) 172 const T* ints,
unsigned char *buffer, std::size_t count)
174 unsigned char* ptr = buffer;
181 *(ptr++) = (
unsigned char)(v & 127);
184 *(ptr++) = (
unsigned char)(v | 128);
186 return static_cast<std::size_t>(ptr - buffer);
195 const T* ints,
unsigned char *buffer, std::size_t count)
197 unsigned char* ptr = buffer;
202 while (v > 63 || v < -64)
204 *(ptr++) = (
unsigned char)(v & 127);
207 *(ptr++) = (
unsigned char)((v & 127) | 128);
209 return static_cast<std::size_t>(ptr - buffer);
217 const unsigned char* buffer, T *ints, std::size_t count)
220 const unsigned char* ptr = buffer;
226 unsigned char b= *(ptr++);
228 while ((b & 128) == 0)
230 v += ((T)b) << bitsLoaded;
237 int bitsLeft =
sizeof(T)*8 - bitsLoaded;
242 (((
signed char)b >> (bitsLeft-1)) != -1) :
243 (((b & 127) >> (bitsLeft-1)) != 0)
246 std::cerr <<
"\nI/O ERROR: vsl_convert_from_arbitrary_length(.., " 247 << vsl_type_string(T()) <<
"*,..)\n" 248 <<
"has attempted to convert a number that is too large to fit into a " 249 << vsl_type_string(T()) <<
'\n';
256 ( ((T)(b & 63)) << bitsLoaded) |
257 ( ((T)(b & 64)) ? (-64 << bitsLoaded) : 0);
259 return static_cast<std::size_t>(ptr - buffer);
266 const unsigned char* buffer, T *ints, std::size_t count = 1)
269 const unsigned char* ptr = buffer;
274 unsigned char b = *(ptr++);
276 while ((b & 128) == 0)
278 v += ((T)b) << bitsLoaded;
285 int bitsLeft =
sizeof(T)*8 - bitsLoaded;
288 if (bitsLeft <= 0 || ((b & 127) >> bitsLeft) != 0)
290 std::cerr <<
"\nI/O ERROR: vsl_convert_from_arbitrary_length(.., " 291 << vsl_type_string(T()) <<
"*,..)\n" 292 <<
"has attempted to convert a number that is too large to fit into a " 293 << vsl_type_string(T()) <<
'\n';
299 *(ints++) = T(v + ( ((T)(b & 127)) << bitsLoaded));
301 return static_cast<std::size_t>(ptr - buffer);
311 unsigned char *buffer,
312 std::size_t count = 1)
328 std::size_t count = 1)
341 unsigned char *buffer,
342 std::size_t count = 1)
358 std::size_t count = 1)
371 unsigned char *buffer,
372 std::size_t count = 1)
389 std::size_t count = 1)
402 unsigned char *buffer,
403 std::size_t count = 1)
420 std::size_t count = 1)
433 unsigned char *buffer,
434 std::size_t count = 1)
450 unsigned short *ints,
451 std::size_t count = 1)
464 unsigned char *buffer,
465 std::size_t count = 1)
482 std::size_t count = 1)
489 #if VXL_HAS_INT_64 && !VXL_INT_64_IS_LONG 500 std::size_t count = 1)
514 std::size_t count = 1)
524 unsigned char *buffer,
525 std::size_t count = 1)
535 unsigned char *buffer,
536 std::size_t count = 1)
541 #endif // VXL_HAS_INT_64 554 unsigned char *buffer,
555 std::size_t count = 1)
572 std::size_t count = 1)
584 unsigned char *buffer,
585 std::size_t count = 1)
601 std::ptrdiff_t *ints,
602 std::size_t count = 1)
623 assert(n < (1 << 16));
625 os.
os().write( (
char* )&n, 2 );
638 is.
is().read( (
char* )&n, 2 );
656 assert(n < 32768 && n >= - 32768);
658 os.
os().write( (
char* )&n, 2 );
670 is.
is().read( (
char* )&n, 2 );
671 if ((*(((
unsigned char*)&n)+1) & 128) == 1)
696 assert(
sizeof(std::size_t) <= 8 || n >> 16 >> 16 >> 16 >> 16 == 0);
698 os.
os().write( (
char* )&n, 8 );
711 is.
is().read( (
char* )&n, 8 );
716 #endif // vsl_binary_explicit_io_h_ void vsl_b_read_uint_64(vsl_b_istream &is, std::size_t &n)
Read a std::size_t as 64 bits from vsl_b_istream.
std::size_t vsl_convert_to_arbitrary_length_signed_impl(const T *ints, unsigned char *buffer, std::size_t count)
Implement arbitrary length conversion for signed integers.
void vsl_b_write_uint_64(vsl_b_ostream &os, std::size_t n)
Write a std::size_t as 64 bits to vsl_b_ostream.
std::size_t vsl_convert_to_arbitrary_length_unsigned_impl(const T *ints, unsigned char *buffer, std::size_t count)
Implement arbitrary length conversion for unsigned integers.
A binary output adaptor for any std::ostream.
void vsl_b_read_uint_16(vsl_b_istream &is, unsigned long &n)
Read an unsigned int as 16 bits from vsl_b_istream.
void vsl_swap_bytes(char *ptr, unsigned nbyte, std::size_t nelem=1)
Perform byte swapping in situ.
void vsl_b_write_int_16(vsl_b_ostream &os, long n)
Write a signed int as 16 bits to vsl_b_ostream.
std::istream & is() const
A reference to the adaptor's stream.
std::size_t vsl_convert_from_arbitrary_length(const unsigned char *buffer, unsigned long *ints, std::size_t count=1)
Decode a buffer of arbitrary length integers.
std::size_t vsl_convert_from_arbitrary_length_signed_impl(const unsigned char *buffer, T *ints, std::size_t count)
Implement arbitrary length conversion for signed integers.
An adaptor for any std::istream to make it suitable for binary input.
std::size_t vsl_convert_to_arbitrary_length(const unsigned long *ints, unsigned char *buffer, std::size_t count=1)
Encode an array of ints into an arbitrary length format.
Set of functions, and objects to perform binary IO.
void vsl_b_read_int_16(vsl_b_istream &is, long &n)
Read a signed int as 16 bits from vsl_b_istream.
std::size_t vsl_convert_from_arbitrary_length_unsigned_impl(const unsigned char *buffer, T *ints, std::size_t count=1)
Implement arbitrary length conversion for unsigned integers.
std::ostream & os() const
A reference to the adaptor's stream.
void vsl_swap_bytes_to_buffer(const char *source, char *dest, unsigned nbyte, std::size_t nelem=1)
Perform byte swapping to a buffer.
void vsl_b_write_uint_16(vsl_b_ostream &os, unsigned long n)
Write an unsigned int as 16 bits to vsl_b_ostream.