#include <iostream>
#include <vector>
#include <utility>
void A( ) {
std:: cout << "I'm an A" << std:: endl ;
}
void B( ) {
std:: cout << "I'm a B" << std:: endl ;
}
void C( ) {
std:: cout << "I'm a C" << std:: endl ;
}
class processor {
private :
std:: vector < void ( * ) ( ) > funcs;
std:: vector < std:: pair < int , int >> links;
public :
void add_func( void ( * func) ( ) ) { funcs.push_back ( func) ; }
void link( int from, int to) { links.push_back ( { from, to} ) ; }
void call( int indx) {
// Make the call
std:: cout << "generic preprocessing" << std:: endl ;
funcs.at ( indx) ( ) ;
std:: cout << "generic postprocessing" << std:: endl ;
// Call any links
for ( auto it : links) {
if ( it.first == indx) { call( it.second ) ; }
}
}
} ;
int main( ) {
processor p;
p.add_func ( A) ;
p.add_func ( B) ;
p.add_func ( C) ;
p.link ( 0 , 1 ) ; // A -> B
p.link ( 1 , 2 ) ; // B -> C
p.call ( 0 ) ; // Call A
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dXRpbGl0eT4KCnZvaWQgQSgpIHsKCXN0ZDo6Y291dCA8PCAiSSdtIGFuIEEiIDw8IHN0ZDo6ZW5kbDsKfQoKdm9pZCBCKCkgewoJc3RkOjpjb3V0IDw8ICJJJ20gYSBCIiA8PCBzdGQ6OmVuZGw7Cn0KCnZvaWQgQygpIHsKCXN0ZDo6Y291dCA8PCAiSSdtIGEgQyIgPDwgc3RkOjplbmRsOwp9CgpjbGFzcyBwcm9jZXNzb3Igewpwcml2YXRlOgoJc3RkOjp2ZWN0b3I8dm9pZCAoKikoKT4gZnVuY3M7CglzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCBpbnQ+PiBsaW5rczsKcHVibGljOgoJdm9pZCBhZGRfZnVuYyh2b2lkICgqZnVuYykoKSkgeyBmdW5jcy5wdXNoX2JhY2soZnVuYyk7IH0KCXZvaWQgbGluayhpbnQgZnJvbSwgaW50IHRvKSB7IGxpbmtzLnB1c2hfYmFjayh7ZnJvbSwgdG99KTsgfQoJdm9pZCBjYWxsKGludCBpbmR4KSB7CgkJLy8gTWFrZSB0aGUgY2FsbAoJCXN0ZDo6Y291dCA8PCAiZ2VuZXJpYyBwcmVwcm9jZXNzaW5nIiA8PCBzdGQ6OmVuZGw7CgkJZnVuY3MuYXQoaW5keCkoKTsKCQlzdGQ6OmNvdXQgPDwgImdlbmVyaWMgcG9zdHByb2Nlc3NpbmciIDw8IHN0ZDo6ZW5kbDsKCQkKCQkvLyBDYWxsIGFueSBsaW5rcwoJCWZvcihhdXRvIGl0IDogbGlua3MpIHsKCQkJaWYoaXQuZmlyc3QgPT0gaW5keCkgeyBjYWxsKGl0LnNlY29uZCk7IH0KCQl9Cgl9Cn07CgppbnQgbWFpbigpIHsKCXByb2Nlc3NvciBwOwoJcC5hZGRfZnVuYyhBKTsKCXAuYWRkX2Z1bmMoQik7CglwLmFkZF9mdW5jKEMpOwoJCglwLmxpbmsoMCwgMSk7IC8vIEEgLT4gQgoJcC5saW5rKDEsIDIpOyAvLyBCIC0+IEMKCQoJcC5jYWxsKDApOyAvLyBDYWxsIEEKCQoJcmV0dXJuIDA7Cn0=