| 
									
										
										
										
											2004-10-07 09:31:30 +00:00
										 |  |  | /** @file
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $Id$ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $Date$ | 
					
						
							|  |  |  |     $Author$ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @copy © Marc Wäckerlin | 
					
						
							|  |  |  |     @license LGPL, see file <a href="license.html">COPYING</a> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $Log$ | 
					
						
							| 
									
										
										
										
											2005-11-29 12:42:01 +00:00
										 |  |  |     Revision 1.4  2005/11/29 12:39:42  marc | 
					
						
							|  |  |  |     make it compilable with gcc 4.0.2 and newer doxygen | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-07 20:51:30 +00:00
										 |  |  |     Revision 1.3  2005/04/07 20:48:20  marc | 
					
						
							|  |  |  |     docu: new doxygen, new grouping | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-20 07:40:36 +00:00
										 |  |  |     Revision 1.2  2004/12/20 07:40:36  marc | 
					
						
							|  |  |  |     documentation improved, new grouping | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-07 09:31:30 +00:00
										 |  |  |     Revision 1.1  2004/10/07 09:31:30  marc | 
					
						
							|  |  |  |     new feature | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | #ifndef __MRW__SET__HPP__
 | 
					
						
							|  |  |  | #define __MRW__SET__HPP__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <set>
 | 
					
						
							|  |  |  | #include <mrw/exception.hpp>
 | 
					
						
							|  |  |  | #include <mrw/string.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-20 07:40:36 +00:00
										 |  |  | /** @addtogroup StdExtSTL
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | //@{
 | 
					
						
							|  |  |  | /** @defgroup StdExtset set
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | //@{
 | 
					
						
							| 
									
										
										
										
											2004-10-07 09:31:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @brief insert a value in a set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @code | 
					
						
							|  |  |  |     std::set<int> test; | 
					
						
							|  |  |  |     test<<1<<2<<3<<4<<5<<6<<7<<8; | 
					
						
							|  |  |  |     @endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @throw mrw::invalid_argument, if element is already in set | 
					
						
							|  |  |  |     @param l a set of values | 
					
						
							|  |  |  |     @param o a value to be inserted into set @c l | 
					
						
							| 
									
										
										
										
											2005-11-29 12:42:01 +00:00
										 |  |  |     @pre \#include <mrw/set.hpp> | 
					
						
							| 
									
										
										
										
											2004-10-07 09:31:30 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | template <typename T, class C, typename A> | 
					
						
							|  |  |  | std::set<T, C, A>& operator<<(std::set<T, C, A>& l, const T& o) | 
					
						
							|  |  |  |   throw(std::exception) { | 
					
						
							|  |  |  |   if (!l.insert(o).second) | 
					
						
							|  |  |  |     throw mrw::invalid_argument(std::string(__FILE__ ":")+__LINE__+ | 
					
						
							|  |  |  |                                 ": std::set<>&" | 
					
						
							|  |  |  |                                 " operator<<(std::set<>&, const T&)," | 
					
						
							|  |  |  |                                 "set element already exists"); | 
					
						
							|  |  |  |   return l; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @brief extract the first value of a set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @code | 
					
						
							|  |  |  |     std::set<int> test; | 
					
						
							|  |  |  |     test<<1<<2<<3<<4<<5<<6<<7<<8; | 
					
						
							|  |  |  |     int i1(0), i2(0), i3(0), i4(0); | 
					
						
							|  |  |  |     test>>i1>>i2>>i3>>i4; | 
					
						
							|  |  |  |     // now: i1==1 i2==2 i3==3 i4==4 test=={5, 6, 7, 8}
 | 
					
						
							|  |  |  |     @endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @param l a set of values | 
					
						
							|  |  |  |     @param o a value to be extracted from set @c l | 
					
						
							|  |  |  |     @throw mrw::length_error, if set was empty on entry | 
					
						
							|  |  |  |     @note when something is extracted from a set, it is removed | 
					
						
							|  |  |  |     from the set, that means after every shift the set is | 
					
						
							|  |  |  |     shortened by the shifted element | 
					
						
							| 
									
										
										
										
											2005-11-29 12:42:01 +00:00
										 |  |  |     @pre \#include <mrw/set.hpp> | 
					
						
							| 
									
										
										
										
											2004-10-07 09:31:30 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | template <typename T, class C, typename A> | 
					
						
							|  |  |  | std::set<T, C, A>& operator>>(std::set<T, C, A>& l, T& o) | 
					
						
							|  |  |  |   throw(std::exception) { | 
					
						
							|  |  |  |   typename std::set<T, C, A>::iterator it(l.begin()); | 
					
						
							|  |  |  |   if (it==l.end()) | 
					
						
							|  |  |  |     throw mrw::length_error(std::string(__FILE__ ":")+__LINE__+ | 
					
						
							|  |  |  |                             ": std::set<>& operator>>(std::set<>&, T&)," | 
					
						
							|  |  |  |                             " set is empty"); | 
					
						
							|  |  |  |   o = *it; | 
					
						
							|  |  |  |   l.erase(it); | 
					
						
							|  |  |  |   return l; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-20 07:40:36 +00:00
										 |  |  | //@}
 | 
					
						
							| 
									
										
										
										
											2004-10-07 09:31:30 +00:00
										 |  |  | //@}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |