/** @file
$ Id $
$ Date $
$ Author $
@ copy & copy ; Marc W & auml ; ckerlin
@ license LGPL , see file < a href = " license.html " > COPYING < / a >
$ Log $
Revision 1.2 2004 / 12 / 20 07 : 40 : 36 marc
documentation improved , new grouping
Revision 1.1 2004 / 10 / 07 09 : 31 : 30 marc
new feature
*/
# ifndef __MRW__MULTIMAP__HPP__
# define __MRW__MULTIMAP__HPP__
# include <map>
# include <mrw/exception.hpp>
# include <mrw/string.hpp>
/** @addtogroup StdExt
*/
//@{
/** @addtogroup StdExtSTL
*/
//@{
/** @addtogroup StdExtmultimap multimap
*/
//@{
/** @brief insert a value in a multimap
@ code
std : : multimap < int , std : : string > test ;
test < < std : : make_pair ( 1 , std : : string ( " one " ) )
< < std : : make_pair ( 2 , std : : string ( " two " ) ) ;
@ endcode
@ throw mrw : : invalid_argument , if element is already in multimap
@ param l a multimap of values
@ param o a value to be inserted into multimap @ c l
@ pre # include < mrw / multimap . hpp >
*/
template < typename K , typename T , class C , typename A >
std : : multimap < K , T , C , A > & operator < < ( std : : multimap < K , T , C , A > & l , const std : : pair < K , T > & o )
throw ( std : : bad_exception ) {
l . insert ( o ) ;
return l ;
}
/** @brief extract the first value of a multimap
@ code
std : : multimap < int , std : : string > test ;
test < < std : : make_pair ( 1 , std : : string ( " one " ) )
< < std : : make_pair ( 2 , std : : string ( " two " ) ) ;
std : : pair < int , std : : string > i1 , i2 ;
test > > i1 > > i2 ;
// now: i1==(1, "one") i2==(2, "two") test=={}
@ endcode
@ param l a multimap of values
@ param o a value to be extracted from multimap @ c l
@ throw mrw : : length_error , if multimap was empty on entry
@ note when something is extracted from a multimap , it is removed
from the multimap , that means after every shift the multimap is
shortened by the shifted element
@ pre # include < mrw / multimap . hpp >
*/
template < typename K , typename T , class C , typename A >
std : : multimap < K , T , C , A > & operator > > ( std : : multimap < K , T , C , A > & l , std : : pair < K , T > & o )
throw ( std : : exception ) {
typename std : : multimap < K , T , C , A > : : iterator it ( l . begin ( ) ) ;
if ( it = = l . end ( ) )
throw mrw : : length_error ( std : : string ( __FILE__ " : " ) + __LINE__ +
" : std::multimap<>& operator>>(std::multimap<>&, T&), "
" multimap is empty " ) ;
o = * it ;
l . erase ( it ) ;
return l ;
}
//@}
//@}
//@}
# endif