Spec-Zone.ru › Haskell 9

GHC.IO.Buffer

Авторское право (c) The University of Glasgow 2008
Лицензия см. libraries/base/LICENSE
Сопровождающие ghc-devs@haskell.org
Стабильность внутренний
Переносимость непереносимый (расширения GHC)
Безопасный Haskell безопасный
Язык Haskell2010

Содержание

  • Буферы элементов любого типа
    • Создание
    • Добавление/удаление
    • Просмотр
    • Работа с необработанным буфером как с Ptr
    • Проверки
  • Необработанные буферы

Описание

Буферы, используемые в системе ввода-вывода

API этого модуля нестабилен и не предназначен для использования широкой публикой. Если вам непременно нужно от него зависеть, обязательно укажите строгую верхнюю границу версии, например base < 4.X вместо base < 5, поскольку интерфейс может быстро меняться без особых предупреждений.

Буферы элементов любого типа

data Buffer e Исходный код

Изменяемый массив байтов, который можно передавать внешним функциям.

Буфер представлен записью, содержащей необработанный буфер и начальную/конечную позиции заполненной части. Содержимое самого буфера изменяемо, но остальная часть записи неизменяема. Это несколько необычное сочетание, однако на практике оно оказывается весьма удобным: делая все метаданные буфера неизменяемыми, мы можем выполнять операции над ними вне монады IO.

«Живые» элементы буфера находятся между смещениями bufL и bufR. В пустом буфере bufL равно bufR, но эти значения не обязательно равны нулю: например, буфер может соответствовать файлу, отображённому в память, и в этом случае bufL будет указывать на следующую позицию для записи, которая не обязательно совпадает с началом файла.

В системах Posix менеджер ввода-вывода неявно полагается на то, что чтение файла перемещает файловый указатель. Однако при асинхронных операциях в Windows объект ядра, представляющий файл, не использует смещение файлового указателя. Логически это имеет смысл, поскольку операции могут выполняться в произвольном порядке. Операции OVERLAPPED не учитывают смещение файлового указателя, так как предназначены для поддержки произвольного асинхронного чтения в любом месте на гораздо более низком уровне. Поэтому нам следует явно отслеживать смещения файла для целевого объекта в буфере. Любая операция перемещения также должна обновлять эту запись.

Чтобы избежать проблем, мы стараемся поддерживать инвариант: любая функция, которой передаётся Handle, отвечает за обновление смещения дескриптора, если не указано иное поведение.

Конструкторы

Buffer

Поля

  • bufRaw :: !(RawBuffer e)
  • bufState :: BufferState
  • bufSize :: !Int
  • bufOffset :: !Word64
  • bufL :: !Int
  • bufR :: !Int

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 Исходный код

charSize :: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API