#include <vector>
#include <algorithm>
using namespace std;
template < bool flag, class IsTrue, class IsFalse>
struct choose;
template < class IsTrue, class IsFalse>
struct choose< true , IsTrue, IsFalse> {
typedef IsTrue type;
} ;
template < class IsTrue, class IsFalse>
struct choose< false , IsTrue, IsFalse> {
typedef IsFalse type;
} ;
class DefaultOrder {
public :
bool operator( ) ( int i1,int i2) { return i1 < i2; }
} ;
template < typename K, typename V, typename Order= DefaultOrder>
struct multimap {
struct pair {
pair( K key, V value) : first( key) ,second( value) { }
K first;
V second;
bool operator< ( pair other) {
Order order;
return order( first,other.first ) ;
}
} ;
template < bool isconst = false >
struct Iterator {
typedef typename choose< isconst, const pair& , pair& > :: type
reference;
typedef typename choose< isconst, const pair* , pair* > :: type
pointer;
typedef typename vector< pair> :: iterator it;
struct ActualIterator {
it i;
vector< pair> & pairs;
ActualIterator( vector< pair> & pairs,it i) : pairs( pairs) ,i( i) { }
bool operator! = ( ActualIterator other) {
return i ! = other.i ;
}
pair& operator* ( ) {
auto & bla = * i;
return bla;
}
virtual ActualIterator& operator++ ( ) = 0 ;
} ;
struct OneKeyIterator : public ActualIterator {
K key;
OneKeyIterator( vector< pair> & pairs, K key) : ActualIterator( pairs,pairs.end ( ) ) ,key( key) {
auto end = pairs.end ( ) ;
for ( auto i_ = pairs.begin ( ) ; i_ ! = end; ++ i_)
if ( i_- > first == key) {
i = i_;
return ;
}
}
ActualIterator& operator++ ( ) {
++ i;
if ( i ! = pairs.end ( ) && i- > first ! = key)
i = pairs.end ( ) ;
return * this ;
}
} ;
struct WholeMapIterator : public ActualIterator {
WholeMapIterator( vector< pair> & pairs, it i) : ActualIterator( pairs,i) { }
ActualIterator& operator++ ( ) {
++ i;
return * this ;
}
} ;
ActualIterator* actualIterator;
Iterator( vector< pair> & pairs, it i) : actualIterator( new WholeMapIterator( pairs,i) ) {
}
Iterator( vector< pair> & pairs, K key) : actualIterator( new OneKeyIterator( pairs,key) ) {
}
Iterator( const Iterator< false > & i) : actualIterator( i.actualIterator ) { }
pointer operator- > ( ) {
return & ** actualIterator;
}
reference operator* ( ) {
return * actualIterator;
}
Iterator& operator++ ( ) {
++ ( * actualIterator) ;
return * this ;
}
bool operator! = ( const Iterator& other) const {
return * actualIterator ! = * other.actualIterator ;
}
bool operator== ( const Iterator& other) const {
return ! ( * this ! = other) ;
}
} ;
typedef Iterator< false > MutableIterator;
typedef Iterator< true > ConstIterator;
vector< pair> pairs;
void insert( K key, V value) {
pairs.push_back ( pair( key,value) ) ;
sort( pairs.begin ( ) , pairs.end ( ) ) ;
}
MutableIterator find( K key) {
//auto end = pairs.end();
//for(auto i = pairs.begin(); i != end; ++i)
//auto p = *i;
// if(i->first == key) {
return MutableIterator( pairs,key) ;
// }
}
MutableIterator begin( ) {
return MutableIterator( pairs,pairs.begin ( ) ) ;
}
MutableIterator end( ) {
return MutableIterator( pairs,pairs.end ( ) ) ;
}
} ;
int main( )
{
multimap< int ,int > mm;
}
I2luY2x1ZGUgPHZlY3Rvcj4gCiNpbmNsdWRlIDxhbGdvcml0aG0+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCnRlbXBsYXRlIDxib29sIGZsYWcsIGNsYXNzIElzVHJ1ZSwgY2xhc3MgSXNGYWxzZT4gCnN0cnVjdCBjaG9vc2U7IAoKdGVtcGxhdGUgPGNsYXNzIElzVHJ1ZSwgY2xhc3MgSXNGYWxzZT4gCnN0cnVjdCBjaG9vc2U8dHJ1ZSwgSXNUcnVlLCBJc0ZhbHNlPiB7IAogICB0eXBlZGVmIElzVHJ1ZSB0eXBlOyAKfTsgCgp0ZW1wbGF0ZSA8Y2xhc3MgSXNUcnVlLCBjbGFzcyBJc0ZhbHNlPiAKc3RydWN0IGNob29zZTxmYWxzZSwgSXNUcnVlLCBJc0ZhbHNlPiB7IAogICB0eXBlZGVmIElzRmFsc2UgdHlwZTsgCn07IAoKY2xhc3MgRGVmYXVsdE9yZGVyIHsgCnB1YmxpYzogCiAgICBib29sIG9wZXJhdG9yKCkoaW50IGkxLGludCBpMikge3JldHVybiBpMSA8IGkyO30gCn07IAoKdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUgT3JkZXI9RGVmYXVsdE9yZGVyPiAKc3RydWN0IG11bHRpbWFwIHsgCiAgICBzdHJ1Y3QgcGFpciB7IAogICAgICAgIHBhaXIoSyBrZXksIFYgdmFsdWUpOmZpcnN0KGtleSksc2Vjb25kKHZhbHVlKSB7fSAKICAgICAgICBLIGZpcnN0OyAKICAgICAgICBWIHNlY29uZDsgCiAgICAgICAgYm9vbCBvcGVyYXRvcjwocGFpciBvdGhlcikgeyAKICAgICAgICAgICAgT3JkZXIgb3JkZXI7IAogICAgICAgICAgICByZXR1cm4gb3JkZXIoZmlyc3Qsb3RoZXIuZmlyc3QpOyAKICAgICAgICB9IAogICAgfTsgCiAgICB0ZW1wbGF0ZTxib29sIGlzY29uc3QgPSBmYWxzZT4gCiAgICBzdHJ1Y3QgSXRlcmF0b3IgeyAKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNob29zZTxpc2NvbnN0LCBjb25zdCBwYWlyJiwgcGFpciY+Ojp0eXBlIAogICAgICAgICAgICByZWZlcmVuY2U7IAogICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hvb3NlPGlzY29uc3QsIGNvbnN0IHBhaXIqLCBwYWlyKj46OnR5cGUgCiAgICAgICAgICAgIHBvaW50ZXI7IAoKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZlY3RvcjxwYWlyPjo6aXRlcmF0b3IgaXQ7IAogICAgICAgIHN0cnVjdCBBY3R1YWxJdGVyYXRvciB7IAogICAgICAgICAgICBpdCBpOyAKICAgICAgICAgICAgdmVjdG9yPHBhaXI+JiBwYWlyczsgCiAgICAgICAgICAgIEFjdHVhbEl0ZXJhdG9yKHZlY3RvcjxwYWlyPiYgcGFpcnMsaXQgaSk6cGFpcnMocGFpcnMpLGkoaSkge30gCiAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShBY3R1YWxJdGVyYXRvciBvdGhlcikgeyAKICAgICAgICAgICAgICAgIHJldHVybiBpICE9IG90aGVyLmk7IAogICAgICAgICAgICB9IAogICAgICAgICAgICBwYWlyJiBvcGVyYXRvciooKSB7IAogICAgICAgICAgICAgICAgYXV0byYgYmxhID0gKmk7IAogICAgICAgICAgICAgICAgcmV0dXJuIGJsYTsgCiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIHZpcnR1YWwgQWN0dWFsSXRlcmF0b3ImIG9wZXJhdG9yKysoKSA9IDA7IAogICAgICAgIH07IAogICAgICAgIHN0cnVjdCBPbmVLZXlJdGVyYXRvciA6IHB1YmxpYyBBY3R1YWxJdGVyYXRvciB7IAogICAgICAgICAgICBLIGtleTsgCiAgICAgICAgICAgIE9uZUtleUl0ZXJhdG9yKHZlY3RvcjxwYWlyPiYgcGFpcnMsIEsga2V5KTpBY3R1YWxJdGVyYXRvcihwYWlycyxwYWlycy5lbmQoKSksa2V5KGtleSkgeyAKICAgICAgICAgICAgICAgIGF1dG8gZW5kID0gcGFpcnMuZW5kKCk7IAogICAgICAgICAgICAgICAgZm9yKGF1dG8gaV8gPSBwYWlycy5iZWdpbigpOyBpXyAhPSBlbmQ7ICsraV8pIAogICAgICAgICAgICAgICAgICAgIGlmKGlfLT5maXJzdCA9PSBrZXkpIHsgCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpXzsgCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgCiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfSAKICAgICAgICAgICAgQWN0dWFsSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IAogICAgICAgICAgICAgICAgKytpOyAKICAgICAgICAgICAgICAgIGlmKGkgIT0gcGFpcnMuZW5kKCkgJiYgaS0+Zmlyc3QgIT0ga2V5KSAKICAgICAgICAgICAgICAgICAgICBpID0gcGFpcnMuZW5kKCk7IAogICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOyAKICAgICAgICAgICAgfSAKICAgICAgICB9OyAKICAgICAgICBzdHJ1Y3QgV2hvbGVNYXBJdGVyYXRvciA6IHB1YmxpYyBBY3R1YWxJdGVyYXRvciB7IAogICAgICAgICAgICBXaG9sZU1hcEl0ZXJhdG9yKHZlY3RvcjxwYWlyPiYgcGFpcnMsIGl0IGkpOkFjdHVhbEl0ZXJhdG9yKHBhaXJzLGkpe30gCiAgICAgICAgICAgIEFjdHVhbEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAKICAgICAgICAgICAgICAgICsraTsgCiAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7IAogICAgICAgICAgICB9IAogICAgICAgIH07IAogICAgICAgIAogICAgICAgIEFjdHVhbEl0ZXJhdG9yKiBhY3R1YWxJdGVyYXRvcjsgCiAgICAgICAgCiAgICAgICAgSXRlcmF0b3IodmVjdG9yPHBhaXI+JiBwYWlycywgaXQgaSk6YWN0dWFsSXRlcmF0b3IobmV3IFdob2xlTWFwSXRlcmF0b3IocGFpcnMsaSkpIHsgCgogICAgICAgIH0gCiAgICAgICAgSXRlcmF0b3IodmVjdG9yPHBhaXI+JiBwYWlycywgSyBrZXkpOmFjdHVhbEl0ZXJhdG9yKG5ldyBPbmVLZXlJdGVyYXRvcihwYWlycyxrZXkpKSB7IAogICAgICAgIH0gCiAgICAgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3I8ZmFsc2U+JiBpKTphY3R1YWxJdGVyYXRvcihpLmFjdHVhbEl0ZXJhdG9yKXt9IAogICAgICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIHsgCiAgICAgICAgICAgIHJldHVybiAmKiphY3R1YWxJdGVyYXRvcjsgCiAgICAgICAgfSAKICAgICAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgeyAKICAgICAgICAgICAgICAgIHJldHVybiAqYWN0dWFsSXRlcmF0b3I7IAogICAgICAgIH0gCiAgICAgICAgSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IAogICAgICAgICAgICArKygqYWN0dWFsSXRlcmF0b3IpOyAKICAgICAgICAgICAgcmV0dXJuICp0aGlzOyAKICAgICAgICB9IAogICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsgCiAgICAgICAgICAgIHJldHVybiAqYWN0dWFsSXRlcmF0b3IgIT0gKm90aGVyLmFjdHVhbEl0ZXJhdG9yOyAKICAgICAgICB9IAogICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsgCiAgICAgICAgICAgIHJldHVybiAhKCp0aGlzICE9IG90aGVyKTsgCiAgICAgICAgfSAKICAgIH07IAoKICAgIHR5cGVkZWYgSXRlcmF0b3I8ZmFsc2U+IE11dGFibGVJdGVyYXRvcjsgCiAgICB0eXBlZGVmIEl0ZXJhdG9yPHRydWU+IENvbnN0SXRlcmF0b3I7IAoKICAgIHZlY3RvcjxwYWlyPiBwYWlyczsgCiAgICB2b2lkIGluc2VydChLIGtleSwgViB2YWx1ZSkgeyAKICAgICAgICBwYWlycy5wdXNoX2JhY2socGFpcihrZXksdmFsdWUpKTsgCiAgICAgICAgc29ydChwYWlycy5iZWdpbigpLCBwYWlycy5lbmQoKSk7IAogICAgfSAKICAgIE11dGFibGVJdGVyYXRvciBmaW5kKEsga2V5KSB7IAogICAgICAgIC8vYXV0byBlbmQgPSBwYWlycy5lbmQoKTsgCiAgICAgICAgLy9mb3IoYXV0byBpID0gcGFpcnMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgCiAgICAgICAgICAgIC8vYXV0byBwID0gKmk7IAogICAgICAgIC8vICAgIGlmKGktPmZpcnN0ID09IGtleSkgeyAKICAgICAgICAgICAgICAgIHJldHVybiBNdXRhYmxlSXRlcmF0b3IocGFpcnMsa2V5KTsgCiAgICAgICAgLy8gICAgfSAKICAgIH0gCiAgICBNdXRhYmxlSXRlcmF0b3IgYmVnaW4oKSB7IAogICAgICAgIHJldHVybiBNdXRhYmxlSXRlcmF0b3IocGFpcnMscGFpcnMuYmVnaW4oKSk7IAogICAgfSAKICAgIE11dGFibGVJdGVyYXRvciBlbmQoKSB7IAogICAgICAgIHJldHVybiBNdXRhYmxlSXRlcmF0b3IocGFpcnMscGFpcnMuZW5kKCkpOyAKICAgIH0gCn07CgppbnQgbWFpbigpCnsKICBtdWx0aW1hcDxpbnQsaW50PiBtbTsKfQo=
compilation info
prog.cpp:46:18: error: cannot declare parameter 'other' to be of abstract type 'multimap<K, V, Order>::Iterator<isconst>::ActualIterator'
prog.cpp:42:31: note: because the following virtual functions are pure within 'multimap<K, V, Order>::Iterator<isconst>::ActualIterator':
prog.cpp:53:37: note: virtual multimap<K, V, Order>::Iterator<isconst>::ActualIterator& multimap<K, V, Order>::Iterator<isconst>::ActualIterator::operator++()
prog.cpp: In constructor 'multimap<K, V, Order>::Iterator<isconst>::OneKeyIterator::OneKeyIterator(std::vector<multimap<K, V, Order>::pair>&, K)':
prog.cpp:61:25: error: 'i' was not declared in this scope
prog.cpp: In member function 'multimap<K, V, Order>::Iterator<isconst>::ActualIterator& multimap<K, V, Order>::Iterator<isconst>::OneKeyIterator::operator++()':
prog.cpp:66:19: error: 'i' was not declared in this scope
prog.cpp: In member function 'multimap<K, V, Order>::Iterator<isconst>::ActualIterator& multimap<K, V, Order>::Iterator<isconst>::WholeMapIterator::operator++()':
prog.cpp:75:19: error: 'i' was not declared in this scope
stdout