#include <iostream>
#include <ostream>
template < int Size>
struct CrapParam
{
bool is_relevant( )
{
return Size% 2 == 0 ;
}
unsigned calc_size( )
{
return Size;
}
void drop( )
{
std:: cout << "Dropped item with size=" << calc_size( ) << std:: endl ;
}
} ;
struct Dropper
{
template < class Item>
void operator& ( Item & item)
{
std:: cout << "\t " ;
item.drop ( ) ;
}
} ;
struct Updater
{
unsigned size;
Updater( ) : size( 0 ) { }
template < class Item>
void operator& ( Item & item)
{
std:: cout << "\t " ;
if ( item.is_relevant ( ) )
{
std:: cout << "Relevant item" ;
size+ = item.calc_size ( ) ;
}
else
{
std:: cout << "Irrelevant item" ;
}
std:: cout << " with size=" << item.calc_size ( ) << std:: endl ;
}
} ;
struct ParamAggregator
{
unsigned counter;
ParamAggregator( ) : counter( 0 ) { }
CrapParam< 1 > p1;
CrapParam< 2 > someShit2;
CrapParam< 5 > superCrap3;
CrapParam< 4 > crappyShit4;
template < class Archive>
void serialize( Archive & ar)
{
ar & p1;
ar & someShit2;
ar & superCrap3;
ar & crappyShit4;
}
int update( )
{
++ counter;
std:: cout << "Updating, counter=" << counter << std:: endl ;
Updater updater;
serialize( updater) ;
std:: cout << "Updated, size=" << updater.size << std:: endl << std:: endl ;
return updater.size ;
}
void drop( )
{
std:: cout << "Dropping items" << std:: endl ;
Dropper d;
serialize( d) ;
std:: cout << "Items are droped" << std:: endl << std:: endl ;
}
} ;
int main( int argc,char * argv[ ] )
{
ParamAggregator pa;
pa.update ( ) ;
pa.drop ( ) ;
pa.update ( ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8b3N0cmVhbT4KCnRlbXBsYXRlPGludCBTaXplPgpzdHJ1Y3QgQ3JhcFBhcmFtCnsKCWJvb2wgaXNfcmVsZXZhbnQoKQoJewoJCXJldHVybiBTaXplJTIgPT0gMDsKCX0KCXVuc2lnbmVkIGNhbGNfc2l6ZSgpCgl7CgkJcmV0dXJuIFNpemU7Cgl9Cgl2b2lkIGRyb3AoKQoJewoJCXN0ZDo6Y291dCA8PCAiRHJvcHBlZCBpdGVtIHdpdGggc2l6ZT0iPDwgY2FsY19zaXplKCkgPDwgc3RkOjplbmRsOwoJfQp9OwoKc3RydWN0IERyb3BwZXIKewoJdGVtcGxhdGU8Y2xhc3MgSXRlbT4KCXZvaWQgb3BlcmF0b3ImKEl0ZW0gJml0ZW0pCgl7CgkJc3RkOjpjb3V0IDw8ICJcdCI7CgkJaXRlbS5kcm9wKCk7Cgl9Cn07CgpzdHJ1Y3QgVXBkYXRlcgp7Cgl1bnNpZ25lZCBzaXplOwoJVXBkYXRlcigpOiBzaXplKDApIHt9Cgl0ZW1wbGF0ZTxjbGFzcyBJdGVtPgoJdm9pZCBvcGVyYXRvciYoSXRlbSAmaXRlbSkKCXsKCQlzdGQ6OmNvdXQgPDwgIlx0IjsKCQlpZihpdGVtLmlzX3JlbGV2YW50KCkpCgkJewoJCQlzdGQ6OmNvdXQgPDwgIlJlbGV2YW50IGl0ZW0iOwoJCQlzaXplKz1pdGVtLmNhbGNfc2l6ZSgpOwoJCX0KCQllbHNlCgkJewoJCQlzdGQ6OmNvdXQgPDwgIklycmVsZXZhbnQgaXRlbSI7CgkJfQoJCXN0ZDo6Y291dCA8PCAiIHdpdGggc2l6ZT0iIDw8IGl0ZW0uY2FsY19zaXplKCkgPDwgc3RkOjplbmRsOwoJfQp9OwoKc3RydWN0IFBhcmFtQWdncmVnYXRvcgp7Cgl1bnNpZ25lZCBjb3VudGVyOwoJUGFyYW1BZ2dyZWdhdG9yKCk6IGNvdW50ZXIoMCkge30KCglDcmFwUGFyYW08MT4gcDE7CglDcmFwUGFyYW08Mj4gc29tZVNoaXQyOwoJQ3JhcFBhcmFtPDU+IHN1cGVyQ3JhcDM7CglDcmFwUGFyYW08ND4gY3JhcHB5U2hpdDQ7CgoJdGVtcGxhdGU8Y2xhc3MgQXJjaGl2ZT4KCXZvaWQgc2VyaWFsaXplKEFyY2hpdmUgJiBhcikKCXsKCQlhciAmIHAxOwoJCWFyICYgc29tZVNoaXQyOwoJCWFyICYgc3VwZXJDcmFwMzsKCQlhciAmIGNyYXBweVNoaXQ0OwoJfQoKCWludCB1cGRhdGUoKQoJewoJCSsrY291bnRlcjsKCQlzdGQ6OmNvdXQgPDwgIlVwZGF0aW5nLCBjb3VudGVyPSIgPDwgY291bnRlciA8PCBzdGQ6OmVuZGw7CgkJVXBkYXRlciB1cGRhdGVyOwoJCXNlcmlhbGl6ZSh1cGRhdGVyKTsKCQlzdGQ6OmNvdXQgPDwgIlVwZGF0ZWQsIHNpemU9IiA8PCB1cGRhdGVyLnNpemUgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gdXBkYXRlci5zaXplOwoJfQoKCXZvaWQgZHJvcCgpCgl7CgkJc3RkOjpjb3V0IDw8ICJEcm9wcGluZyBpdGVtcyIgPDwgc3RkOjplbmRsOwoJCURyb3BwZXIgZDsKCQlzZXJpYWxpemUoZCk7CgkJc3RkOjpjb3V0IDw8ICJJdGVtcyBhcmUgZHJvcGVkIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOwoJfQp9OwoKCgppbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCnsKCVBhcmFtQWdncmVnYXRvciBwYTsKCXBhLnVwZGF0ZSgpOwoJcGEuZHJvcCgpOwoJcGEudXBkYXRlKCk7CglyZXR1cm4gMDsKfQo=