#include <vector>
#include <iostream>
#include <type_traits>
template<class ITERATORT,class ADAPTER>class IteratorAdapter : public ITERATORT {
ADAPTER adapter_;
public: IteratorAdapter(ITERATORT underlying,ADAPTER adapter) :
ITERATORT(underlying),
adapter_(adapter)
{ }
public: auto operator*(){
return adapter_(ITERATORT::operator*());
}
};
template<class COLLECTION,class ADAPTER>class CollectAdapter{
using CollectAdapterT=CollectAdapter<COLLECTION,ADAPTER>;
COLLECTION* collection_; //<------ #1 problem?
ADAPTER adapter_;
public: CollectAdapter(COLLECTION& collection,ADAPTER adapter){
collection_=&collection;
adapter_=adapter;
}
public: auto begin(){
return IteratorAdapter<
decltype(std::declval<COLLECTION>().begin()),
decltype(adapter_)>
(collection_->begin(),adapter_);
}
public: auto end(){
return IteratorAdapter<
decltype(std::declval<COLLECTION>().end()),
decltype(adapter_)>
(collection_->end(),adapter_);
}
};
class CollectAdapterWidget{
public: template<class COLLECTION,class ADAPTER> static CollectAdapter<COLLECTION,ADAPTER> createAdapter(COLLECTION& collection,ADAPTER adapter){
return CollectAdapter<COLLECTION,ADAPTER>(collection,adapter);
}
};
int func1(int i){
return i+10;
}
int func2(int i){
return i+100;
}
template<class T> auto utilityAdapter(const T& t){
auto adapter1=CollectAdapterWidget::createAdapter(t,func1);
auto adapter12=CollectAdapterWidget::createAdapter(adapter1,func2);
return adapter12;
}
int main(){
std::vector<int> test;
test.push_back(5);
std::cout<<"start"<<std::endl;
//for(auto b:CollectAdapterWidget::createAdapter(test,func1)){
for(auto b:utilityAdapter(test)
){
std::cout<< b<<std::endl;
}
std::cout<<"end"<<std::endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTxjbGFzcyBJVEVSQVRPUlQsY2xhc3MgQURBUFRFUj5jbGFzcyBJdGVyYXRvckFkYXB0ZXIgOiBwdWJsaWMgSVRFUkFUT1JUIHsKICAgIEFEQVBURVIgYWRhcHRlcl87CiAgICBwdWJsaWM6IEl0ZXJhdG9yQWRhcHRlcihJVEVSQVRPUlQgdW5kZXJseWluZyxBREFQVEVSIGFkYXB0ZXIpIDoKICAgICAgICBJVEVSQVRPUlQodW5kZXJseWluZyksCiAgICAgICAgYWRhcHRlcl8oYWRhcHRlcikKICAgIHsgICB9CiAgICBwdWJsaWM6IGF1dG8gb3BlcmF0b3IqKCl7CiAgICAgICAgcmV0dXJuIGFkYXB0ZXJfKElURVJBVE9SVDo6b3BlcmF0b3IqKCkpOwogICAgfQp9Owp0ZW1wbGF0ZTxjbGFzcyBDT0xMRUNUSU9OLGNsYXNzIEFEQVBURVI+Y2xhc3MgQ29sbGVjdEFkYXB0ZXJ7CiAgICB1c2luZyBDb2xsZWN0QWRhcHRlclQ9Q29sbGVjdEFkYXB0ZXI8Q09MTEVDVElPTixBREFQVEVSPjsKICAgIENPTExFQ1RJT04qIGNvbGxlY3Rpb25fOyAgICAvLzwtLS0tLS0gIzEgIHByb2JsZW0/CiAgICBBREFQVEVSIGFkYXB0ZXJfOwogICAgcHVibGljOiBDb2xsZWN0QWRhcHRlcihDT0xMRUNUSU9OJiBjb2xsZWN0aW9uLEFEQVBURVIgYWRhcHRlcil7CiAgICAgICAgY29sbGVjdGlvbl89JmNvbGxlY3Rpb247CiAgICAgICAgYWRhcHRlcl89YWRhcHRlcjsKICAgIH0KICAgIHB1YmxpYzogYXV0byBiZWdpbigpewogICAgICAgIHJldHVybiBJdGVyYXRvckFkYXB0ZXI8CiAgICAgICAgICAgIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxDT0xMRUNUSU9OPigpLmJlZ2luKCkpLAogICAgICAgICAgICBkZWNsdHlwZShhZGFwdGVyXyk+CiAgICAgICAgICAgIChjb2xsZWN0aW9uXy0+YmVnaW4oKSxhZGFwdGVyXyk7CiAgICB9CiAgICBwdWJsaWM6IGF1dG8gZW5kKCl7CiAgICAgICAgcmV0dXJuIEl0ZXJhdG9yQWRhcHRlcjwKICAgICAgICAgICAgZGVjbHR5cGUoc3RkOjpkZWNsdmFsPENPTExFQ1RJT04+KCkuZW5kKCkpLAogICAgICAgICAgICBkZWNsdHlwZShhZGFwdGVyXyk+CiAgICAgICAgICAgIChjb2xsZWN0aW9uXy0+ZW5kKCksYWRhcHRlcl8pOwogICAgfQp9OwpjbGFzcyBDb2xsZWN0QWRhcHRlcldpZGdldHsKICAgIHB1YmxpYzogdGVtcGxhdGU8Y2xhc3MgQ09MTEVDVElPTixjbGFzcyBBREFQVEVSPiBzdGF0aWMgQ29sbGVjdEFkYXB0ZXI8Q09MTEVDVElPTixBREFQVEVSPiBjcmVhdGVBZGFwdGVyKENPTExFQ1RJT04mIGNvbGxlY3Rpb24sQURBUFRFUiBhZGFwdGVyKXsKICAgICAgICByZXR1cm4gQ29sbGVjdEFkYXB0ZXI8Q09MTEVDVElPTixBREFQVEVSPihjb2xsZWN0aW9uLGFkYXB0ZXIpOwogICAgfQp9OwoKCmludCBmdW5jMShpbnQgaSl7CiAgICByZXR1cm4gaSsxMDsKfQppbnQgZnVuYzIoaW50IGkpewogICAgcmV0dXJuIGkrMTAwOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGF1dG8gdXRpbGl0eUFkYXB0ZXIoY29uc3QgVCYgdCl7CglhdXRvIGFkYXB0ZXIxPUNvbGxlY3RBZGFwdGVyV2lkZ2V0OjpjcmVhdGVBZGFwdGVyKHQsZnVuYzEpOwoJYXV0byBhZGFwdGVyMTI9Q29sbGVjdEFkYXB0ZXJXaWRnZXQ6OmNyZWF0ZUFkYXB0ZXIoYWRhcHRlcjEsZnVuYzIpOwoJcmV0dXJuIGFkYXB0ZXIxMjsKfQppbnQgbWFpbigpewogICAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0OwogICAgdGVzdC5wdXNoX2JhY2soNSk7CiAgICBzdGQ6OmNvdXQ8PCJzdGFydCI8PHN0ZDo6ZW5kbDsKICAgIC8vZm9yKGF1dG8gYjpDb2xsZWN0QWRhcHRlcldpZGdldDo6Y3JlYXRlQWRhcHRlcih0ZXN0LGZ1bmMxKSl7CiAgICAKICAgIGZvcihhdXRvIGI6dXRpbGl0eUFkYXB0ZXIodGVzdCkKICAgICl7CiAgICAKICAgICAgICBzdGQ6OmNvdXQ8PCBiPDxzdGQ6OmVuZGw7CiAgICB9CiAgICBzdGQ6OmNvdXQ8PCJlbmQiPDxzdGQ6OmVuZGw7Cn0=