1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef _COMMAND_QUEUE_H_
#define _COMMAND_QUEUE_H_
#include <deque>
#include "Command.h"
namespace springLegacyAI {
/// A wrapper class for std::deque<Command> to keep track of commands
class CCommandQueue {
friend class CAIAICallback; // the C++ AI interface wrapper
// see CommandAI.cpp for further creg stuff for this class
CR_DECLARE(CCommandQueue);
public:
enum QueueType {
CommandQueueType,
NewUnitQueueType,
BuildQueueType
};
inline QueueType GetType() const { return queueType; }
public:
/// limit to a float's integer range
static const int maxTagValue = (1 << 24); // 16777216
typedef std::deque<Command> basis;
typedef basis::size_type size_type;
typedef basis::iterator iterator;
typedef basis::const_iterator const_iterator;
typedef basis::reverse_iterator reverse_iterator;
typedef basis::const_reverse_iterator const_reverse_iterator;
inline bool empty() const { return queue.empty(); }
inline size_type size() const { return queue.size(); }
inline void push_back(const Command& cmd);
inline void push_front(const Command& cmd);
inline iterator insert(iterator pos, const Command& cmd);
inline void pop_back()
{
queue.pop_back();
}
inline void pop_front()
{
queue.pop_front();
}
inline iterator erase(iterator pos)
{
return queue.erase(pos);
}
inline iterator erase(iterator first, iterator last)
{
return queue.erase(first, last);
}
inline void clear()
{
queue.clear();
}
inline iterator end() { return queue.end(); }
inline const_iterator end() const { return queue.end(); }
inline iterator begin() { return queue.begin(); }
inline const_iterator begin() const { return queue.begin(); }
inline reverse_iterator rend() { return queue.rend(); }
inline const_reverse_iterator rend() const { return queue.rend(); }
inline reverse_iterator rbegin() { return queue.rbegin(); }
inline const_reverse_iterator rbegin() const { return queue.rbegin(); }
inline Command& back() { return queue.back(); }
inline const Command& back() const { return queue.back(); }
inline Command& front() { return queue.front(); }
inline const Command& front() const { return queue.front(); }
inline Command& at(size_type i) { return queue.at(i); }
inline const Command& at(size_type i) const { return queue.at(i); }
inline Command& operator[](size_type i) { return queue[i]; }
inline const Command& operator[](size_type i) const { return queue[i]; }
private:
CCommandQueue() : queueType(CommandQueueType), tagCounter(0) {};
CCommandQueue(const CCommandQueue&);
CCommandQueue& operator=(const CCommandQueue&);
private:
inline int GetNextTag();
inline void SetQueueType(QueueType type) { queueType = type; }
private:
std::deque<Command> queue;
QueueType queueType;
int tagCounter;
};
} // namespace springLegacyAI
inline int springLegacyAI::CCommandQueue::GetNextTag()
{
tagCounter++;
if (tagCounter >= maxTagValue) {
tagCounter = 1;
}
return tagCounter;
}
inline void springLegacyAI::CCommandQueue::push_back(const Command& cmd)
{
queue.push_back(cmd);
queue.back().tag = GetNextTag();
}
inline void springLegacyAI::CCommandQueue::push_front(const Command& cmd)
{
queue.push_front(cmd);
queue.front().tag = GetNextTag();
}
inline springLegacyAI::CCommandQueue::iterator springLegacyAI::CCommandQueue::insert(
iterator pos, const Command& cmd)
{
Command tmpCmd = cmd;
tmpCmd.tag = GetNextTag();
return queue.insert(pos, tmpCmd);
}
#endif // _COMMAND_QUEUE_H_
|