Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/shared/Communication.h

Issue 10824027: Implement better marshaling (Closed)
Patch Set: Created June 3, 2013, 12:05 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/shared/Communication.h
===================================================================
--- a/src/shared/Communication.h
+++ b/src/shared/Communication.h
@@ -9,30 +9,32 @@
#include <vector>
#include <Windows.h>
namespace Communication
{
extern const std::wstring pipeName;
const int bufferSize = 1024;
- enum ValueType {TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL};
+ enum {TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL};
+ typedef int32_t ValueType;
+ typedef uint32_t SizeType;
class InputBuffer
{
public:
InputBuffer(const std::string& data) : buffer(data), hasType(false) {}
InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_STRING); }
InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE_WSTRING); }
InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); }
InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); }
InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); }
private:
std::istringstream buffer;
- int32_t currentType;
+ ValueType currentType;
bool hasType;
void CheckType(ValueType expectedType)
{
if (!hasType)
ReadBinary(currentType);
if (currentType != expectedType)
@@ -45,17 +47,17 @@ namespace Communication
hasType = false;
}
template<class T>
InputBuffer& ReadString(T& value, ValueType expectedType)
{
CheckType(expectedType);
- uint32_t length;
+ SizeType length;
ReadBinary(length);
std::auto_ptr<T::value_type> data(new T::value_type[length]);
buffer.read(reinterpret_cast<char*>(data.get()), sizeof(T::value_type) * length);
if (buffer.fail())
throw new std::runtime_error("Unexpected end of input buffer");
value.assign(data.get(), length);
@@ -94,33 +96,36 @@ namespace Communication
OutputBuffer& operator<<(const std::string& value) { return WriteString(value, TYPE_STRING); }
OutputBuffer& operator<<(const std::wstring& value) { return WriteString(value, TYPE_WSTRING); }
OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); }
OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); }
OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); }
private:
std::ostringstream buffer;
+ // Disallow copying
+ const OutputBuffer& operator=(const OutputBuffer&);
+
template<class T>
- OutputBuffer& WriteString(const T& value, int32_t type)
+ OutputBuffer& WriteString(const T& value, ValueType type)
{
WriteBinary(type);
- uint32_t length = value.size();
+ SizeType length = value.size();
WriteBinary(length);
buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value_type) * length);
if (buffer.fail())
throw new std::runtime_error("Unexpected error writing to output buffer");
return *this;
}
template<class T>
- OutputBuffer& Write(const T value, int32_t type)
+ OutputBuffer& Write(const T value, ValueType type)
Felix Dahlke 2013/06/03 12:23:54 Shouldn't value be passed by reference?
Wladimir Palant 2013/06/03 12:25:55 Given that this function is meant for primitive ty
Felix Dahlke 2013/06/04 06:41:38 Right, didn't think of that. Won't hurt, but it wo
{
WriteBinary(type);
WriteBinary(value);
return *this;
}
template<class T>
void WriteBinary(const T& value)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld