Linux compile fix with template specialization

This commit is contained in:
Alexander Bock
2015-02-17 20:51:25 +01:00
parent 08d4ca9f6b
commit d439157d4f

View File

@@ -35,7 +35,18 @@ public:
SyncBuffer(size_t n);
template<typename T>
void encode(const std::string& s) {
const size_t size = sizeof(char) * s.size() + sizeof(int32_t);
assert(_encodeOffset + size < _n);
int32_t length = static_cast<int32_t>(s.length());
memcpy(_dataStream.data() + _encodeOffset, reinterpret_cast<const char*>(&length), sizeof(int32_t));
_encodeOffset += sizeof(int32_t);
memcpy(_dataStream.data() + _encodeOffset, s.c_str(), length);
_encodeOffset += length;
}
template <typename T>
void encode(const T& v) {
const size_t size = sizeof(T);
assert(_encodeOffset + size < _n);
@@ -44,19 +55,20 @@ public:
_encodeOffset += size;
}
template<>
void encode(const std::string& s) {
const size_t size = sizeof(char) * s.size() + sizeof(int32_t);
assert(_encodeOffset + size < _n);
std::string decode() {
int32_t length;
memcpy(reinterpret_cast<char*>(&length), _dataStream.data() + _decodeOffset, sizeof(int32_t));
char* tmp = new char[length + 1];
_decodeOffset += sizeof(int32_t);
memcpy(tmp, _dataStream.data() + _decodeOffset, length);
_decodeOffset += length;
tmp[length] = '\0';
std::string ret(tmp);
delete[] tmp;
return ret;
}
int32_t length = s.length();
memcpy(_dataStream.data() + _encodeOffset, reinterpret_cast<const char*>(&length), sizeof(int32_t));
_encodeOffset += sizeof(int32_t);
memcpy(_dataStream.data() + _encodeOffset, s.c_str(), length);
_encodeOffset += length;
}
template<typename T>
template <typename T>
T decode() {
const size_t size = sizeof(T);
assert(_decodeOffset + size < _n);
@@ -66,21 +78,11 @@ public:
return value;
}
template<>
std::string decode() {
int32_t length;
memcpy(reinterpret_cast<char*>(&length), _dataStream.data() + _decodeOffset, sizeof(int32_t));
char* tmp = new char[length + 1];
_decodeOffset += sizeof(int32_t);
memcpy(tmp, _dataStream.data() + _decodeOffset, length);
_decodeOffset += length;
tmp[length] = '\0';
std::string ret(tmp);
delete[] tmp;
return ret;
}
void decode(std::string& s) {
s = decode<std::string>();
}
template<typename T>
template <typename T>
void decode(T& value) {
const size_t size = sizeof(T);
assert(_decodeOffset + size < _n);
@@ -88,12 +90,7 @@ public:
_decodeOffset += size;
}
template<>
void decode(std::string &s) {
s = decode<std::string>();
}
void write();
void write();
void read();