76 lines
2.4 KiB
C++
76 lines
2.4 KiB
C++
#ifndef DAY_MANAGER_H
|
|
#define DAY_MANAGER_H
|
|
|
|
#include <QTime>
|
|
|
|
class DayManager {
|
|
public:
|
|
enum class SlotSelectionMode { Maximal, Minimal, Quick, Random };
|
|
enum class StartTimeMode { Left, Random, Right };
|
|
|
|
private:
|
|
QMap<QTime, QTime> availableSlots_;
|
|
SlotSelectionMode slotSelectionMode_;
|
|
StartTimeMode startTimeMode_;
|
|
qint64 minDurationMs_;
|
|
qsizetype createdRecords_;
|
|
|
|
public:
|
|
inline DayManager();
|
|
explicit DayManager(const QTime &begin, const QTime &end);
|
|
|
|
QPair<QTime, QTime> 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 <typename... Times>
|
|
bool isAvailable(const QTime &first, const Times &...others) const;
|
|
|
|
QList<std::reference_wrapper<const QTime>>
|
|
availableSlots(qint64 requiredMs) const;
|
|
|
|
QPair<QTime, QTime> reserveAvailableSlot(QTime key, qint64 requiredMs);
|
|
QPair<QTime, QTime> reserveAvailableSlotLeft(QTime key, qint64 requiredMs);
|
|
QPair<QTime, QTime> reserveAvailableSlotRandom(QTime key, qint64 requiredMs);
|
|
QPair<QTime, QTime> reserveAvailableSlotRight(QTime key, qint64 requiredMs);
|
|
QPair<QTime, QTime> reserveImpl(qint64 requiredMs);
|
|
QPair<QTime, QTime> reserveImplMaximal(qint64 requiredMs);
|
|
QPair<QTime, QTime> reserveImplMinimal(qint64 requiredMs);
|
|
QPair<QTime, QTime> reserveImplQuick(qint64 requiredMs);
|
|
QPair<QTime, QTime> 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
|