DDNet documentation
Loading...
Searching...
No Matches
snapshot.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef ENGINE_SHARED_SNAPSHOT_H
4#define ENGINE_SHARED_SNAPSHOT_H
5
6#include <cstddef>
7#include <cstdint>
8#include <optional>
9
10// CSnapshot
11
13{
14 friend class CSnapshotBuilder;
15
16 int *Data() { return (int *)(this + 1); }
17
18public:
20
21 const int *Data() const { return (int *)(this + 1); }
22 int InternalType() const { return m_TypeAndId >> 16; }
23 int Id() const { return m_TypeAndId & 0xffff; }
24 int Key() const { return m_TypeAndId; }
25 void Invalidate() { m_TypeAndId = -1; }
26};
27
29{
30 friend class CSnapshotBuilder;
31 int m_DataSize = 0;
32 int m_NumItems = 0;
33
34 int *Offsets() const { return (int *)(this + 1); }
35 char *DataStart() const { return (char *)(Offsets() + m_NumItems); }
36
37 size_t OffsetSize() const { return sizeof(int) * m_NumItems; }
38 size_t TotalSize() const { return sizeof(CSnapshot) + OffsetSize() + m_DataSize; }
39
41
42public:
43 enum
44 {
46 MAX_TYPE = 0x7fff,
47 MAX_ID = 0xffff,
48 MAX_ITEMS = 1024,
51 };
52
53 int NumItems() const { return m_NumItems; }
54 int DataSize() const { return m_DataSize; }
55 const CSnapshotItem *GetItem(int Index) const;
56 int GetItemSize(int Index) const;
57 int GetItemIndex(int Key) const;
58 void InvalidateItem(int Index);
59 int GetItemType(int Index) const;
60 int GetExternalItemType(int InternalType) const;
61 const void *FindItem(int Type, int Id) const;
62
63 unsigned Crc() const;
64 // Prints the raw snapshot data showing item and int boundaries.
65 // See also `CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap)`
66 // For more detailed annotations of the data.
67 void DebugDump() const;
68 bool IsValid(size_t ActualSize) const;
69
70 static const CSnapshot *EmptySnapshot() { return &ms_EmptySnapshot; }
71};
72
73class alignas(int32_t) CSnapshotBuffer
74{
75public:
77
79 const CSnapshot *AsSnapshot() const { return (const CSnapshot *)m_aData; }
80};
81
82class alignas(int32_t) CSnapshotDeltaBuffer
83{
84 // A delta always fits into twice the snapshot size.
85 static constexpr int MAX_SIZE = 2 * CSnapshot::MAX_SIZE;
86
87public:
88 unsigned char m_aData[MAX_SIZE];
89};
90
91// CSnapshotDelta
92
94{
95public:
96 class CData
97 {
98 public:
101 int m_NumTempItems; // needed?
102 int m_aData[1];
103 };
104
105private:
106 enum
107 {
109 };
114
115 static void UndiffItem(const int *pPast, const int *pDiff, int *pOut, int Size, uint64_t *pDataRate);
116
117public:
118 static int DiffItem(const int *pPast, const int *pCurrent, int *pOut, int Size);
120 CSnapshotDelta(const CSnapshotDelta &Old);
121 uint64_t GetDataRate(int Index) const { return m_aSnapshotDataRate[Index]; }
122 uint64_t GetDataUpdates(int Index) const { return m_aSnapshotDataUpdates[Index]; }
123 void SetStaticsize(int ItemType, size_t Size);
124 const CData *EmptyDelta() const;
125 int CreateDelta(const CSnapshot *pFrom, const CSnapshot *pTo, CSnapshotDeltaBuffer *pDstData);
126 int UnpackDelta(const CSnapshot *pFrom, CSnapshotBuffer *pTo, const void *pSrcData, int DataSize);
127 int DebugDumpDelta(const void *pSrcData, int DataSize);
128};
129
130// CSnapshotStorage
131
133{
134public:
150
153
156 void Init();
157 void PurgeAll();
158 void PurgeUntil(int Tick);
159 void Add(int Tick, int64_t Tagtime, size_t DataSize, const void *pData, size_t AltDataSize, const void *pAltData);
160 int Get(int Tick, int64_t *pTagtime, const CSnapshot **ppData, const CSnapshot **ppAltData) const;
161};
162
164{
165 enum
166 {
168 };
169
172
175
178
179 bool AddExtendedItemType(int Index);
180 int GetExtendedItemTypeIndex(int TypeId);
181 int GetTypeFromIndex(int Index) const;
182
183 bool m_Building = false;
184 bool m_HasDroppedItem = false;
185 bool m_Sixup = false;
186
187public:
188 void Init(bool Sixup = false);
189 void Init7(const CSnapshot *pSnapshot);
190
191 bool NewItem(int Type, int Id, const void *pData, int Size);
192 void *NewItemRaw(int Type, int Id, int Size);
193
194 CSnapshotItem *GetItem(int Index);
195 int GetItemSize(int Index) const;
196 int *GetItemData(int Index);
197 std::optional<int> FindItemIndexByKey(int Key);
198
200 int Finish(CSnapshotBuffer *pBuffer);
201};
202
203#endif // ENGINE_SHARED_SNAPSHOT_H
Definition snapshot.h:74
const CSnapshot * AsSnapshot() const
Definition snapshot.h:79
CSnapshot * AsSnapshot()
Definition snapshot.h:78
unsigned char m_aData[CSnapshot::MAX_SIZE]
Definition snapshot.h:76
Definition snapshot.h:164
int FinishIfNoDroppedItems(CSnapshotBuffer *pSnapData)
Definition snapshot.cpp:797
int m_NumItems
Definition snapshot.h:174
int m_aExtendedItemTypes[MAX_EXTENDED_ITEM_TYPES]
Definition snapshot.h:176
CSnapshotItem * GetItem(int Index)
Definition snapshot.cpp:765
bool m_Sixup
Definition snapshot.h:185
void Init(bool Sixup=false)
Definition snapshot.cpp:749
char m_aData[CSnapshot::MAX_SIZE]
Definition snapshot.h:170
bool m_Building
Definition snapshot.h:183
void * NewItemRaw(int Type, int Id, int Size)
Definition snapshot.cpp:888
std::optional< int > FindItemIndexByKey(int Key)
Definition snapshot.cpp:784
bool NewItem(int Type, int Id, const void *pData, int Size)
Definition snapshot.cpp:871
int m_aOffsets[CSnapshot::MAX_ITEMS]
Definition snapshot.h:173
int m_NumExtendedItemTypes
Definition snapshot.h:177
bool m_HasDroppedItem
Definition snapshot.h:184
int * GetItemData(int Index)
Definition snapshot.cpp:779
int GetExtendedItemTypeIndex(int TypeId)
Definition snapshot.cpp:850
@ MAX_EXTENDED_ITEM_TYPES
Definition snapshot.h:167
int Finish(CSnapshotBuffer *pBuffer)
Definition snapshot.cpp:808
int GetItemSize(int Index) const
Definition snapshot.cpp:771
int GetTypeFromIndex(int Index) const
Definition snapshot.cpp:825
void Init7(const CSnapshot *pSnapshot)
Definition sixup_translate_snapshot.cpp:6
int m_DataSize
Definition snapshot.h:171
bool AddExtendedItemType(int Index)
Definition snapshot.cpp:830
Definition snapshot.h:83
static constexpr int MAX_SIZE
Definition snapshot.h:85
unsigned char m_aData[MAX_SIZE]
Definition snapshot.h:88
Definition snapshot.h:97
int m_NumUpdateItems
Definition snapshot.h:100
int m_aData[1]
Definition snapshot.h:102
int m_NumTempItems
Definition snapshot.h:101
int m_NumDeletedItems
Definition snapshot.h:99
CData m_Empty
Definition snapshot.h:113
uint64_t GetDataUpdates(int Index) const
Definition snapshot.h:122
static void UndiffItem(const int *pPast, const int *pDiff, int *pOut, int Size, uint64_t *pDataRate)
Definition snapshot.cpp:250
@ MAX_NETOBJSIZES
Definition snapshot.h:108
uint64_t m_aSnapshotDataRate[CSnapshot::MAX_TYPE+1]
Definition snapshot.h:111
static int DiffItem(const int *pPast, const int *pCurrent, int *pOut, int Size)
Definition snapshot.cpp:233
uint64_t GetDataRate(int Index) const
Definition snapshot.h:121
uint64_t m_aSnapshotDataUpdates[CSnapshot::MAX_TYPE+1]
Definition snapshot.h:112
CSnapshotDelta()
Definition snapshot.cpp:273
short m_aItemSizes[MAX_NETOBJSIZES]
Definition snapshot.h:110
Definition snapshot.h:13
void Invalidate()
Definition snapshot.h:25
int Id() const
Definition snapshot.h:23
int m_TypeAndId
Definition snapshot.h:19
const int * Data() const
Definition snapshot.h:21
int InternalType() const
Definition snapshot.h:22
int Key() const
Definition snapshot.h:24
friend class CSnapshotBuilder
Definition snapshot.h:14
int * Data()
Definition snapshot.h:16
Definition snapshot.h:136
int m_Tick
Definition snapshot.h:142
int m_SnapSize
Definition snapshot.h:144
int m_AltSnapSize
Definition snapshot.h:145
CHolder * m_pPrev
Definition snapshot.h:138
CHolder * m_pNext
Definition snapshot.h:139
CSnapshot * m_pAltSnap
Definition snapshot.h:148
int64_t m_Tagtime
Definition snapshot.h:141
CSnapshot * m_pSnap
Definition snapshot.h:147
~CSnapshotStorage()
Definition snapshot.h:155
CSnapshotStorage()
Definition snapshot.h:154
void PurgeAll()
Definition snapshot.cpp:641
void Init()
Definition snapshot.cpp:635
CHolder * m_pLast
Definition snapshot.h:152
CHolder * m_pFirst
Definition snapshot.h:151
Definition snapshot.h:29
int GetExternalItemType(int InternalType) const
Definition snapshot.cpp:43
static const CSnapshot * EmptySnapshot()
Definition snapshot.h:70
int * Offsets() const
Definition snapshot.h:34
const CSnapshotItem * GetItem(int Index) const
Definition snapshot.cpp:23
size_t TotalSize() const
Definition snapshot.h:38
char * DataStart() const
Definition snapshot.h:35
int m_NumItems
Definition snapshot.h:32
const void * FindItem(int Type, int Id) const
Definition snapshot.cpp:79
int GetItemIndex(int Key) const
Definition snapshot.cpp:63
@ MAX_ID
Definition snapshot.h:47
@ MAX_ITEMS
Definition snapshot.h:48
@ MAX_SIZE
Definition snapshot.h:50
@ MAX_TYPE
Definition snapshot.h:46
@ MAX_PARTS
Definition snapshot.h:49
@ OFFSET_UUID_TYPE
Definition snapshot.h:45
int DataSize() const
Definition snapshot.h:54
int GetItemType(int Index) const
Definition snapshot.cpp:37
void InvalidateItem(int Index)
Definition snapshot.cpp:74
void DebugDump() const
Definition snapshot.cpp:127
unsigned Crc() const
Definition snapshot.cpp:112
size_t OffsetSize() const
Definition snapshot.h:37
bool IsValid(size_t ActualSize) const
Definition snapshot.cpp:140
friend class CSnapshotBuilder
Definition snapshot.h:30
int m_DataSize
Definition snapshot.h:31
int NumItems() const
Definition snapshot.h:53
static const CSnapshot ms_EmptySnapshot
Definition snapshot.h:40
int GetItemSize(int Index) const
Definition snapshot.cpp:30