Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

103
LINES

< > BotCompany Repo | #1002114 // structs.h from cheesebase

Document

// Licensed under the Apache License 2.0 (see LICENSE file).

#pragma once

#include "common.h"
#include "compiler.h"
#include <gsl.h>

namespace cheesebase {

enum class BlockType {
  pg = 'P', // 1 page (4k)
  t1 = '1', // 1/2 page (2k)
  t2 = '2', // 1/4 page (1k)
  t3 = '3', // 1/8 page (512)
  t4 = '4'  // 1/16 page (256)
};

constexpr size_t toBlockSize(BlockType t) {
  return t == BlockType::pg
             ? k_page_size
             : t == BlockType::t1
                   ? k_page_size / 2
                   : t == BlockType::t2
                         ? k_page_size / 4
                         : t == BlockType::t3
                               ? k_page_size / 8
                               : t == BlockType::t4 ? k_page_size / 16
                                                    : throw ConsistencyError(
                                                          "Invalid block type");
}

CB_PACKED(struct DskBlockHdr {
  DskBlockHdr() = default;
  DskBlockHdr(BlockType type, Addr next) {
    auto type_value = static_cast<uint64_t>(type);
    Expects(type_value <= 0xff);
    Expects(next < ((uint64_t)1 << 56));
    data = (type_value << 56) + (next & (((uint64_t)1 << 56) - 1));
  };

  PageNr next() const noexcept { return (data & (((uint64_t)1 << 56) - 1)); }

  BlockType type() const noexcept {
    return gsl::narrow_cast<BlockType>(data >> 56);
  }

  uint64_t data;
});

const uint64_t magic = *((uint64_t const*)"CHSBSE01");

CB_PACKED(struct DskDatabaseHdr {
  uint64_t magic;
  uint64_t end_of_file;
  uint64_t free_alloc_pg;
  uint64_t free_alloc_t1;
  uint64_t free_alloc_t2;
  uint64_t free_alloc_t3;
  uint64_t free_alloc_t4;
});
static_assert(sizeof(DskDatabaseHdr) <= k_page_size / 2,
              "Database header should be smaller than half of the page size");

using Key = uint64_t;

CB_PACKED(struct DskKey {
  DskKey() = default;
  DskKey(uint32_t h, uint16_t i) : hash(h), index(i) {}
  DskKey(Key k) {
    k >>= 16;
    index = gsl::narrow_cast<uint16_t>(k);
    hash = gsl::narrow_cast<uint32_t>(k >> 16);
  }
  Key key() const {
    return ((static_cast<uint64_t>(hash) << 16) + index) << 16;
  }
  uint32_t hash;
  uint16_t index;

  bool operator!=(const DskKey& o) {
    return this->hash != o.hash || this->index != o.index;
  }
  bool operator==(const DskKey& o) { return !(*this != o); }
});
static_assert(sizeof(DskKey) == 6, "Invalid disk key size");

CB_PACKED(using DskKeyCacheSize = uint16_t);
static_assert(sizeof(DskKeyCacheSize) == 2, "Invalid disk key cache size size");

CB_PACKED(struct DskValueHdr {
  uint8_t magic_byte;
  uint8_t type;
});
static_assert(sizeof(DskValueHdr) == 2, "Invalid disk value header size");

CB_PACKED(struct DskPair {
  DskKey key;
  DskValueHdr value;
});
static_assert(sizeof(DskPair) == 8, "invalid disk pair size");

} // namespace cheesebase

Author comment

(C++ example code for TinyBrain)

download  show line numbers   

Travelled to 12 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1002114
Snippet name: structs.h from cheesebase
Eternal ID of this version: #1002114/1
Text MD5: 51038af73c2e17202b4c23eea9206537
Author: stefan
Category: C++
Type: Document
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2015-12-19 00:55:05
Source code size: 2949 bytes / 103 lines
Pitched / IR pitched: No / Yes
Views / Downloads: 653 / 545
Referenced in: #1002115 - Find brackets in C++
#1002117 - Find all initializers
#3000204 - Answer for stefanreich (>> t cheesebase)
#3000382 - Answer for ferdie (>> t = 1, f = 0)
#3000383 - Answer for funkoverflow (>> t=1, f=0 okay)