#include <iostream>
#include <map>
#include <string>
#include <algorithm>
template < class Key, class T, class Compare = std:: less < Key> ,
class Allocator = std:: allocator < std:: pair < const Key,T> > >
class mymap: public std:: map < Key, T, Compare, Allocator>
{
public :
typedef std:: map < Key, T, Compare, Allocator> base;
explicit mymap( const Compare& comp = Compare( ) , const Allocator& alloc = Allocator( ) ) : base( comp, alloc) , cache_valid_( false ) { }
template < class InputIterator>
mymap( InputIterator first, InputIterator last,
const Compare & comp = Compare( ) , const Allocator & alloc = Allocator( ) ) : base( first, last, comp, alloc) , cache_valid_( false ) { }
mymap( const mymap< Key,T,Compare,Allocator> & x) : base( x) , cache_valid_( false ) { }
mymap & operator = ( mymap const & m) { base:: operator = ( m) ; cache_valid_( false ) ; return * this ; }
~mymap( ) {
std:: cout << "Hello, lamer007, i'm non virtual destructor of custom map!" << std:: endl ;
}
T & operator[ ] ( Key const & key)
{
if ( cache_valid_ && cached_- > first == key) {
std:: cout << "cached value for [" << key << "]" << std:: endl ;
return cached_- > second;
}
std:: cout << "real value for [" << key << "]" << std:: endl ;
cached_ = base:: insert ( std:: make_pair ( key, T( ) ) ) .first ;
cache_valid_ = true ;
return cached_- > second;
}
void reset_cache( ) { cache_valid_ = false ; }
private :
typename base:: iterator cached_;
bool cache_valid_;
} ;
int main( )
{
{
mymap< std:: string , std:: string > mm;
mm[ "hello" ] = "world" ;
if ( mm[ "hello" ] == "World" || mm[ "hello" ] == "WORLD"
|| mm[ "world" ] == "hello" || mm[ "hello" ] == "w0rld"
|| mm[ "hello" ] == "world" )
std:: cout << "ok" << std:: endl ;
else
std:: cout << "failed" << std:: endl ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZSA9IHN0ZDo6bGVzczxLZXk+LAogICAgICAgICAgIGNsYXNzIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBLZXksVD4gPiA+CmNsYXNzIG15bWFwOiBwdWJsaWMgc3RkOjptYXA8S2V5LCBULCBDb21wYXJlLCBBbGxvY2F0b3I+CnsKcHVibGljOgogICAgICAgIHR5cGVkZWYgc3RkOjptYXA8S2V5LCBULCBDb21wYXJlLCBBbGxvY2F0b3I+ICAgIGJhc2U7CgogICAgICAgIGV4cGxpY2l0IG15bWFwKGNvbnN0IENvbXBhcmUmIGNvbXAgPSBDb21wYXJlKCksIGNvbnN0IEFsbG9jYXRvciYgYWxsb2MgPSBBbGxvY2F0b3IoKSk6IGJhc2UoY29tcCwgYWxsb2MpLCBjYWNoZV92YWxpZF8oZmFsc2UpIHt9CgogICAgICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgogICAgICAgIG15bWFwKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKICAgICAgICAgICAgICAgIGNvbnN0IENvbXBhcmUgJiBjb21wID0gQ29tcGFyZSgpLCBjb25zdCBBbGxvY2F0b3IgJiBhbGxvYyA9IEFsbG9jYXRvcigpKTogYmFzZShmaXJzdCwgbGFzdCwgY29tcCwgYWxsb2MpLCBjYWNoZV92YWxpZF8oZmFsc2UpIHt9CgogICAgICAgIG15bWFwKGNvbnN0IG15bWFwPEtleSxULENvbXBhcmUsQWxsb2NhdG9yPiAmIHgpOiBiYXNlKHgpLCBjYWNoZV92YWxpZF8oZmFsc2UpIHt9CgogICAgICAgIG15bWFwICYgb3BlcmF0b3IgPSAobXltYXAgY29uc3QgJiBtKSB7IGJhc2U6Om9wZXJhdG9yID0gKG0pOyBjYWNoZV92YWxpZF8oZmFsc2UpOyByZXR1cm4gKnRoaXM7IH0KCiAgICAgICAgfm15bWFwKCkgewogICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJIZWxsbywgbGFtZXIwMDcsIGknbSBub24gdmlydHVhbCBkZXN0cnVjdG9yIG9mIGN1c3RvbSBtYXAhIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQoKICAgICAgICBUICYgb3BlcmF0b3JbXSAoS2V5IGNvbnN0ICYga2V5KQogICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZV92YWxpZF8gJiYgY2FjaGVkXy0+Zmlyc3QgPT0ga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiY2FjaGVkIHZhbHVlIGZvciBbIiA8PCBrZXkgPDwgIl0iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZF8tPnNlY29uZDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgInJlYWwgdmFsdWUgZm9yIFsiIDw8IGtleSA8PCAiXSIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICAgY2FjaGVkXyA9IGJhc2U6Omluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIFQoKSkpLmZpcnN0OwogICAgICAgICAgICAgICAgY2FjaGVfdmFsaWRfID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRfLT5zZWNvbmQ7CiAgICAgICAgfQoKICAgICAgICB2b2lkIHJlc2V0X2NhY2hlKCkgeyBjYWNoZV92YWxpZF8gPSBmYWxzZTsgfQoKcHJpdmF0ZToKICAgICAgICB0eXBlbmFtZSBiYXNlOjppdGVyYXRvciBjYWNoZWRfOwogICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGNhY2hlX3ZhbGlkXzsKfTsKCgppbnQgbWFpbigpCnsKICAgICAgICB7CiAgICAgICAgICAgICAgICBteW1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1tOwogICAgICAgICAgICAgICAgbW1bImhlbGxvIl0gPSAid29ybGQiOwoKICAgICAgICAgICAgICAgIGlmIChtbVsiaGVsbG8iXSA9PSAiV29ybGQiIHx8IG1tWyJoZWxsbyJdID09ICJXT1JMRCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtbVsid29ybGQiXSA9PSAiaGVsbG8iIHx8IG1tWyJoZWxsbyJdID09ICJ3MHJsZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtbVsiaGVsbG8iXSA9PSAid29ybGQiKQogICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIm9rIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiZmFpbGVkIiA8PCBzdGQ6OmVuZGw7CgogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDA7Cn0=