void SegmentedString::prepend(const SegmentedSubstring& s, PrependType type) { ASSERT(!s.numberOfCharactersConsumed()); if (!s.length()) return; // FIXME: We're also ASSERTing that s is a fresh SegmentedSubstring. // The assumption is sufficient for our current use, but we might // need to handle the more elaborate cases in the future. m_numberOfCharactersConsumedPriorToCurrentString += m_currentString.numberOfCharactersConsumed(); if (type == PrependType::Unconsume) m_numberOfCharactersConsumedPriorToCurrentString -= s.length(); if (!m_currentString.length()) { m_currentString = s; updateAdvanceFunctionPointers(); } else { // Shift our m_currentString into our list. m_substrings.prepend(m_currentString); m_currentString = s; updateAdvanceFunctionPointers(); } m_empty = false; }
void SegmentedString::append(const SegmentedSubstring& s) { ASSERT(!m_closed); if (!s.length()) return; if (!m_currentString.length()) { m_numberOfCharactersConsumedPriorToCurrentString += m_currentString.numberOfCharactersConsumed(); m_currentString = s; updateAdvanceFunctionPointers(); } else { m_substrings.append(s); } m_empty = false; }