use crate::backend::native::{EdgeStore, GraphFile, NodeStore};
use std::mem;
pub unsafe fn create_node_store(graph_file: &mut GraphFile) -> NodeStore<'static> {
unsafe { NodeStore::new(mem::transmute::<&mut _, &'static mut _>(graph_file)) }
}
pub unsafe fn create_edge_store(graph_file: &mut GraphFile) -> EdgeStore<'static> {
unsafe { EdgeStore::new(mem::transmute::<&mut _, &'static mut _>(graph_file)) }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_node_store() {
let temp_dir = tempfile::tempdir().unwrap();
let graph_path = temp_dir.path().join("test.v2");
let graph_file = GraphFile::create(&graph_path).unwrap();
let mut graph_file = graph_file;
let _node_store = unsafe { create_node_store(&mut graph_file) };
}
#[test]
fn test_create_edge_store() {
let temp_dir = tempfile::tempdir().unwrap();
let graph_path = temp_dir.path().join("test.v2");
let graph_file = GraphFile::create(&graph_path).unwrap();
let mut graph_file = graph_file;
let _edge_store = unsafe { create_edge_store(&mut graph_file) };
}
}
#[cfg(all(miri, test))]
mod miri_tests {
use super::*;
use parking_lot::RwLock;
#[test]
fn miri_test_arc_rwlock_graphfile_lifetime() {
let temp_dir = tempfile::tempdir().unwrap();
let graph_path = temp_dir.path().join("test.v2");
let graph_file = GraphFile::create(&graph_path).unwrap();
let graph_file = Arc::new(RwLock::new(graph_file));
let graph_file_clone = Arc::clone(&graph_file);
{
let mut guard = graph_file.write();
let _node_store = unsafe { create_node_store(&mut guard) };
}
let guard = graph_file_clone.read();
let _header = guard.header();
}
#[test]
fn miri_test_store_lifetime_bounded() {
let temp_dir = tempfile::tempdir().unwrap();
let graph_path = temp_dir.path().join("test.v2");
let graph_file = GraphFile::create(&graph_path).unwrap();
let graph_file = Arc::new(RwLock::new(graph_file));
{
let mut node_store = unsafe {
let mut guard = graph_file.write();
create_node_store(&mut guard)
};
let _node_id = node_store.allocate_node_id().unwrap();
}
{
let mut edge_store = unsafe {
let mut guard = graph_file.write();
create_edge_store(&mut guard)
};
let _max_id = edge_store.max_edge_id();
}
let guard = graph_file.read();
let _header = guard.header();
}
#[test]
fn miri_test_drop_order() {
let temp_dir = tempfile::tempdir().unwrap();
let graph_path = temp_dir.path().join("test.v2");
let graph_file = GraphFile::create(&graph_path).unwrap();
let graph_file = Arc::new(RwLock::new(graph_file));
let arc_clone = Arc::clone(&graph_file);
drop(graph_file);
let guard = arc_clone.read();
let _header = guard.header();
}
}