#include <cassert>
#include <cstddef>
#include <utility>
template <typename K, typename V>
struct key_value_pair {
using key_type = K;
using value_type = V;
key_value_pair() = default;
key_value_pair(const key_value_pair& other) = default;
key_value_pair(key_value_pair&& other) noexcept = default;
key_value_pair(const key_type& key, const value_type& value)
: key_(key),
value_(value)
{}
key_value_pair(key_type&& key, value_type&& value) noexcept
: key_(std::move(key)),
value_(std::move(value))
{}
key_value_pair& operator =(key_value_pair&& other) noexcept = default;
key_value_pair& operator =(const key_value_pair& other)
{
return *this = key_value_pair(other);
}
private:
key_type key_;
value_type value_;
};
template <typename K, typename V, std::size_t N = 5>
class key_value_pair_stack {
public:
using element_type = key_value_pair<K, V>;
public:
key_value_pair_stack() : data_(), i_(0)
{
}
void push(const element_type& obj)
{
this->push(element_type(obj));
}
void push(element_type&& obj)
{
assert(i_ < N);
data_[i_++] = std::move(obj);
}
void push(
const typename element_type::key_type& key,
const typename element_type::value_type& value)
{
this->push(value_type(key, value));
}
void push(
typename element_type::key_type&& key,
typename element_type::value_type&& value)
{
this->push(element_type(std::move(key), std::move(value)));
}
element_type pop()
{
assert(i_ > 0);
return data_[--i_];
}
constexpr std::size_t max_size() const
{
return N;
}
std::size_t size() const
{
return i_;
}
void clear()
{
i_ = 0;
}
private:
element_type data_[N];
std::size_t i_;
};
int main() {
key_value_pair_stack<int, double> s;
s.push(5, 10.);
s.push(4, 10.);
const auto t0 = s.pop(); //(4, 10.)
const auto t1 = s.pop(); //(5, 10.)
return 0;
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxjc3RkZGVmPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgpzdHJ1Y3Qga2V5X3ZhbHVlX3BhaXIgewogICAgdXNpbmcga2V5X3R5cGUgPSBLOwogICAgdXNpbmcgdmFsdWVfdHlwZSA9IFY7CgogICAga2V5X3ZhbHVlX3BhaXIoKSA9IGRlZmF1bHQ7CiAgICBrZXlfdmFsdWVfcGFpcihjb25zdCBrZXlfdmFsdWVfcGFpciYgb3RoZXIpID0gZGVmYXVsdDsKICAgIGtleV92YWx1ZV9wYWlyKGtleV92YWx1ZV9wYWlyJiYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKICAgIGtleV92YWx1ZV9wYWlyKGNvbnN0IGtleV90eXBlJiBrZXksIGNvbnN0IHZhbHVlX3R5cGUmIHZhbHVlKQogICAgICAgIDoga2V5XyhrZXkpLAogICAgICAgIHZhbHVlXyh2YWx1ZSkKICAgIHt9CiAgICBrZXlfdmFsdWVfcGFpcihrZXlfdHlwZSYmIGtleSwgdmFsdWVfdHlwZSYmIHZhbHVlKSBub2V4Y2VwdAogICAgICAgIDoga2V5XyhzdGQ6Om1vdmUoa2V5KSksCiAgICAgICAgdmFsdWVfKHN0ZDo6bW92ZSh2YWx1ZSkpIAogICAge30KICAgIGtleV92YWx1ZV9wYWlyJiBvcGVyYXRvciA9KGtleV92YWx1ZV9wYWlyJiYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKICAgIGtleV92YWx1ZV9wYWlyJiBvcGVyYXRvciA9KGNvbnN0IGtleV92YWx1ZV9wYWlyJiBvdGhlcikKICAgIHsKICAgICAgICByZXR1cm4gKnRoaXMgPSBrZXlfdmFsdWVfcGFpcihvdGhlcik7CiAgICB9Cgpwcml2YXRlOgogICAga2V5X3R5cGUga2V5XzsKICAgIHZhbHVlX3R5cGUgdmFsdWVfOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHN0ZDo6c2l6ZV90IE4gPSA1PgpjbGFzcyBrZXlfdmFsdWVfcGFpcl9zdGFjayB7CnB1YmxpYzoKICAgIHVzaW5nIGVsZW1lbnRfdHlwZSA9IGtleV92YWx1ZV9wYWlyPEssIFY+OwoKcHVibGljOgogICAga2V5X3ZhbHVlX3BhaXJfc3RhY2soKSA6IGRhdGFfKCksIGlfKDApCiAgICB7CiAgICB9CgogICAgdm9pZCBwdXNoKGNvbnN0IGVsZW1lbnRfdHlwZSYgb2JqKQogICAgewogICAgICAgIHRoaXMtPnB1c2goZWxlbWVudF90eXBlKG9iaikpOwogICAgfQoKICAgIHZvaWQgcHVzaChlbGVtZW50X3R5cGUmJiBvYmopCiAgICB7CiAgICAgICAgYXNzZXJ0KGlfIDwgTik7CiAgICAgICAgZGF0YV9baV8rK10gPSBzdGQ6Om1vdmUob2JqKTsKICAgIH0KCiAgICB2b2lkIHB1c2goCiAgICAgICAgY29uc3QgdHlwZW5hbWUgZWxlbWVudF90eXBlOjprZXlfdHlwZSYga2V5LAogICAgICAgIGNvbnN0IHR5cGVuYW1lIGVsZW1lbnRfdHlwZTo6dmFsdWVfdHlwZSYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+cHVzaCh2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKICAgIH0KCiAgICB2b2lkIHB1c2goCiAgICAgICAgdHlwZW5hbWUgZWxlbWVudF90eXBlOjprZXlfdHlwZSYmIGtleSwKICAgICAgICB0eXBlbmFtZSBlbGVtZW50X3R5cGU6OnZhbHVlX3R5cGUmJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5wdXNoKGVsZW1lbnRfdHlwZShzdGQ6Om1vdmUoa2V5KSwgc3RkOjptb3ZlKHZhbHVlKSkpOwogICAgfQoKICAgIGVsZW1lbnRfdHlwZSBwb3AoKQogICAgewogICAgICAgIGFzc2VydChpXyA+IDApOwogICAgICAgIHJldHVybiBkYXRhX1stLWlfXTsKICAgIH0KCiAgICBjb25zdGV4cHIgc3RkOjpzaXplX3QgbWF4X3NpemUoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBOOwogICAgfQoKICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBpXzsKICAgIH0KICAgIAogICAgdm9pZCBjbGVhcigpCiAgICB7CiAgICAgICAgaV8gPSAwOwogICAgfQoKcHJpdmF0ZToKICAgIGVsZW1lbnRfdHlwZSBkYXRhX1tOXTsKICAgIHN0ZDo6c2l6ZV90IGlfOwp9OwoKaW50IG1haW4oKSB7CiAgICBrZXlfdmFsdWVfcGFpcl9zdGFjazxpbnQsIGRvdWJsZT4gczsKICAgIHMucHVzaCg1LCAxMC4pOwogICAgcy5wdXNoKDQsIDEwLik7CiAgICBjb25zdCBhdXRvIHQwID0gcy5wb3AoKTsgLy8oNCwgMTAuKQogICAgY29uc3QgYXV0byB0MSA9IHMucG9wKCk7IC8vKDUsIDEwLikKCiAgICByZXR1cm4gMDsKfQ==