This is a little class representing an interval (range of time). It might be usefull for you...
Happy new year!
Code: Select all
#pragma once
#include "wx/wx.h"
class wxInterval : public wxObject
{
public:
wxInterval(wxDateTime s, wxDateTime e) : m_dtStart(s), m_dtEnd(e) { }
wxInterval() { }
wxInterval(const wxInterval& iv) : m_dtStart(iv.GetStart()), m_dtEnd(iv.GetEnd()) { m_lType=iv.m_lType; }
virtual ~wxInterval() { }
bool IsNull() const { return !(GetStart() < GetEnd()); }
bool Contains(wxDateTime date) const
{
return date.IsBetween(GetStart(),GetEnd());
}
bool Contains(const wxInterval& i) const
{
return (GetStart() <= i.GetStart()) && (i.GetEnd() <= GetEnd());
}
bool Overlap(const wxInterval& i)
{
// Sets the interval to the overlapping interval.
if (GetEnd() <= i.GetStart() || GetStart() >= i.GetEnd())
{
// Intervals do not overlap.
m_dtStart = GetStart()-wxTimeSpan::Day();
return false;
}
if (GetStart() < i.GetStart())
m_dtStart = i.GetStart();
if (GetEnd() > i.GetEnd())
m_dtEnd = i.GetEnd();
return true;
}
bool Overlaps(const wxInterval& i) const
{
return (GetStart() <= GetEnd() && i.GetStart() <= i.GetEnd() &&
((GetStart() <= i.GetStart() && i.GetStart() <= GetEnd()) ||
(i.GetStart() <= GetStart() && GetStart() <= i.GetEnd())));
}
bool Prepend(const wxInterval& i)
{
if (((i.GetEnd() + wxTimeSpan::Day()) == GetStart()) && (i.GetStart() < GetStart()))
{
m_dtStart = i.GetStart();
return true;
}
return false;
}
bool Append(const wxInterval& i)
{
if (((GetEnd() + wxTimeSpan::Day()) == i.GetStart()) && ((GetEnd() + wxTimeSpan::Day()) <= i.GetEnd()))
{
m_dtEnd = i.GetEnd();
return true;
}
return false;
}
int Compare(const wxInterval& i) const
{
if (GetEnd() < i.GetStart())
return -1; // interval is below i
else if (i.GetEnd() < GetStart())
return 1; // interval above below i
else
return 0; // interval overlap
}
bool operator==(const wxInterval& i) const
{
return GetStart() == i.GetStart() && GetEnd() == i.GetEnd();
}
bool operator!=(const wxInterval& i) const
{
return GetStart() != i.GetStart() || GetEnd() != i.GetEnd();
}
inline wxDateTime GetStart() const { return m_dtStart; }
void SetStart(wxDateTime s) { m_dtStart = s; }
inline wxDateTime GetEnd() const { return m_dtEnd; }
void SetEnd(wxDateTime e) { m_dtEnd = e; }
wxTimeSpan GetDuration() const { return GetEnd() - GetStart(); }
const wxInterval& FirstDay()
{
m_dtStart.SetDay(1);
m_dtEnd = GetStart()+wxTimeSpan::Day();
return *this;
}
const wxInterval& FirstWeek()
{
m_dtStart.SetToPrevWeekDay(wxDateTime::WeekDay::Mon); //, weekStartsMonday);
m_dtEnd = m_dtStart.GetLastWeekDay(wxDateTime::WeekDay::Mon);
return *this;
}
const wxInterval& FirstMonth()
{
m_dtStart.SetDay(1);
m_dtEnd = m_dtStart.GetLastMonthDay();
return *this;
}
const wxInterval& FirstQuarter()
{
m_dtStart.SetMonth(((wxDateTime::Month)((GetStart().GetMonth()/3)*3)));
m_dtStart.SetDay(1);
m_dtEnd = m_dtStart;
m_dtEnd.SetMonth(((wxDateTime::Month)(GetStart().GetMonth()+3)));
m_dtEnd.SetToLastMonthDay();
return *this;
}
const wxInterval& FirstYear()
{
m_dtStart.SetDay(1);
m_dtStart.SetMonth(wxDateTime::Month::Jan);
m_dtEnd = m_dtStart;
m_dtEnd.SetMonth(wxDateTime::Month::Dec);
m_dtEnd.SetToLastMonthDay();
return *this;
}
protected:
/// The start of the time interval.
wxDateTime m_dtStart;
/// The end of the time interval. This value is part of the interval.
wxDateTime m_dtEnd;
};
Dirk