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
82// CSnapshotDelta
83
85{
86public:
87 class CData
88 {
89 public:
92 int m_NumTempItems; // needed?
93 int m_aData[1];
94 };
95
96private:
97 enum
98 {
100 };
105
106 static void UndiffItem(const int *pPast, const int *pDiff, int *pOut, int Size, uint64_t *pDataRate);
107
108public:
109 static int DiffItem(const int *pPast, const int *pCurrent, int *pOut, int Size);
111 CSnapshotDelta(const CSnapshotDelta &Old);
112 uint64_t GetDataRate(int Index) const { return m_aSnapshotDataRate[Index]; }
113 uint64_t GetDataUpdates(int Index) const { return m_aSnapshotDataUpdates[Index]; }
114 void SetStaticsize(int ItemType, size_t Size);
115 const CData *EmptyDelta() const;
116 int CreateDelta(const CSnapshot *pFrom, const CSnapshot *pTo, void *pDstData);
117 int UnpackDelta(const CSnapshot *pFrom, CSnapshotBuffer *pTo, const void *pSrcData, int DataSize);
118 int DebugDumpDelta(const void *pSrcData, int DataSize);
119};
120
121// CSnapshotStorage
122
124{
125public:
141
144
147 void Init();
148 void PurgeAll();
149 void PurgeUntil(int Tick);
150 void Add(int Tick, int64_t Tagtime, size_t DataSize, const void *pData, size_t AltDataSize, const void *pAltData);
151 int Get(int Tick, int64_t *pTagtime, const CSnapshot **ppData, const CSnapshot **ppAltData) const;
152};
153
155{
156 enum
157 {
159 };
160
163
166
169
170 bool AddExtendedItemType(int Index);
171 int GetExtendedItemTypeIndex(int TypeId);
172 int GetTypeFromIndex(int Index) const;
173
174 bool m_Building = false;
175 bool m_HasDroppedItem = false;
176 bool m_Sixup = false;
177
178public:
179 void Init(bool Sixup = false);
180 void Init7(const CSnapshot *pSnapshot);
181
182 bool NewItem(int Type, int Id, const void *pData, int Size);
183 void *NewItemRaw(int Type, int Id, int Size);
184
185 CSnapshotItem *GetItem(int Index);
186 int GetItemSize(int Index) const;
187 int *GetItemData(int Index);
188 std::optional<int> FindItemIndexByKey(int Key);
189
191 int Finish(CSnapshotBuffer *pBuffer);
192};
193
194#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:155
int FinishIfNoDroppedItems(CSnapshotBuffer *pSnapData)
Definition snapshot.cpp:775
int m_NumItems
Definition snapshot.h:165
int m_aExtendedItemTypes[MAX_EXTENDED_ITEM_TYPES]
Definition snapshot.h:167
CSnapshotItem * GetItem(int Index)
Definition snapshot.cpp:743
bool m_Sixup
Definition snapshot.h:176
void Init(bool Sixup=false)
Definition snapshot.cpp:727
char m_aData[CSnapshot::MAX_SIZE]
Definition snapshot.h:161
bool m_Building
Definition snapshot.h:174
void * NewItemRaw(int Type, int Id, int Size)
Definition snapshot.cpp:866
std::optional< int > FindItemIndexByKey(int Key)
Definition snapshot.cpp:762
bool NewItem(int Type, int Id, const void *pData, int Size)
Definition snapshot.cpp:849
int m_aOffsets[CSnapshot::MAX_ITEMS]
Definition snapshot.h:164
int m_NumExtendedItemTypes
Definition snapshot.h:168
bool m_HasDroppedItem
Definition snapshot.h:175
int * GetItemData(int Index)
Definition snapshot.cpp:757
int GetExtendedItemTypeIndex(int TypeId)
Definition snapshot.cpp:828
@ MAX_EXTENDED_ITEM_TYPES
Definition snapshot.h:158
int Finish(CSnapshotBuffer *pBuffer)
Definition snapshot.cpp:786
int GetItemSize(int Index) const
Definition snapshot.cpp:749
int GetTypeFromIndex(int Index) const
Definition snapshot.cpp:803
void Init7(const CSnapshot *pSnapshot)
Definition sixup_translate_snapshot.cpp:6
int m_DataSize
Definition snapshot.h:162
bool AddExtendedItemType(int Index)
Definition snapshot.cpp:808
Definition snapshot.h:88
int m_NumUpdateItems
Definition snapshot.h:91
int m_aData[1]
Definition snapshot.h:93
int m_NumTempItems
Definition snapshot.h:92
int m_NumDeletedItems
Definition snapshot.h:90
CData m_Empty
Definition snapshot.h:104
uint64_t GetDataUpdates(int Index) const
Definition snapshot.h:113
@ MAX_NETOBJSIZES
Definition snapshot.h:99
uint64_t m_aSnapshotDataRate[CSnapshot::MAX_TYPE+1]
Definition snapshot.h:102
uint64_t GetDataRate(int Index) const
Definition snapshot.h:112
uint64_t m_aSnapshotDataUpdates[CSnapshot::MAX_TYPE+1]
Definition snapshot.h:103
CSnapshotDelta()
Definition snapshot.cpp:260
short m_aItemSizes[MAX_NETOBJSIZES]
Definition snapshot.h:101
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:127
int m_Tick
Definition snapshot.h:133
int m_SnapSize
Definition snapshot.h:135
int m_AltSnapSize
Definition snapshot.h:136
CHolder * m_pPrev
Definition snapshot.h:129
CHolder * m_pNext
Definition snapshot.h:130
CSnapshot * m_pAltSnap
Definition snapshot.h:139
int64_t m_Tagtime
Definition snapshot.h:132
CSnapshot * m_pSnap
Definition snapshot.h:138
~CSnapshotStorage()
Definition snapshot.h:146
CSnapshotStorage()
Definition snapshot.h:145
void PurgeAll()
Definition snapshot.cpp:628
void Init()
Definition snapshot.cpp:622
CHolder * m_pLast
Definition snapshot.h:143
CHolder * m_pFirst
Definition snapshot.h:142
Definition snapshot.h:29
int GetExternalItemType(int InternalType) const
Definition snapshot.cpp:42
static const CSnapshot * EmptySnapshot()
Definition snapshot.h:70
int * Offsets() const
Definition snapshot.h:34
const CSnapshotItem * GetItem(int Index) const
Definition snapshot.cpp:22
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:78
int GetItemIndex(int Key) const
Definition snapshot.cpp:62
@ 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:36
void InvalidateItem(int Index)
Definition snapshot.cpp:73
void DebugDump() const
Definition snapshot.cpp:126
unsigned Crc() const
Definition snapshot.cpp:111
size_t OffsetSize() const
Definition snapshot.h:37
bool IsValid(size_t ActualSize) const
Definition snapshot.cpp:139
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:29
static void UndiffItem(const uint32_t *pPast, const uint32_t *pDiff, uint32_t *pOut, size_t Size)
Definition ghost.cpp:454
static void DiffItem(const uint32_t *pPast, const uint32_t *pCurrent, uint32_t *pOut, size_t Size)
Definition ghost.cpp:88