|
|
|
@ -5,6 +5,8 @@
|
|
|
|
|
#include "mregex.h" |
|
|
|
|
#include "traits.h" |
|
|
|
|
#include "uvdata.h" |
|
|
|
|
#include <array> |
|
|
|
|
#include <utility> |
|
|
|
|
|
|
|
|
|
using michlib::MDateTime; |
|
|
|
|
|
|
|
|
@ -21,6 +23,41 @@ using michlib::MDateTime;
|
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
struct TimeData |
|
|
|
|
{ |
|
|
|
|
static constexpr auto stepunits = std::to_array<uint>({3600 * 24, 3600, 60, 1}); |
|
|
|
|
static constexpr std::array<const std::string, stepunits.size()> stepnames{"days", "hours", "minutes", "seconds"}; |
|
|
|
|
|
|
|
|
|
MDateTime refdate; |
|
|
|
|
size_t unitind; |
|
|
|
|
std::vector<michlib::int4> steps; |
|
|
|
|
|
|
|
|
|
template<class D> TimeData(const D& data, const TIndex& tindexes): refdate(), unitind(stepunits.size()), steps(tindexes.size()) |
|
|
|
|
{ |
|
|
|
|
if(steps.size() == 0) return; |
|
|
|
|
refdate = data.Time(tindexes[0]); |
|
|
|
|
unitind = 0; |
|
|
|
|
|
|
|
|
|
for(size_t i = 0; i < steps.size(); i++) |
|
|
|
|
{ |
|
|
|
|
auto delta = data.Time(tindexes[i]) - refdate; |
|
|
|
|
while(delta % stepunits[unitind] != 0) unitind++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for(size_t i = 0; i < steps.size(); i++) |
|
|
|
|
{ |
|
|
|
|
auto delta = data.Time(tindexes[i]) - refdate; |
|
|
|
|
steps[i] = michlib::int_cast<decltype(steps)::value_type>(delta / stepunits[unitind]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MString UnitName() const |
|
|
|
|
{ |
|
|
|
|
MString out = stepnames[unitind].c_str(); |
|
|
|
|
return out + " since " + refdate.ToString(); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template<class D> size_t GetTIndex(const D& data, const MDateTime& t) |
|
|
|
|
{ |
|
|
|
|
size_t nt = data.NTimes(); |
|
|
|
@ -98,14 +135,10 @@ template<class D> std::pair<TIndex, MString> GetTIndexes(const D& data, const CL
|
|
|
|
|
return {tindexes, ""}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<class D> std::vector<ReadType<D>> Read(const D& data, const std::vector<MString>& vnames, const BaseParameters* p, const TIndex& tindex) |
|
|
|
|
template<class D> std::vector<ReadType<D>> Read(const D& data, const std::vector<MString>& vnames, const BaseParameters* p, size_t ind) |
|
|
|
|
{ |
|
|
|
|
using RT = ReadType<D>; |
|
|
|
|
size_t ind; |
|
|
|
|
std::vector<RT> out; |
|
|
|
|
if(tindex.size() == 1) |
|
|
|
|
{ |
|
|
|
|
ind = tindex[0]; |
|
|
|
|
michlib::message("Time: " + data.Time(ind).ToTString()); |
|
|
|
|
std::map<MString, RT> cache; |
|
|
|
|
for(const auto& vname: vnames) |
|
|
|
@ -118,7 +151,17 @@ template<class D> std::vector<ReadType<D>> Read(const D& data, const std::vector
|
|
|
|
|
if(!res) return out; |
|
|
|
|
} |
|
|
|
|
for(size_t i = 0; i < vnames.size(); i++) out.emplace_back(std::move(cache[vnames[i]])); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return out; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<class D> std::vector<ReadType<D>> Read(const D& data, const std::vector<MString>& vnames, const BaseParameters* p, const TIndex& tindex) |
|
|
|
|
{ |
|
|
|
|
using RT = ReadType<D>; |
|
|
|
|
size_t ind; |
|
|
|
|
std::vector<RT> out; |
|
|
|
|
if(tindex.size() == 1) |
|
|
|
|
return Read(data, vnames, p, tindex[0]); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
std::vector<Averager<RT>> aver(vnames.size()); |
|
|
|
|