Spec-Zone.ru › Haskell 7

Foreign.Storable

Авторские права (c) Команда FFI 2001
Лицензия см. libraries/base/LICENSE
Поддерживающий ffi@haskell.org
Стабильность предварительная
Переносимость переносимая
Безопасный Haskell Надежный
Язык Haskell2010

Описание

Модуль Foreign.Storable предоставляет базовую поддержку маршалинга и является частью языка-независимой части Foreign Function Interface (FFI), и обычно импортируется через модуль Foreign.

класс Storable a где Исходный код

Члены этого класса облегчают запись значений примитивных типов в сырую память (которая могла быть выделена с помощью вышеупомянутых процедур) и чтение значений из блоков сырой памяти. Кроме того, класс включает поддержку вычисления требований к хранилищу и ограничений выравнивания для типов, поддерживающих хранение.

Адреса памяти представлены значениями типа Ptr a, для некоторого a, который является экземпляром класса Storable. Тип аргумента для Ptr помогает обеспечить некоторую ценную безопасность типов в коде FFI (вы не можете смешивать указатели разных типов без явного приведения типов), а также помогает системе типов Haskell понять, какой метод маршалинга нужен для данного указателя.

Любой маршалинг между Haskell и иностранным языком в конечном итоге сводится к преобразованию структур данных Haskell в двоичное представление соответствующей структуры данных иностранного языка и наоборот. Для кодирования этого маршалинга в Haskell необходимо управлять примитивными типами данных, хранящимися в неструктурированных блоках памяти. Класс Storable облегчает это управление для всех типов, для которых он создан, это стандартные базовые типы Haskell, типы фиксированной длины Int (Int8, Int16, Int32, Int64), типы фиксированной длины Word (Word8, Word16, Word32, Word64), StablePtr, все типы из Foreign.C.Types, а также Ptr.

Минимальное полное определение

sizeOf, alignment, (peek | peekElemOff | peekByteOff), (poke | pokeElemOff | pokeByteOff)

Методы

sizeOf :: a -> Int Исходный код

Вычисляет требования к хранилищу (в байтах) аргумента. Значение аргумента не используется.

alignment :: a -> Int Исходный код

Вычисляет ограничение выравнивания аргумента. Ограничение выравнивания x выполняется любым адресом, делящимся на x. Значение аргумента не используется.

peekElemOff :: Ptr a -> Int -> IO a Исходный код

Считывает значение из области памяти, рассматриваемой как массив значений одного типа. Первый аргумент указывает начальный адрес массива, а второй - индекс в массиве (первый элемент массива имеет индекс 0). Действует следующее равенство:

peekElemOff addr idx = IOExts.fixIO $ \result ->
  peek (addr `plusPtr` (idx * sizeOf result))

Обратите внимание, что это только спецификация, а не обязательно конкретная реализация функции.

pokeElemOff :: Ptr a -> Int -> a -> IO () Исходный код

Записывает значение в область памяти, рассматриваемую как массив значений одного типа. Действует следующее равенство:

pokeElemOff addr idx x = 
  poke (addr `plusPtr` (idx * sizeOf x)) x

peekByteOff :: Ptr b -> Int -> IO a Исходный код

Считывает значение из местоположения памяти, заданного базовым адресом и смещением. Действует следующее равенство:

peekByteOff addr off = peek (addr `plusPtr` off)

pokeByteOff :: Ptr b -> Int -> a -> IO () Исходный код

Записывает значение в местоположение памяти, заданное базовым адресом и смещением. Действует следующее равенство:

pokeByteOff addr off x = poke (addr `plusPtr` off) x

peek :: Ptr a -> IO a Исходный код

Считывает значение из данного местоположения памяти.

Обратите внимание, что функции peek и poke могут потребовать правильно выровненных адресов для корректной работы. Это зависит от архитектуры; следовательно, переносимый код должен гарантировать, что при чтении или записи значений некоторого типа a, ограничение выравнивания для a, как задано функцией alignment, соблюдается.

poke :: Ptr a -> a -> IO () Исходный код

Записывает данное значение в данное местоположение памяти. Могут применяться ограничения выравнивания; см. peek.

Примеры реализации

Storable Bool
Storable Char
Storable Double
Storable Float
Storable Int
Storable Int8
Storable Int16
Storable Int32
Storable Int64
Storable Word
Storable Word8
Storable Word16
Storable Word32
Storable Word64
Storable Fingerprint
Storable CUIntMax
Storable CIntMax
Storable CUIntPtr
Storable CIntPtr
Storable CSUSeconds
Storable CUSeconds
Storable CTime
Storable CClock
Storable CSigAtomic
Storable CWchar
Storable CSize
Storable CPtrdiff
Storable CDouble
Storable CFloat
Storable CULLong
Storable CLLong
Storable CULong
Storable CLong
Storable CUInt
Storable CInt
Storable CUShort
Storable CShort
Storable CUChar
Storable CSChar
Storable CChar
Storable IntPtr
Storable WordPtr
Storable Fd
Storable CRLim
Storable CTcflag
Storable CSpeed
Storable CCc
Storable CUid
Storable CNlink
Storable CGid
Storable CSsize
Storable CPid
Storable COff
Storable CMode
Storable CIno
Storable CDev
(Storable a, Integral a) => Storable (Ratio a)
Storable (StablePtr a)
Storable (Ptr a)
Storable (FunPtr a)
Storable a => Storable (Complex a)

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Foreign-Storable.html

Spec-Zone.ru

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