// Copyright 2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use hir::def_id::DefId; use std::rc::Rc; use super::dep_node::DepNode; use super::query::DepGraphQuery; use super::raii; use super::thread::{DepGraphThreadData, DepMessage}; #[derive(Clone)] pub struct DepGraph { data: Rc } impl DepGraph { pub fn new(enabled: bool) -> DepGraph { DepGraph { data: Rc::new(DepGraphThreadData::new(enabled)) } } /// True if we are actually building a dep-graph. If this returns false, /// then the other methods on this `DepGraph` will have no net effect. #[inline] pub fn enabled(&self) -> bool { self.data.enabled() } pub fn query(&self) -> DepGraphQuery { self.data.query() } pub fn in_ignore<'graph>(&'graph self) -> raii::IgnoreTask<'graph> { raii::IgnoreTask::new(&self.data) } pub fn in_task<'graph>(&'graph self, key: DepNode) -> raii::DepTask<'graph> { raii::DepTask::new(&self.data, key) } pub fn with_ignore(&self, op: OP) -> R where OP: FnOnce() -> R { let _task = self.in_ignore(); op() } pub fn with_task(&self, key: DepNode, op: OP) -> R where OP: FnOnce() -> R { let _task = self.in_task(key); op() } pub fn read(&self, v: DepNode) { self.data.enqueue(DepMessage::Read(v)); } pub fn write(&self, v: DepNode) { self.data.enqueue(DepMessage::Write(v)); } }