#pragma once #include "mdatetime.h" #include #include using michlib::MDateTime; template std::vector GetTIndexes(const T& adapter, const MDateTime& b, const MDateTime& e) { std::vector out; auto nt = adapter.NTimes(); const MDateTime& beg = (b < e) ? b : e; const MDateTime& end = (b > e) ? b : e; if(beg > adapter.Time(nt - 1) || end < adapter.Time(0)) return out; size_t ib = 0, ie = nt - 1; for(size_t i = 0; i < nt; i++) if(adapter.Time(i) >= beg) { ib = i; break; } for(size_t i = nt; i != 0; i--) if(adapter.Time(i - 1) <= end) { ie = i - 1; break; } out.resize(ie - ib + 1); for(size_t i = 0; i < ie - ib + 1; i++) out[i] = i + ib; return out; } template std::vector GetTIndexes(const T& adapter, const MString& regex) { std::vector out; std::unique_ptr regbuf(new regex_t); if(0 != regcomp(regbuf.get(), regex.Buf(), REG_EXTENDED | REG_NOSUB)) return out; for(size_t i = 0; i < adapter.NTimes(); i++) { MString date = adapter.Time(i).ToString(); if(0 != regexec(regbuf.get(), date.Buf(), 0, 0, 0)) continue; out.push_back(i); } return out; } template size_t GetTIndex(const T& adapter, const MDateTime& t) { size_t nt = adapter.NTimes(); if(t <= adapter.Time(0)) return 0; if(t >= adapter.Time(nt - 1)) return nt - 1; for(size_t i = 0; i < nt - 1; i++) if(t >= adapter.Time(i) && t <= adapter.Time(i + 1)) return (t - adapter.Time(i) <= adapter.Time(i + 1) - t) ? i : (i + 1); return 0; }