Test of netCDF C++ API: read attributes into vectors.
#include <iostream>
using std::cout;
using std::endl;
#include "netcdf4"
using namespace netcdf;
#include <memory>
char const *
const ncFileName =
"Test_AttVectors.nc";
namespace {
struct AttData
{
static short const size = 3;
static char charData[size];
static int intData[size];
static float floatData[size];
static char const * const strData[size];
};
char AttData::charData[size] = { 'A', 'B', 'C' };
int AttData::intData[size] = { 11, 22, 33 };
float AttData::floatData[size] = { 3.14159, 0.31831, 9.8696 };
char const * const AttData::strData[size] = { "Do", "whah", "ditty" };
struct AttVectors
{
static short const size = 12;
};
struct AttNames
{
typedef char const * const CStr;
static short const size = 12;
static CStr
uBytes, bytes, chars, shorts, ushorts, ints, uints,
floats, doubles, int64s, uint64s, strings;
};
AttNames::CStr
AttNames::uBytes = "NcUbyte",
AttNames::bytes = "NcByte",
AttNames::chars = "NcChar",
AttNames::shorts = "NcShort",
AttNames::ushorts = "NcUshort",
AttNames::ints = "NcInt",
AttNames::uints = "NcUint",
AttNames::floats = "NcFloat",
AttNames::doubles = "NcDouble",
AttNames::int64s = "NcInt64",
AttNames::uint64s = "NcUint64",
AttNames::strings = "NcString";
}
{
std::auto_ptr<NcFile> pNcFile (
pNcFile->ToDataMode();
return pNcFile;
}
{
attVec.push_back( ncFile.
PutAtt ( AttNames::uBytes,
ncUbyte, AttData::size, AttData::charData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::bytes,
ncByte, AttData::size, AttData::charData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::chars,
ncChar, AttData::size, AttData::charData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::shorts,
ncShort, AttData::size, AttData::intData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::ushorts,
ncUshort, AttData::size, AttData::intData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::ints,
ncInt, AttData::size, AttData::intData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::uints,
ncUint, AttData::size, AttData::intData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::floats,
ncFloat, AttData::size, AttData::floatData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::doubles,
ncDouble, AttData::size, AttData::floatData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::int64s,
ncInt64, AttData::size, AttData::intData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::uint64s,
ncUint64, AttData::size, AttData::intData ) );
attVec.push_back( ncFile.
PutAtt ( AttNames::strings,
ncString, AttData::size, AttData::strData ) );
}
void ReadAttributes (
NcFile & ncFile, std::vector<NcGroupAtt>
const & attVec, AttVectors & vecData )
{
attVec[0].Get ( vecData.uBytes );
attVec[1].Get ( vecData.bytes );
attVec[2].Get ( vecData.chars );
attVec[3].Get ( vecData.shorts );
attVec[4].Get ( vecData.ushorts );
attVec[5].Get ( vecData.ints );
attVec[6].Get ( vecData.uints );
attVec[7].Get ( vecData.floats );
attVec[8].Get ( vecData.doubles );
attVec[9].Get ( vecData.int64s );
attVec[10].Get ( vecData.uint64s );
attVec[11].Get ( vecData.strings );
}
template
<
class TLHS,
class TRHS
>
inline bool AllEqual ( TLHS
const & lhs, TRHS
const & rhs )
{
return std::equal( lhs, lhs + rhs.size(), rhs.begin() );
}
{
std::string const yes = "passed";
std::string const no = "failed";
cout << "Comparing input values to original values: " << endl;
cout << AttNames::uBytes <<
":\t" << (
AllEqual( AttData::charData, vecData.uBytes ) ? yes : no ) << endl;
cout << AttNames::bytes <<
":\t" << (
AllEqual( AttData::charData, vecData.bytes ) ? yes : no ) << endl;
cout << AttNames::chars <<
":\t" << (
AllEqual( AttData::charData, vecData.chars ) ? yes : no ) << endl;
cout << AttNames::shorts <<
":\t" << (
AllEqual( AttData::intData, vecData.shorts ) ? yes : no ) << endl;
cout << AttNames::ushorts <<
":\t" << (
AllEqual( AttData::intData, vecData.ushorts ) ? yes : no ) << endl;
cout << AttNames::ints <<
":\t" << (
AllEqual( AttData::intData, vecData.ints ) ? yes : no ) << endl;
cout << AttNames::uints <<
":\t" << (
AllEqual( AttData::intData, vecData.uints ) ? yes : no ) << endl;
cout << AttNames::floats <<
":\t" << (
AllEqual( AttData::floatData, vecData.floats ) ? yes : no ) << endl;
cout << AttNames::doubles <<
":\t" << (
AllEqual( AttData::floatData, vecData.doubles ) ? yes : no ) << endl;
cout << AttNames::int64s <<
":\t" << (
AllEqual( AttData::intData, vecData.int64s ) ? yes : no ) << endl;
cout << AttNames::uint64s <<
":\t" << (
AllEqual( AttData::intData, vecData.uint64s ) ? yes : no ) << endl;
cout << AttNames::strings <<
":\t" << (
AllEqual( AttData::strData, vecData.strings ) ? yes : no ) << endl;
}
{
cout << "Test of netCDF C++ API: read attributes into vectors" << endl;
try
{
cout << "Add attributes to file..." << endl;
std::vector<NcGroupAtt> attVec;
cout << "Read attributes from file..." << endl;
AttVectors vecData;
}
catch (std::exception const & e)
{
cout << "Exception: " << e.what() << endl;
}
catch (...)
{
cout << "Error: unknown error." << endl;
}
cout << "\n all done!" << endl;
return 0;
}