jens@0
|
1 |
/*
|
jens@0
|
2 |
* MemoryMap.h
|
jens@0
|
3 |
* Ottoman
|
jens@0
|
4 |
*
|
jens@0
|
5 |
* Created by Jens Alfke on 9/17/09.
|
jens@0
|
6 |
* Copyright 2009 Jens Alfke. All rights reserved.
|
jens@0
|
7 |
* BSD-Licensed: See the file "LICENSE.txt" for details.
|
jens@0
|
8 |
*/
|
jens@0
|
9 |
|
jens@0
|
10 |
#include "File.h"
|
jens@0
|
11 |
|
jens@0
|
12 |
namespace Mooseyard {
|
jens@0
|
13 |
|
jens@0
|
14 |
/** A flexible memory-map on a file, which can handle multiple discontiguous mapped regions.
|
jens@0
|
15 |
Clients usually access this functionality through File, which delegates to it. */
|
jens@0
|
16 |
class MemoryMap {
|
jens@0
|
17 |
public:
|
jens@0
|
18 |
MemoryMap (File* file) :_file(file), _nRegions(0), _regions(NULL) { }
|
jens@0
|
19 |
~MemoryMap();
|
jens@0
|
20 |
|
jens@0
|
21 |
void mapRegion (off_t position, size_t length);
|
jens@0
|
22 |
const void* mappedPosition (off_t position) const;
|
jens@0
|
23 |
|
jens@0
|
24 |
private:
|
jens@0
|
25 |
UNCOPYABLE(MemoryMap);
|
jens@0
|
26 |
class Region;
|
jens@0
|
27 |
const void* _at (off_t) const;
|
jens@0
|
28 |
|
jens@0
|
29 |
File *_file;
|
jens@0
|
30 |
int _nRegions;
|
jens@0
|
31 |
Region **_regions;
|
jens@0
|
32 |
};
|
jens@0
|
33 |
|
jens@0
|
34 |
|
jens@0
|
35 |
class MemoryMap::Region {
|
jens@0
|
36 |
public:
|
jens@0
|
37 |
Region (File*, off_t position, size_t length);
|
jens@0
|
38 |
~Region();
|
jens@0
|
39 |
off_t position() const {return _position;}
|
jens@0
|
40 |
size_t length() const {return _length;}
|
jens@0
|
41 |
off_t end() const {return _position + _length;}
|
jens@0
|
42 |
bool setLength (size_t); // Returns false if it failed
|
jens@0
|
43 |
const void* mappedPosition(off_t);
|
jens@0
|
44 |
private:
|
jens@0
|
45 |
UNCOPYABLE(Region);
|
jens@0
|
46 |
File* const _file;
|
jens@0
|
47 |
const off_t _position;
|
jens@0
|
48 |
size_t _length;
|
jens@0
|
49 |
const uint8_t *_start;
|
jens@0
|
50 |
};
|
jens@0
|
51 |
|
jens@0
|
52 |
|
jens@0
|
53 |
}
|