summaryrefslogtreecommitdiffstats
path: root/include/util/types.h
blob: a13bd952d1477d4b07398768d37f5cfbcf8b4fca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * include/util/types.h
 *
 * Copyright (C) 2023 Douglas B. Rumbaugh <drumbaugh@psu.edu>
 *
 * Distributed under the Modified BSD License.
 *
 * A centralized header file for various data types used throughout the
 * code base. There are a few very specific types, such as header formats,
 * that are defined within the header files that make direct use of them,
 * but all generally usable, simple types are defined here.
 *
 * Many of these types were used in the Practical Dynamic Extension for
 * Sampling Indexes work, particularly for external storage and buffer
 * pool systems. They aren't used now, but we're leaving them here to use
 * them in the future, when we add this functionality into this system too.
 */
#pragma once

#include <cstdint>
#include <cstdlib>

namespace de {

/* Represents a page offset within a specific file (physical or virtual) */
typedef uint32_t PageNum;

/*
 * Byte offset within a page. Also used for lengths of records, etc.,
 * within the codebase. size_t isn't necessary, as the maximum offset
 * is only parm::PAGE_SIZE 
 */
typedef uint16_t PageOffset;

/* A unique identifier for a frame within a buffer or cache */
typedef int32_t FrameId;

/* 
 * A unique timestamp for use in MVCC concurrency control. Currently stored in
 * record headers, but not used by anything.
 */
typedef uint32_t Timestamp;
const Timestamp TIMESTAMP_MIN = 0;
const Timestamp TIMESTAMP_MAX = UINT32_MAX;

/* 
 * Invalid values for various IDs. Used throughout the code base to indicate
 * uninitialized values and error conditions.
 */
const PageNum INVALID_PNUM = 0;
const FrameId INVALID_FRID = -1;

/*
 * An ID for a given shard within the index. The level_idx is the index
 * in the memory_levels and disk_levels vectors corresponding to the
 * shard, and the shard_idx is the index with the level (always 0 in the
 * case of leveling). Note that the two vectors of levels are treated
 * as a contiguous index space.
 */
struct ShardID {
    ssize_t level_idx;
    ssize_t shard_idx;

    friend bool operator==(const ShardID &shid1, const ShardID &shid2) {
        return shid1.level_idx == shid2.level_idx && shid1.shard_idx == shid2.shard_idx;
    }
};

/* A placeholder for an invalid shard--also used to indicate the mutable buffer */
const ShardID INVALID_SHID = {-1, -1};

}