Copyright | (c) The University of Glasgow 2008 |
---|---|
License | see libraries/base/LICENSE |
Maintainer | cvs-ghc@haskell.org |
Stability | internal |
Portability | non-portable (GHC Extensions) |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Buffers used in the IO system
- data Buffer e = Buffer {}
- data BufferState
- 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
- isEmptyBuffer :: Buffer e -> Bool
- isFullBuffer :: Buffer e -> Bool
- isFullCharBuffer :: Buffer e -> Bool
- isWriteBuffer :: Buffer e -> Bool
- bufferElems :: Buffer e -> Int
- bufferAvailable :: Buffer e -> Int
- summaryBuffer :: Buffer a -> String
- 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
Buffers of any element
A mutable array of bytes that can be passed to foreign functions.
The buffer is represented by a record, where the record contains the raw buffer and the start/end points of the filled portion. The buffer contents itself is mutable, but the rest of the record is immutable. This is a slightly odd mix, but it turns out to be quite practical: by making all the buffer metadata immutable, we can have operations on buffer metadata outside of the IO monad.
The "live" elements of the buffer are those between the bufL
and
bufR
offsets. In an empty buffer, bufL
is equal to bufR
, but
they might not be zero: for exmaple, the buffer might correspond to
a memory-mapped file and in which case bufL
will point to the
next location to be written, which is not necessarily the beginning
of the file.
type CharBuffer = Buffer CharSource
type CharBufElem = CharSource
Creation
newByteBuffer :: Int -> BufferState -> IO (Buffer Word8)Source
newCharBuffer :: Int -> BufferState -> IO CharBufferSource
emptyBuffer :: RawBuffer e -> Int -> BufferState -> Buffer eSource
Insertion/removal
bufferRemove :: Int -> Buffer e -> Buffer eSource
slideContents :: Buffer Word8 -> IO (Buffer Word8)Source
slides the contents of the buffer to the beginning
bufferAdjustL :: Int -> Buffer e -> Buffer eSource
Inspecting
isEmptyBuffer :: Buffer e -> BoolSource
isFullBuffer :: Buffer e -> BoolSource
isFullCharBuffer :: Buffer e -> BoolSource
isWriteBuffer :: Buffer e -> BoolSource
bufferElems :: Buffer e -> IntSource
bufferAvailable :: Buffer e -> IntSource
summaryBuffer :: Buffer a -> StringSource
Operating on the raw buffer as a Ptr
Assertions
checkBuffer :: Buffer a -> IO ()Source
Raw buffers
type RawBuffer e = ForeignPtr eSource
peekCharBuf :: RawCharBuffer -> Int -> IO CharSource
readCharBuf :: RawCharBuffer -> Int -> IO (Char, Int)Source
writeCharBuf :: RawCharBuffer -> Int -> Char -> IO IntSource
readCharBufPtr :: Ptr CharBufElem -> Int -> IO (Char, Int)Source
writeCharBufPtr :: Ptr CharBufElem -> Int -> Char -> IO IntSource