Task #3118
Updated by Zhiyi Zhang about 10 years ago
This is a draft abstraction for schedule. It consists of two class. One is Schedule, another is Agenda(maybe there's a better name), which is the element in Schedule.
Here is the abstraction:
class Schedule
{
public:
///@brief Construct an empty schedule
Schedule();
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<TAG>& encoder) const;
Block
wireEncode();
void
wireDecode();
///@brief Add a new agenda, if there's a conflict, the agenda will use the union set of the agendas
Schedule&
addAgenda(Agenda);
///@brief Delete an agenda, if the agenda covers time that is not in existing agenda, this part time will be omitted
Schedule&
deleteAgenda(Agenda);
///@brief Change an existing agenda, replace the old one
Schedule&
replaceAgenda(Agenda, Agenda);
///@brief Get the agenda that cover the ts
Agenda
getAgenda(const TimePoint& ts);
private:
///@brief Check if two agenda is conflicted
bool
isConflict(Agenda, Agenda);
std::list<Agenda> m_agendaList;
Block m_wire;
};
class Agenda
{
public:
enum RepeatPattern{
NONE = 0,
EVERY_DAY = 1,
EVERY_WEEK = 2,
EVERY_MONTH = 3
}
public:
///@brief The construction, once the object is created, it becomes read-only
Agenda(TimePoint startTime,
TimePoint endTime);
Agenda(TimePoint startTime,
TimePoint endTime,
RepeatPattern pattern,
TimePoint repeatEndTime);
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<TAG>& encoder) const;
Block
wireEncode();
void
wireDecode();
///@brief Get the start time of the agenda
TimePoint
getStartTime();
///@brief Get the end time of the agenda
TimePoint
getEndTime();
///@brief Get the repeat pattern of the agenda
RepeatPattern
getRepeatPattern();
///@brief Check if the time point is in the agenda
bool
isInAgenda(TimePoint tp);
///@brief Check if two agendas are same
bool
equals(Agenda);
///@brief reload the operator ==
bool
operator==(const Agenda& agenda) const;
private:
TimePoint m_startTime;
TimePoint m_endTime;
RepeatPattern m_repeatPattern;
TimePoint m_repeatEndTime;
Block m_wire;
};