You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

70 lines
1.5 KiB

#include "BFileW.h"
#include "NEMO.h"
#include "tindexes.h"
#if !defined(M__ODM)
#define M__ODM
using michlib::BFileW;
using michlib::errmessage;
using michlib::GPL;
using michlib::message;
using michlib::SList;
using DataVariants = std::variant<NEMOData>;
using CLArgs = std::map<MString, MString>;
class Data: public DataVariants
{
template<class D> static bool WriteData(BFileW& fw, const D& data)
{
for(size_t i = 0; i < data.N(); i++)
{
fw.Write(data.Lon(i));
fw.Write(data.Lat(i));
fw.Write(data(i) == data.Fillval() ? NAN : data(i));
}
return true;
}
public:
Data() = default;
Data(DataVariants&& d): DataVariants(std::move(d)) {}
auto Time(size_t it) const
{
return std::visit(
[it = it](const auto& arg) -> auto{ return arg.Time(it); }, *this);
}
auto NTimes() const
{
return std::visit(
[](const auto& arg) -> auto{ return arg.NTimes(); }, *this);
}
bool Write(BFileW& fw, VarType vt, const std::vector<size_t>& tindexes) const
{
return std::visit(
[&fw = fw, vt = vt, &ti = tindexes](const auto& d) -> bool
{
using T = std::decay_t<decltype(d)>;
return std::visit(
[&fw = fw, &ti = ti, &d = d](auto v) -> bool
{
constexpr auto cvt = decltype(v)::vt;
if constexpr(isDataSupported<T, cvt>)
return WriteData(fw, d.template Read<cvt>(ti));
else
return false;
},
vt);
},
*this);
}
};
CLArgs ParseArgs(int argc, char** argv);
#endif