src/Chunk.h
author Jens Alfke <jens@mooseyard.com>
Sun Sep 20 20:39:24 2009 -0700 (2009-09-20)
changeset 1 6cbad782d16a
parent 0 include/Chunk.h@31a43d94cc26
permissions -rw-r--r--
Moved non-public headers out of include/ directory.
jens@0
     1
/*
jens@0
     2
 *  Chunk.h
jens@0
     3
 *  Ottoman
jens@0
     4
 *
jens@0
     5
 *  Created by Jens Alfke on 8/27/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
#ifndef _MOOSEYARD_CHUNK_
jens@0
    11
#define _MOOSEYARD_CHUNK_
jens@0
    12
#include "File.h"
jens@0
    13
jens@0
    14
namespace Mooseyard {
jens@0
    15
    
jens@0
    16
    class KeyValueChunk;
jens@0
    17
    
jens@0
    18
#pragma pack(2)
jens@0
    19
    
jens@0
    20
    /** An item stored in a file. It's prefixed with its length, so that the entire file
jens@0
    21
        can be scanned for chunks easily. */
jens@0
    22
    class Chunk {
jens@0
    23
    public:
jens@0
    24
        uint32_t size() const                       {return _size;}
jens@0
    25
        uint16_t type() const;
jens@0
    26
        
jens@0
    27
        /** If this is a KeyValueChunk, returns itself cast to that type, else NULL. */
jens@0
    28
        const KeyValueChunk* asKeyValue() const;
jens@0
    29
        
jens@0
    30
        /** Write a Chunk to the file, in pieces a la writev. */
jens@0
    31
        static size_t writeMultiple (File *file, uint16_t type,
jens@0
    32
                                     Blob blobs[], int count)  throw(File::Error);
jens@0
    33
        
jens@0
    34
        static size_t writePadding (File *file);
jens@0
    35
jens@0
    36
        static const uint16_t kChunkTypePadding = 0;
jens@0
    37
jens@0
    38
        const void* end() const                     {return offsetBy(this,_size);}
jens@0
    39
jens@0
    40
    protected:
jens@0
    41
        Chunk (uint32_t size, uint16_t type)        :_size(size), _keyLength(0xFFFF), _type(type) { }
jens@0
    42
jens@0
    43
    private:
jens@0
    44
        // This is mapped to data in the file! Don't mess with it!
jens@0
    45
        LittleEndian<uint32_t> _size;
jens@0
    46
        LittleEndian<uint16_t> _keyLength;          // Used by KeyValueChunk; else 0xFFFF
jens@0
    47
        LittleEndian<uint16_t> _type;               // Not used by KeyValueChunk
jens@0
    48
        friend class KeyValueChunk;
jens@0
    49
    };
jens@0
    50
    
jens@0
    51
    
jens@0
    52
    /** A key/value pair as stored in the memory-mapped file. */
jens@0
    53
    class KeyValueChunk :public Chunk {
jens@0
    54
    public:
jens@0
    55
        Blob key() const;
jens@0
    56
        Blob value() const;
jens@0
    57
        
jens@0
    58
        bool hasKey (Blob key) const;
jens@0
    59
        
jens@0
    60
        void validate() const  throw(File::Error);
jens@0
    61
        
jens@0
    62
        /** Write a KeyValueChunk to a file. */
jens@0
    63
        static size_t write (File* file, FilePosition pos, Blob key, Blob value)  throw(File::Error);
jens@0
    64
jens@0
    65
        static const uint16_t kChunkType = 1;
jens@0
    66
jens@0
    67
    private:
jens@0
    68
        const char* valuePtr() const;
jens@0
    69
    };    
jens@0
    70
   
jens@0
    71
#pragma options align=reset
jens@0
    72
    
jens@0
    73
    
jens@0
    74
    /** An iterator over all the Chunks in a file. */
jens@0
    75
    class ChunkIterator {
jens@0
    76
    public:
jens@0
    77
        ChunkIterator (File*, FilePosition start);
jens@0
    78
        
jens@0
    79
        const Chunk* chunk() const              {return _chunk;}
jens@0
    80
        FilePosition position() const           {return _pos;}
jens@0
    81
        bool atEOF() const;
jens@0
    82
        bool next();
jens@0
    83
        
jens@0
    84
        operator const Chunk*() const           {return _chunk;}
jens@0
    85
        virtual bool hasValue() const           {return _chunk != NULL;}
jens@0
    86
        operator bool() const                   {return hasValue();}
jens@0
    87
        ChunkIterator& operator++()             {next(); return *this;}
jens@0
    88
    private:
jens@0
    89
        void _loadChunk();
jens@0
    90
        File *_file;
jens@0
    91
        FilePosition _pos, _length;
jens@0
    92
        const Chunk* _chunk;
jens@0
    93
    };
jens@0
    94
    
jens@0
    95
}
jens@0
    96
jens@0
    97
#endif _MOOSEYARD_CHUNK_