920 static constexpr const unsigned char UNDEFINED = 0b00000000;
921 static constexpr const unsigned char SIGNED = 0b00000001;
922 static constexpr const unsigned char UINT8 = 0b00000010;
923 static constexpr const unsigned char UINT16 = 0b00000100;
924 static constexpr const unsigned char UINT32 = 0b00001000;
925 static constexpr const unsigned char UINT64 = 0b00010000;
926 static constexpr const unsigned char INT8 = 0b00000011;
927 static constexpr const unsigned char INT16 = 0b00000101;
928 static constexpr const unsigned char INT32 = 0b00001001;
929 static constexpr const unsigned char INT64 = 0b00010001;
930 static constexpr const unsigned char FLOAT32 = 0b00100000;
931 static constexpr const unsigned char FLOAT64 = 0b01000000;
932 static constexpr const unsigned char FLOAT80 = 0b10000000;
933 static unsigned char encode(
char c,
bool isSigned =
false) {
934 unsigned char _is_signed = isSigned ? type_enc::SIGNED : 0;
936 case 'c':
return _is_signed | type_enc::UINT8;
937 case 's':
return _is_signed | type_enc::UINT16;
938 case 'i':
return _is_signed | type_enc::UINT32;
939 case 'l':
return _is_signed | type_enc::UINT64;
940 case 'f':
return type_enc::FLOAT32;
941 case 'd':
return type_enc::FLOAT64;
942 case 'D':
return type_enc::FLOAT80;
944 return type_enc::UNDEFINED;
946 static char decode(
unsigned char c,
bool isSigned =
false) {
949 case type_enc::UINT8:
return 'c';
950 case type_enc::INT16:
951 case type_enc::UINT16:
return 's';
952 case type_enc::INT32:
953 case type_enc::UINT32:
return 'i';
954 case type_enc::INT64:
955 case type_enc::UINT64:
return 'l';
956 case type_enc::FLOAT32:
return 'f';
957 case type_enc::FLOAT64:
return 'd';
958 case type_enc::FLOAT80:
return 'D';
962 static int bytes_len(
unsigned char enct) {
964 case type_enc::INT32:
return sizeof(int);
965 case type_enc::INT64:
return sizeof(
long long);
966 case type_enc::UINT16:
return sizeof(
unsigned short);
967 case type_enc::UINT8:
return sizeof(
unsigned char);
968 case type_enc::UINT32:
return sizeof(
unsigned int);
969 case type_enc::UINT64:
return sizeof(
unsigned long long);
970 case type_enc::INT8:
return sizeof(char);
971 case type_enc::INT16:
return sizeof(short);
972 case type_enc::FLOAT32:
return sizeof(float);
973 case type_enc::FLOAT64:
return sizeof(double);
974 case type_enc::FLOAT80:
return sizeof(
long double);
978 static bool is_signed(
unsigned char c) {
979 return c == FLOAT32 || c == FLOAT64 || c == FLOAT80 || c & SIGNED;
985 int n_time_channels()
const {
return n_time; };
986 int n_val_channels()
const {
return n_val; };
989 int time_unit()
const {
return _time_unit; };
990 int Time_ch_vec(
int idx,
int chan,
void * data_)
const {
return Time<int>(idx, chan, data); }
991 void SetVal_ch_vec(
int idx,
int chan,
float _val,
void *data_) { setVal(idx, chan, _val, data_); };
993 inline void Set(
int idx,
int *times,
float *vals) { Set(idx, times, vals, data); }
995 inline void Set(
int idx,
int *times,
float *vals,
void* data_)
997 for (
int chan = 0; chan < n_time; ++chan)
998 setTime(idx, chan, times[chan], (
char*)data_);
1000 for (
int chan = 0; chan < n_val; ++chan)
1001 setVal(idx, chan, vals[chan], (
char*)data_);
1004 size_t size()
const {
return struct_size; }
1007 if (sid == info.sid)
return;
1008 _time_unit = info.time_unit;
1009 time_channel_offsets = info.time_channel_offsets;
1010 val_channel_offsets = info.val_channel_offsets;
1011 time_channel_types = info.time_channel_types;
1012 val_channel_types = info.val_channel_types;
1014 struct_size = info.bytes_len;
1015 n_time = info.n_time_channels;
1016 n_val = info.n_val_channels;
1025 std::array<int, GENERIC_SIG_VEC_MAX_CHANNELS> time_channel_offsets;
1026 std::array<int, GENERIC_SIG_VEC_MAX_CHANNELS> val_channel_offsets;
1027 std::array<unsigned char, GENERIC_SIG_VEC_MAX_CHANNELS> time_channel_types;
1028 std::array<unsigned char, GENERIC_SIG_VEC_MAX_CHANNELS> val_channel_types;
1032 void set_data(
void* _data,
int _len) {
1036 GenericSigVec() : data(nullptr), sid(-1), len(0), struct_size(0), n_time(0), n_val(0) { time_channel_offsets.fill(0); val_channel_offsets.fill(0); time_channel_types.fill(0); val_channel_types.fill(0); }
1042 struct_size = other.struct_size;
1044 n_time = other.n_time;
1045 n_val = other.n_val;
1046 _time_unit = other._time_unit;
1047 time_channel_offsets = other.time_channel_offsets;
1048 time_channel_types = other.time_channel_types;
1049 val_channel_offsets = other.val_channel_offsets;
1050 val_channel_types = other.val_channel_types;
1056 copy_signal_metadata(other);
1060 void init_from_spec(
const string& signalSpec);
1061 void init_from_sigtype(SigType sigtype);
1064 template<
typename T =
int>
1065 T Time(
int idx,
int chan)
const {
return Time<T>(idx, chan, data); }
1067 template<
typename T =
int>
1068 T Time(
int idx,
int chan,
const void* data_)
const {
1069 auto field_ptr = ((
const char*)data_) + idx * struct_size + time_channel_offsets[chan];
1070 switch (time_channel_types[chan]) {
1071 case type_enc::INT32:
return (T)(*(
int*)(field_ptr));
1072 case type_enc::INT64:
return (T)(*(
long long*)(field_ptr));
1073 case type_enc::UINT16:
return (T)(*(
unsigned short*)(field_ptr));
1074 case type_enc::UINT8:
return (T)(*(
unsigned char*)(field_ptr));
1075 case type_enc::UINT32:
return (T)(*(
unsigned int*)(field_ptr));
1076 case type_enc::UINT64:
return (T)(*(
unsigned long long*)(field_ptr));
1077 case type_enc::INT8:
return (T)(*(
char*)(field_ptr));
1078 case type_enc::INT16:
return (T)(*(
short*)(field_ptr));
1079 case type_enc::FLOAT32:
return (T)(*(
float*)(field_ptr));
1080 case type_enc::FLOAT64:
return (T)(*(
double*)(field_ptr));
1081 case type_enc::FLOAT80:
return (T)(*(
long double*)(field_ptr));
1086 template<
typename T =
int>
1087 void setTime(
int idx,
int chan, T new_val) { setTime<T>(idx, chan, new_val, data); }
1089 template<
typename T =
int>
1090 void setTime(
int idx,
int chan, T new_val,
void* data_) {
1091 auto field_ptr = ((
char*)data_) + idx * struct_size + time_channel_offsets[chan];
1092 switch (time_channel_types[chan]) {
1093 case type_enc::INT32: (*(
int*)(field_ptr)) = (
int)new_val;
return;
1094 case type_enc::INT64: (*(
long long*)(field_ptr)) = (
long long)new_val;
return;
1095 case type_enc::UINT16: (*(
unsigned short*)(field_ptr)) = (
unsigned short)new_val;
return;
1096 case type_enc::UINT8: (*(
unsigned char*)(field_ptr)) = (
unsigned char)new_val;
return;
1097 case type_enc::UINT32: (*(
unsigned int*)(field_ptr)) = (
unsigned int)new_val;
return;
1098 case type_enc::UINT64: (*(
unsigned long long*)(field_ptr)) = (
unsigned long long)new_val;
return;
1099 case type_enc::INT8: (*(
char*)(field_ptr)) = (
char)new_val;
return;
1100 case type_enc::INT16: (*(
short*)(field_ptr)) = (
short)new_val;
return;
1101 case type_enc::FLOAT32: (*(
float*)(field_ptr)) = (
float)new_val;
return;
1102 case type_enc::FLOAT64: (*(
double*)(field_ptr)) = (
double)new_val;
return;
1103 case type_enc::FLOAT80: (*(
long double*)(field_ptr)) = (
long double)new_val;
return;
1107 template<
typename T =
float>
1108 T Val(
int idx,
int chan)
const {
return Val<T>(idx, chan, data); }
1110 template<
typename T =
float>
1111 T Val(
int idx)
const {
return Val<T>(idx, 0, data); }
1113 template<
typename T =
float>
1114 T Val(
int idx,
int chan,
const void* data_)
const {
1115 auto field_ptr = ((
char*)data_) + idx * struct_size + val_channel_offsets[chan];
1116 switch (val_channel_types[chan]) {
1117 case type_enc::FLOAT32:
return (T)(*(
float*)(field_ptr));
1118 case type_enc::INT16:
return (T)(*(
short*)(field_ptr));
1119 case type_enc::UINT16:
return (T)(*(
unsigned short*)(field_ptr));
1120 case type_enc::UINT8:
return (T)(*(
unsigned char*)(field_ptr));
1121 case type_enc::UINT32:
return (T)(*(
unsigned int*)(field_ptr));
1122 case type_enc::UINT64:
return (T)(*(
unsigned long long*)(field_ptr));
1123 case type_enc::INT8:
return (T)(*(
char*)(field_ptr));
1124 case type_enc::INT32:
return (T)(*(
int*)(field_ptr));
1125 case type_enc::INT64:
return (T)(*(
long long*)(field_ptr));
1126 case type_enc::FLOAT64:
return (T)(*(
double*)(field_ptr));
1127 case type_enc::FLOAT80:
return (T)(*(
long double*)(field_ptr));
1132 template<
typename T =
float>
1133 void setVal(
int idx,
int chan, T new_val) { setVal<T>(idx, chan, new_val, data); }
1135 template<
typename T =
float>
1136 void setVal(
int idx,
int chan, T new_val,
void* data_) {
1137 auto field_ptr = ((
char*)data_) + idx * struct_size + val_channel_offsets[chan];
1138 switch (val_channel_types[chan]) {
1139 case type_enc::FLOAT32: (*(
float*)(field_ptr)) = (
float)new_val;
return;
1140 case type_enc::INT16: (*(
short*)(field_ptr)) = (
short)new_val;
return;
1141 case type_enc::UINT16: (*(
unsigned short*)(field_ptr)) = (
unsigned short)new_val;
return;
1142 case type_enc::UINT8: (*(
unsigned char*)(field_ptr)) = (
unsigned char)new_val;
return;
1143 case type_enc::UINT32: (*(
unsigned int*)(field_ptr)) = (
unsigned int)new_val;
return;
1144 case type_enc::UINT64: (*(
unsigned long long*)(field_ptr)) = (
unsigned long long)new_val;
return;
1145 case type_enc::INT8: (*(
char*)(field_ptr)) = (
char)new_val;
return;
1146 case type_enc::INT32: (*(
int*)(field_ptr)) = (
int)new_val;
return;
1147 case type_enc::INT64: (*(
long long*)(field_ptr)) = (
long long)new_val;
return;
1148 case type_enc::FLOAT64: (*(
double*)(field_ptr)) = (
double)new_val;
return;
1149 case type_enc::FLOAT80: (*(
long double*)(field_ptr)) = (
long double)new_val;
return;
1154 inline int Time(
int idx)
const {
return Time(idx, 0); }
1155 inline float Val(
int idx)
const {
return Val(idx, 0); }
1157 inline int TimeU(
int idx,
int to_time_unit)
const {
return med_time_converter.
convert_times(time_unit(), to_time_unit, Time(idx)); }
1166 inline int TimeU(
int idx,
int chan,
int to_time_unit)
const {
return med_time_converter.
convert_times(time_unit(), to_time_unit, Time(idx, chan)); }
1167 inline int Date(
int idx,
int chan)
const {
return med_time_converter.
convert_times(time_unit(),
MedTime::Date, Time(idx, chan)); }
1168 inline int Years(
int idx,
int chan)
const {
return med_time_converter.
convert_times(time_unit(),
MedTime::Years, Time(idx, chan)); }
1170 inline int Days(
int idx,
int chan)
const {
return med_time_converter.
convert_times(time_unit(),
MedTime::Days, Time(idx, chan)); }
1171 inline int Hours(
int idx,
int chan)
const {
return med_time_converter.
convert_times(time_unit(),
MedTime::Hours, Time(idx, chan)); }
1174 template <
class S>
void set_funcs()
const { }
1176 SigType get_type()
const {
return type; }
1181 int get_index_gt_time_bound(
int time_chan,
int time_bound);
1183 int get_index_ge_time_bound(
int time_chan,
int time_bound);
1185 bool compareTimeLt(
const void* data1,
int idx1,
const void* data2,
int idx2)
const {
1186 for (
int tchan = 0; tchan < n_time; tchan++) {
1187 if (this->Time(idx1, tchan, data1) > this->Time(idx2, tchan, data2))
1189 if (this->Time(idx1, tchan, data1) < this->Time(idx2, tchan, data2))
1192 for (
int vchan = 0; vchan < n_val; vchan++) {
1193 if (this->Val(idx1, vchan, data1) > this->Val(idx2, vchan, data2))
1195 if (this->Val(idx1, vchan, data1) < this->Val(idx2, vchan, data2))
1201 int compare_elements(
const void* elem1,
const void* elem2) {
1202 if (compareTimeLt(elem1, 0, elem2, 0))
return - 1;
1208 return compareTimeLt(&e1.data[0], 0, &e2.data[0], 0);
1211 int inplace_sort_data(
const void *data,
int nelem) {
1212 vector<GSVElement> dc(nelem);
1213 unsigned char* p_data = (
unsigned char *)data;
1215 for (
int i = 0; i < nelem; i++) {
1216 dc[i].data.resize(this->struct_size);
1217 for (
int j = 0; j < this->struct_size; j++)
1218 dc[i].data[j] = p_data[k++];
1221 std::sort(dc.begin(), dc.end(), [
this](
GSVElement l,
GSVElement r) {return compare_gsv_elements(l, r); });
1224 for (
int i = 0; i < nelem; i++) {
1225 dc[i].data.resize(this->struct_size);
1226 for (
int j = 0; j < this->struct_size; j++)
1227 p_data[k++] = dc[i].data[j];
1234 bool compareData(
int idx,
const GenericSigVec& other_gsv,
int other_idx)
const {
1235 return std::memcmp(((
const char*)data) + idx * struct_size, ((
const char*)other_gsv.data) + other_idx * struct_size, struct_size) == 0;
1238 static string get_type_generic_spec(SigType t);
1240 string get_signal_generic_spec()
const;
1243 const SigType type = T_Generic;