Files

76 lines
2.4 KiB
C++
Raw Permalink Normal View History

2026-07-12 14:34:52 +04:00
#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