u::logic HDF5FormatLib::WriteToFile(QString filePath, QString dataSetPath, u::cptr data, u::int64 lines, u::int64 columns, int byteType)
{
    try
    {
        QStringList listPathes = ParseFile(dataSetPath);
        if (listPathes.isEmpty())
        {
            throw GenericExc(QObject::tr("Не задан путь к данным"));
        }
        if (filePath.isEmpty())
        {
            throw GenericExc(QObject::tr("Не задан путь к файлу"));
        }
        // пробуем открыть файл. Если status = -1, то создаем файл
        hid_t fileHandle, dataspace_id, group_id, dataset_id;
        hsize_t     dims[2];
        QList<hid_t> groups_idList;
        herr_t status;
        fileHandle = H5Fopen(filePath.toStdString().c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
        if (fileHandle < 0)
        {
            fileHandle = H5Fcreate(filePath.toStdString().c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
            if (fileHandle < 0)
            {
                throw GenericExc(QObject::tr("Ошибка создания файла"));
            }
        }
        if (listPathes.size() != 1)
        {
            QString str = "/" + listPathes.at(0);
            group_id = H5Gopen2(fileHandle, str.toStdString().c_str(), H5P_DEFAULT);
            if (group_id < 0)
            {
                group_id = H5Gcreate2(fileHandle, str.toStdString().c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
                if (group_id < 0)
                {
                    throw GenericExc(QObject::tr("Ошибка создания группы файла"));
                }
            }
            groups_idList.append(group_id);
            // Последнее - это название dataSet
            for (int i = 1; i < listPathes.size()-1; i++)
            {
                // сначала открываем, если не вышло, то создаем новую группу
                group_id = H5Gopen2(groups_idList.at(i-1), listPathes.at(i).toStdString().c_str(), H5P_DEFAULT);
                if (group_id < 0)
                {
                    group_id = H5Gcreate2(groups_idList.at(i-1), listPathes.at(i).toStdString().c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
                    if (group_id < 0)
                    {
                        throw GenericExc(QObject::tr("Ошибка создания группы файла"));
                    }
                }
                groups_idList.append(group_id);
            }
        }

        // создаем размерность dataset
        dims[0] = lines;
        dims[1] = columns;
        dataspace_id = H5Screate_simple(2, dims, NULL);
        if (dataspace_id < 0)
        {
            throw GenericExc(QObject::tr("Ошибка выделения памяти для данных"));
        }
        dataset_id = H5Dcreate2(groups_idList.at(groups_idList.size()-1), listPathes.at(listPathes.size()-1).toStdString().c_str(), GetByteType(byteType), dataspace_id,
                               H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
        if (dataset_id < 0)
        {
            throw GenericExc(QObject::tr("Ошибка создания set данных. Возможно данный сет данных уже создан"));
        }
        status = H5Dwrite(dataset_id, GetByteType(byteType), H5S_ALL, H5S_ALL, H5P_DEFAULT,
                          data);
        if (status < 0)
        {
            throw GenericExc(QObject::tr("Ошибка записи данных"));
        }

        status = H5Sclose(dataspace_id);
        if (status < 0)
        {
            throw GenericExc(QObject::tr("Ошибка установки запрета на ввод данных"));
        }

        status = H5Dclose(dataset_id);
        if (status < 0)
        {
            throw GenericExc(QObject::tr("Ошибка закрытия set данных"));
        }

        for (int i = groups_idList.size()-1; i >= 0; i-- )
        {
            status = H5Gclose(groups_idList.at(i));
            if (status < 0)
            {
                throw GenericExc(QObject::tr("Ошибка закрытия группы"));
            }
        }
        status = H5Fclose (fileHandle);
        if (status < 0)
        {
            throw GenericExc(QObject::tr("Ошибка закрытия файла"));
        }
        return true;
    } catch (const GenericExc& exc)
    {
        m_errDescription = exc.GetWhat();
        return false;
    } catch (...)
    {
        m_errDescription = QObject::tr("Неизвестная ошибка при записи в файл");
        return false;
    }
}
u::logic HDF5FormatLib::ReadFromFile(QString filePath, QString dataSetPath, u::ptr data, int byteType)
{
    try
    {
        QStringList listPathes = ParseFile(dataSetPath);
        if (listPathes.isEmpty())
        {
            throw GenericExc(QObject::tr("Не задан путь к данным"));
        }
        // пробуем открыть файл. Если status = -1, то создаем файл
        hid_t fileHandle, group_id, dataset_id;
        QList<hid_t> groups_idList;
        herr_t status;
        fileHandle = H5Fopen(filePath.toStdString().c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
        if (fileHandle < 0)
        {
            throw GenericExc(QObject::tr("Ошибка открытия файла"));
        }
        if (listPathes.size() != 1)
        {
            group_id = H5Gopen2(fileHandle, listPathes.at(0).toStdString().c_str(), H5P_DEFAULT);
            if (group_id < 0)
            {
                throw GenericExc(QObject::tr("Ошибка открытия группы файла"));
            } else {
                groups_idList.append(group_id);
            }
        }
            // Последнее - это название dataSet
        for (int i = 1; i < listPathes.size()-1; i++)
        {
            group_id = H5Gopen2(groups_idList.at(i-1), listPathes.at(i).toStdString().c_str(), H5P_DEFAULT);
            if (group_id < 0)
            {
                throw GenericExc(QObject::tr("Ошибка открытия группы файла"));
            }
             else
            {
                groups_idList.append(group_id);
            }
        }
        dataset_id = H5Dopen2 (groups_idList.at(groups_idList.size()-1), listPathes.at(listPathes.size()-1).toStdString().c_str(), H5P_DEFAULT);
        if (dataset_id < 0)
        {
            throw GenericExc(QObject::tr("Ошибка открытия set данных"));
        }
        status = H5Dread (dataset_id, GetByteType(byteType), H5S_ALL, H5S_ALL,
                               H5P_DEFAULT, data);
        if (status < 0)
        {
            throw GenericExc(QObject::tr("Ошибка чтения данных"));
        }

        status = H5Dclose(dataset_id);
        if (status < 0)
        {
            throw GenericExc(QObject::tr("Ошибка закрытия set данных"));
        }

        for (int i = groups_idList.size()-1; i >= 0; i-- )
        {
            status = H5Gclose(groups_idList.at(i));
            if (status < 0)
            {
                throw GenericExc(QObject::tr("Ошибка закрытия группы"));
            }
        }
        status = H5Fclose (fileHandle);
        if (status < 0)
        {
            throw GenericExc(QObject::tr("Ошибка закрытия файла"));
        }

        return true;
    } catch (const GenericExc& exc)
    {
        m_errDescription = exc.GetWhat();
        return false;
    } catch (...)
    {
        m_errDescription = QObject::tr("Неизвестная ошибка при чтении данных из файла");
        return false;
    }
}
Beispiel #3
0
    void VirtualMachine::LoadRuntimeClasses()
    {
        // Load only once.
        if(objectClass)
            return;

        // The first loaded module must be the runtime.
        runtimeModule = loadedModules[0];
        runtimeModule->SetRuntimeFlag(true);

        // Get basic classes.
        typeClass = GetClass(runtimeModule, "Chela.Lang.Type");
        objectClass = GetClass(runtimeModule, "Chela.Lang.Object");
        stringClass = GetClass(runtimeModule, "Chela.Lang.String");
        closureClass = GetClass(runtimeModule, "Chela.Lang.Closure");
        arrayClass = GetClass(runtimeModule, "Chela.Lang.Array");
        valueTypeClass = GetClass(runtimeModule, "Chela.Lang.ValueType");
        enumClass = GetClass(runtimeModule, "Chela.Lang.Enum");
        delegateClass = GetClass(runtimeModule, "Chela.Lang.Delegate");

        // Special attributes.
        threadStaticAttribute = GetClass(runtimeModule, "Chela.Lang.ThreadStaticAttribute");
        chelaIntrinsicAttribute = GetClass(runtimeModule, "Chela.Runtime.Core.ChelaIntrinsicAttribute");

        // Get the kernel data holding classes.
        streamHolderClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder");
        streamHolder1DClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder1D");
        streamHolder2DClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder2D");
        streamHolder3DClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder3D");
        uniformHolderClass = GetTemplateClass(runtimeModule, "Chela.Compute.UniformHolder");

        // Get the reflection classes.
        assemblyClass = GetClass(runtimeModule, "Chela.Reflection.Assembly");
        constructorInfoClass = GetClass(runtimeModule, "Chela.Reflection.ConstructorInfo");
        eventInfoClass = GetClass(runtimeModule, "Chela.Reflection.EventInfo");
        fieldInfoClass = GetClass(runtimeModule, "Chela.Reflection.FieldInfo");
        memberInfoClass = GetClass(runtimeModule, "Chela.Reflection.MemberInfo");
        methodInfoClass = GetClass(runtimeModule, "Chela.Reflection.MethodInfo");
        parameterInfoClass = GetClass(runtimeModule, "Chela.Reflection.ParameterInfo");
        propertyInfoClass = GetClass(runtimeModule, "Chela.Reflection.PropertyInfo");

        // Register associated types.
        RegisterPrimStruct(GetBoolType(), "Chela.Lang.Boolean");
        RegisterPrimStruct(GetCharType(), "Chela.Lang.Char");
        RegisterPrimStruct(GetSByteType(), "Chela.Lang.SByte");
        RegisterPrimStruct(GetByteType(), "Chela.Lang.Byte");
        RegisterPrimStruct(GetShortType(), "Chela.Lang.Int16");
        RegisterPrimStruct(GetUShortType(), "Chela.Lang.UInt16");
        RegisterPrimStruct(GetIntType(), "Chela.Lang.Int32");
        RegisterPrimStruct(GetUIntType(), "Chela.Lang.UInt32");
        RegisterPrimStruct(GetLongType(), "Chela.Lang.Int64");
        RegisterPrimStruct(GetULongType(), "Chela.Lang.UInt64");
        RegisterPrimStruct(GetSizeType(), "Chela.Lang.UIntPtr");
        RegisterPrimStruct(GetPtrDiffType(), "Chela.Lang.IntPtr");
        RegisterPrimStruct(GetFloatType(), "Chela.Lang.Single");
        RegisterPrimStruct(GetDoubleType(), "Chela.Lang.Double");
        RegisterPrimStruct(GetVoidType(), "Chela.Lang.Void");

        // Register vector associated types.
        RegisterPrimStruct(GetFloatVectorTy(this, 2), "Chela.Lang.Single2");
        RegisterPrimStruct(GetFloatVectorTy(this, 3), "Chela.Lang.Single3");
        RegisterPrimStruct(GetFloatVectorTy(this, 4), "Chela.Lang.Single4");
        RegisterPrimStruct(GetDoubleVectorTy(this, 2), "Chela.Lang.Double2");
        RegisterPrimStruct(GetDoubleVectorTy(this, 3), "Chela.Lang.Double3");
        RegisterPrimStruct(GetDoubleVectorTy(this, 4), "Chela.Lang.Double4");
        RegisterPrimStruct(GetIntVectorTy(this, 2), "Chela.Lang.Int32x2");
        RegisterPrimStruct(GetIntVectorTy(this, 3), "Chela.Lang.Int32x3");
        RegisterPrimStruct(GetIntVectorTy(this, 4), "Chela.Lang.Int32x4");
        RegisterPrimStruct(GetBoolVectorTy(this, 2), "Chela.Lang.Boolean2");
        RegisterPrimStruct(GetBoolVectorTy(this, 3), "Chela.Lang.Boolean3");
        RegisterPrimStruct(GetBoolVectorTy(this, 4), "Chela.Lang.Boolean4");

        // Register matrix associated types.
        RegisterPrimStruct(GetFloatMatrixTy(this, 3,3), "Chela.Lang.Single3x3");
        RegisterPrimStruct(GetFloatMatrixTy(this, 4,4), "Chela.Lang.Single4x4");

        // Declare them.
        typeClass->DeclarePass();
        objectClass->DeclarePass();
        stringClass->DeclarePass();
        closureClass->DeclarePass();
        arrayClass->DeclarePass();
        valueTypeClass->DeclarePass();
        enumClass->DeclarePass();
        delegateClass->DeclarePass();
        streamHolderClass->DeclarePass();
        streamHolder1DClass->DeclarePass();
        streamHolder2DClass->DeclarePass();
        streamHolder3DClass->DeclarePass();
        uniformHolderClass->DeclarePass();

        assemblyClass->DeclarePass();
        constructorInfoClass->DeclarePass();
        eventInfoClass->DeclarePass();
        fieldInfoClass->DeclarePass();
        memberInfoClass->DeclarePass();
        methodInfoClass->DeclarePass();
        parameterInfoClass->DeclarePass();
        propertyInfoClass->DeclarePass();
    }