44#include "config_hdf.h"
56#include <libdap/InternalErr.h>
66template <
class T,
class U >
67 void ConvertArrayByCast(U * array,
int nelts, T ** carray)
73 *carray =
new T[nelts];
74 if (*carray ==
nullptr)
76 for (
int i = 0; i < nelts; ++i) {
77 *(*carray + i) =
static_cast < T
> (*(array + i));
88void hdf_genvec::_init(int32 nt,
void *data,
int begin,
int end,
95 if ((eltsize = DFKNTsize(nt)) <= 0)
97 bool zerovec = (data ==
nullptr && begin == 0 && end == 0 && stride == 0);
102 if (begin < 0 || end < 0 || stride <= 0 || end < begin)
108 auto nelts = (end - begin)/stride + 1;
109 _data =
new char[nelts * eltsize];
110 if (_data ==
nullptr)
111 THROW(hcerr_nomemory);
113 (void) memcpy(_data, (
void *) ((
char *) data + begin),
116 for (
int i = 0, j = begin; i < nelts; ++i, j += stride)
117 memcpy((
void *) (_data + i * eltsize),
118 (
void *) ((
char *) data + j * eltsize), eltsize);
127void hdf_genvec::_init(
void)
137 if (gv._nt == 0 && gv._nelts == 0 && gv._data ==
nullptr)
139 else if (gv._nelts == 0)
140 _init(gv._nt,
nullptr, 0, 0, 0);
142 _init(gv._nt, gv._data, 0, gv._nelts - 1, 1);
147void hdf_genvec::_del(
void)
161hdf_genvec::hdf_genvec(
void)
167hdf_genvec::hdf_genvec(int32 nt,
void *data,
int begin,
int end,
170 _init(nt, data, begin, end, stride);
174hdf_genvec::hdf_genvec(int32 nt,
void *data,
int nelts)
176 _init(nt, data, 0, nelts - 1, 1);
186hdf_genvec::~hdf_genvec(
void)
202void hdf_genvec::append(int32 nt,
const char *new_data, int32 nelts)
207 if ((eltsize = DFKNTsize(nt)) <= 0)
210 if (new_data ==
nullptr && nelts == 0) {
216 if (new_data ==
nullptr)
220 auto d =
new char[(_nelts + nelts) * eltsize];
221 memcpy(d, _data, _nelts);
222 memcpy(d + _nelts, new_data, nelts);
235void hdf_genvec::import_vec(int32 nt,
void *data,
int begin,
int end,
242 _init(nt, data, begin, end, stride);
247void hdf_genvec::import_vec(int32 nt,
const vector < string > &sv)
249 static char strbuf[hdfclass::MAXSTR];
251 int eltsize = DFKNTsize(nt);
254 if (sv.empty() ==
true) {
255 this->import_vec(nt);
259 auto obuf =
new char[DFKNTsize(nt) * sv.size()];
263 for (
int i = 0; i < (int) sv.size(); ++i) {
264 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
265 istringstream(strbuf) >> val;
266 *((float32 *) obuf + i) = val;
272 for (
int i = 0; i < (int) sv.size(); ++i) {
273 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
274 istringstream(strbuf) >> val;
275 *((float64 *) obuf + i) = val;
281 for (
int i = 0; i < (int) sv.size(); ++i) {
282 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
283 istringstream iss(strbuf);
285 *((int8 *) obuf + i) = val;
291 for (
int i = 0; i < (int) sv.size(); ++i) {
292 istringstream(strbuf) >> val;
293 *((int16 *) obuf + i) = val;
299 for (
int i = 0; i < (int) sv.size(); ++i) {
300 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
301 istringstream(strbuf) >> val;
302 *((int32 *) obuf + i) = val;
308 for (
int i = 0; i < (int) sv.size(); ++i) {
309 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
310 istringstream iss(strbuf);
312 *((uint8 *) obuf + i) = val;
318 for (
int i = 0; i < (int) sv.size(); ++i) {
319 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
320 istringstream(strbuf) >> val;
321 *((uint16 *) obuf + i) = val;
327 for (
int i = 0; i < (int) sv.size(); ++i) {
328 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
329 istringstream(strbuf) >> val;
330 *((uint32 *) obuf + i) = val;
336 for (
int i = 0; i < (int) sv.size(); ++i) {
337 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
338 istringstream iss(strbuf);
340 *((uchar8 *) obuf + i) = val;
346 for (
int i = 0; i < (int) sv.size(); ++i) {
347 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
348 istringstream iss(strbuf);
350 *((char8 *) obuf + i) = val;
359 this->import_vec(nt, obuf, (
int) sv.size());
371uchar8 *hdf_genvec::export_uchar8(
void)
const
374 if (_nt == DFNT_UINT8)
375 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
376 else if (_nt == DFNT_UCHAR8)
377 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
380 else if (_nt == DFNT_INT8)
381 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
384 THROW(hcerr_dataexport);
389uchar8 hdf_genvec::elt_uchar8(
int i)
const
392 if (i < 0 || i > _nelts)
394 if (_nt == DFNT_UINT8)
395 rv = (uchar8) * ((uint8 *) _data + i);
396 else if (_nt == DFNT_UCHAR8)
397 rv = *((uchar8 *) _data + i);
400 else if (_nt == DFNT_INT8)
401 rv = *((int8 *) _data + i);
404 THROW(hcerr_dataexport);
409vector < uchar8 > hdf_genvec::exportv_uchar8(
void)
const
411 auto rv = vector < uchar8 > (0);
412 uchar8 *dtmp =
nullptr;
413 if (_nt == DFNT_UINT8)
414 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
415 else if (_nt == DFNT_UCHAR8)
416 dtmp = (uchar8 *) _data;
419 else if (_nt == DFNT_INT8)
420 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
423 THROW(hcerr_dataexport);
424 rv = vector < uchar8 > (dtmp, dtmp + _nelts);
425 if (dtmp != (uchar8 *) _data)
431char8 *hdf_genvec::export_char8(
void)
const
434 if (_nt == DFNT_INT8)
435 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
436 else if (_nt == DFNT_CHAR8)
437 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
439 THROW(hcerr_dataexport);
444char8 hdf_genvec::elt_char8(
int i)
const
447 if (i < 0 || i > _nelts)
449 if (_nt == DFNT_INT8)
450 rv = (char8) * ((int8 *) _data + i);
451 else if (_nt == DFNT_CHAR8 || _nt == DFNT_UCHAR8)
452 rv = *((char8 *) _data + i);
454 THROW(hcerr_dataexport);
459vector < char8 > hdf_genvec::exportv_char8(
void)
const
461 auto rv = vector < char8 > (0);
462 char8 *dtmp =
nullptr;
463 if (_nt == DFNT_INT8)
464 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
465 else if (_nt == DFNT_CHAR8)
466 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
468 THROW(hcerr_dataexport);
470 throw InternalErr(__FILE__, __LINE__,
"No data returned for the character array.");
471 rv = vector < char8 > (dtmp, dtmp + _nelts);
472 if (dtmp != (char8 *) _data)
478uint8 *hdf_genvec::export_uint8(
void)
const
481 if (_nt == DFNT_UCHAR8 || _nt == DFNT_CHAR8)
482 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
483 else if (_nt == DFNT_UINT8)
484 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
486 THROW(hcerr_dataexport);
491uint8 hdf_genvec::elt_uint8(
int i)
const
494 if (i < 0 || i > _nelts)
496 if (_nt == DFNT_UCHAR8 || _nt == DFNT_CHAR8)
497 rv = (uint8) * ((uchar8 *) _data + i);
498 else if (_nt == DFNT_UINT8)
499 rv = *((uint8 *) _data + i);
501 THROW(hcerr_dataexport);
506vector < uint8 > hdf_genvec::exportv_uint8(
void)
const
508 auto rv = vector < uint8 > (0);
509 uint8 *dtmp =
nullptr;
510 if (_nt == DFNT_UCHAR8 || _nt == DFNT_CHAR8)
511 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
512 else if (_nt == DFNT_UINT8)
513 dtmp = (uint8 *) _data;
515 THROW(hcerr_dataexport);
517 rv = vector < uint8 > (dtmp, dtmp + _nelts);
518 if (dtmp != (uint8 *) _data)
524int8 *hdf_genvec::export_int8(
void)
const
527 if (_nt == DFNT_CHAR8)
528 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
529 else if (_nt == DFNT_INT8)
530 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
532 THROW(hcerr_dataexport);
537int8 hdf_genvec::elt_int8(
int i)
const
540 if (i < 0 || i > _nelts)
542 if (_nt == DFNT_CHAR8)
543 rv = (int8) * ((char8 *) _data + i);
544 else if (_nt == DFNT_INT8)
545 rv = *((int8 *) _data + i);
547 THROW(hcerr_dataexport);
552vector < int8 > hdf_genvec::exportv_int8(
void)
const
554 auto rv = vector < int8 > (0);
555 int8 *dtmp =
nullptr;
556 if (_nt == DFNT_CHAR8)
557 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
558 else if (_nt == DFNT_INT8)
559 dtmp = (int8 *) _data;
561 THROW(hcerr_dataexport);
562 rv = vector < int8 > (dtmp, dtmp + _nelts);
563 if (dtmp != (int8 *) _data)
569uint16 *hdf_genvec::export_uint16(
void)
const
571 uint16 *rv =
nullptr;
572 if (_nt == DFNT_UCHAR8)
573 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
574 else if (_nt == DFNT_UINT8)
575 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
576 else if (_nt == DFNT_UINT16)
577 ConvertArrayByCast((uint16 *) _data, _nelts, &rv);
579 THROW(hcerr_dataexport);
584uint16 hdf_genvec::elt_uint16(
int i)
const
586 uint16 ret_value = 0;
587 if (i < 0 || i > _nelts)
589 if (_nt == DFNT_UCHAR8)
590 ret_value = (uint16) * ((uchar8 *) _data + i);
591 else if (_nt == DFNT_UINT8)
592 ret_value = (uint16) * ((uint8 *) _data + i);
593 else if (_nt == DFNT_UINT16)
594 ret_value = *((uint16 *) _data + i);
596 THROW(hcerr_dataexport);
601vector < uint16 > hdf_genvec::exportv_uint16(
void)
const
603 auto rv = vector < uint16 > (0);
604 uint16 *dtmp =
nullptr;
605 if (_nt == DFNT_UCHAR8)
606 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
607 else if (_nt == DFNT_UINT8)
608 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
609 else if (_nt == DFNT_UINT16)
610 dtmp = (uint16 *) _data;
612 THROW(hcerr_dataexport);
613 rv = vector < uint16 > (dtmp, dtmp + _nelts);
614 if (dtmp != (uint16 *) _data)
621int16 *hdf_genvec::export_int16(
void)
const
624 if (_nt == DFNT_UCHAR8)
625 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
626 else if (_nt == DFNT_CHAR8)
627 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
628 else if (_nt == DFNT_UINT8)
629 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
630 else if (_nt == DFNT_INT8)
631 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
632 else if (_nt == DFNT_INT16)
633 ConvertArrayByCast((int16 *) _data, _nelts, &rv);
635 THROW(hcerr_dataexport);
640int16 hdf_genvec::elt_int16(
int i)
const
643 if (i < 0 || i > _nelts)
645 if (_nt == DFNT_UCHAR8)
646 ret_value = (int16) (*((uchar8 *) _data + i));
647 else if (_nt == DFNT_CHAR8)
648 ret_value = (int16) (*((char8 *) _data + i));
649 else if (_nt == DFNT_UINT8)
650 ret_value = (int16) (*((uint8 *) _data + i));
651 else if (_nt == DFNT_INT8)
652 ret_value = (int16) (*((int8 *) _data + i));
653 else if (_nt == DFNT_INT16)
654 ret_value = *((int16 *) _data + i);
656 THROW(hcerr_dataexport);
661vector < int16 > hdf_genvec::exportv_int16(
void)
const
663 auto rv = vector < int16 > (0);
664 int16 *dtmp =
nullptr;
665 if (_nt == DFNT_UCHAR8)
666 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
667 else if (_nt == DFNT_CHAR8)
668 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
669 else if (_nt == DFNT_UINT8)
670 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
671 else if (_nt == DFNT_INT8)
672 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
673 else if (_nt == DFNT_INT16)
674 dtmp = (int16 *) _data;
676 THROW(hcerr_dataexport);
677 rv = vector < int16 > (dtmp, dtmp + _nelts);
678 if (dtmp != (int16 *) _data)
685uint32 *hdf_genvec::export_uint32(
void)
const
687 uint32 *rv =
nullptr;
688 if (_nt == DFNT_UCHAR8)
689 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
690 else if (_nt == DFNT_UINT8)
691 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
692 else if (_nt == DFNT_UINT16)
693 ConvertArrayByCast((uint16 *) _data, _nelts, &rv);
694 else if (_nt == DFNT_UINT32)
695 ConvertArrayByCast((uint32 *) _data, _nelts, &rv);
697 THROW(hcerr_dataexport);
702uint32 hdf_genvec::elt_uint32(
int i)
const
704 uint32 ret_value = 0;
705 if (i < 0 || i > _nelts)
707 if (_nt == DFNT_UCHAR8)
708 ret_value = (uint32) (*((uchar8 *) _data + i));
709 else if (_nt == DFNT_UINT8)
710 ret_value = (uint32) (*((uint8 *) _data + i));
711 else if (_nt == DFNT_UINT16)
712 ret_value = (uint32) (*((uint16 *) _data + i));
713 else if (_nt == DFNT_UINT32)
714 ret_value = *((uint32 *) _data + i);
716 THROW(hcerr_dataexport);
722vector < uint32 > hdf_genvec::exportv_uint32(
void)
const
724 auto rv = vector < uint32 > (0);
725 uint32 *dtmp =
nullptr;
726 if (_nt == DFNT_UCHAR8)
727 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
728 else if (_nt == DFNT_UINT8)
729 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
730 else if (_nt == DFNT_UINT16)
731 ConvertArrayByCast((uint16 *) _data, _nelts, &dtmp);
732 else if (_nt == DFNT_UINT32)
733 dtmp = (uint32 *) _data;
735 THROW(hcerr_dataexport);
736 rv = vector < uint32 > (dtmp, dtmp + _nelts);
737 if (dtmp != (uint32 *) _data)
744int32 *hdf_genvec::export_int32(
void)
const
747 if (_nt == DFNT_UCHAR8)
748 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
749 else if (_nt == DFNT_CHAR8)
750 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
751 else if (_nt == DFNT_UINT8)
752 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
753 else if (_nt == DFNT_INT8)
754 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
755 else if (_nt == DFNT_UINT16)
756 ConvertArrayByCast((uint16 *) _data, _nelts, &rv);
757 else if (_nt == DFNT_INT16)
758 ConvertArrayByCast((int16 *) _data, _nelts, &rv);
759 else if (_nt == DFNT_INT32)
760 ConvertArrayByCast((int32 *) _data, _nelts, &rv);
762 THROW(hcerr_dataexport);
767int32 hdf_genvec::elt_int32(
int i)
const
770 if (i < 0 || i > _nelts)
772 if (_nt == DFNT_UCHAR8)
773 ret_value = (int32) (*((uchar8 *) _data + i));
774 else if (_nt == DFNT_CHAR8)
775 ret_value = (int32) (*((char8 *) _data + i));
776 else if (_nt == DFNT_UINT8)
777 ret_value = (int32) (*((uint8 *) _data + i));
778 else if (_nt == DFNT_INT8)
779 ret_value = (int32) (*((int8 *) _data + i));
780 else if (_nt == DFNT_UINT16)
781 ret_value = (int32) (*((uint16 *) _data + i));
782 else if (_nt == DFNT_INT16)
783 ret_value = (int32) (*((int16 *) _data + i));
784 else if (_nt == DFNT_INT32)
785 ret_value = *((int32 *) _data + i);
787 THROW(hcerr_dataexport);
793vector < int32 > hdf_genvec::exportv_int32(
void)
const
795 auto rv = vector < int32 > (0);
796 int32 *dtmp =
nullptr;
797 if (_nt == DFNT_UCHAR8)
798 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
799 else if (_nt == DFNT_CHAR8)
800 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
801 else if (_nt == DFNT_UINT8)
802 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
803 else if (_nt == DFNT_INT8)
804 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
805 else if (_nt == DFNT_UINT16)
806 ConvertArrayByCast((uint16 *) _data, _nelts, &dtmp);
807 else if (_nt == DFNT_INT16)
808 ConvertArrayByCast((int16 *) _data, _nelts, &dtmp);
809 else if (_nt == DFNT_INT32)
810 dtmp = (int32 *) _data;
812 THROW(hcerr_dataexport);
813 rv = vector < int32 > (dtmp, dtmp + _nelts);
814 if (dtmp != (int32 *) _data)
820float32 *hdf_genvec::export_float32(
void)
const
822 float32 *rv =
nullptr;
823 if (_nt != DFNT_FLOAT32)
824 THROW(hcerr_dataexport);
826 ConvertArrayByCast((float32 *) _data, _nelts, &rv);
831float32 hdf_genvec::elt_float32(
int i)
const
833 if (i < 0 || i > _nelts)
835 if (_nt != DFNT_FLOAT32)
836 THROW(hcerr_dataexport);
837 return *((float32 *) _data + i);
841vector < float32 > hdf_genvec::exportv_float32(
void)
const
843 if (_nt != DFNT_FLOAT32) {
844 THROW(hcerr_dataexport);
846 return vector < float32 > ((float32 *) _data,
847 (float32 *) _data + _nelts);
851float64 *hdf_genvec::export_float64(
void)
const
853 float64 *rv =
nullptr;
854 if (_nt == DFNT_FLOAT64)
855 ConvertArrayByCast((float64 *) _data, _nelts, &rv);
856 else if (_nt == DFNT_FLOAT32)
857 ConvertArrayByCast((float32 *) _data, _nelts, &rv);
859 THROW(hcerr_dataexport);
864float64 hdf_genvec::elt_float64(
int i)
const
866 if (i < 0 || i > _nelts)
868 if (_nt == DFNT_FLOAT64)
869 return *((float64 *) _data + i);
870 else if (_nt == DFNT_FLOAT32)
871 return (float64) (*((float32 *) _data + i));
873 THROW(hcerr_dataexport);
877vector < float64 > hdf_genvec::exportv_float64(
void)
const
879 auto rv = vector < float64 > (0);
880 float64 *dtmp =
nullptr;
881 if (_nt == DFNT_FLOAT32)
882 ConvertArrayByCast((float32 *) _data, _nelts, &dtmp);
883 else if (_nt == DFNT_FLOAT64)
884 dtmp = (float64 *) _data;
886 THROW(hcerr_dataexport);
887 rv = vector < float64 > (dtmp, dtmp + _nelts);
888 if (dtmp != (float64 *) _data)
894string hdf_genvec::export_string(
void)
const
896 if (_nt != DFNT_CHAR8 && _nt != DFNT_UCHAR8) {
897 THROW(hcerr_dataexport);
900 if (_data ==
nullptr)
903 return string((
char *) _data, _nelts);
908void hdf_genvec::print(vector < string > &sv)
const
911 print(sv, 0, _nelts - 1, 1);
917void hdf_genvec::print(vector < string > &sv,
int begin,
int end,
920 if (begin < 0 || begin > _nelts || stride < 1 || end < 0 || end < begin
921 || stride <= 0 || end > _nelts - 1)
923 if (_nt == DFNT_CHAR8 || _nt == DFNT_UCHAR8) {
925 sub = string((
char *) _data + begin, (end - begin + 1));
928 for (
int i = 0; i < (end - begin + 1); i += stride)
935 char buf[hdfclass::MAXSTR];
941 for (i = begin; i <= end; i += stride) {
942 ostrstream(buf, hdfclass::MAXSTR) <<
943 (int) *((uchar8 *) _data + i) << ends;
944 sv.push_back(
string(buf));
949 for (i = begin; i <= end; i += stride) {
951 buf << (
unsigned int) *((uint8 *) _data + i);
952 sv.push_back(buf.str());
956 for (i = begin; i <= end; i += stride) {
958 buf << (int) *((int8 *) _data + i);
959 sv.push_back(buf.str());
963 for (i = begin; i <= end; i += stride) {
965 buf << *((uint16 *) _data + i);
966 sv.push_back(buf.str());
970 for (i = begin; i <= end; i += stride) {
972 buf << *((int16 *) _data + i);
973 sv.push_back(buf.str());
977 for (i = begin; i <= end; i += stride) {
979 buf << *((uint32 *) _data + i);
980 sv.push_back(buf.str());
984 for (i = begin; i <= end; i += stride) {
986 buf << *((int32 *) _data + i);
987 sv.push_back(buf.str());
991 for (i = begin; i <= end; i += stride) {
993 buf << *((float32 *) _data + i);
994 sv.push_back(buf.str());
998 for (i = begin; i <= end; i += stride) {
1000 buf << *((float64 *) _data + i);
1001 sv.push_back(buf.str());
1005 THROW(hcerr_dftype);