void DirectorySearchRules::AddSearchDirectory(StringSection<ResChar> dir) { // Attempt to fit this directory into our buffer. // note that we have limited space in the buffer, but we can't really // rely on all directory names remaining small and convenient... If we // overflow our fixed size buffer, we can use the dynamically // allocated "_bufferOverflow" assert((_startPointCount+1) <= dimof(_startOffsets)); if ((_startPointCount+1) > dimof(_startOffsets)) { // limited number of directories that can be pushed into a single "search rules" // this allows us to avoid a little bit of awkward dynamic memory allocation return; } // Check for duplicates // Duplicates are bad because they will increase the number of search operations if (HasDirectory(dir)) return; unsigned allocationLength = (unsigned)(dir.Length() + 1); if (_bufferOverflow.empty() && (_bufferUsed + allocationLength <= dimof(_buffer))) { // just append this new string to our buffer, and add a new start offset XlCopyMemory(&_buffer[_bufferUsed], dir.begin(), (allocationLength-1) * sizeof(ResChar)); _buffer[_bufferUsed+allocationLength-1] = '\0'; } else { if (_bufferOverflow.empty()) { _bufferOverflow.resize(_bufferUsed + allocationLength); XlCopyMemory(AsPointer(_bufferOverflow.begin()), _buffer, _bufferUsed * sizeof(ResChar)); XlCopyMemory(PtrAdd(AsPointer(_bufferOverflow.begin()), _bufferUsed * sizeof(ResChar)), dir.begin(), (allocationLength-1) * sizeof(ResChar)); _bufferOverflow[_bufferUsed+allocationLength-1] = '\0'; } else { assert(_bufferOverflow.size() == allocationLength); auto i = _bufferOverflow.insert(_bufferOverflow.end(), dir.begin(), dir.end()); _bufferOverflow.insert(i + dir.Length(), 0); } } _startOffsets[_startPointCount++] = _bufferUsed; _bufferUsed += allocationLength; }
void PushString( std::basic_streambuf<OutChar>& stream, StringSection<InChar> input) { stream.sputn((const OutChar*)input.begin(), input.Length()); }
void FileOutputStream::Write(StringSection<ucs4> s) { _file.Write(s.begin(), sizeof(*s.begin()), s.Length()); }