This example compound type creation.
#include <iostream>
#include <iomanip>
#include <string>
#include <cstddef>
#include <netcdf>
#include <stdio.h>
#include <stddef.h>
#include "test_utilities.h"
using namespace std;
using namespace netCDF;
using namespace netCDF::exceptions;
struct struct3{
int mem1;
double mem2;
short mem3[3];
};
int main()
{
try
{
cout<<"Opening file \"firstFile.cdf\" with NcFile::replace"<<endl;
NcFile ncFile(
"firstFile.cdf",NcFile::replace);
cout<<left<<std::setw(57)<<"Testing addGroup(\"groupName\")";
NcGroup groupA(ncFile.addGroup(
"groupA"));
NcGroup groupA0(ncFile.addGroup(
"groupA0"));
NcGroup groupB(groupA.addGroup(
"groupB"));
NcGroup groupC(groupA.addGroup(
"groupC"));
cout <<" ----------- passed\n";
vector<string> b1(10);
vector<unsigned char *> b2(10);
vector<signed char*> b3(10);
vector<short> a1(10);
vector<int> a2(10);
vector<float> a3(10);
vector<double> a4(10);
vector<unsigned short> a5(10);
vector<unsigned int> a6(10);
vector<long long> a7(10);
vector<unsigned long long> a8(10);
vector<double> a9(10);
initializeVector(a1);
initializeVector(a2);
initializeVector(a3);
initializeVector(a4);
initializeVector(a5);
initializeVector(a6);
initializeVector(a7);
initializeVector(a8);
initializeVector(a9);
cout <<left<<setw(57)<<"Testing getName()";
if( ncUshort.
getName() !=
"ushort")
throw NcException(
"Error in test 1.5",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing getParentGroup() and isNull()";
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing getSize()";
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing getTypeClass()";
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing getTypeClassName()";
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing creating new Compound Type";
struct struct1{
char mem1;
char mem2;
short mem3;
double mem4;
};
struct struct2{
char mem1;
double mem2;
short mem3[18];
};
vector<int> vecSize(2); vecSize[0]=6,vecSize[1]=3;
NcCompoundType compoundType1(ncFile.addCompoundType(
"compoundType_1",
sizeof(struct1)));
NcCompoundType compoundType2(ncFile.addCompoundType(
"compoundType_2",
sizeof(struct2)));
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcCompoundType::addMember()";
compoundType1.
addMember(
"member1",ncByte,offsetof(struct1,mem1));
compoundType1.addMember("member2",ncByte,offsetof(struct1,mem2));
compoundType1.addMember("member3",ncShort,offsetof(struct1,mem3));
compoundType1.addMember("member4",ncDouble,offsetof(struct1,mem4));
compoundType2.addMember("memberA",ncChar,offsetof(struct2,mem1));
compoundType2.addMember("memberB",ncDouble,offsetof(struct2,mem2));
compoundType2.addMember("memberC",ncShort,offsetof(struct2,mem3),vecSize);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcCompoundType==>NcType && NcType::getTypeClass()";
NcType dummyType(compoundType2);
if(compoundType2.getTypeClass() != NcType::nc_COMPOUND)
throw NcException(
"Error in test 8.1",__FILE__,__LINE__);
if(dummyType.getTypeClass() != NcType::nc_COMPOUND)
throw NcException(
"Error in test 8.2",__FILE__,__LINE__);
if(compoundType2.getTypeClass() != NcCompoundType::nc_COMPOUND)
throw NcException(
"Error in test 8.3",__FILE__,__LINE__);
if(dummyType.getTypeClass() != NcCompoundType::nc_COMPOUND)
throw NcException(
"Error in test 8.4",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing compoundClass.getMemberCount()";
if(compoundType2.getMemberCount() != 3)
throw NcException(
"Error in test 9.1",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcCompoundType::getMemberDimCount()";
if(compoundType2.getMemberDimCount(0) != 0)
throw NcException(
"Error in test 10.1",__FILE__,__LINE__);
if(compoundType2.getMemberDimCount(1) != 0)
throw NcException(
"Error in test 10.2",__FILE__,__LINE__);
if(compoundType2.getMemberDimCount(2) != 2)
throw NcException(
"Error in test 10.3",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcCompoundType::getMemberShape(index)";
vector<int> memberShape;
memberShape =compoundType2.getMemberShape(0);
if(memberShape.size() != 0)
throw NcException(
"Error in test 11.1",__FILE__,__LINE__);
memberShape =compoundType2.getMemberShape(1);
if(memberShape.size() != 0)
throw NcException(
"Error in test 11.2",__FILE__,__LINE__);
memberShape =compoundType2.getMemberShape(2);
if(memberShape.size() != 2)
throw NcException(
"Error in test 11.3",__FILE__,__LINE__);
if(memberShape[0] != 6)
throw NcException(
"Error in test 11.4",__FILE__,__LINE__);
if(memberShape[1] != 3)
throw NcException(
"Error in test 11.5",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcCompoundType::getMember(index).getName()";
if(compoundType2.getMember(0).getName() !=
"char")
throw NcException(
"Error in test 12.1",__FILE__,__LINE__);
if(compoundType2.getMember(1).getName() !=
"double")
throw NcException(
"Error in test 12.2",__FILE__,__LINE__);
if(compoundType2.getMember(2).getName() !=
"short")
throw NcException(
"Error in test 12.3",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcCompoundType == NcType";
NcType dummyType2(compoundType2);
if(!(dummyType2 == compoundType2))
throw NcException(
"Error in test 13.1",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcCompoundType == NcCompoundType";
if(!(dummy3 == compoundType2))
throw NcException(
"Error in test 14.1",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing creating new Vlen Type";
NcVlenType vlenType1(ncFile.addVlenType(
"vlenType_1",ncShort));
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcVlenType::getTypeClass()";
if(vlenType1.getTypeClass() != NcType::nc_VLEN)
throw NcException(
"Error in test 15.1",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcVlenType::getTypeClassName()";
if(vlenType1.getTypeClassName() !=
"nc_VLEN")
throw NcException(
"Error in test 16.1",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcVlenType::getName()";
if(vlenType1.getName() !=
"vlenType_1")
throw NcException(
"Error in test 17.1",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcVlenType::getBaseType(); == and !=";
if(!(vlenType1.getBaseType() ==
ncShort))
throw NcException(
"Error in test 18.1",__FILE__,__LINE__);
if(vlenType1.getBaseType() !=
ncShort)
throw NcException(
"Error in test 18.2",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcVlenType constructors";
if(vlenType1 != vlenvlenType)
throw NcException(
"Error in test 19.1",__FILE__,__LINE__);
if(vlenType1 != typevlen)
throw NcException(
"Error in test 19.2",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing creating new Enum Type";
NcEnumType enumType1(ncFile.addEnumType(
"enumType_1",NcEnumType::nc_SHORT));
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcEnumType::addMember()";
enumType1.addMember("Tuesday",7);
enumType1.addMember("Wednesday",-20);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcEnumType::getBaseType() == and !=";
if(enumType1.getBaseType() !=
ncShort)
throw NcException(
"Error in test 20.1",__FILE__,__LINE__);
if(!(enumType1.getBaseType() ==
ncShort))
throw NcException(
"Error in test 20.2",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcEnumType::getMemberCount()";
if(enumType1.getMemberCount() != 3)
throw NcException(
"Error in test 21.1",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcEnumType::getMemberNameFromIndex(index)";
if(enumType1.getMemberNameFromIndex(0) !=
"Monday")
throw NcException(
"Error in test 22.1",__FILE__,__LINE__);
if(enumType1.getMemberNameFromIndex(1) !=
"Tuesday")
throw NcException(
"Error in test 22.2",__FILE__,__LINE__);
if(enumType1.getMemberNameFromIndex(2) !=
"Wednesday")
throw NcException(
"Error in test 22.3",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcEnumType::getMemberNameFromValue(index)";
if(enumType1.getMemberNameFromValue(1) !=
"Monday")
throw NcException(
"Error in test 23.1",__FILE__,__LINE__);
if(enumType1.getMemberNameFromValue(7) !=
"Tuesday")
throw NcException(
"Error in test 23.2",__FILE__,__LINE__);
if(enumType1.getMemberNameFromValue(-20) !=
"Wednesday")
throw NcException(
"Error in test 23.3",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcEnumType::getMemberValue(index,value)";
short value;
enumType1.getMemberValue(0,value);
if(value != 1)
throw NcException(
"Error in test 24.1",__FILE__,__LINE__);
enumType1.getMemberValue(1,value);
if(value != 7)
throw NcException(
"Error in test 24.2",__FILE__,__LINE__);
enumType1.getMemberValue(2,value);
if(value != -20)
throw NcException(
"Error in test 24.3",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing NcEnumType constructors == and !=";
if(enumType1 != EnumEnumType)
throw NcException(
"Error in test 25.1",__FILE__,__LINE__);
if(enumType1 != typeEnum)
throw NcException(
"Error in test 25.2",__FILE__,__LINE__);
if(!(enumType1 == EnumEnumType))
throw NcException(
"Error in test 25.3",__FILE__,__LINE__);
if(!(enumType1 == typeEnum))
throw NcException(
"Error in test 25.4",__FILE__,__LINE__);
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing ncFile::getType() (overloaded)";
NcType typ1(ncFile.getType(
"enumType_1"));
if(ncFile.getTypeCount()!= 4)
throw NcException(
"Error in test 26.1",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_BYTE)!= 0)
throw NcException(
"Error in test 26.3",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_CHAR)!= 0)
throw NcException(
"Error in test 26.4",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_SHORT)!= 0)
throw NcException(
"Error in test 26.5",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_INT)!= 0)
throw NcException(
"Error in test 26.6",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_FLOAT)!= 0)
throw NcException(
"Error in test 26.7",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_DOUBLE)!= 0)
throw NcException(
"Error in test 26.8",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_UBYTE)!= 0)
throw NcException(
"Error in test 26.9",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_USHORT)!= 0)
throw NcException(
"Error in test 26.10",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_UINT)!= 0)
throw NcException(
"Error in test 26.11",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_INT64)!= 0)
throw NcException(
"Error in test 26.12",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_UINT64)!= 0)
throw NcException(
"Error in test 26.13",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_STRING)!= 0)
throw NcException(
"Error in test 26.14",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_VLEN)!= 1)
throw NcException(
"Error in test 26.15",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_OPAQUE)!= 0)
throw NcException(
"Error in test 26.16",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_ENUM)!= 1)
throw NcException(
"Error in test 26.17",__FILE__,__LINE__);
if(ncFile.getTypeCount(NcType::nc_COMPOUND)!= 2)
throw NcException(
"Error in test 26.18",__FILE__,__LINE__);
cout <<" ----------- passed\n";
ncFile.getTypes("enumType_1",NcType::nc_ENUM);
ncFile.getTypes(NcType::nc_ENUM);
ncFile.getTypes("enumType_1");
ncFile.getTypes();
cout <<left<<setw(57)<<"Testing ENUM ncFile::putVar() and NcFile::getVar()";
{
NcDim dim1 = ncFile.addDim(
"dim1",10);
NcVar var_1 = ncFile.addVar(
"var_1", enumType1,dim1);
short enumValues[10];
enumValues[0] = 1;
enumValues[1] = 1;
enumValues[2] = 1;
enumValues[3] = 1;
enumValues[4] = 1;
enumValues[5] = 1;
enumValues[6] = 1;
enumValues[7] = 1;
enumValues[8] = -20;
enumValues[9] = 7;
NcVar var_2(ncFile.getVar(
"var_1"));
if(var_2.isNull())
throw NcException(
"Error in test 27.1",__FILE__,__LINE__);
short enumValues2[10];
var_2.getVar(enumValues2);
if(enumValues[0] != 1)
throw NcException(
"Error in test 27.2",__FILE__,__LINE__);
if(enumValues[1] != 1)
throw NcException(
"Error in test 27.3",__FILE__,__LINE__);
if(enumValues[2] != 1)
throw NcException(
"Error in test 27.4",__FILE__,__LINE__);
if(enumValues[3] != 1)
throw NcException(
"Error in test 27.5",__FILE__,__LINE__);
if(enumValues[4] != 1)
throw NcException(
"Error in test 27.6",__FILE__,__LINE__);
if(enumValues[5] != 1)
throw NcException(
"Error in test 27.7",__FILE__,__LINE__);
if(enumValues[6] != 1)
throw NcException(
"Error in test 27.8",__FILE__,__LINE__);
if(enumValues[7] != 1)
throw NcException(
"Error in test 27.9",__FILE__,__LINE__);
if(enumValues[8] != -20)
throw NcException(
"Error in test 27.10",__FILE__,__LINE__);
if(enumValues[9] != 7)
throw NcException(
"Error in test 27.11",__FILE__,__LINE__);
}
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing COMPOUND ncFile::putVar() and NcFile::getVar()";
{
vector<int> vecSize(2); vecSize[0]=6,vecSize[1]=3;
NcCompoundType compoundType3(ncFile.addCompoundType(
"compoundType_3",
sizeof(struct3)));
compoundType3.
addMember(
"member1",ncInt,offsetof(struct3,mem1));
compoundType3.addMember("member2",ncDouble,offsetof(struct3,mem2));
vector<int> mem3Shape(1);mem3Shape[0]=3;
compoundType3.addMember("member3",ncShort,offsetof(struct3,mem3),mem3Shape);
NcDim dim3 = ncFile.addDim(
"dim3",2);
NcVar var_3 = ncFile.addVar(
"var_3", compoundType3,dim3);
struct3 dummyStruct;
dummyStruct.mem1=1;
dummyStruct.mem2=-1.23456;
dummyStruct.mem3[0]=1;
dummyStruct.mem3[1]=-6;
dummyStruct.mem3[2]=20;
struct3 dummyFill ;
dummyFill.mem1=94;
dummyFill.mem2=95;
dummyFill.mem3[0]=96;
dummyFill.mem3[1]=97;
dummyFill.mem3[2]=98;
struct3 dummyStruct2[2];
dummyStruct2[0].mem1=1;
dummyStruct2[0].mem2=-1.23456;
dummyStruct2[0].mem3[0]=1;
dummyStruct2[0].mem3[1]=-6;
dummyStruct2[0].mem3[2]=20;
vector<size_t> index(1);index[0]=1;
var_3.
putVar(index,&dummyStruct);
NcVar var_4(ncFile.getVar(
"var_3"));
if(var_4.isNull())
throw NcException(
"Error in test 28.1",__FILE__,__LINE__);
struct3 dummyStruct3[2];
var_4.getVar(dummyStruct3);
if(dummyStruct3[1].mem1 != 1)
throw NcException(
"Error in test 28.2",__FILE__,__LINE__);
if(dummyStruct3[1].mem2 != -1.23456)
throw NcException(
"Error in test 28.3",__FILE__,__LINE__);
if(dummyStruct3[1].mem3[0] != 1)
throw NcException(
"Error in test 28.4",__FILE__,__LINE__);
if(dummyStruct3[1].mem3[1] != -6)
throw NcException(
"Error in test 28.5",__FILE__,__LINE__);
if(dummyStruct3[1].mem3[2] != 20)
throw NcException(
"Error in test 28.6",__FILE__,__LINE__);
if(dummyStruct3[0].mem1 != 94)
throw NcException(
"Error in test 28.7",__FILE__,__LINE__);
if(dummyStruct3[0].mem2 != 95)
throw NcException(
"Error in test 28.8",__FILE__,__LINE__);
if(dummyStruct3[0].mem3[0] != 96)
throw NcException(
"Error in test 28.9",__FILE__,__LINE__);
if(dummyStruct3[0].mem3[1] != 97)
throw NcException(
"Error in test 28.10",__FILE__,__LINE__);
if(dummyStruct3[0].mem3[2] != 98)
throw NcException(
"Error in test 28.11",__FILE__,__LINE__);
}
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing VLEN ncFile::putVar() and NcFile::getVar()";
{
NcVlenType vlenType3(ncFile.addVlenType(
"vlenType_3",ncShort));
NcDim dim3(ncFile.getDim(
"dim3"));
NcVar var_7 = ncFile.addVar(
"var_7", vlenType3,dim3);
nc_vlen_t dummyData[2];
short int* vlenPointer;
vlenPointer = (short int*) malloc(3*sizeof(short int));
vlenPointer[0] = 1;
vlenPointer[1] = 31;
vlenPointer[2] = -20;
dummyData[0].p = vlenPointer;
dummyData[0].len = 3;
vlenPointer = (short int*) malloc(2*sizeof(short int));
vlenPointer[0] = 73;
vlenPointer[1] = 64;
dummyData[1].p = vlenPointer;
dummyData[1].len = 2;
nc_free_vlen(&dummyData[0]);
nc_free_vlen(&dummyData[1]);
NcVar var_8(ncFile.getVar(
"var_7"));
if(var_8.isNull())
throw NcException(
"Error in test 29.1",__FILE__,__LINE__);
nc_vlen_t dummyData2[2];
var_8.getVar(dummyData2);
if(dummyData2[0].len != 3)
throw NcException(
"Error in test 29.2",__FILE__,__LINE__);
if(((
short int *)dummyData2[0].p)[0] != 1)
throw NcException(
"Error in test 29.3",__FILE__,__LINE__);
if(((
short int *)dummyData2[0].p)[1] != 31)
throw NcException(
"Error in test 29.4",__FILE__,__LINE__);
if(((
short int *)dummyData2[0].p)[2] != -20)
throw NcException(
"Error in test 29.5",__FILE__,__LINE__);
if(dummyData2[1].len != 2)
throw NcException(
"Error in test 29.6",__FILE__,__LINE__);
if(((
short int *)dummyData2[1].p)[0] != 73)
throw NcException(
"Error in test 29.7",__FILE__,__LINE__);
if(((
short int *)dummyData2[1].p)[1] != 64)
throw NcException(
"Error in test 29.8",__FILE__,__LINE__);
nc_free_vlen(&dummyData2[0]);
nc_free_vlen(&dummyData2[1]);
}
cout <<" ----------- passed\n";
cout <<left<<setw(57)<<"Testing COMPOUND with VLEN ncFile::putVar() and NcFile::getVar()";
{
struct struct10{
nc_vlen_t mem1[2];
double mem2;
};
NcVlenType vlenType13(ncFile.addVlenType(
"vlenType_13",ncShort));
NcDim dim12 = ncFile.addDim(
"dim12",2);
NcCompoundType compoundType4(ncFile.addCompoundType(
"compoundType_4",
sizeof(struct10)));
vector<int> mem1Shape(1);mem1Shape[0]=2;
compoundType4.addMember("member1",vlenType13,offsetof(struct10,mem1),mem1Shape);
compoundType4.addMember("member2",ncDouble,offsetof(struct10,mem2));
NcDim dim13 = ncFile.addDim(
"dim13",2);
NcVar var_13 = ncFile.addVar(
"var_13", compoundType4,dim13);
struct10 dummyData2;
short int* vlenPointer;
vlenPointer = (short int*) malloc(3*sizeof(short int));
vlenPointer[0] = 1;
vlenPointer[1] = 31;
vlenPointer[2] = -20;
dummyData2.mem1[0];
dummyData2.mem1[0].p = vlenPointer;
dummyData2.mem1[0].len=3;
vlenPointer = (short int*) malloc(2*sizeof(short int));
vlenPointer[0] = 73;
vlenPointer[1] = 64;
dummyData2.mem1[1].p=vlenPointer;
dummyData2.mem1[1].len=2;
dummyData2.mem2=20.1234;
vector<size_t> index(1);index[0]=1;
var_13.
putVar(index,&dummyData2);
nc_free_vlen(&dummyData2.mem1[0]);
nc_free_vlen(&dummyData2.mem1[1]);
}
cout <<" ----------- passed\n";
}
{
cout << "unknown error"<<endl;
}
}