src/MemoryMap.h
author Jens Alfke <jens@mooseyard.com>
Sun Sep 20 20:39:24 2009 -0700 (2009-09-20)
changeset 1 6cbad782d16a
parent 0 include/MemoryMap.h@31a43d94cc26
permissions -rw-r--r--
Moved non-public headers out of include/ directory.
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
}