summaryrefslogtreecommitdiff
path: root/include/pso/TMenuList.h
blob: f7924629c82f2de4c4086b58e7df77855383d9da (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#ifndef TMENULIST_H
#define TMENULIST_H

#include "pso/forward.h"
#include "pso/protocol.h"
#include "pso/macros.h"
#include "pso/TPlyGuildCardTag.h"
#include <global_types.h>

template <typename T>
class TMenuListEntry : public TPlyGuildCardTag {
	public:
	T entry;

	void bswap();
	TMenuListEntry &operator=(const TMenuListEntry &src);
} __packed__;

template <typename T, int num_entries, int num_pad_entries>
class TMenuList {
	public:
	packet_header header;
	TMenuListEntry<T> pad_entries[num_pad_entries];
	TMenuListEntry<T> entries[num_entries];

	void bswap();
	TMenuList &operator=(const TMenuList &src);

} __packed__;

template <typename T, int num_entries>
class TMenuList<T, num_entries, 0> {
	public:
	packet_header header;
	TMenuListEntry<T> entries[num_entries];

	void bswap();
	TMenuList &operator=(const TMenuList &src);
} __packed__;

template <typename T, int num_pad_entries>
class TMenuList<T, 0, num_pad_entries> {
	public:
	packet_header header;
	TMenuListEntry<T> pad_entries[num_pad_entries];

	void bswap();
	TMenuList &operator=(const TMenuList &src);
} __packed__;


template <typename T, int num_entries>
void TMenuList<T, num_entries, 0>::bswap() {
	header.bswap();
	for (int i = 0; i < num_entries; i++) {
		entries[i].bswap();
	}
}

template <typename T, int num_pad_entries>
void TMenuList<T, 0, num_pad_entries>::bswap() {
	header.bswap();
	for (int i = 0; i < num_pad_entries; i++) {
		pad_entries[i].bswap();
	}
}

template <typename T, int num_entries, int num_pad_entries>
void TMenuList<T, num_entries, num_pad_entries>::bswap() {
	header.bswap();
	if (num_pad_entries) {
		for (int i = 0; i < num_pad_entries; i++) {
			pad_entries[i].bswap();
		}
	}
	if (num_entries) {
		for (int i = 0; i < num_entries; i++) {
			entries[i].bswap();
		}
	}
}

template <typename T>
void TMenuListEntry<T>::bswap() {
	TPlyGuildCardTag::bswap();
	entry.bswap();
}


template <typename T, int num_entries>
TMenuList<T, num_entries, 0> &TMenuList<T, num_entries, 0>::operator=(const TMenuList<T, num_entries, 0> &src) {
	header = src.header;
	for (int i = 0; i < num_entries; i++) {
		entries[i] = src.entries[i];
	}
	return *this;
}

template <typename T, int num_pad_entries>
TMenuList<T, 0, num_pad_entries> &TMenuList<T, 0, num_pad_entries>::operator=(const TMenuList<T, 0, num_pad_entries> &src) {
	header = src.header;
	for (int i = 0; i < num_pad_entries; i++) {
		pad_entries[i] = src.pad_entries[i];
	}
	return *this;
}

template <typename T, int num_entries, int num_pad_entries>
TMenuList<T, num_entries, num_pad_entries> &TMenuList<T, num_entries, num_pad_entries>::operator=(const TMenuList<T, num_entries, num_pad_entries> &src) {
	header = src.header;
	if (num_pad_entries) {
		for (int i = 0; i < num_pad_entries; i++) {
			pad_entries[i] = src.pad_entries[i];
		}
	}
	if (num_entries) {
		for (int i = 0; i < num_entries; i++) {
			entries[i] = src.entries[i];
		}
	}
	return *this;
}

template <typename T>
TMenuListEntry<T> &TMenuListEntry<T>::operator=(const TMenuListEntry<T> &src) {
	TPlyGuildCardTag::operator=(src);
	entry = src.entry;
	return *this;
}
#endif