--- a/src/proto2/NetworkPacket.cc Thu Nov 20 22:55:28 2008 +0000
+++ b/src/proto2/NetworkPacket.cc Thu Nov 20 23:20:00 2008 +0000
@@ -1,3 +1,5 @@
+
+#include <cassert>
#include "NetworkPacket.hh"
@@ -19,32 +21,42 @@
throw NetworkPacketError("not enough data to read");
}
+void NetworkPacket::write (const void *ptr, size_t len) {
+ // check buffer overflow
+ check_write_size(len);
+
+ // set value
+ memcpy(buf + offset, ptr, len);
+
+ // update offset and size
+ offset += len;
+ data_size += len;
+}
+
+void NetworkPacket::read (void *ptr, size_t len) {
+ // check buffer underflow
+ check_read_size(len);
+
+ // set value
+ memcpy(ptr, buf + offset, len);
+
+ // update offset
+ offset += len;
+}
+
template <typename T> T NetworkPacket::read_val (void) {
T val;
- // check size
- check_read_size(sizeof(T));
-
- // set value
- val = *((T*) (buf + offset));
-
- // update offset
- offset += sizeof(T);
+ // read
+ read(&val, sizeof(T));
// return
return val;
}
template <typename T> void NetworkPacket::write_val (const T &val) {
- // check max size
- check_write_size(sizeof(T));
-
- // set value
- *((T*) (buf + offset)) = val;
-
- // update offset and size
- offset += sizeof(T);
- data_size += sizeof(T);
+ // write
+ write(&val, sizeof(T));
}
uint32_t NetworkPacket::read_uint32 (void) {
@@ -72,7 +84,9 @@
}
float NetworkPacket::read_float32 (void) {
- return (float) read_uint32();
+ int32_t ival = read_int32();
+
+ return *((float *) &ival);
}
Vector NetworkPacket::read_vector (void) {
@@ -107,7 +121,7 @@
}
void NetworkPacket::write_float32 (float val) {
- write_uint32((uint32_t) val);
+ write_int32(*((int32_t *) &val));
}
void NetworkPacket::write_vector (const Vector &vec) {