middle of porting; unstable, don't checkout; refs #1
This commit is contained in:
134
src/mrw/list.hpp
Normal file
134
src/mrw/list.hpp
Normal file
@@ -0,0 +1,134 @@
|
||||
/** @file
|
||||
|
||||
$Id$
|
||||
|
||||
$Date$
|
||||
$Author$
|
||||
|
||||
@copy © Marc Wäckerlin
|
||||
@license LGPL, see file <a href="license.html">COPYING</a>
|
||||
|
||||
$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:35 marc
|
||||
documentation improved, new grouping
|
||||
|
||||
Revision 1.1 2004/10/07 09:31:30 marc
|
||||
new feature
|
||||
|
||||
|
||||
*/
|
||||
#ifndef __MRW__LIST__HPP__
|
||||
#define __MRW__LIST__HPP__
|
||||
|
||||
#include <list>
|
||||
#include <mrw/exception.hpp>
|
||||
#include <mrw/string.hpp>
|
||||
|
||||
/** @addtogroup StdExt
|
||||
*/
|
||||
//@{
|
||||
/** @defgroup StdExtSTL STL extensions
|
||||
|
||||
The STL extensions give you the possibility to fill up a container
|
||||
by shifting in values, and to extract values by shifting them out.
|
||||
@code
|
||||
std::list<std::string> l;
|
||||
l<<"hello"<<"world"<<"this"<<is"<<"cool";
|
||||
for (std::string s; l.size();) {
|
||||
l>>s;
|
||||
std::cout<<"list contains: "<<s<<std::endl;
|
||||
}
|
||||
@endcode
|
||||
*/
|
||||
//@}
|
||||
|
||||
/** @addtogroup StdExtSTL
|
||||
*/
|
||||
//@{
|
||||
|
||||
/** @defgroup StdExtliststl list
|
||||
*/
|
||||
//@{
|
||||
|
||||
/** @brief push a value to a list
|
||||
|
||||
@code
|
||||
std::list<int> test;
|
||||
test<<1<<2<<3<<4<<5<<6<<7<<8;
|
||||
@endcode
|
||||
|
||||
@param l a list of values
|
||||
@param o a value to be inserted into list @c l
|
||||
@pre \#include <mrw/list.hpp>
|
||||
*/
|
||||
// template <typename T, typename A, typename FROM>
|
||||
// std::list<T, A>& operator<<(std::list<T, A>& l, const FROM& o)
|
||||
// throw(std::bad_exception) {
|
||||
// l.push_back(T(o));
|
||||
// return l;
|
||||
// }
|
||||
template <typename T, typename A>
|
||||
std::list<T, A>& operator<<(std::list<T, A>& l, const T& o)
|
||||
throw(std::bad_exception) {
|
||||
l.push_back(o);
|
||||
return l;
|
||||
}
|
||||
|
||||
/* @brief push a char* to a list of string
|
||||
|
||||
@code
|
||||
std::list<std::string> test;
|
||||
test<<"Hello"<<"World";
|
||||
@endcode
|
||||
|
||||
@param l a list of string values (that can be constructed from char*)
|
||||
@param o a value to be inserted into list @c l
|
||||
@pre \#include <mrw/list.hpp> */
|
||||
template <typename T, typename A>
|
||||
std::list<T, A>& operator<<(std::list<T, A>& l,
|
||||
const char *const o)
|
||||
throw(std::bad_exception) {
|
||||
l.push_back(T(o));
|
||||
return l;
|
||||
}
|
||||
|
||||
/** @brief extract the first value of a list
|
||||
|
||||
@code
|
||||
std::list<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 list of values
|
||||
@param o a value to be extracted from list @c l
|
||||
@throw mrw::length_error, if list was empty on entry
|
||||
@note when something is extracted from a list, it is removed
|
||||
from the list, that means after every shift the list is
|
||||
shortened by the shifted element
|
||||
@pre \#include <mrw/list.hpp>
|
||||
*/
|
||||
template <typename T, typename A>
|
||||
std::list<T, A>& operator>>(std::list<T, A>& l, T& o) throw(std::exception) {
|
||||
typename std::list<T, A>::iterator it(l.begin());
|
||||
if (it==l.end())
|
||||
throw mrw::length_error(std::string(__FILE__ ":")+__LINE__+
|
||||
": std::list<>& operator>>(std::list<>&, T&),"
|
||||
" list is empty");
|
||||
o = *it;
|
||||
l.erase(it);
|
||||
return l;
|
||||
}
|
||||
|
||||
//@}
|
||||
//@}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user