std::wstring widen(std::string const& src)
{
typedef std::codecvt<wchar_t, char, std::mbstate_t> convert;
const convert& cvt = std::use_facet<convert>(std::locale(""));
convert::result res;
std::mbstate_t state;
const char *src_next = 0;
wchar_t *wcs = new wchar_t[src.length() + 1];
wchar_t *wcs_next = 0;
std::wstring ret;
res = cvt.in(state, src.data(), src.data() + src.size(), src_next,
wcs, wcs + sizeof(wchar_t) * (src.length() + 1), wcs_next
);
// big endian
if (res == convert::ok) {
std::wstring ret(wcs, wcs_next);
for (auto it = ret.begin(), end = ret.end(); it != end; ++it) {
std::reverse(reinterpret_cast<unsigned wchar_t>(*it), sizeof(unsigned wchar_t));
}
return ret;
}
// fail
return std::wstring();
}
CXN0ZDo6d3N0cmluZyB3aWRlbihzdGQ6OnN0cmluZyBjb25zdCYgc3JjKQoJewkKCQl0eXBlZGVmIHN0ZDo6Y29kZWN2dDx3Y2hhcl90LCBjaGFyLCBzdGQ6Om1ic3RhdGVfdD4gY29udmVydDsKCQkKCQljb25zdCBjb252ZXJ0JiBjdnQgPSBzdGQ6OnVzZV9mYWNldDxjb252ZXJ0PihzdGQ6OmxvY2FsZSgiIikpOwoJCWNvbnZlcnQ6OnJlc3VsdCByZXM7CgkJc3RkOjptYnN0YXRlX3Qgc3RhdGU7CgkJCgkJY29uc3QgY2hhciAqc3JjX25leHQgPSAwOwoJCXdjaGFyX3QgKndjcyA9IG5ldyB3Y2hhcl90W3NyYy5sZW5ndGgoKSArIDFdOwoJCXdjaGFyX3QgKndjc19uZXh0ID0gMDsKCQlzdGQ6OndzdHJpbmcgcmV0OwoJCQoJCXJlcyA9IGN2dC5pbihzdGF0ZSwgc3JjLmRhdGEoKSwgc3JjLmRhdGEoKSArIHNyYy5zaXplKCksIHNyY19uZXh0LCAKCQkJCXdjcywgd2NzICsgc2l6ZW9mKHdjaGFyX3QpICogKHNyYy5sZW5ndGgoKSArIDEpLCB3Y3NfbmV4dAoJCSk7CgkJCgkJLy8gYmlnIGVuZGlhbgoJCWlmIChyZXMgPT0gY29udmVydDo6b2spIHsKCQkJc3RkOjp3c3RyaW5nIHJldCh3Y3MsIHdjc19uZXh0KTsKCQkJCgkJCWZvciAoYXV0byBpdCA9IHJldC5iZWdpbigpLCBlbmQgPSByZXQuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewoJCQkJc3RkOjpyZXZlcnNlKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgd2NoYXJfdD4oKml0KSwgc2l6ZW9mKHVuc2lnbmVkIHdjaGFyX3QpKTsKCQkJfQoJCQlyZXR1cm4gcmV0OwoJCX0KCQkKCQkKCQkvLyBmYWlsCgkJcmV0dXJuIHN0ZDo6d3N0cmluZygpOwoJfQ==