std::wostream& operator<<(std::wostream& out, const std::type_info& p) { const char* mangled = p.name(); int status = 0; char* demangled = abi::__cxa_demangle(mangled, nullptr, nullptr, &status); if (demangled != nullptr) { out << decodeUtf8(std::string{demangled}); free(demangled); } else { // demangling failed. Output function name as a C function with // no arguments. out << decodeUtf8(std::string{mangled}); } return out; }
std::vector<SubtitleRenderer::InternalChar> SubtitleRenderer:: get_internal_chars(const std::string& str) { std::vector<InternalChar> internal_chars; bool italic{}; auto c_str = str.c_str(); for (size_t i = 0, len = str.length(); i < len;) { try { auto cp = decodeUtf8(c_str, len, i); internal_chars.push_back(InternalChar({cp, italic})); } catch (...) { ++i; // Keep going } } return internal_chars; }
std::vector<SubtitleRenderer::InternalChar> SubtitleRenderer:: get_internal_chars(const std::string& str, TagTracker& tag_tracker) { std::vector<InternalChar> internal_chars; auto c_str = str.c_str(); for (size_t i = 0, len = str.length(); i < len;) { try { auto cp = decodeUtf8(c_str, len, i); tag_tracker.put(cp); if (!tag_tracker.in_tag()) internal_chars.push_back(InternalChar(cp, tag_tracker.italic())); } catch (...) { ++i; // Keep going } } return internal_chars; }
Utf8Iterator::Utf8Iterator(uint8_t const *b, uint8_t const *e, uint8_t const *c) : begin(b), end(e), value( { 0, nullptr, nullptr }) { if(begin == end) { begin = end = reinterpret_cast<uint8_t const *>( PLACEHOLDER_EMPTY_STRING); } if(begin == nullptr || end == nullptr) { throw std::runtime_error( "Cannot construct Utf8Iterator from invalid pointers."); } value = decodeUtf8(begin, c == nullptr ? begin : c, end); }
Utf8Iterator &Utf8Iterator::operator--() { value = decodeUtf8(begin, findPrevious(begin, value.current, end), end); return *this; }
Utf8Iterator &Utf8Iterator::operator++() { value = decodeUtf8(begin, value.currentEnd, end); return *this; }