aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/raw_pdb/src/PDB_DirectMSFStream.h
blob: 70024592fe01c65c4fe1f8c48e33dcc5d185f714 (plain) (blame)
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
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2011-2022, Molecular Matters GmbH <[email protected]>
// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause)

#pragma once

#include "Foundation/PDB_Macros.h"


// https://llvm.org/docs/PDB/index.html#the-msf-container
// https://llvm.org/docs/PDB/MsfFile.html
namespace PDB
{
	// provides direct access to the data of an MSF stream.
	// inherently thread-safe, the stream doesn't carry any internal offset or similar.
	// trivial to construct.
	// slower individual reads, but pays off when not all data of a stream is needed.
	class PDB_NO_DISCARD DirectMSFStream
	{
	public:
		DirectMSFStream(void) PDB_NO_EXCEPT;
		explicit DirectMSFStream(const void* data, uint32_t blockSize, const uint32_t* blockIndices, uint32_t streamSize) PDB_NO_EXCEPT;

		PDB_DEFAULT_MOVE(DirectMSFStream);

		// Reads a number of bytes from the stream.
		void ReadAtOffset(void* destination, size_t size, size_t offset) const PDB_NO_EXCEPT;

		// Reads from the stream.
		template <typename T>
		PDB_NO_DISCARD inline T ReadAtOffset(size_t offset) const PDB_NO_EXCEPT
		{
			T data;
			ReadAtOffset(&data, sizeof(T), offset);
			return data;
		}

		// Returns the block size of the stream.
		PDB_NO_DISCARD inline uint32_t GetBlockSize(void) const PDB_NO_EXCEPT
		{
			return m_blockSize;
		}

		// Returns the size of the stream.
		PDB_NO_DISCARD inline uint32_t GetSize(void) const PDB_NO_EXCEPT
		{
			return m_size;
		}

	private:
		friend class CoalescedMSFStream;

		struct IndexAndOffset
		{
			uint32_t index;
			uint32_t offsetWithinBlock;
		};

		// Returns the block index and offset within the block that correspond to the given offset.
		PDB_NO_DISCARD IndexAndOffset GetBlockIndexForOffset(uint32_t offset) const PDB_NO_EXCEPT;

		// Returns the offset into the data that corresponds to the given indices and offset within a block.
		PDB_NO_DISCARD size_t GetDataOffsetForIndexAndOffset(const IndexAndOffset& indexAndOffset) const PDB_NO_EXCEPT;

		// Provides read-only access to the memory-mapped data.
		PDB_NO_DISCARD inline const void* GetData(void) const PDB_NO_EXCEPT
		{
			return m_data;
		}

		// Provides read-only access to the block indices.
		PDB_NO_DISCARD inline const uint32_t* GetBlockIndices(void) const PDB_NO_EXCEPT
		{
			return m_blockIndices;
		}

		const void* m_data;
		const uint32_t* m_blockIndices;
		uint32_t m_blockSize;
		uint32_t m_size;
		uint32_t m_blockSizeLog2;

		PDB_DISABLE_COPY(DirectMSFStream);
	};
}