#include <queue>
#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <map>
struct SillyJob
{
std:: string description;
std:: string priority;
SillyJob( const std:: string & d, const std:: string & p)
: description( d) , priority( p) { }
bool operator< ( const SillyJob& sj) const { return description.size ( ) < sj.description .size ( ) ; }
friend std:: ostream & operator<< ( std:: ostream & os, const SillyJob& sj)
{ return os << sj.priority << ": " << sj.description ; }
} ;
static bool by_priority( const SillyJob& a, const SillyJob& b)
{
static std:: map < std:: string , int > prio_map;
if ( prio_map.empty ( ) )
{
prio_map[ "HIGH" ] = 3 ;
prio_map[ "MEDIUM" ] = 2 ;
prio_map[ "LOW" ] = 1 ;
}
return prio_map[ a.priority ] < prio_map[ b.priority ] ;
}
int main( )
{
std:: cout << "Silly: (by description length)" << std:: endl ;
{
// by description length (member operator<)
std:: priority_queue < SillyJob> silly_queue;
silly_queue.push ( SillyJob( "short" , "HIGH" ) ) ;
silly_queue.push ( SillyJob( "very very long description" , "LOW" ) ) ;
while ( ! silly_queue.empty ( ) )
{
std:: cout << silly_queue.top ( ) << std:: endl ;
silly_queue.pop ( ) ;
}
}
std:: cout << std:: string ( 60 , '-' ) << "\n Not so silly: (by priority value)" << std:: endl ;
{
// by description length (member operator<)
typedef bool ( * cmpf) ( const SillyJob& , const SillyJob& ) ;
typedef std:: priority_queue < SillyJob, std:: vector < SillyJob> , cmpf> not_so_silly_queue;
not_so_silly_queue queue( by_priority) ;
queue.push ( SillyJob( "short" , "HIGH" ) ) ;
queue.push ( SillyJob( "very very long description" , "LOW" ) ) ;
while ( ! queue.empty ( ) )
{
std:: cout << queue.top ( ) << std:: endl ;
queue.pop ( ) ;
}
}
}
I2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgoKc3RydWN0IFNpbGx5Sm9iCnsKICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOwogICAgc3RkOjpzdHJpbmcgcHJpb3JpdHk7CgogICAgU2lsbHlKb2IoY29uc3Qgc3RkOjpzdHJpbmcmIGQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwKQogICAgICAgIDogZGVzY3JpcHRpb24oZCksIHByaW9yaXR5KHApIHsgfQoKICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNpbGx5Sm9iJiBzaikgY29uc3QgeyByZXR1cm4gZGVzY3JpcHRpb24uc2l6ZSgpIDwgc2ouZGVzY3JpcHRpb24uc2l6ZSgpOyB9CgogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTaWxseUpvYiYgc2opCiAgICB7IHJldHVybiBvcyA8PCBzai5wcmlvcml0eSA8PCAiOiAiIDw8IHNqLmRlc2NyaXB0aW9uOyB9Cn07CgpzdGF0aWMgYm9vbCBieV9wcmlvcml0eShjb25zdCBTaWxseUpvYiYgYSwgY29uc3QgU2lsbHlKb2ImIGIpCnsKICAgIHN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBwcmlvX21hcDsKICAgIGlmIChwcmlvX21hcC5lbXB0eSgpKQogICAgewogICAgICAgIHByaW9fbWFwWyJISUdIIl0gICA9IDM7CiAgICAgICAgcHJpb19tYXBbIk1FRElVTSJdID0gMjsKICAgICAgICBwcmlvX21hcFsiTE9XIl0gICAgPSAxOwogICAgfQoKICAgIHJldHVybiBwcmlvX21hcFthLnByaW9yaXR5XSA8IHByaW9fbWFwW2IucHJpb3JpdHldOwp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dCA8PCAiU2lsbHk6IChieSBkZXNjcmlwdGlvbiBsZW5ndGgpIiA8PCBzdGQ6OmVuZGw7CiAgICB7CiAgICAgICAgLy8gYnkgZGVzY3JpcHRpb24gbGVuZ3RoIChtZW1iZXIgb3BlcmF0b3I8KQogICAgICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8U2lsbHlKb2I+IHNpbGx5X3F1ZXVlOwoKICAgICAgICBzaWxseV9xdWV1ZS5wdXNoKFNpbGx5Sm9iKCJzaG9ydCIsICJISUdIIikpOwogICAgICAgIHNpbGx5X3F1ZXVlLnB1c2goU2lsbHlKb2IoInZlcnkgdmVyeSBsb25nIGRlc2NyaXB0aW9uIiwgIkxPVyIpKTsKCiAgICAgICAgd2hpbGUgKCFzaWxseV9xdWV1ZS5lbXB0eSgpKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHNpbGx5X3F1ZXVlLnRvcCgpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgc2lsbHlfcXVldWUucG9wKCk7CiAgICAgICAgfQogICAgfQoKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnN0cmluZyg2MCwgJy0nKSA8PCAiXG5Ob3Qgc28gc2lsbHk6IChieSBwcmlvcml0eSB2YWx1ZSkiIDw8IHN0ZDo6ZW5kbDsKICAgIHsKICAgICAgICAvLyBieSBkZXNjcmlwdGlvbiBsZW5ndGggKG1lbWJlciBvcGVyYXRvcjwpCiAgICAgICAgdHlwZWRlZiBib29sICgqY21wZikoY29uc3QgU2lsbHlKb2ImLCBjb25zdCBTaWxseUpvYiYpOwogICAgICAgIHR5cGVkZWYgc3RkOjpwcmlvcml0eV9xdWV1ZTxTaWxseUpvYiwgc3RkOjp2ZWN0b3I8U2lsbHlKb2I+LCBjbXBmPiBub3Rfc29fc2lsbHlfcXVldWU7CgogICAgICAgIG5vdF9zb19zaWxseV9xdWV1ZSBxdWV1ZShieV9wcmlvcml0eSk7CgogICAgICAgIHF1ZXVlLnB1c2goU2lsbHlKb2IoInNob3J0IiwgIkhJR0giKSk7CiAgICAgICAgcXVldWUucHVzaChTaWxseUpvYigidmVyeSB2ZXJ5IGxvbmcgZGVzY3JpcHRpb24iLCAiTE9XIikpOwoKICAgICAgICB3aGlsZSAoIXF1ZXVlLmVtcHR5KCkpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgcXVldWUudG9wKCkgPDwgc3RkOjplbmRsOwogICAgICAgICAgICBxdWV1ZS5wb3AoKTsKICAgICAgICB9CiAgICB9Cgp9Cg==