Task #3118
Updated by Zhiyi Zhang over 8 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; };