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