GHC.IO.Buffer
| Авторское право | (c) The University of Glasgow 2008 |
|---|---|
| Лицензия | см. libraries/base/LICENSE |
| Сопровождающие | ghc-devs@haskell.org |
| Стабильность | внутренний |
| Переносимость | непереносимый (расширения GHC) |
| Безопасный Haskell | безопасный |
| Язык | Haskell2010 |
Описание
Буферы, используемые в системе ввода-вывода
API этого модуля нестабилен и не предназначен для использования широкой публикой. Если вам непременно нужно от него зависеть, обязательно укажите строгую верхнюю границу версии, например base < 4.X вместо base < 5, поскольку интерфейс может быстро меняться без особых предупреждений.
Буферы элементов любого типа
data Buffer e Исходный код
Изменяемый массив байтов, который можно передавать внешним функциям.
Буфер представлен записью, содержащей необработанный буфер и начальную/конечную позиции заполненной части. Содержимое самого буфера изменяемо, но остальная часть записи неизменяема. Это несколько необычное сочетание, однако на практике оно оказывается весьма удобным: делая все метаданные буфера неизменяемыми, мы можем выполнять операции над ними вне монады IO.
«Живые» элементы буфера находятся между смещениями bufL и bufR. В пустом буфере bufL равно bufR, но эти значения не обязательно равны нулю: например, буфер может соответствовать файлу, отображённому в память, и в этом случае bufL будет указывать на следующую позицию для записи, которая не обязательно совпадает с началом файла.
В системах Posix менеджер ввода-вывода неявно полагается на то, что чтение файла перемещает файловый указатель. Однако при асинхронных операциях в Windows объект ядра, представляющий файл, не использует смещение файлового указателя. Логически это имеет смысл, поскольку операции могут выполняться в произвольном порядке. Операции OVERLAPPED не учитывают смещение файлового указателя, так как предназначены для поддержки произвольного асинхронного чтения в любом месте на гораздо более низком уровне. Поэтому нам следует явно отслеживать смещения файла для целевого объекта в буфере. Любая операция перемещения также должна обновлять эту запись.
Чтобы избежать проблем, мы стараемся поддерживать инвариант: любая функция, которой передаётся Handle, отвечает за обновление смещения дескриптора, если не указано иное поведение.
Конструкторы
| Buffer | |
data BufferState Исходный код
Конструкторы
| ReadBuffer | |
| WriteBuffer |
Экземпляры
| Eq BufferState Исходный код | Начиная с: base-4.2.0.0 |
Определён в GHC.Internal.IO.Buffer Методы(==) :: BufferState -> BufferState -> Bool Исходный код (/=) :: BufferState -> BufferState -> Bool Исходный код | |
type CharBuffer = Buffer Char Исходный код
type CharBufElem = Char Исходный код
Создание
newByteBuffer :: Int -> BufferState -> IO (Buffer Word8) Исходный код
newCharBuffer :: Int -> BufferState -> IO CharBuffer Исходный код
newBuffer :: Int -> Int -> BufferState -> IO (Buffer e) Исходный код
emptyBuffer :: RawBuffer e -> Int -> BufferState -> Buffer e Исходный код
Добавление/удаление
bufferRemove :: Int -> Buffer e -> Buffer e Исходный код
bufferAdd :: Int -> Buffer e -> Buffer e Исходный код
slideContents :: Buffer Word8 -> IO (Buffer Word8) Исходный код
перемещает содержимое буфера в начало
bufferAdjustL :: Int -> Buffer e -> Buffer e Исходный код
bufferAddOffset :: Int -> Buffer e -> Buffer e Исходный код
bufferAdjustOffset :: Word64 -> Buffer e -> Buffer e Исходный код
Просмотр
isEmptyBuffer :: Buffer e -> Bool Исходный код
isFullBuffer :: Buffer e -> Bool Исходный код
isFullCharBuffer :: Buffer e -> Bool Исходный код
isWriteBuffer :: Buffer e -> Bool Исходный код
bufferElems :: Buffer e -> Int Исходный код
bufferAvailable :: Buffer e -> Int Исходный код
bufferOffset :: Buffer e -> Word64 Исходный код
summaryBuffer :: Buffer a -> String Исходный код
Работа с необработанным буфером как с Ptr
withBuffer :: Buffer e -> (Ptr e -> IO a) -> IO a Исходный код
withRawBuffer :: RawBuffer e -> (Ptr e -> IO a) -> IO a Исходный код
Проверки
checkBuffer :: Buffer a -> IO () Исходный код
Необработанные буферы
type RawBuffer e = ForeignPtr e Исходный код
readWord8Buf :: RawBuffer Word8 -> Int -> IO Word8 Исходный код
writeWord8Buf :: RawBuffer Word8 -> Int -> Word8 -> IO () Исходный код
type RawCharBuffer = RawBuffer CharBufElem Исходный код
peekCharBuf :: RawCharBuffer -> Int -> IO Char Исходный код
readCharBuf :: RawCharBuffer -> Int -> IO (Char, Int) Исходный код
writeCharBuf :: RawCharBuffer -> Int -> Char -> IO Int Исходный код
readCharBufPtr :: Ptr CharBufElem -> Int -> IO (Char, Int) Исходный код
writeCharBufPtr :: Ptr CharBufElem -> Int -> Char -> IO Int Исходный код
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/GHC-IO-Buffer.html