Fix 24339 - std.mmfile has poor documentation

This commit is contained in:
Dennis Korpel 2024-01-13 10:37:35 +01:00 committed by The Dlang Bot
parent fa7f22b2cf
commit fc804bb8da

View file

@ -2,10 +2,22 @@
/**
* Read and write memory mapped files.
*
* Memory mapped files are a mechanism in operating systems that allows
* file access through virtual memory. After opening a file with `MmFile`,
* the contents can be read from or written to with standard slice / pointer operations.
* Changes to the memory are automatically reflected in the underlying file.
*
* Memory mapping can increase I/O performance of large files, compared to buffered
* read / write operations from `std.file` and `std.stdio`. However, I/O errors are
* not handled as safely: when for example the disk that the file is on gets removed,
* reading from it may result in a segfault.
*
* Copyright: Copyright The D Language Foundation 2004 - 2009.
* License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: $(HTTP digitalmars.com, Walter Bright),
* Matthew Wilson
* References: $(LINK https://en.wikipedia.org/wiki/Memory-mapped_file)
* Source: $(PHOBOSSRC std/mmfile.d)
*
* $(SCRIPT inhibitQuickIndex = 1;)
@ -612,23 +624,45 @@ private:
{
static assert(0);
}
}
// Report error, where errno gives the error number
// void errNo()
// {
// version (Windows)
// {
// throw new FileException(filename, GetLastError());
// }
// else version (linux)
// {
// throw new FileException(filename, errno);
// }
// else
// {
// static assert(0);
// }
// }
/// Read an existing file
@system unittest
{
import std.file;
std.file.write(deleteme, "hello"); // deleteme is a temporary filename
scope(exit) remove(deleteme);
// Use a scope class so the file will be closed at the end of this function
scope mmfile = new MmFile(deleteme);
assert(mmfile.length == "hello".length);
// Access file contents with the slice operator
// This is typed as `void[]`, so cast to `char[]` or `ubyte[]` to use it
const data = cast(const(char)[]) mmfile[];
// At this point, the file content hasn't been read yet.
// The OS will
assert(data[0 .. 5] == "hello");
}
/// Write a new file
@system unittest
{
import std.file;
scope(exit) remove(deleteme);
scope mmfile = new MmFile(deleteme, MmFile.Mode.readWriteNew, 5, null);
assert(mmfile.length == 5);
// Assign through operator overload of `MmFile`
auto data = cast(ubyte[]) mmfile[];
data[] = '\n';
mmfile.flush();
assert(std.file.read(deleteme) == "\n\n\n\n\n");
}
@system unittest