#ifndef H5MACROS_H
#define H5MACROS_H

#define WRITE_INTERNAL_VECTOR_DATASET(input, paramsName, listName, nameStr, dataType) \
    do \
    { \
        auto listName ## _data = input.paramsName.listName.data(); \
        hsize_t dims[1]{static_cast<hsize_t>(input.paramsName.listName.count())}; \
        H5::DataSpace* dataspace = new H5::DataSpace(1, dims); \
        H5::DataSet* dataset = \
            new H5::DataSet(_file.createDataSet(nameStr, \
                                                H5::PredType::dataType, *dataspace, H5P_DEFAULT, \
                                                H5P_DEFAULT, H5P_DEFAULT)); \
        dataset->write(listName ## _data, \
                       H5::PredType::dataType, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT); \
        delete dataspace; \
        delete dataset; \
    } \
    while(0) \


//halfPeriodVector.append(input.hwRegister.pulseProps.at(i).halfPeriod)
#define WRITE_INTERNAL_QTZD_VECTOR_DS(input, \
                                      paramsName, \
                                      listName, \
                                      qName, \
                                      nameStr, \
                                      dataType) \
    do \
    { \
        auto tempMember = input.paramsName.listName.at(0).qName; \
        QVector<typeof (tempMember)> list; \
        for(int i = 0; i < input.paramsName.listName.count(); ++i) \
        { \
            list.append(input.paramsName.listName.at(i).qName); \
        } \
        auto listName ## _data = list.data(); \
        hsize_t dims[1]{static_cast<hsize_t>(list.count())}; \
        H5::DataSpace* dataspace = new H5::DataSpace(1, dims); \
        H5::DataSet* dataset = \
            new H5::DataSet(_file.createDataSet(nameStr, \
                                                H5::PredType::dataType, *dataspace, H5P_DEFAULT, \
                                                H5P_DEFAULT, H5P_DEFAULT)); \
        dataset->write(listName ## _data, \
                       H5::PredType::dataType, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT); \
        delete dataspace; \
        delete dataset; \
    } \
    while(0) \

#define WRITE_INTERNAL_2D_VECTOR_DATASET(input, paramsName, listName, nameStr, dataType) \
    do \
    { \
        auto tempMember = input.paramsName.listName.at(0).at(0); \
        QVector<typeof (tempMember)> list; \
        for(int i = 0; i < input.paramsName.listName.count(); ++i){ \
            for(int j = 0; j < input.paramsName.listName.at(i).count(); ++j){ \
                list.append(input.paramsName.listName.at(i).at(j)); \
            } \
        } \
        auto listName ## _data = list.data(); \
        hsize_t dims[1]{static_cast<hsize_t>(list.count())}; \
        H5::DataSpace* dataspace = new H5::DataSpace(1, dims); \
        H5::DataSet* dataset = \
            new H5::DataSet(_file.createDataSet(nameStr, \
                                                H5::PredType::dataType, *dataspace, H5P_DEFAULT, \
                                                H5P_DEFAULT, H5P_DEFAULT)); \
        dataset->write(listName ## _data, \
                       H5::PredType::dataType, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT); \
        delete dataspace; \
        delete dataset; \
    } \
    while(0) \


#define WRITE_VECTOR_DATASET(input, listName, nameStr, dataType) \
    do \
    { \
        auto listName ## _data = input.listName.data(); \
        hsize_t dims[1]{static_cast<hsize_t>(input.listName.count())}; \
        H5::DataSpace* dataspace = new H5::DataSpace(1, dims); \
        H5::DataSet* dataset = \
            new H5::DataSet(_file.createDataSet(nameStr, \
                                                H5::PredType::dataType, *dataspace, H5P_DEFAULT, \
                                                H5P_DEFAULT, H5P_DEFAULT)); \
        dataset->write(listName ## _data, \
                       H5::PredType::dataType, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT); \
        delete dataspace; \
        delete dataset; \
    } \
    while(0) \


#define WRITE_Single_DATASET(input, valueName, nameStr, dataType) \
    do \
    { \
        auto valueName ## _data = &input.valueName; \
        hsize_t dims[1]{static_cast<hsize_t>(1)}; \
        H5::DataSpace* dataspace = new H5::DataSpace(1, dims); \
        H5::DataSet* dataset = \
            new H5::DataSet(_file.createDataSet(nameStr, \
                                                H5::PredType::dataType, *dataspace, H5P_DEFAULT, \
                                                H5P_DEFAULT, H5P_DEFAULT)); \
        dataset->write(valueName ## _data, \
                       H5::PredType::dataType, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT); \
        delete dataspace; \
        delete dataset; \
    } \
    while(0) \


#define WRITE_INTERNAL_SINGLE_DATASET(input, paramsName, valueName, nameStr, dataType) \
    do \
    { \
        auto valueName ## _data = &input.paramsName.valueName; \
        hsize_t dims[1]{static_cast<hsize_t>(1)}; \
        H5::DataSpace* dataspace = new H5::DataSpace(1, dims); \
        H5::DataSet* dataset = \
            new H5::DataSet(_file.createDataSet(nameStr, \
                                                H5::PredType::dataType, *dataspace, H5P_DEFAULT, \
                                                H5P_DEFAULT, H5P_DEFAULT)); \
        dataset->write(valueName ## _data, \
                       H5::PredType::dataType, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT, \
                       H5P_DEFAULT); \
        delete dataspace; \
        delete dataset; \
    } \
    while(0) \


#endif //H5MACROS_H