The following overview shows which members are called by which em(stream)
read/write/seek requests:
    itemization(
    itt(seek) requests tt(seekg, seekp) call tt(seekoff). The member
        tt(streambuf::seekpos) is maybe also called, but in practice
        tt(seekpos) calls tt(seekoff);

    itt(get) calls tt(underflow) if there's no (or an exhausted) read
        buffer. Otherwise it returns the character at tt(gptr()), incrementing
        its position;

    itt(>>)  calls tt(underflow) if there's no (or an exhausted) read
        buffer. Otherwise if white-space characters are ignored (which is the
        default) all white-space characters are skipped and the stream reads
        the matching bytes from the read buffer, refreshing the buffer when
        needed;

    itt(read) calls tt(xsgetn) (which itself calls tt(underflow)) if there's
        no or an exhausted read buffer, and tries to read the requested number
        of characters from the device;
    
    itt(rdbuf()) is used to insert the device's content from its current
        offset position. It calls tt(underflow) and reads all the buffer's
        characters until tt(underflow) returns bf(EOF).

    itt(put) calls tt(overflow) if there's no (or a  filled up) write
        buffer. Otherwise it returns the character at tt(pptr()), incrementing
        its position;

    itt(<<) calls tt(overflow) if there's no (or a filled up) write
        buffer. Otherwise the argument may be converted to characters (like
        when insterting an tt(int) value) and the resulting characters are
        inserted into the device, refreshing the buffer when needed;

    itt(write) calls tt(xsputn) (which itself calls tt(overflow)) if there's
        no or a filled up wrte buffer, and tries to write the requested number
        of characters to the device.
    )
