44 #include "config_hdf.h"
55 #include <InternalErr.h>
64 template <
class T,
class U >
65 void ConvertArrayByCast(U * array,
int nelts, T ** carray)
71 *carray =
new T[nelts];
74 for (
int i = 0; i < nelts; ++i) {
75 *(*carray + i) =
static_cast < T
> (*(array + i));
86 void hdf_genvec::_init(int32 nt,
void *data,
int begin,
int end,
93 if ((eltsize = DFKNTsize(nt)) <= 0)
95 bool zerovec = (data == 0 && begin == 0 && end == 0 && stride == 0);
100 if (begin < 0 || end < 0 || stride <= 0 || end < begin)
106 int nelts = (int) ((end - begin) / stride + 1);
107 _data =
new char[nelts * eltsize];
111 (void) memcpy(_data, (
void *) ((
char *) data + begin),
114 for (
int i = 0, j = begin; i < nelts; ++i, j += stride)
115 memcpy((
void *) ((
char *) _data + i * eltsize),
116 (
void *) ((
char *) data + j * eltsize), eltsize);
125 void hdf_genvec::_init(
void)
135 if (gv._nt == 0 && gv._nelts == 0 && gv._data == 0)
137 else if (gv._nelts == 0)
138 _init(gv._nt, 0, 0, 0, 0);
140 _init(gv._nt, gv._data, 0, gv._nelts - 1, 1);
145 void hdf_genvec::_del(
void)
159 hdf_genvec::hdf_genvec(
void)
165 hdf_genvec::hdf_genvec(int32 nt,
void *data,
int begin,
int end,
168 _init(nt, data, begin, end, stride);
172 hdf_genvec::hdf_genvec(int32 nt,
void *data,
int nelts)
174 _init(nt, data, 0, nelts - 1, 1);
184 hdf_genvec::~hdf_genvec(
void)
200 void hdf_genvec::append(int32 nt,
const char *new_data, int32 nelts)
205 if ((eltsize = DFKNTsize(nt)) <= 0)
208 if (new_data == 0 && nelts == 0) {
218 char *d =
new char[(_nelts + nelts) * eltsize];
219 memcpy(d, _data, _nelts);
220 memcpy(d + _nelts, new_data, nelts);
233 void hdf_genvec::import(int32 nt,
void *data,
int begin,
int end,
240 _init(nt, data, begin, end, stride);
245 void hdf_genvec::import(int32 nt,
const vector < string > &sv)
247 static char strbuf[hdfclass::MAXSTR];
249 int eltsize = DFKNTsize(nt);
252 if (sv.size() == 0) {
257 char *obuf =
new char[DFKNTsize(nt) * sv.size()];
261 for (
int i = 0; i < (int) sv.size(); ++i) {
262 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
263 istringstream(strbuf) >> val;
264 *((float32 *) obuf + i) = val;
270 for (
int i = 0; i < (int) sv.size(); ++i) {
271 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
272 istringstream(strbuf) >> val;
273 *((float64 *) obuf + i) = val;
279 for (
int i = 0; i < (int) sv.size(); ++i) {
280 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
281 istringstream iss(strbuf);
283 *((int8 *) obuf + i) = val;
289 for (
int i = 0; i < (int) sv.size(); ++i) {
290 istringstream(strbuf) >> val;
291 *((int16 *) obuf + i) = val;
297 for (
int i = 0; i < (int) sv.size(); ++i) {
298 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
299 istringstream(strbuf) >> val;
300 *((int32 *) obuf + i) = val;
306 for (
int i = 0; i < (int) sv.size(); ++i) {
307 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
308 istringstream iss(strbuf);
310 *((uint8 *) obuf + i) = val;
316 for (
int i = 0; i < (int) sv.size(); ++i) {
317 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
318 istringstream(strbuf) >> val;
319 *((uint16 *) obuf + i) = val;
325 for (
int i = 0; i < (int) sv.size(); ++i) {
326 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
327 istringstream(strbuf) >> val;
328 *((uint32 *) obuf + i) = val;
334 for (
int i = 0; i < (int) sv.size(); ++i) {
335 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
336 istringstream iss(strbuf);
338 *((uchar8 *) obuf + i) = val;
344 for (
int i = 0; i < (int) sv.size(); ++i) {
345 strncpy(strbuf, sv[i].c_str(), hdfclass::MAXSTR - 1);
346 istringstream iss(strbuf);
348 *((char8 *) obuf + i) = val;
357 this->
import(nt, obuf, (int) sv.size());
369 uchar8 *hdf_genvec::export_uchar8(
void)
const
372 if (_nt == DFNT_UINT8)
373 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
374 else if (_nt == DFNT_UCHAR8)
375 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
378 else if (_nt == DFNT_INT8)
379 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
387 uchar8 hdf_genvec::elt_uchar8(
int i)
const
390 if (i < 0 || i > _nelts)
392 if (_nt == DFNT_UINT8)
393 rv = (uchar8) * ((uint8 *) _data + i);
394 else if (_nt == DFNT_UCHAR8)
395 rv = *((uchar8 *) _data + i);
398 else if (_nt == DFNT_INT8)
399 rv = *((int8 *) _data + i);
407 vector < uchar8 > hdf_genvec::exportv_uchar8(
void)
const
409 vector < uchar8 > rv = vector < uchar8 > (0);
411 if (_nt == DFNT_UINT8)
412 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
413 else if (_nt == DFNT_UCHAR8)
414 dtmp = (uchar8 *) _data;
417 else if (_nt == DFNT_INT8)
418 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
422 rv = vector < uchar8 > (dtmp, dtmp + _nelts);
423 if (dtmp != (uchar8 *) _data)
429 char8 *hdf_genvec::export_char8(
void)
const
432 if (_nt == DFNT_INT8)
433 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
434 else if (_nt == DFNT_CHAR8)
435 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
442 char8 hdf_genvec::elt_char8(
int i)
const
445 if (i < 0 || i > _nelts)
447 if (_nt == DFNT_INT8)
448 rv = (char8) * ((int8 *) _data + i);
449 else if (_nt == DFNT_CHAR8 || _nt == DFNT_UCHAR8)
450 rv = *((char8 *) _data + i);
457 vector < char8 > hdf_genvec::exportv_char8(
void)
const
459 vector < char8 > rv = vector < char8 > (0);
461 if (_nt == DFNT_INT8)
462 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
463 else if (_nt == DFNT_CHAR8)
464 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
469 throw InternalErr(__FILE__, __LINE__,
"No data returned for the character array.");
470 rv = vector < char8 > (dtmp, dtmp + _nelts);
471 if (dtmp != (char8 *) _data)
477 uint8 *hdf_genvec::export_uint8(
void)
const
480 if (_nt == DFNT_UCHAR8 || _nt == DFNT_CHAR8)
481 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
482 else if (_nt == DFNT_UINT8)
483 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
490 uint8 hdf_genvec::elt_uint8(
int i)
const
493 if (i < 0 || i > _nelts)
495 if (_nt == DFNT_UCHAR8 || _nt == DFNT_CHAR8)
496 rv = (uint8) * ((uchar8 *) _data + i);
497 else if (_nt == DFNT_UINT8)
498 rv = *((uint8 *) _data + i);
505 vector < uint8 > hdf_genvec::exportv_uint8(
void)
const
507 vector < uint8 > rv = vector < uint8 > (0);
509 if (_nt == DFNT_UCHAR8 || _nt == DFNT_CHAR8)
510 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
511 else if (_nt == DFNT_UINT8)
512 dtmp = (uint8 *) _data;
516 rv = vector < uint8 > (dtmp, dtmp + _nelts);
517 if (dtmp != (uint8 *) _data)
523 int8 *hdf_genvec::export_int8(
void)
const
526 if (_nt == DFNT_CHAR8)
527 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
528 else if (_nt == DFNT_INT8)
529 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
536 int8 hdf_genvec::elt_int8(
int i)
const
539 if (i < 0 || i > _nelts)
541 if (_nt == DFNT_CHAR8)
542 rv = (int8) * ((char8 *) _data + i);
543 else if (_nt == DFNT_INT8)
544 rv = *((int8 *) _data + i);
551 vector < int8 > hdf_genvec::exportv_int8(
void)
const
553 vector < int8 > rv = vector < int8 > (0);
555 if (_nt == DFNT_CHAR8)
556 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
557 else if (_nt == DFNT_INT8)
558 dtmp = (int8 *) _data;
561 rv = vector < int8 > (dtmp, dtmp + _nelts);
562 if (dtmp != (int8 *) _data)
568 uint16 *hdf_genvec::export_uint16(
void)
const
571 if (_nt == DFNT_UCHAR8)
572 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
573 else if (_nt == DFNT_UINT8)
574 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
575 else if (_nt == DFNT_UINT16)
576 ConvertArrayByCast((uint16 *) _data, _nelts, &rv);
583 uint16 hdf_genvec::elt_uint16(
int i)
const
585 if (i < 0 || i > _nelts)
587 if (_nt == DFNT_UCHAR8)
588 return (uint16) * ((uchar8 *) _data + i);
589 else if (_nt == DFNT_UINT8)
590 return (uint16) * ((uint8 *) _data + i);
591 else if (_nt == DFNT_UINT16)
592 return *((uint16 *) _data + i);
599 vector < uint16 > hdf_genvec::exportv_uint16(
void)
const
601 vector < uint16 > rv = vector < uint16 > (0);
603 if (_nt == DFNT_UCHAR8)
604 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
605 else if (_nt == DFNT_UINT8)
606 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
607 else if (_nt == DFNT_UINT16)
608 dtmp = (uint16 *) _data;
611 rv = vector < uint16 > (dtmp, dtmp + _nelts);
612 if (dtmp != (uint16 *) _data)
619 int16 *hdf_genvec::export_int16(
void)
const
622 if (_nt == DFNT_UCHAR8)
623 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
624 else if (_nt == DFNT_CHAR8)
625 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
626 else if (_nt == DFNT_UINT8)
627 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
628 else if (_nt == DFNT_INT8)
629 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
630 else if (_nt == DFNT_INT16)
631 ConvertArrayByCast((int16 *) _data, _nelts, &rv);
638 int16 hdf_genvec::elt_int16(
int i)
const
640 if (i < 0 || i > _nelts)
642 if (_nt == DFNT_UCHAR8)
643 return (int16) (*((uchar8 *) _data + i));
644 else if (_nt == DFNT_CHAR8)
645 return (int16) (*((char8 *) _data + i));
646 else if (_nt == DFNT_UINT8)
647 return (int16) (*((uint8 *) _data + i));
648 else if (_nt == DFNT_INT8)
649 return (int16) (*((int8 *) _data + i));
650 else if (_nt == DFNT_INT16)
651 return *((int16 *) _data + i);
658 vector < int16 > hdf_genvec::exportv_int16(
void)
const
660 vector < int16 > rv = vector < int16 > (0);
662 if (_nt == DFNT_UCHAR8)
663 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
664 else if (_nt == DFNT_CHAR8)
665 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
666 else if (_nt == DFNT_UINT8)
667 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
668 else if (_nt == DFNT_INT8)
669 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
670 else if (_nt == DFNT_INT16)
671 dtmp = (int16 *) _data;
674 rv = vector < int16 > (dtmp, dtmp + _nelts);
675 if (dtmp != (int16 *) _data)
682 uint32 *hdf_genvec::export_uint32(
void)
const
685 if (_nt == DFNT_UCHAR8)
686 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
687 else if (_nt == DFNT_UINT8)
688 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
689 else if (_nt == DFNT_UINT16)
690 ConvertArrayByCast((uint16 *) _data, _nelts, &rv);
691 else if (_nt == DFNT_UINT32)
692 ConvertArrayByCast((uint32 *) _data, _nelts, &rv);
699 uint32 hdf_genvec::elt_uint32(
int i)
const
701 if (i < 0 || i > _nelts)
703 if (_nt == DFNT_UCHAR8)
704 return (uint32) (*((uchar8 *) _data + i));
705 else if (_nt == DFNT_UINT8)
706 return (uint32) (*((uint8 *) _data + i));
707 else if (_nt == DFNT_UINT16)
708 return (uint32) (*((uint16 *) _data + i));
709 else if (_nt == DFNT_UINT32)
710 return *((uint32 *) _data + i);
718 vector < uint32 > hdf_genvec::exportv_uint32(
void)
const
720 vector < uint32 > rv = vector < uint32 > (0);
722 if (_nt == DFNT_UCHAR8)
723 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
724 else if (_nt == DFNT_UINT8)
725 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
726 else if (_nt == DFNT_UINT16)
727 ConvertArrayByCast((uint16 *) _data, _nelts, &dtmp);
728 else if (_nt == DFNT_UINT32)
729 dtmp = (uint32 *) _data;
732 rv = vector < uint32 > (dtmp, dtmp + _nelts);
733 if (dtmp != (uint32 *) _data)
740 int32 *hdf_genvec::export_int32(
void)
const
743 if (_nt == DFNT_UCHAR8)
744 ConvertArrayByCast((uchar8 *) _data, _nelts, &rv);
745 else if (_nt == DFNT_CHAR8)
746 ConvertArrayByCast((char8 *) _data, _nelts, &rv);
747 else if (_nt == DFNT_UINT8)
748 ConvertArrayByCast((uint8 *) _data, _nelts, &rv);
749 else if (_nt == DFNT_INT8)
750 ConvertArrayByCast((int8 *) _data, _nelts, &rv);
751 else if (_nt == DFNT_UINT16)
752 ConvertArrayByCast((uint16 *) _data, _nelts, &rv);
753 else if (_nt == DFNT_INT16)
754 ConvertArrayByCast((int16 *) _data, _nelts, &rv);
755 else if (_nt == DFNT_INT32)
756 ConvertArrayByCast((int32 *) _data, _nelts, &rv);
763 int32 hdf_genvec::elt_int32(
int i)
const
765 if (i < 0 || i > _nelts)
767 if (_nt == DFNT_UCHAR8)
768 return (int32) (*((uchar8 *) _data + i));
769 else if (_nt == DFNT_CHAR8)
770 return (int32) (*((char8 *) _data + i));
771 else if (_nt == DFNT_UINT8)
772 return (int32) (*((uint8 *) _data + i));
773 else if (_nt == DFNT_INT8)
774 return (int32) (*((int8 *) _data + i));
775 else if (_nt == DFNT_UINT16)
776 return (int32) (*((uint16 *) _data + i));
777 else if (_nt == DFNT_INT16)
778 return (int32) (*((int16 *) _data + i));
779 else if (_nt == DFNT_INT32)
780 return *((int32 *) _data + i);
788 vector < int32 > hdf_genvec::exportv_int32(
void)
const
790 vector < int32 > rv = vector < int32 > (0);
792 if (_nt == DFNT_UCHAR8)
793 ConvertArrayByCast((uchar8 *) _data, _nelts, &dtmp);
794 else if (_nt == DFNT_CHAR8)
795 ConvertArrayByCast((char8 *) _data, _nelts, &dtmp);
796 else if (_nt == DFNT_UINT8)
797 ConvertArrayByCast((uint8 *) _data, _nelts, &dtmp);
798 else if (_nt == DFNT_INT8)
799 ConvertArrayByCast((int8 *) _data, _nelts, &dtmp);
800 else if (_nt == DFNT_UINT16)
801 ConvertArrayByCast((uint16 *) _data, _nelts, &dtmp);
802 else if (_nt == DFNT_INT16)
803 ConvertArrayByCast((int16 *) _data, _nelts, &dtmp);
804 else if (_nt == DFNT_INT32)
805 dtmp = (int32 *) _data;
808 rv = vector < int32 > (dtmp, dtmp + _nelts);
809 if (dtmp != (int32 *) _data)
815 float32 *hdf_genvec::export_float32(
void)
const
818 if (_nt != DFNT_FLOAT32)
821 ConvertArrayByCast((float32 *) _data, _nelts, &rv);
826 float32 hdf_genvec::elt_float32(
int i)
const
828 if (i < 0 || i > _nelts)
830 if (_nt != DFNT_FLOAT32)
832 return *((float32 *) _data + i);
836 vector < float32 > hdf_genvec::exportv_float32(
void)
const
838 if (_nt != DFNT_FLOAT32) {
843 return vector < float32 > ((float32 *) _data,
844 (float32 *) _data + _nelts);
848 float64 *hdf_genvec::export_float64(
void)
const
851 if (_nt == DFNT_FLOAT64)
852 ConvertArrayByCast((float64 *) _data, _nelts, &rv);
853 else if (_nt == DFNT_FLOAT32)
854 ConvertArrayByCast((float32 *) _data, _nelts, &rv);
861 float64 hdf_genvec::elt_float64(
int i)
const
863 if (i < 0 || i > _nelts)
865 if (_nt == DFNT_FLOAT64)
866 return *((float64 *) _data + i);
867 else if (_nt == DFNT_FLOAT32)
868 return (float64) (*((float32 *) _data + i));
875 vector < float64 > hdf_genvec::exportv_float64(
void)
const
877 vector < float64 > rv = vector < float64 > (0);
879 if (_nt == DFNT_FLOAT32)
880 ConvertArrayByCast((float32 *) _data, _nelts, &dtmp);
881 else if (_nt == DFNT_FLOAT64)
882 dtmp = (float64 *) _data;
885 rv = vector < float64 > (dtmp, dtmp + _nelts);
886 if (dtmp != (float64 *) _data)
892 string hdf_genvec::export_string(
void)
const
894 if (_nt != DFNT_CHAR8 && _nt != DFNT_UCHAR8) {
901 return string((
char *) _data, _nelts);
906 void hdf_genvec::print(vector < string > &sv)
const
909 print(sv, 0, _nelts - 1, 1);
915 void hdf_genvec::print(vector < string > &sv,
int begin,
int end,
918 if (begin < 0 || begin > _nelts || stride < 1 || end < 0 || end < begin
919 || stride <= 0 || end > _nelts - 1)
921 if (_nt == DFNT_CHAR8 || _nt == DFNT_UCHAR8) {
923 sub = string((
char *) _data + begin, (end - begin + 1));
926 for (
int i = 0; i < (end - begin + 1); i += stride)
933 char buf[hdfclass::MAXSTR];
939 for (i = begin; i <= end; i += stride) {
940 ostrstream(buf, hdfclass::MAXSTR) <<
941 (int) *((uchar8 *) _data + i) << ends;
942 sv.push_back(
string(buf));
947 for (i = begin; i <= end; i += stride) {
949 buf << (
unsigned int) *((uint8 *) _data + i);
950 sv.push_back(buf.str());
954 for (i = begin; i <= end; i += stride) {
956 buf << (int) *((int8 *) _data + i);
957 sv.push_back(buf.str());
961 for (i = begin; i <= end; i += stride) {
963 buf << *((uint16 *) _data + i);
964 sv.push_back(buf.str());
968 for (i = begin; i <= end; i += stride) {
970 buf << *((int16 *) _data + i);
971 sv.push_back(buf.str());
975 for (i = begin; i <= end; i += stride) {
977 buf << *((uint32 *) _data + i);
978 sv.push_back(buf.str());
982 for (i = begin; i <= end; i += stride) {
984 buf << *((int32 *) _data + i);
985 sv.push_back(buf.str());
989 for (i = begin; i <= end; i += stride) {
991 buf << *((float32 *) _data + i);
992 sv.push_back(buf.str());
996 for (i = begin; i <= end; i += stride) {
998 buf << *((float64 *) _data + i);
999 sv.push_back(buf.str());