#pragma once #include "Common.h" #include "MetaType.h" class IDABot; struct BuildOrderItem { MetaType type; // the thing we want to 'build' int priority; // the priority at which to place it in the queue bool blocking; // whether or not we block further items BuildOrderItem(const MetaType & t, int p, bool b); bool operator<(const BuildOrderItem & x) const; }; class BuildOrderQueue { IDABot & m_bot; std::deque<BuildOrderItem> m_queue; int m_lowestPriority; int m_highestPriority; int m_defaultPrioritySpacing; int m_numSkippedItems; public: BuildOrderQueue(IDABot & bot); void clearAll(); // clears the entire build order queue void skipItem(); // increments skippedItems void queueAsHighestPriority(const MetaType & type, bool blocking); // queues something at the highest priority void queueAsLowestPriority(const MetaType & type, bool blocking); // queues something at the lowest priority void queueItem(const BuildOrderItem & b); // queues something with a given priority void removeHighestPriorityItem(); // removes the highest priority item void removeCurrentHighestPriorityItem(); size_t size(); // returns the size of the queue bool isEmpty(); BuildOrderItem & getHighestPriorityItem(); // returns the highest priority item BuildOrderItem & getNextHighestPriorityItem(); // returns the highest priority item bool canSkipItem(); std::string getQueueInformation() const; // overload the bracket operator for ease of use BuildOrderItem operator [] (int i); };