class Wrapper{
std::string &m_data;
public:
typedef std::string::value_type value_type;
Wrapper(std::string & data):m_data(data){ }
std::string &str(){
return m_data;
}
};
std::ostream &
operator << (std::ostream & os, Wrapper & s);
std::ostream &
operator<< (std::ostream & os, Wrapper & s){
XmlEscape x(os);
for_each(s.str().begin(),s.str().end(),x);
return os;
}
where XmlEscape is a functor:
class XmlEscape{
static const char * m_chars;
static const char * m_replacements[];
static const unsigned int m_nchars=5;
std::ostream & m_os;
public:
XmlEscape(std::ostream & os);
void operator()(char c);
std::ostream & ostream();
};
with implementation:
const char * XmlEscape::m_chars ="&\'\"><";
const char * XmlEscape::m_replacements[]={"&", "'", """, ">", "<"};
XmlEscape::XmlEscape(std::ostream & os):m_os(os){
//nop
}
void
XmlEscape::operator()(char c){
unsigned int i(m_nchars);
while(i--){
if (c==m_chars[i]) {
m_os<<m_replacements[i];
return;
}
}
m_os<<c;
}
2. Adapt the stream
No comments:
Post a Comment