#pragma once #include "nczarrcommon.h" #include #include class NCSimpleTypes: public NcZarrTypes { protected: template class ReadedData { using Vec = std::vector; private: std::unique_ptr data; public: ReadedData() = default; ReadedData(std::unique_ptr&& d): data(std::move(d)) {} VType operator()(size_t lini) const { return data[lini]; } }; }; class NCSimpleFunctions: public NCSimpleTypes { int ncid; RetVal> ReadAtts(int vid) const; protected: NCSimpleFunctions(): ncid(0) {} template RetVal> Read(const MString& var, const size_t* start, const size_t* count) const { static const MString pref = "NCSimpleFunctions::Read"; size_t ind = FindInd(var, vars); const size_t N = vars[ind].NDim(); std::unique_ptr cdata; size_t dsize = 1; for(size_t i = 0; i < N; i++) dsize *= count[i]; cdata.reset(new VType[dsize]); int vid; int res = nc_inq_varid(ncid, var.Buf(), &vid); if(res != NC_NOERR) return Error(pref, MString("nc_inq_varid error: ") + nc_strerror(res)); if constexpr(std::is_same_v) res = nc_get_vara_float(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_double(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_int(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_long(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_longlong(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_short(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_schar(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_uint(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_ulonglong(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_ushort(ncid, vid, start, count, cdata.get()); else if constexpr(std::is_same_v) res = nc_get_vara_ubyte(ncid, vid, start, count, cdata.get()); else return Error(pref, "Unsupported variable type"); if(res != NC_NOERR) return Error(pref, MString("nc_get_vara error: ") + nc_strerror(res)); return ReadedData(std::move(cdata)); } public: ~NCSimpleFunctions() { nc_close(ncid); } Error Open(const MString& filename); }; using NCSimple = NcZarrRead;