#include <array>
#include <iostream>
#include <queue>
template <typename T, size_t N = 2>
class CyclicArray {
public:
typedef typename std::array<T, N>::value_type value_type;
typedef typename std::array<T, N>::reference reference;
typedef typename std::array<T, N>::const_reference const_reference;
typedef typename std::array<T, N>::size_type size_type;
~CyclicArray() {
while (size())
pop_front();
}
void push_back(const T& v) {
if (size_ + 1 > N)
throw;
new (&array_[(front_ + size_) % N]) T(v);
++size_;
}
void pop_front() {
if (size_ < 1)
throw;
front().~T();
++front_;
--size_;
if (front_ >= N)
front_ = 0;
}
const_reference front() const {
return *static_cast<const T*>(&array_[front_]);
}
reference front() {
return *reinterpret_cast<T*>(&array_[front_]);
}
size_type size() const {
return size_;
}
private:
size_type front_ = 0;
size_type size_ = 0;
std::array<char[sizeof(T)], N> array_;
};
int main() {
std::queue<int, CyclicArray<int, 2>> queue;
queue.push(1);
queue.push(2);
queue.pop();
queue.push(3);
int f = queue.front();
queue.pop();
std::cout << f << std::endl;
f = queue.front();
queue.pop();
std::cout << f << std::endl;
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxxdWV1ZT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTiA9IDI+CmNsYXNzIEN5Y2xpY0FycmF5IHsKIHB1YmxpYzoKICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6YXJyYXk8VCwgTj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6YXJyYXk8VCwgTj46OnJlZmVyZW5jZSByZWZlcmVuY2U7CiAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmFycmF5PFQsIE4+Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjphcnJheTxULCBOPjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKICAKICB+Q3ljbGljQXJyYXkoKSB7CiAgCXdoaWxlIChzaXplKCkpCiAgCSAgcG9wX2Zyb250KCk7CiAgfQoKICB2b2lkIHB1c2hfYmFjayhjb25zdCBUJiB2KSB7CiAgICBpZiAoc2l6ZV8gKyAxID4gTikKICAgICAgdGhyb3c7CiAgICBuZXcgKCZhcnJheV9bKGZyb250XyArIHNpemVfKSAlIE5dKSBUKHYpOwogICAgKytzaXplXzsKICB9CiAgCiAgdm9pZCBwb3BfZnJvbnQoKSB7CiAgCWlmIChzaXplXyA8IDEpCiAgCSAgdGhyb3c7CiAgCWZyb250KCkuflQoKTsKICAJKytmcm9udF87CiAgCS0tc2l6ZV87CiAgCWlmIChmcm9udF8gPj0gTikKICAJICBmcm9udF8gPSAwOwogIH0KICAKICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7CiAgCXJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KCZhcnJheV9bZnJvbnRfXSk7CiAgfQoKICByZWZlcmVuY2UgZnJvbnQoKSB7CiAgCXJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxUKj4oJmFycmF5X1tmcm9udF9dKTsKICB9CiAgCiAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CiAgICByZXR1cm4gc2l6ZV87CiAgfQogIAogcHJpdmF0ZToKICBzaXplX3R5cGUgZnJvbnRfID0gMDsKICBzaXplX3R5cGUgc2l6ZV8gPSAwOwogIHN0ZDo6YXJyYXk8Y2hhcltzaXplb2YoVCldLCBOPiBhcnJheV87Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6cXVldWU8aW50LCBDeWNsaWNBcnJheTxpbnQsIDI+PiBxdWV1ZTsKCXF1ZXVlLnB1c2goMSk7CglxdWV1ZS5wdXNoKDIpOwoJcXVldWUucG9wKCk7CglxdWV1ZS5wdXNoKDMpOwoJaW50IGYgPSBxdWV1ZS5mcm9udCgpOwoJcXVldWUucG9wKCk7CglzdGQ6OmNvdXQgPDwgZiA8PCBzdGQ6OmVuZGw7CglmID0gcXVldWUuZnJvbnQoKTsKCXF1ZXVlLnBvcCgpOwoJc3RkOjpjb3V0IDw8IGYgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=