rustc_data_structures/
lib.rs1#![allow(internal_features)]
11#![allow(rustc::default_hash_types)]
12#![allow(rustc::potential_query_instability)]
13#![cfg_attr(bootstrap, feature(array_windows))]
14#![deny(unsafe_op_in_unsafe_fn)]
15#![feature(allocator_api)]
16#![feature(ascii_char)]
17#![feature(ascii_char_variants)]
18#![feature(assert_matches)]
19#![feature(auto_traits)]
20#![feature(cfg_select)]
21#![feature(const_default)]
22#![feature(const_trait_impl)]
23#![feature(core_intrinsics)]
24#![feature(dropck_eyepatch)]
25#![feature(extend_one)]
26#![feature(file_buffered)]
27#![feature(map_try_insert)]
28#![feature(min_specialization)]
29#![feature(negative_impls)]
30#![feature(never_type)]
31#![feature(ptr_alignment_type)]
32#![feature(rustc_attrs)]
33#![feature(sized_hierarchy)]
34#![feature(test)]
35#![feature(thread_id_value)]
36#![feature(trusted_len)]
37#![feature(type_alias_impl_trait)]
38#![feature(unwrap_infallible)]
39use std::fmt;
42
43pub use atomic_ref::AtomicRef;
44pub use ena::{snapshot_vec, undo_log, unify};
45pub use rustc_index::static_assert_size;
46pub use {either, indexmap, smallvec, thin_vec};
48
49pub mod aligned;
50pub mod base_n;
51pub mod binary_search_util;
52pub mod fingerprint;
53pub mod flat_map_in_place;
54pub mod flock;
55pub mod frozen;
56pub mod fx;
57pub mod graph;
58pub mod intern;
59pub mod jobserver;
60pub mod marker;
61pub mod memmap;
62pub mod obligation_forest;
63pub mod owned_slice;
64pub mod packed;
65pub mod profiling;
66pub mod sharded;
67pub mod small_c_str;
68pub mod snapshot_map;
69pub mod sorted_map;
70pub mod sso;
71pub mod stable_hasher;
72pub mod stack;
73pub mod steal;
74pub mod svh;
75pub mod sync;
76pub mod tagged_ptr;
77pub mod temp_dir;
78pub mod thinvec;
79pub mod thousands;
80pub mod transitive_relation;
81pub mod unhash;
82pub mod union_find;
83pub mod unord;
84pub mod vec_cache;
85pub mod work_queue;
86
87mod atomic_ref;
88
89#[inline(never)]
91#[cold]
92pub fn outline<F: FnOnce() -> R, R>(f: F) -> R {
93 f()
94}
95
96pub fn defer<F: FnOnce()>(f: F) -> OnDrop<F> {
98 OnDrop(Some(f))
99}
100
101pub struct OnDrop<F: FnOnce()>(Option<F>);
102
103impl<F: FnOnce()> OnDrop<F> {
104 #[inline]
106 pub fn disable(mut self) {
107 self.0.take();
108 }
109}
110
111impl<F: FnOnce()> Drop for OnDrop<F> {
112 #[inline]
113 fn drop(&mut self) {
114 if let Some(f) = self.0.take() {
115 f();
116 }
117 }
118}
119
120pub struct FatalErrorMarker;
122
123pub fn make_display(f: impl Fn(&mut fmt::Formatter<'_>) -> fmt::Result) -> impl fmt::Display {
125 struct Printer<F> {
126 f: F,
127 }
128 impl<F> fmt::Display for Printer<F>
129 where
130 F: Fn(&mut fmt::Formatter<'_>) -> fmt::Result,
131 {
132 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
133 (self.f)(fmt)
134 }
135 }
136
137 Printer { f }
138}
139
140#[doc(hidden)]
142pub fn __noop_fix_for_windows_dllimport_issue() {}
143
144#[macro_export]
145macro_rules! external_bitflags_debug {
146 ($Name:ident) => {
147 impl ::std::fmt::Debug for $Name {
148 fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
149 ::bitflags::parser::to_writer(self, f)
150 }
151 }
152 };
153}