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.
Примеры реализации
© 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