hydroflow 0.10.0

Hydro's low-level dataflow runtime and IR
Documentation
use std::cell::RefCell;
use std::rc::Rc;

use bincode::options;
use serde::de::DeserializeSeed;
use serde::{Deserializer, Serialize, Serializer};

use super::magic_buffer::MagicBuffer;
use crate::buffer_pool::BufferPool;
use crate::protocol::serialization::KvsRequestDeserializer;
use crate::protocol::KvsRequest;

fn assert_eq_req<const SIZE: usize>(r1: &KvsRequest<SIZE>, r2: &KvsRequest<SIZE>) {
    match (r1, r2) {
        (KvsRequest::Gossip { map: map1 }, KvsRequest::Gossip { map: map2 }) => {
            assert_eq!(map1, map2);
        }
        (KvsRequest::Delete { key: key1 }, KvsRequest::Delete { key: key2 }) => {
            assert_eq!(key1, key2);
        }
        (KvsRequest::Get { key: key1 }, KvsRequest::Get { key: key2 }) => {
            assert_eq!(key1, key2);
        }
        (
            KvsRequest::Put {
                key: key1,
                value: value1,
            },
            KvsRequest::Put {
                key: key2,
                value: value2,
            },
        ) => {
            assert_eq!(key1, key2);
            assert_eq!(*value1.inner.borrow(), *value2.inner.borrow());
        }
        _ => panic!(),
    }
}

fn serialize_deserialize<'de, S, D, const SIZE: usize>(
    req: &KvsRequest<SIZE>,
    buffer_pool: &Rc<RefCell<BufferPool<SIZE>>>,
    mut serializer: S,
    mut deserializer: D,
) -> KvsRequest<SIZE>
where
    for<'a> &'a mut S: Serializer,
    for<'b> &'b mut D: Deserializer<'de>,
{
    Serialize::serialize(&req, &mut serializer).unwrap();

    let req2 = {
        KvsRequestDeserializer {
            collector: Rc::clone(&buffer_pool),
        }
        .deserialize(&mut deserializer)
        .unwrap()
    };

    req2
}

pub fn check_all<const SIZE: usize>(
    buffer_pool: &Rc<RefCell<BufferPool<SIZE>>>,
    req: &KvsRequest<SIZE>,
) {
    {
        let buffer = MagicBuffer::default();

        let req2 = serialize_deserialize(
            &req,
            &buffer_pool,
            bincode::Serializer::new(buffer.clone(), options()),
            bincode::Deserializer::with_reader(buffer.clone(), options()),
        );

        assert_eq_req(&req, &req2);
    }

    {
        let buffer = MagicBuffer::default();

        let req2 = serialize_deserialize(
            &req,
            &buffer_pool,
            serde_json::Serializer::new(buffer.clone()),
            serde_json::Deserializer::from_reader(buffer.clone()),
        );

        assert_eq_req(&req, &req2);
    }
}