std::stringstream& operator<<(std::stringstream& stream, VehicleInfo &info)
{
stream.write(reinterpret_cast<char*>(&info.Pos.x), sizeof(float));
stream.write(reinterpret_cast<char*>(&info.Pos.y), sizeof(float));
stream.write(reinterpret_cast<char*>(&info.Pos.z), sizeof(float));
return stream;
}
std::stringstream& operator>>(std::stringstream& stream, VehicleInfo &info)
{
stream.read(reinterpret_cast<char*>(&info.Pos.x), sizeof(float));
stream.read(reinterpret_cast<char*>(&info.Pos.y), sizeof(float));
stream.read(reinterpret_cast<char*>(&info.Pos.z), sizeof(float));
return stream;
}
std::stringstream& operator<<(std::stringstream& stream, Recorder::FrameInfo &info)
{
stream << info.Vehicle;
stream.write(reinterpret_cast<char*>(&info.Nitro), sizeof(int));
stream.write(reinterpret_cast<char*>(&info.RPM), sizeof(float));
stream.write(reinterpret_cast<char*>(&info.CurrentGear), sizeof(int));
stream.write(reinterpret_cast<char*>(&info.TURBO), sizeof(int));
for(int i = 0; i < 256; ++i)
{
stream.write(reinterpret_cast<char*>(&info.Keys[i].Pressed), sizeof(bool));
stream.write(reinterpret_cast<char*>(&info.Keys[i].Released), sizeof(bool));
stream.write(reinterpret_cast<char*>(&info.Keys[i].Down), sizeof(bool));
stream.write(reinterpret_cast<char*>(&info.Keys[i].Up), sizeof(bool));
}
return stream;
}
std::stringstream& operator>>(std::stringstream& stream, Recorder::FrameInfo &info)
{
stream >> info.Vehicle;
stream.read(reinterpret_cast<char*>(&info.Nitro), sizeof(int));
stream.read(reinterpret_cast<char*>(&info.RPM), sizeof(float));
stream.read(reinterpret_cast<char*>(&info.CurrentGear), sizeof(int));
stream.read(reinterpret_cast<char*>(&info.TURBO), sizeof(int));
for(int i = 0; i < 256; ++i)
{
stream.read(reinterpret_cast<char*>(&info.Keys[i].Pressed), sizeof(bool));
stream.read(reinterpret_cast<char*>(&info.Keys[i].Released), sizeof(bool));
stream.read(reinterpret_cast<char*>(&info.Keys[i].Down), sizeof(bool));
stream.read(reinterpret_cast<char*>(&info.Keys[i].Up), sizeof(bool));
}
return stream;
}
c3RkOjpzdHJpbmdzdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpzdHJpbmdzdHJlYW0mIHN0cmVhbSwgVmVoaWNsZUluZm8gJmluZm8pCnsKCXN0cmVhbS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPigmaW5mby5Qb3MueCksIHNpemVvZihmbG9hdCkpOwoJc3RyZWFtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLlBvcy55KSwgc2l6ZW9mKGZsb2F0KSk7CglzdHJlYW0ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmluZm8uUG9zLnopLCBzaXplb2YoZmxvYXQpKTsKCXJldHVybiBzdHJlYW07Cn0KCnN0ZDo6c3RyaW5nc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6c3RyaW5nc3RyZWFtJiBzdHJlYW0sIFZlaGljbGVJbmZvICZpbmZvKQp7CglzdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmaW5mby5Qb3MueCksIHNpemVvZihmbG9hdCkpOwoJc3RyZWFtLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmluZm8uUG9zLnkpLCBzaXplb2YoZmxvYXQpKTsKCXN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLlBvcy56KSwgc2l6ZW9mKGZsb2F0KSk7CglyZXR1cm4gc3RyZWFtOwp9CgpzdGQ6OnN0cmluZ3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6OnN0cmluZ3N0cmVhbSYgc3RyZWFtLCBSZWNvcmRlcjo6RnJhbWVJbmZvICZpbmZvKQp7CglzdHJlYW0gPDwgaW5mby5WZWhpY2xlOwoJc3RyZWFtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLk5pdHJvKSwgc2l6ZW9mKGludCkpOwoJc3RyZWFtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLlJQTSksIHNpemVvZihmbG9hdCkpOwoJc3RyZWFtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLkN1cnJlbnRHZWFyKSwgc2l6ZW9mKGludCkpOwoJc3RyZWFtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLlRVUkJPKSwgc2l6ZW9mKGludCkpOwoJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgKytpKQoJewoJCXN0cmVhbS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPigmaW5mby5LZXlzW2ldLlByZXNzZWQpLCBzaXplb2YoYm9vbCkpOwoJCXN0cmVhbS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPigmaW5mby5LZXlzW2ldLlJlbGVhc2VkKSwgc2l6ZW9mKGJvb2wpKTsKCQlzdHJlYW0ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmluZm8uS2V5c1tpXS5Eb3duKSwgc2l6ZW9mKGJvb2wpKTsKCQlzdHJlYW0ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmluZm8uS2V5c1tpXS5VcCksIHNpemVvZihib29sKSk7Cgl9CglyZXR1cm4gc3RyZWFtOwp9CgpzdGQ6OnN0cmluZ3N0cmVhbSYgb3BlcmF0b3I+PihzdGQ6OnN0cmluZ3N0cmVhbSYgc3RyZWFtLCBSZWNvcmRlcjo6RnJhbWVJbmZvICZpbmZvKQp7CglzdHJlYW0gPj4gaW5mby5WZWhpY2xlOwoJc3RyZWFtLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmluZm8uTml0cm8pLCBzaXplb2YoaW50KSk7CglzdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmaW5mby5SUE0pLCBzaXplb2YoZmxvYXQpKTsKCXN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLkN1cnJlbnRHZWFyKSwgc2l6ZW9mKGludCkpOwoJc3RyZWFtLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmluZm8uVFVSQk8pLCBzaXplb2YoaW50KSk7Cglmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpCgl7CgkJc3RyZWFtLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmluZm8uS2V5c1tpXS5QcmVzc2VkKSwgc2l6ZW9mKGJvb2wpKTsKCQlzdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmaW5mby5LZXlzW2ldLlJlbGVhc2VkKSwgc2l6ZW9mKGJvb2wpKTsKCQlzdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmaW5mby5LZXlzW2ldLkRvd24pLCBzaXplb2YoYm9vbCkpOwoJCXN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZpbmZvLktleXNbaV0uVXApLCBzaXplb2YoYm9vbCkpOwoJfQoJcmV0dXJuIHN0cmVhbTsKfQ==