Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #pragma once
00015
00019 #include <vector>
00020 #include <cassert>
00021 #include <string>
00022
00023 #include "kNet/SharedPtr.h"
00024
00025 #include "kNet/MessageListParser.h"
00026 #include "kNet/SerializedDataIterator.h"
00027 #include "kNet/VLEPacker.h"
00028
00029 namespace kNet
00030 {
00031
00032 struct SerializedMessage : public RefCountable
00033 {
00034 std::vector<char> data;
00035 };
00036
00039 class DataSerializer
00040 {
00041 public:
00045 explicit DataSerializer(size_t maxBytes_ = 128 * 1024);
00046
00049 DataSerializer(size_t maxBytes_, const SerializedMessageDesc *msgTemplate);
00050
00052 DataSerializer(char *data_, size_t maxBytes_);
00053
00055 DataSerializer(char *data_, size_t maxBytes_, const SerializedMessageDesc *msgTemplate);
00056
00059 explicit DataSerializer(std::vector<char> &data, size_t maxBytes);
00060
00063 DataSerializer(std::vector<char> &data, size_t maxBytes, const SerializedMessageDesc *msgTemplate);
00064
00070 template<typename T>
00071 void Add(const T &value);
00072
00073 template<typename VLEType>
00074 void AddVLE(u32 value);
00075
00079 void AppendBits(u32 value, int amount);
00080
00083 void AddString(const char *str);
00084
00086 void AddString(const std::string &str) { AddString(str.c_str()); }
00087
00089 template<typename T>
00090 void AddArray(const T *data, u32 count);
00091
00094 void AddAlignedByteArray(const void *data, u32 numBytes);
00095
00097 void SetVaryingElemSize(u32 count);
00098
00099 void ResetFill();
00100
00101 char *GetData() const { return data; }
00102
00105 void SkipNumBytes(size_t numBytes);
00106
00108 size_t BytesFilled() const { return elemOfs + ((bitOfs != 0) ? 1 : 0); }
00109
00111 size_t BitsFilled() const { return elemOfs * 8 + bitOfs; }
00112
00114 size_t Capacity() const { return maxBytes; }
00115
00117 size_t ByteOffset() const { return elemOfs; }
00118
00120 size_t BitOffset() const { return bitOfs; }
00121
00122 private:
00123 void AppendByte(u8 byte);
00124 void AppendUnalignedByte(u8 byte);
00125 void AppendAlignedByte(u8 byte);
00126
00128 Ptr(SerializedDataIterator) iter;
00129
00131 char *data;
00132
00134 size_t maxBytes;
00135
00137 Ptr(SerializedMessage) messageData;
00139 size_t elemOfs;
00141 int bitOfs;
00142 };
00143
00144 template<typename T>
00145 void DataSerializer::Add(const T &value)
00146 {
00147 #ifdef _DEBUG
00148 if (iter)
00149 {
00150 BasicSerializedDataType nextExpectedType = iter->NextElementType();
00151 BasicSerializedDataType currentFilledType = SerializedDataTypeTraits<T>::type;
00152 assert(nextExpectedType == currentFilledType);
00153 }
00154 #endif
00155 const u8 *data = reinterpret_cast<const u8*>(&value);
00156
00157 for(int i = 0; i < sizeof(value); ++i)
00158 AppendByte(data[i]);
00159
00160 if (iter)
00161 iter->ProceedToNextVariable();
00162 }
00163
00164 template<> void DataSerializer::Add<char*>(char * const & value);
00165 template<> void DataSerializer::Add<const char*>(const char * const & value);
00166 template<> void DataSerializer::Add<std::string>(const std::string &value);
00167
00168 template<> void DataSerializer::Add<bit>(const bit &value);
00169
00170 template<typename VLEType>
00171 void DataSerializer::AddVLE(u32 value)
00172 {
00173 assert(!iter);
00174
00175 u32 encoded = VLEType::Encode(value);
00176 int numBits = VLEType::GetEncodedBitLength(value);
00177
00179 if (numBits == 8) Add<u8>((u8)encoded);
00180 else if (numBits == 16) Add<u16>((u16)encoded);
00181 else if (numBits == 32) Add<u32>(encoded);
00182 else
00183 {
00184 assert(false && "N/I numBits count! todo.. Write AddBits()");
00185 }
00186 }
00187
00189 template<typename T>
00190 void DataSerializer::AddArray(const T *data, u32 count)
00191 {
00192 for(u32 i = 0; i < count; ++i)
00193 Add<T>(data[i]);
00194
00195
00196 if (count == 0 && iter)
00197 iter->ProceedToNextVariable();
00198 }
00199
00201 template<typename T> size_t SumArray(const T &data, size_t numElems)
00202 {
00203 size_t size = 0;
00204 for(size_t i = 0; i < numElems; ++i)
00205 size += data[i].Size();
00206 return size;
00207 }
00208
00209 }