Remove serde (#23)

This commit is contained in:
Patrick Stevens
2023-06-05 20:55:23 +01:00
committed by GitHub
parent 8b5213e262
commit c3b7cdc725
8 changed files with 142 additions and 80 deletions

View File

@@ -10,6 +10,5 @@ edition = "2021"
clap = { version = "4.3.1", features = [ "derive" ] }
rand = "0.8.5"
haversine = { path = "../haversine" }
serde_json = "1.0.96"
serde = "1.0.163"
json = { path = "../json" }
byteorder = "1.4.3"

View File

@@ -1,7 +1,8 @@
use byteorder::{ByteOrder, LittleEndian};
use byteorder::{BigEndian, ByteOrder};
use clap::{builder::PossibleValue, Parser, ValueEnum};
use haversine::haversine::{CoordinatePair, HaversineData};
use haversine::{distance, earth};
use json::json_object::JsonValue;
use rand::distributions::Distribution;
use rand::rngs::StdRng;
use rand::{Rng, SeedableRng};
@@ -63,10 +64,41 @@ fn write_json(data: &HaversineData, json_filename: &str) {
let output_file = File::create(json_filename).unwrap();
let mut writer = BufWriter::new(output_file);
serde_json::to_writer(&mut writer, &data).unwrap();
writer.write_all(r#"{"pairs":["#.as_bytes()).unwrap();
let mut is_first = true;
for point in data.pairs.iter() {
if !is_first {
writer.write_all(&[b',']).unwrap();
}
writer.write_all(&[b'{']).unwrap();
writer
.write_all(
format!(
r#""x0":{:.17},"y0":{:.17},"x1":{:.17},"y1":{:.17}"#,
point.x0, point.y0, point.x1, point.y1
)
.as_bytes(),
)
.unwrap();
writer.write_all(&[b'}']).unwrap();
is_first = false;
}
writer.write_all("]}".as_bytes()).unwrap();
writer.flush().unwrap();
}
// Our JSON parser is incapable of round-tripping floats, for precision reasons.
// To work around this, we'll just compute using the serialised versions.
fn round_trip_float(f: f64) -> f64 {
let written = format!("{:.17}", f);
JsonValue::parse(&mut written.chars())
.unwrap()
.0
.as_number()
}
fn write_answer(data: &HaversineData, binary_filename: &str) {
let output_file = File::create(binary_filename).unwrap();
let mut writer = BufWriter::new(output_file);
@@ -75,8 +107,15 @@ fn write_answer(data: &HaversineData, binary_filename: &str) {
let mut buf = [0u8; 8];
for (count, point) in data.pairs.iter().enumerate() {
let distance = distance::naive(point, earth::RADIUS);
LittleEndian::write_f64(&mut buf, distance);
let point = CoordinatePair {
x0: round_trip_float(point.x0),
y0: round_trip_float(point.y0),
x1: round_trip_float(point.x1),
y1: round_trip_float(point.y1),
};
let distance = distance::naive(&point, earth::RADIUS);
BigEndian::write_f64(&mut buf, distance);
let written = writer.write(&buf).unwrap();
if written < buf.len() {
@@ -90,7 +129,7 @@ fn write_answer(data: &HaversineData, binary_filename: &str) {
// sic!
println!("Expected sum: {}", expected_average);
LittleEndian::write_f64(&mut buf, expected_average);
BigEndian::write_f64(&mut buf, expected_average);
let written = writer.write(&buf).unwrap();
if written < buf.len() {
panic!("Failed to write everything")