/** @file $Id$ $Date$ $Author$ @copy © Marc Wäckerlin @license LGPL, see file COPYING $Log$ Revision 1.4 2005/11/29 12:39:42 marc make it compilable with gcc 4.0.2 and newer doxygen Revision 1.3 2005/04/07 20:48:20 marc docu: new doxygen, new grouping 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__SET__HPP__ #define __MRW__SET__HPP__ #include #include #include #include /** @addtogroup StdExtSTL */ //@{ /** @defgroup StdExtset set */ //@{ /** @brief insert a value in a set @code std::set 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 @pre \#include */ template std::set& operator<<(std::set& l, const T& o) throw(std::exception) { if (!l.insert(o).second) throw mrw::invalid_argument(std::string(__FILE__ ":")+__LINE__+ ": std::set<>::operator<<, " "set element already exists"); return l; } /** @brief insert a value in a set Makes a copy and returns the copy. @code std::set()<<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 @pre \#include */ template std::set operator<<(const std::set& l, const T& o) throw(std::exception) { std::set copy(l); if (!copy.insert(o).second) throw mrw::invalid_argument(std::string(__FILE__ ":")+__LINE__+ ": std::set<>::operator<<, " "set element already exists"); return copy; } /* @brief push a char* to a set of string @code std::set test; test<<"Hello"<<"World"; @endcode @param l a set of string values (that can be constructed from char*) @param o a value to be inserted into set @c l @pre \#include */ template std::set& operator<<(std::set& l, const char *const o) throw(std::bad_exception) { l.push_back(T(o)); return l; } /** @brief extract the first value of a set @code std::set 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 @pre \#include */ template std::set& operator>>(std::set& l, T& o) throw(std::exception) { typename std::set::iterator it(l.begin()); if (it==l.end()) throw mrw::length_error(std::string(__FILE__ ":")+__LINE__+ ": std::set<> operator>>," " set is empty"); o = *it; l.erase(it); return l; } //@} //@} #endif