[/
    Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail dot com)

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
]

[section:File File]

The [*File] concept abstracts access to files in the underlying file system.
To support other platform interfaces, users may author their own [*File]
types which meet these requirements.

[heading Associated Types]

* [link beast.ref.boost__beast__file_mode `file_mode`]
* [link beast.ref.boost__beast__is_file `is_file`]

[heading Requirements]

In this table:

* `F` is a [*File] type
* `f` is an instance of `F`
* `p` is a value of type `char const*` which points to a null
      terminated utf-8 encoded string.
* `m` is an instance of [link beast.ref.boost__beast__file_mode `file_mode`]
* `n` is a number of bytes, convertible to `std::size_t`
* `o` is a byte offset in the file, convertible to `std::uint64_t`
* `b` is any non-const pointer to memory
* `c` is any possibly-const pointer to memory
* `ec` is a reference of type [link beast.ref.boost__beast__error_code `error_code`]

[table Valid expressions
[[Expression] [Type] [Semantics, Pre/Post-conditions]]
[[Operation] [Return Type] [Semantics, Pre/Post-conditions]]
[
    [`F()`]
    [ ]
    [
        Default constructable
    ]
]
[
    [`f.~F()`]
    [ ]
    [
        Destructible.
        If `f` refers to an open file, it is first closed
        as if by a call to `close` with the error ignored.
    ]
]
[
    [`f.is_open()`]
    [`bool`]
    [
        Returns `true` if `f` refers to an open file, `false` otherwise.
    ]
]
[
    [`f.close(ec)`]
    []
    [
        If `f` refers to an open file, this function attempts to
        close the file.
        Regardless of whether an error occurs or not, a subsequent
        call to `f.is_open()` will return `false`.
        The function will ensure that `!ec` is `true` if there was
        no error or set to the appropriate error code if an error
        occurred. 
    ]
]
[
    [`f.open(p,m,ec)`]
    []
    [
        Attempts to open the file at the path specified by `p`
        with the mode specified by `m`.
        Upon success, a subsequent call to `f.is_open()` will
        return `true`.
        If `f` refers to an open file, it is first closed
        as if by a call to `close` with the error ignored.
        The function will ensure that `!ec` is `true` if there was
        no error or set to the appropriate error code if an error
        occurred. 

    ]
]
[
    [`f.size(ec)`]
    [`std::uint64_t`]
    [
        If `f` refers to an open file, this function attempts to
        determine the file size and return its value.
        If `f` does not refer to an open file, the function will
        set `ec` to `errc::invalid_argument` and return 0.
        The function will ensure that `!ec` is `true` if there was
        no error or set to the appropriate error code if an error
        occurred. 
    ]
]
[
    [`f.pos(ec)`]
    [`std::uint64_t`]
    [
        If `f` refers to an open file, this function attempts to
        determine the current file offset and return it.
        If `f` does not refer to an open file, the function will
        set `ec` to `errc::invalid_argument` and return 0.
        The function will ensure that `!ec` is `true` if there was
        no error or set to the appropriate error code if an error
        occurred. 
    ]
]
[
    [`f.seek(o,ec)`]
    []
    [
        Attempts to reposition the current file offset to the value
        `o`, which represents a byte offset relative to the beginning
        of the file.
        If `f` does not refer to an open file, the function will
        set `ec` to `errc::invalid_argument` and return immediately.
        The function will ensure that `!ec` is `true` if there was
        no error or set to the appropriate error code if an error
        occurred. 
    ]
]
[
    [`f.read(b,n,ec)`]
    [`std::size_t`]
    [
        Attempts to read `n` bytes starting at the current file offset
        from the open file referred to by `f`.
        Bytes read are stored in the memory buffer at address `b` which
        must be at least `n` bytes in size.
        The function advances the file offset by the amount read, and
        returns the number of bytes actually read, which may be less
        than `n`.
        If `f` does not refer to an open file, the function will
        set `ec` to `errc::invalid_argument` and return immediately.
        The function will ensure that `!ec` is `true` if there was
        no error or set to the appropriate error code if an error
        occurred.
        If an end-of-file condition is detected prior to reading any
        bytes, the function will ensure that `!ec` is `true` and the
        return value shall be 0.
    ]
]
[
    [`f.write(c,n,ec)`]
    [`std::size_t`]
    [
        Attempts to write `n` bytes from the buffer pointed to by `c` to
        the current file offset of the open file referred to by `f`. 
        The memory buffer at `c` must point to storage of at least `n`
        bytes meant to be copied to the file.
        The function advances the file offset by the amount written,
        and returns the number of bytes actually written, which may be
        less than `n`.
        If `f` does not refer to an open file, the function will
        set `ec` to `errc::invalid_argument` and return immediately.
        The function will ensure that `!ec` is `true` if there was
        no error or set to the appropriate error code if an error
        occurred. 
    ]
]
]

[heading Exemplar]

[concept_File]

[heading Models]

* [link beast.ref.boost__beast__file_posix `file_posix`]
* [link beast.ref.boost__beast__file_stdio `file_stdio`]
* [link beast.ref.boost__beast__file_win32 `file_win32`]

[endsect]
