std::codecvt_base::result
CaesarRotateCvt::do_out( std::mbstate_t & state,
const char * from,
const char * from_end,
const char *& from_next,
char * to,
char * to_limit,
char *& to_next ) const
{
std::locale classic( "C" );
const std::ctype<char> & fac =
std::use_facet<std::ctype<char> >( classic );
int len = length( state, from, from_end, to_limit - to );
for( int i = 0; i < len; i++ )
{
if( fac.is( std::ctype_base::alpha, from[ i ] ))
{
if( fac.is( std::ctype_base::upper, from[ i ] ))
{
to[ i ] = (( from[ i ] - 'A' + 13 ) % 26 ) + 'A';
}
else
{
to[ i ] = (( from[ i ] - 'a' + 13 ) % 26 ) + 'a';
}
}
else
{
to[ i ] = from[ i ];
}
}
from_next = from + len + 1;
to_next = to + len + 1;
return std::codecvt_base::ok;
}