Accept a number of Eric Niebler's suggestions, including renaming.

[SVN r63074]
This commit is contained in:
Beman Dawes
2010-06-18 00:59:40 +00:00
parent 292f21393c
commit fa2be5fde6
2 changed files with 158 additions and 179 deletions

View File

@ -1,179 +0,0 @@
// Copyright Beman Dawes 2010
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
//--------------------------------------------------------------------------------------//
#ifndef BOOST_QUOTE_MANIP
#define BOOST_QUOTE_MANIP
#include <istream>
#include <ostream>
#include <string>
#include <boost/io/ios_state.hpp>
namespace boost
{
namespace io
{
namespace detail { // forward declare the helpers
template <class Char, class Traits, class Alloc> struct quote_proxy;
template <class Char> struct c_str_quote_proxy;
template <class Char, class Traits, class Alloc> struct unquote_proxy;
}
// ------------ public interface ------------------------------------------------//
template <class Char, class Traits, class Alloc>
detail::quote_proxy<Char, Traits, Alloc>
quote(const std::basic_string<Char, Traits, Alloc>& s,
Char escape='\\', Char delim='\"');
template <class Char>
detail::c_str_quote_proxy<Char>
quote(const Char* s, Char escape='\\', Char delim='\"');
template <class Char, class Traits, class Alloc>
detail::unquote_proxy<Char, Traits, Alloc>
unquote(std::basic_string<Char, Traits, Alloc>& s,
Char escape='\\', Char delim='\"');
// ----------- implementation details -------------------------------------------//
namespace detail
{
// string inserter helpers
template <class Char, class Traits, class Alloc>
struct quote_proxy
{
const std::basic_string<Char, Traits, Alloc>& s;
Char escape;
Char delim;
quote_proxy(const std::basic_string<Char, Traits, Alloc>& s_,
Char escape_, Char delim_)
: s(s_), escape(escape_), delim(delim_) {}
};
template <class Char, class Traits, class Alloc>
std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os,
quote_proxy<Char, Traits, Alloc>& proxy)
{
os << proxy.delim;
std::basic_string<Char, Traits, Alloc>::const_iterator end_it = proxy.s.end();
for (std::basic_string<Char, Traits, Alloc>::const_iterator it = proxy.s.begin();
it != end_it;
++it )
{
if (*it == proxy.delim || *it == proxy.escape)
os << proxy.escape;
os << *it;
}
os << proxy.delim;
return os;
}
// c_str inserter helpers
template <class Char>
struct c_str_quote_proxy
{
const Char* s;
Char escape;
Char delim;
c_str_quote_proxy(const Char* s_, Char escape_, Char delim_)
: s(s_), escape(escape_), delim(delim_) {}
};
template <class Char, class Traits>
std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os,
c_str_quote_proxy<Char>& proxy)
{
os << proxy.delim;
for (const Char* it = proxy.s;
*it;
++it )
{
if (*it == proxy.delim || *it == proxy.escape)
os << proxy.escape;
os << *it;
}
os << proxy.delim;
return os;
}
// string extractor helpers
template <class Char, class Traits, class Alloc>
struct unquote_proxy
{
std::basic_string<Char, Traits, Alloc>& s;
Char escape;
Char delim;
unquote_proxy(std::basic_string<Char, Traits, Alloc>& s_,
Char escape_, Char delim_)
: s(s_), escape(escape_), delim(delim_) {}
};
template <class Char, class Traits, class Alloc>
std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& is,
unquote_proxy<Char, Traits, Alloc>& proxy)
{
Char c;
is >> c;
if (c != proxy.delim)
{
proxy.s = c;
is >> proxy.s;
return is;
}
proxy.s.clear();
{
boost::io::ios_flags_saver ifs(is);
is >> std::noskipws;
for (;;)
{
is >> c;
if (c == proxy.escape)
is >> c;
else if (c == proxy.delim)
break;
proxy.s += c;
}
}
return is;
}
} // namespace detail
// manipulator implementations
template <class Char, class Traits, class Alloc>
inline detail::quote_proxy<Char, Traits, Alloc>
quote(const std::basic_string<Char, Traits, Alloc>& s, Char escape, Char delim)
{
return detail::quote_proxy<Char, Traits, Alloc>(s, escape, delim);
}
template <class Char>
inline detail::c_str_quote_proxy<Char>
quote(const Char* s, Char escape, Char delim)
{
return detail::c_str_quote_proxy<Char>(s, escape, delim);
}
template <class Char, class Traits, class Alloc>
inline detail::unquote_proxy<Char, Traits, Alloc>
unquote(std::basic_string<Char, Traits, Alloc>& s, Char escape, Char delim)
{
return detail::unquote_proxy<Char, Traits, Alloc>(s, escape, delim);
}
} // namespace io
} // namespace boost
#endif // BOOST_QUOTE_MANIP

