String StringUtil::Translate(CStrRef input, CStrRef from, CStrRef to) { if (input.empty()) return input; int len = input.size(); String retstr(len, ReserveString); char *ret = retstr.mutableSlice().ptr; memcpy(ret, input.data(), len); auto trlen = std::min(from.size(), to.size()); string_translate(ret, len, from.data(), to.data(), trlen); return retstr.setSize(len); }
String StringUtil::Translate(const String& input, const String& from, const String& to) { if (input.empty()) return input; int len = input.size(); String retstr(len, ReserveString); char *ret = retstr.bufferSlice().ptr; memcpy(ret, input.data(), len); auto trlen = std::min(from.size(), to.size()); string_translate(ret, len, from.data(), to.data(), trlen); return retstr.setSize(len); }
String StringUtil::Translate(CStrRef input, CStrRef from, CStrRef to) { if (input.empty()) return input; int len = input.size(); char *ret = (char *)malloc(len + 1); memcpy(ret, input, len); ret[len] = '\0'; int fromSize = from.size(); int toSize = to.size(); int trlen = (fromSize < toSize) ? fromSize : toSize; string_translate(ret, len, from, to, trlen); return String(ret, len, AttachString); }
String StringUtil::Translate(CStrRef input, CStrRef from, CStrRef to) { if (input.empty()) return input; if (from.empty()) { throw InvalidArgumentException("from", "(empty)"); } if (from.size() != to.size()) { throw InvalidArgumentException("from and to", "(different sizes)"); } int len = input.size(); char *ret = (char *)malloc(len + 1); memcpy(ret, input, len); ret[len] = '\0'; string_translate(ret, len, from, to, from.size()); return String(ret, len, AttachString); }