1 /**
2  * ae.sys.datamm
3  *
4  * License:
5  *   This Source Code Form is subject to the terms of
6  *   the Mozilla Public License, v. 2.0. If a copy of
7  *   the MPL was not distributed with this file, You
8  *   can obtain one at http://mozilla.org/MPL/2.0/.
9  *
10  * Authors:
11  *   Vladimir Panteleev <vladimir@thecybershadow.net>
12  */
13 
14 module ae.sys.datamm;
15 
16 import std.mmfile;
17 import std.typecons;
18 debug import std.stdio;
19 
20 import ae.sys.data;
21 
22 alias MmMode = MmFile.Mode;
23 
24 // ************************************************************************
25 
26 class MappedDataWrapper : DataWrapper
27 {
28 	typeof(scoped!MmFile(null)) mmFile;
29 	void[] mappedData;
30 
31 	this(string name, MmMode mode, size_t from, size_t to)
32 	{
33 		mmFile = scoped!MmFile(name, mode, 0, null);
34 		mappedData = (from || to) ? mmFile.Scoped_payload[from..(to ? to : mmFile.length)] : mmFile.Scoped_payload[];
35 
36 		debug(DATA_REFCOUNT) writefln("? -> %s [%s..%s]: Created MappedDataWrapper", cast(void*)this, contents.ptr, contents.ptr + contents.length);
37 	}
38 
39 	debug(DATA_REFCOUNT)
40 	~this()
41 	{
42 		writefln("? -> %s: Deleted MappedDataWrapper", cast(void*)this);
43 	}
44 
45 	override @property inout(void)[] contents() inout { return mappedData; }
46 	override @property size_t size() const { return mappedData.length; }
47 	override void setSize(size_t newSize) { assert(false, "Can't resize MappedDataWrapper"); }
48 	override @property size_t capacity() const { return mappedData.length; }
49 }
50 
51 auto mapFile(string name, MmMode mode, size_t from = 0, size_t to = 0)
52 {
53 	auto wrapper = unmanagedNew!MappedDataWrapper(name, mode, from, to);
54 	return Data(wrapper, mode != MmMode.read);
55 }