Foreign.Marshal.Array

Foreign.Marshal.Array

Haskell 리스트를 단일체(monolithic) 배열로, 또는 그 반대로 마샬링하는 연산을 제공하는 모듈이에요.

출처: Haskell 2010 언어 리포트

본문

module Foreign.Marshal.Array (

    mallocArray,  mallocArray0,  allocaArray,  allocaArray0,  reallocArray,

    reallocArray0,  peekArray,  peekArray0,  pokeArray,  pokeArray0,  newArray,

    newArray0,  withArray,  withArray0,  withArrayLen,  withArrayLen0,

    copyArray,  moveArray,  lengthArray0,  advancePtr

  ) where

Foreign.Marshal.Array 모듈은 Haskell 리스트를 단일체 배열로, 또는 그 반대로 마샬링하는 연산을 제공해요. 대부분의 함수는 두 가지 형태로 제공돼요. 하나는 특별한 종료 요소(termination element)로 끝나는 배열용이고, 다른 하나는 명시적인 길이 매개변수를 사용해 배열의 범위를 정하는 용도예요. 전자의 대표적인 예가 C의 NUL 종결 문자열이에요. 다만 C 문자열은 유니코드 인코딩을 고려해야 하므로, 보통은 Foreign.C.String이 제공하는 함수들을 사용해 마샬링해야 한다는 점에 유의해요.

특별한 종료 요소로 끝나는 배열에 특화된 모든 함수는 이름이 0으로 끝나요 — 예를 들어 mallocArray는 주어진 크기의 배열을 위한 공간을 할당하는 반면, mallocArray0은 종료자(terminator)를 위한 공간이 확보되도록 요소를 하나 더 할당해요.

32.1 배열 마샬링 (Marshalling arrays)

32.1.1 할당 (Allocation)

mallocArray :: Storable a => Int -> IO (Ptr a)

주어진 개수의 storable 타입 요소를 위한 저장 공간을 할당해요(Foreign.Marshal.Alloc.malloc과 같지만, 여러 요소를 위한 것).

mallocArray0 :: Storable a => Int -> IO (Ptr a)

mallocArray와 같지만, 특별한 종료 요소를 담을 추가 위치를 더해요.

allocaArray :: Storable a => Int -> (Ptr a -> IO b) -> IO b

주어진 개수의 요소를 위한 공간을 임시로 할당해요(Foreign.Marshal.Alloc.alloca와 같지만, 여러 요소를 위한 것).

allocaArray0 :: Storable a => Int -> (Ptr a -> IO b) -> IO b

allocaArray와 같지만, 특별한 종료 요소를 담을 추가 위치를 더해요.

reallocArray :: Storable a => Ptr a -> Int -> IO (Ptr a)

배열의 크기를 조정해요.

reallocArray0 :: Storable a => Ptr a -> Int -> IO (Ptr a)

끝 표시(end marker)를 위한 추가 위치를 포함해 배열의 크기를 조정해요.

32.1.2 마샬링 (Marshalling)

peekArray :: Storable a => Int -> Ptr a -> IO [a]

주어진 길이의 배열을 Haskell 리스트로 변환해요.

peekArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO [a]

주어진 끝 표시(end marker)로 종결되는 배열을 Haskell 리스트로 변환해요.

pokeArray :: Storable a => Ptr a -> [a] -> IO ()

리스트 요소들을 메모리에 연속적으로 써요.

pokeArray0 :: Storable a => a -> Ptr a -> [a] -> IO ()

리스트 요소들을 메모리에 연속적으로 쓰고, 주어진 표시 요소로 종결해요.

32.1.3 할당과 마샬링의 결합 (Combined allocation and marshalling)

newArray :: Storable a => [a] -> IO (Ptr a)

storable 요소들의 리스트를 새로 할당된 연속적인 storable 값 수열로 써요(Foreign.Marshal.Utils.new과 같지만, 여러 요소를 위한 것).

newArray0 :: Storable a => a -> [a] -> IO (Ptr a)

storable 요소들의 리스트를 새로 할당된 연속적인 storable 값 수열로 쓰되, 끝은 주어진 끝 표시로 고정해요.

withArray :: Storable a => [a] -> (Ptr a -> IO b) -> IO b

storable 값들의 리스트를 메모리에 임시로 저장해요(Foreign.Marshal.Utils.with와 같지만, 여러 요소를 위한 것).

withArray0 :: Storable a => a -> [a] -> (Ptr a -> IO b) -> IO b

withArray와 같지만, 종결자가 배열이 끝나는 위치를 나타내요.

withArrayLen :: Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b

withArray와 같지만, 액션이 값의 개수를 추가 매개변수로 받아요.

withArrayLen0 :: Storable a => a
                                   -> [a] -> (Int -> Ptr a -> IO b) -> IO b

withArrayLen과 같지만, 종결자가 배열이 끝나는 위치를 나타내요.

32.1.4 복사 (Copying)

(인자 순서: 목적지, 소스)

copyArray :: Storable a => Ptr a -> Ptr a -> Int -> IO ()

주어진 개수의 요소를 두 번째 배열(소스)에서 첫 번째 배열(목적지)로 복사해요. 복사 영역은 겹쳐서는 안 돼요.

moveArray :: Storable a => Ptr a -> Ptr a -> Int -> IO ()

주어진 개수의 요소를 두 번째 배열(소스)에서 첫 번째 배열(목적지)로 복사해요. 복사 영역은 겹쳐도 돼요.

32.1.5 길이 찾기 (Finding the length)

lengthArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO Int

종결자를 제외한 배열의 요소 개수를 돌려줘요.

32.1.6 인덱싱 (Indexing)

advancePtr :: Storable a => Ptr a -> Int -> Ptr a

주어진 요소 개수만큼 배열 안의 포인터를 전진시켜요.

더 알아보기 (Learn more)