/** @file
$ Id $
$ Date $
$ Author $
@ copy & copy ; Marc W & auml ; ckerlin
@ license LGPL , see file < a href = " license.html " > COPYING < / a >
$ Log $
Revision 1.7 2005 / 02 / 28 07 : 10 : 23 marc
removed deprecated min , max
Revision 1.6 2005 / 02 / 18 15 : 47 : 23 marc
missing # ifndef
new functions ifelse
Revision 1.5 2005 / 01 / 28 07 : 52 : 33 marc
typo in doc
Revision 1.4 2004 / 12 / 20 07 : 40 : 36 marc
documentation improved , new grouping
Revision 1.3 2004 / 12 / 17 16 : 27 : 28 marc
error in documentation : group forgotten
Revision 1.2 2004 / 10 / 13 11 : 18 : 33 marc
getline reads a whole line from a stream
Revision 1.1 2004 / 10 / 11 18 : 30 : 16 marc
* * * empty log message * * *
*/
# ifndef __MRW__STDEXT_HPP__
# define __MRW__STDEXT_HPP__
# include <string>
# include <iostream>
# include <algorithm>
namespace mrw {
/** @addtogroup StdExt
*/
//@{
/** @defgroup stdextFunction Useful Global Functions
- @ ref getline read exactly one line from a stream
- @ ref ifelse implements a dual < code > ? : < / code > operator , like :
< code > a & nbsp ; ? & nbsp ; a & nbsp ; : & nbsp ; b < / code >
@ section stdextReadline Read Line
The global functions mrw : : getline read exactly one line from a
stream , without the need of a buffer . It is therefore guaranteed
that a whole line is read , regardless of the length of the
line . The result is returned as std : : string .
@ code
// first syntax returns a string:
std : : string line ( mrw : : readline ( std : : cin ) ) ;
// second syntax returns the stream:
while ( mrw : : readline ( std : : cin , line ) )
std : : cout < < " Read: " < < line < < std : : endl ;
@ endcode
*/
//@{
/** @brief Dual <code>?:</code> operation:
< code > a & nbsp ; ? & nbsp ; a & nbsp ; : & nbsp ; b < / code >
If the first parameter is not @ c 0 , then it is returned ,
otherwise the second parameter is returned . It is equivalent to
the construct : < code > a & nbsp ; ? & nbsp ; a & nbsp ; : & nbsp ; b < / code > , but without
the side effect of duplicated evaluation of parameter
< code > a < / code > .
Older gcc compiler implemented the non standard extension of
< code > a ? : b < / code > , which was exactly the same .
@ param a criteria that is checked and returned if not @ c 0
@ param b alternative value to be returned if @ c a is @ c 0
@ return < code > a & nbsp ; ? & nbsp ; a & nbsp ; : & nbsp ; b < / code >
@ pre # include < mrw / stdext . hpp >
@ pre @ c T must be convertible to @ c bool
*/
template < typename T > const T & ifelse ( const T & a , const T & b ) {
return a ? a : b ;
}
/** @brief Dual <code>?:</code> operation:
< code > a & nbsp ; ? & nbsp ; a & nbsp ; : & nbsp ; b < / code >
@ copydoc ifelse ( const T & a , const T & b ) */
template < typename T > const T * ifelse ( const T * a , const T * b ) {
return a ? a : b ;
}
/** @brief read one line from a stream
Reads one line from a stream , up to delimiter @ c d .
The delimiter is not appended to the string .
@ param is the stream to read from
@ param d the end of line delimiter
@ return the line read from the stream
@ pre # include < mrw / stdext . hpp >
*/
std : : string getline ( std : : istream & is , char d = ' \n ' ) ;
/** @brief read one line from a stream
Reads one line from a stream , up to delimiter @ c d .
The delimiter is not appended to the string .
@ param is the stream to read from
@ param s the string to place the line in
@ param d the end of line delimiter
@ return @ c s : the line read from the stream
@ return the stream after extraction of line
@ pre # include < mrw / stdext . hpp >
*/
std : : istream & getline ( std : : istream & is , std : : string & s , char d = ' \n ' ) ;
//@}
//@}
}
# endif