//#include "stdafx.h"
#include <iostream>
#include <stack>
#include <queue>
#include <typeinfo>
#include <string.h>
using namespace std;
template <class T, class S, class C> S& Container(priority_queue<T, S, C>& pq)
{
struct hpQueue : private priority_queue<T, S, C> {static S& Container(priority_queue<T, S, C>& pq){return pq.*&hpQueue::c;}};
return hpQueue::Container(pq);
}
template <class T, class S> S& Container(stack<T, S>& s)
{
struct hStack : private stack<T, S>{static S& Container(stack<T, S>& s){return s.*&hStack::c;}};
return hStack::Container(s);
}
template <class T, class S> S& Container(queue<T, S>& q)
{
struct hQueue : private queue<T, S> {static S& Container(queue<T, S>& q){return q.*&hQueue::c;}};
return hQueue::Container(q);
}
template<class ContainerAdapter>
void print_sqp(ContainerAdapter& cad)
{
bool isStack = (strstr(typeid(cad).name(), "class std::stack") != NULL);
while (!cad.empty())
{
auto container = Container(cad);
auto value = isStack ? container.back() : container.front();
cout << value << " ";
cad.pop();
}
cout << endl;
}
int main()
{
std::stack<int> foo;
std::queue<int> bar;
std::priority_queue<int> baz;
for(int n : {1,8,5,6,3,4,0,9,7,2})
{
foo.push(n);
bar.push(n);
baz.push(n);
}
print_sqp(foo);
print_sqp(bar);
print_sqp(baz);
return 0;
}
Ly8jaW5jbHVkZSAic3RkYWZ4LmgiCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTLCBjbGFzcyBDPiBTJiBDb250YWluZXIocHJpb3JpdHlfcXVldWU8VCwgUywgQz4mIHBxKSAKewoJc3RydWN0IGhwUXVldWUgOiBwcml2YXRlIHByaW9yaXR5X3F1ZXVlPFQsIFMsIEM+IHtzdGF0aWMgUyYgQ29udGFpbmVyKHByaW9yaXR5X3F1ZXVlPFQsIFMsIEM+JiBwcSl7cmV0dXJuIHBxLiomaHBRdWV1ZTo6Yzt9fTsKCXJldHVybiBocFF1ZXVlOjpDb250YWluZXIocHEpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgUz4gUyYgQ29udGFpbmVyKHN0YWNrPFQsIFM+JiBzKQp7CglzdHJ1Y3QgaFN0YWNrIDogcHJpdmF0ZSBzdGFjazxULCBTPntzdGF0aWMgUyYgQ29udGFpbmVyKHN0YWNrPFQsIFM+JiBzKXtyZXR1cm4gcy4qJmhTdGFjazo6Yzt9fTsKCXJldHVybiBoU3RhY2s6OkNvbnRhaW5lcihzKTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFM+IFMmIENvbnRhaW5lcihxdWV1ZTxULCBTPiYgcSkKewoJc3RydWN0IGhRdWV1ZSA6IHByaXZhdGUgcXVldWU8VCwgUz4ge3N0YXRpYyBTJiBDb250YWluZXIocXVldWU8VCwgUz4mIHEpe3JldHVybiBxLiomaFF1ZXVlOjpjO319OwoJcmV0dXJuIGhRdWV1ZTo6Q29udGFpbmVyKHEpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBDb250YWluZXJBZGFwdGVyPgp2b2lkIHByaW50X3NxcChDb250YWluZXJBZGFwdGVyJiBjYWQpCnsKCWJvb2wgaXNTdGFjayA9IChzdHJzdHIodHlwZWlkKGNhZCkubmFtZSgpLCAiY2xhc3Mgc3RkOjpzdGFjayIpICE9IE5VTEwpOwoJd2hpbGUgKCFjYWQuZW1wdHkoKSkKCXsKCQlhdXRvIGNvbnRhaW5lciA9IENvbnRhaW5lcihjYWQpOwoJCWF1dG8gdmFsdWUgPSBpc1N0YWNrID8gY29udGFpbmVyLmJhY2soKSA6IGNvbnRhaW5lci5mcm9udCgpOwoJCWNvdXQgPDwgdmFsdWUgPDwgIiAiOwoJCWNhZC5wb3AoKTsKICAgIH0KCWNvdXQgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7CglzdGQ6OnN0YWNrPGludD4gZm9vOwoJc3RkOjpxdWV1ZTxpbnQ+IGJhcjsKCXN0ZDo6cHJpb3JpdHlfcXVldWU8aW50PiBiYXo7CgkKCWZvcihpbnQgbiA6IHsxLDgsNSw2LDMsNCwwLDksNywyfSkKCXsKICAgICAgICBmb28ucHVzaChuKTsKICAgICAgICBiYXIucHVzaChuKTsKICAgICAgICBiYXoucHVzaChuKTsKCX0gICAKCXByaW50X3NxcChmb28pOwoJcHJpbnRfc3FwKGJhcik7CglwcmludF9zcXAoYmF6KTsKCglyZXR1cm4gMDsKfQo=