59D4StreamUnMarshaller::D4StreamUnMarshaller(istream &in,
bool twiddle_bytes) : d_in(in), d_twiddle_bytes(twiddle_bytes) {
60 assert(
sizeof(std::streamsize) >=
sizeof(int64_t));
62#if USE_XDR_FOR_IEEE754_ENCODING
64 xdrmem_create(&d_source, d_buf,
sizeof(
dods_float64), XDR_DECODE);
69 d_in.exceptions(istream::failbit | istream::badbit);
78D4StreamUnMarshaller::D4StreamUnMarshaller(istream &in) : d_in(in), d_twiddle_bytes(false) {
79 assert(
sizeof(std::streamsize) >=
sizeof(int64_t));
81#if USE_XDR_FOR_IEEE754_ENCODING
83 xdrmem_create(&d_source, d_buf,
sizeof(
dods_float64), XDR_DECODE);
88 d_in.exceptions(istream::failbit | istream::badbit);
92#if USE_XDR_FOR_IEEE754_ENCODING
93 xdr_destroy(&d_source);
106 oss.setf(ios::hex, ios::basefield);
117 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_int16));
123 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_int32));
129 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_int64));
135#if !USE_XDR_FOR_IEEE754_ENCODING
136 assert(std::numeric_limits<float>::is_iec559);
138 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_float32));
139 if (d_twiddle_bytes) {
145 if (std::numeric_limits<float>::is_iec559) {
146 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_float32));
147 if (d_twiddle_bytes) {
153 xdr_setpos(&d_source, 0);
156 if (!xdr_float(&d_source, &val))
157 throw Error(
"Network I/O Error. Could not read float 64 data.");
163#if !USE_XDR_FOR_IEEE754_ENCODING
164 assert(std::numeric_limits<double>::is_iec559);
166 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_float64));
167 if (d_twiddle_bytes) {
173 if (std::numeric_limits<float>::is_iec559) {
174 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_float64));
175 if (d_twiddle_bytes) {
180 xdr_setpos(&d_source, 0);
183 if (!xdr_double(&d_source, &val))
184 throw Error(
"Network I/O Error. Could not read float 64 data.");
190 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_uint16));
196 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_uint32));
202 d_in.read(
reinterpret_cast<char *
>(&val),
sizeof(
dods_uint64));
209 d_in.read(
reinterpret_cast<char *
>(&len),
sizeof(int64_t));
212 d_in.read(&val[0], len);
227 d_in.read(
reinterpret_cast<char *
>(&count),
sizeof(count));
240 d_in.read(
reinterpret_cast<char *
>(&len),
sizeof(len));
242 *val =
new char[len];
243 d_in.read(*val, len);
249 d_in.read(
reinterpret_cast<char *
>(&len),
sizeof(len));
252 d_in.read(
reinterpret_cast<char *
>(val.data()), len);
257#if USE_XDR_FOR_IEEE754_ENCODING
258void D4StreamUnMarshaller::m_deserialize_reals(
char *val, int64_t num,
int width,
Type type) {
259 int64_t size = num * width;
261 vector<char> buf(size);
263 xdrmem_create(&xdr, buf.data(), size, XDR_DECODE);
265 xdr_setpos(&d_source, 0);
266 d_in.read(buf.data(), size);
269 throw InternalErr(__FILE__, __LINE__,
"Error deserializing a Float64 array");
271 if (xdr_getpos(&xdr) != size)
272 throw InternalErr(__FILE__, __LINE__,
"Error deserializing a Float64 array");
281void D4StreamUnMarshaller::m_twidle_vector_elements(
char *vals, int64_t num,
int width) {
286 *local = bswap_16(*local);
295 *local = bswap_32(*local);
304 *local = bswap_64(*local);
310 throw InternalErr(__FILE__, __LINE__,
"Unrecognized word size.");
315 assert(std::numeric_limits<float>::is_iec559);
316 assert(std::numeric_limits<double>::is_iec559);
318 assert(num_elem >= 0);
319 assert(elem_size > 0);
325 assert(!
"Don't call this method for bytes, use put_vector(val, bytes) instead");
330 assert(!(num_elem & 0x4000000000000000));
331 bytes = num_elem << 1;
334 assert(!(num_elem & 0x6000000000000000));
335 bytes = num_elem << 2;
338 assert(!(num_elem & 0x7000000000000000));
339 bytes = num_elem << 3;
342 bytes = num_elem * elem_size;
346 d_in.read(val, bytes);
349 m_twidle_vector_elements(val, num_elem, elem_size);
353#if !USE_XDR_FOR_IEEE754_ENCODING
354 assert(std::numeric_limits<float>::is_iec559);
356 assert(num_elem >= 0);
357 assert(!(num_elem & 0x6000000000000000));
359 int64_t bytes = num_elem << 2;
361 d_in.read(val, bytes);
364 m_twidle_vector_elements(val, num_elem,
sizeof(
dods_float32));
367 if (type ==
dods_float32_c && !std::numeric_limits<float>::is_iec559) {
369 m_deserialize_reals(val, num, 4, type);
370 }
else if (type ==
dods_float64_c && !std::numeric_limits<double>::is_iec559) {
371 m_deserialize_reals(val, num, 8, type);
373 d_in.read(val, num * width);
375 m_twidle_vector_elements(val, num, width);
381#if !USE_XDR_FOR_IEEE754_ENCODING
382 assert(std::numeric_limits<float>::is_iec559);
384 assert(num_elem >= 0);
385 assert(!(num_elem & 0x7000000000000000));
387 int64_t bytes = num_elem << 3;
389 d_in.read(val, bytes);
392 m_twidle_vector_elements(val, num_elem,
sizeof(
dods_float64));
395 if (type ==
dods_float32_c && !std::numeric_limits<float>::is_iec559) {
397 m_deserialize_reals(val, num, 4, type);
398 }
else if (type ==
dods_float64_c && !std::numeric_limits<double>::is_iec559) {
399 m_deserialize_reals(val, num, 8, type);
401 d_in.read(val, num * width);
403 m_twidle_vector_elements(val, num, width);
409 strm <<
DapIndent::LMarg <<
"D4StreamUnMarshaller::dump - (" << (
void *)
this <<
")" << endl;
string get_checksum_str()
virtual void get_byte(dods_byte &val)
virtual void get_vector_float64(char *val, int64_t num_elem)
Crc32::checksum get_checksum()
virtual void get_uint64(dods_uint64 &val)
virtual void get_int32(dods_int32 &val)
virtual void get_vector_float32(char *val, int64_t num_elem)
virtual void get_uint16(dods_uint16 &val)
virtual void get_str(string &val)
virtual void get_float64(dods_float64 &val)
virtual void get_url(string &val)
virtual void get_opaque_dap4(char **val, int64_t &len)
virtual ~D4StreamUnMarshaller()
virtual void get_int16(dods_int16 &val)
virtual void dump(ostream &strm) const
dump the contents of this object to the specified ostream
virtual void get_vector(char **, unsigned int &, Vector &)
virtual void get_int8(dods_int8 &val)
virtual void get_float32(dods_float32 &val)
virtual void get_int64(dods_int64 &val)
virtual void get_uint32(dods_uint32 &val)
static ostream & LMarg(ostream &strm)
A class for error processing.
A class for software fault reporting.
static xdrproc_t xdr_coder(const Type &t)
Returns a function used to encode elements of an array.
top level DAP object to house generic methods
Type
Identifies the data type.