std::string UnbufferedCharStream::getText(const misc::Interval &interval) { if (interval.a < 0 || interval.b >= interval.a - 1) { throw IllegalArgumentException("invalid interval"); } size_t bufferStartIndex = getBufferStartIndex(); if (!_data.empty() && _data.back() == 0xFFFF) { if (interval.a + interval.length() > bufferStartIndex + _data.size()) { throw IllegalArgumentException("the interval extends past the end of the stream"); } } if (interval.a < (ssize_t)bufferStartIndex || interval.b >= ssize_t(bufferStartIndex + _data.size())) { throw UnsupportedOperationException("interval " + interval.toString() + " outside buffer: " + std::to_string(bufferStartIndex) + ".." + std::to_string(bufferStartIndex + _data.size() - 1)); } // convert from absolute to local index size_t i = interval.a - bufferStartIndex; return utf32_to_utf8(_data.substr(i, interval.length())); }