Foreign.Marshal.Array
Foreign.Marshal.Array
Haskell 리스트를 단일체(monolithic) 배열로, 또는 그 반대로 마샬링하는 연산을 제공하는 모듈이에요.
본문
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)
- 메모리 해제·재할당을 위한 기본 루틴은 31장 Foreign.Marshal.Alloc에서 다뤄요.
- C 문자열(NUL 종결) 마샬링은 27장 Foreign.C.String에서 다뤄요.