View File

@ -0,0 +1,158 @@
// Copyright Beman Dawes 2010
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
//--------------------------------------------------------------------------------------//
#ifndef BOOST_QUOTE_MANIP
#define BOOST_QUOTE_MANIP
#include <iosfwd>
#include <string>
#include <boost/io/ios_state.hpp>
namespace boost
{
namespace io
{
namespace detail { template <class String, class Char> struct quoted_proxy; }
// ------------ public interface ------------------------------------------------//
template <class Char, class Traits, class Alloc>
detail::quoted_proxy<std::basic_string<Char, Traits, Alloc> const &, Char>
quoted(const std::basic_string<Char, Traits, Alloc>& s,
Char escape='\\', Char delim='\"');
template <class Char>
detail::quoted_proxy<const Char*, Char>
quoted(const Char* s, Char escape='\\', Char delim='\"');
template <class Char, class Traits, class Alloc>
detail::quoted_proxy<std::basic_string<Char, Traits, Alloc> &, Char>
quoted(std::basic_string<Char, Traits, Alloc>& s,
Char escape='\\', Char delim='\"');
// ----------- implementation details -------------------------------------------//
namespace detail
{
template <class String, class Char>
struct quoted_proxy
{
String string;
Char escape;
Char delim;
quoted_proxy(String s_, Char escape_, Char delim_)
: string(s_), escape(escape_), delim(delim_) {}
};
template <class Char, class Traits, class Alloc>
std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os,
const quoted_proxy<std::basic_string<Char, Traits, Alloc> const &, Char>& proxy)
{
os << proxy.delim;
std::basic_string<Char, Traits, Alloc>::const_iterator end_it = proxy.string.end();
for (std::basic_string<Char, Traits, Alloc>::const_iterator it = proxy.string.begin();
it != end_it;
++it )
{
if (*it == proxy.delim || *it == proxy.escape)
os << proxy.escape;
os << *it;
}
os << proxy.delim;
return os;
}
template <class Char, class Traits, class Alloc>
inline
std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os,
const quoted_proxy<std::basic_string<Char, Traits, Alloc>&, Char>& proxy)
{
return os <<
*reinterpret_cast<const quoted_proxy<std::basic_string
<Char, Traits, Alloc> const &, Char>*>(&proxy);
}
template <class Char, class Traits>
std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os,
const quoted_proxy<const Char*, Char>& proxy)
{
os << proxy.delim;
for (const Char* it = proxy.string;
*it;
++it )
{
if (*it == proxy.delim || *it == proxy.escape)
os << proxy.escape;
os << *it;
}
os << proxy.delim;
return os;
}
template <class Char, class Traits, class Alloc>
std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& is,
const quoted_proxy<std::basic_string<Char, Traits, Alloc>&, Char>& proxy)
{
Char c;
is >> c;
if (c != proxy.delim)
{
proxy.string = c;
is >> proxy.string;
return is;
}
proxy.string.clear();
{
boost::io::ios_flags_saver ifs(is);
is >> std::noskipws;
for (;;)
{
is >> c;
if (c == proxy.escape)
is >> c;
else if (c == proxy.delim)
break;
proxy.string += c;
}
}
return is;
}
} // namespace detail
// manipulator implementations
template <class Char, class Traits, class Alloc>
inline detail::quoted_proxy<std::basic_string<Char, Traits, Alloc> const &, Char>
quoted(const std::basic_string<Char, Traits, Alloc>& s, Char escape, Char delim)
{
return detail::quoted_proxy<std::basic_string<Char, Traits, Alloc> const &, Char>
(s, escape, delim);
}
template <class Char>
inline detail::quoted_proxy<const Char*, Char>
quoted(const Char* s, Char escape, Char delim)
{
return detail::quoted_proxy<const Char*, Char> (s, escape, delim);
}
template <class Char, class Traits, class Alloc>
inline detail::quoted_proxy<std::basic_string<Char, Traits, Alloc> &, Char>
quoted(std::basic_string<Char, Traits, Alloc>& s, Char escape, Char delim)
{
return detail::quoted_proxy<std::basic_string<Char, Traits, Alloc>&, Char>
(s, escape, delim);
}
} // namespace io
} // namespace boost
#endif // BOOST_QUOTE_MANIP