#ifndef DAY_MANAGER_H #define DAY_MANAGER_H #include class DayManager { public: enum class SlotSelectionMode { Maximal, Minimal, Quick, Random }; enum class StartTimeMode { Left, Random, Right }; private: QMap availableSlots_; SlotSelectionMode slotSelectionMode_; StartTimeMode startTimeMode_; qint64 minDurationMs_; qsizetype createdRecords_; public: inline DayManager(); explicit DayManager(const QTime &begin, const QTime &end); QPair reserve(const QTime &duration); QTime duration() const; QTime duration(const QTime &begin) const; inline QTime minDuration() const noexcept; inline qsizetype createdRecords() const noexcept; inline qsizetype slotCount() const; inline void setMode(SlotSelectionMode mode); inline void setMode(StartTimeMode mode); void addAvailableSlot(const QTime &begin, const QTime &end); void setMinDuration(const QTime &duration); qsizetype calculatePossibleReservations(qint64 requiredMs) const; private: template bool isAvailable(const QTime &first, const Times &...others) const; QList> availableSlots(qint64 requiredMs) const; QPair reserveAvailableSlot(QTime key, qint64 requiredMs); QPair reserveAvailableSlotLeft(QTime key, qint64 requiredMs); QPair reserveAvailableSlotRandom(QTime key, qint64 requiredMs); QPair reserveAvailableSlotRight(QTime key, qint64 requiredMs); QPair reserveImpl(qint64 requiredMs); QPair reserveImplMaximal(qint64 requiredMs); QPair reserveImplMinimal(qint64 requiredMs); QPair reserveImplQuick(qint64 requiredMs); QPair reserveImplRandom(qint64 requiredMs); private: friend class DayManagerTest; }; DayManager::DayManager() : slotSelectionMode_(SlotSelectionMode::Minimal), startTimeMode_(StartTimeMode::Left), minDurationMs_(1), createdRecords_(0) {} void DayManager::setMode(SlotSelectionMode mode) { slotSelectionMode_ = mode; } void DayManager::setMode(StartTimeMode mode) { startTimeMode_ = mode; } inline QTime DayManager::minDuration() const noexcept { return QTime::fromMSecsSinceStartOfDay(minDurationMs_); } qsizetype DayManager::createdRecords() const noexcept { return createdRecords_; } qsizetype DayManager::slotCount() const { return availableSlots_.size(); } #endif // DAY_MANAGER_H