1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
// Copyright 2012-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 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Fork of Arc. This has the following advantages over std::sync::Arc: //! //! * `triomphe::Arc` doesn't support weak references: we save space by excluding the weak reference count, and we don't do extra read-modify-update operations to handle the possibility of weak references. //! * `triomphe::UniqueArc` allows one to construct a temporarily-mutable `Arc` which can be converted to a regular `triomphe::Arc` later //! * `triomphe::OffsetArc` can be used transparently from C++ code and is compatible with (and can be converted to/from) `triomphe::Arc` //! * `triomphe::ArcBorrow` is functionally similar to `&triomphe::Arc<T>`, however in memory it's simply `&T`. This makes it more flexible for FFI; the source of the borrow need not be an `Arc` pinned on the stack (and can instead be a pointer from C++, or an `OffsetArc`). Additionally, this helps avoid pointer-chasing. //! * `triomphe::Arc` has can be constructed for dynamically-sized types via `from_header_and_iter` //! * `triomphe::ThinArc` provides thin-pointer `Arc`s to dynamically sized types //! * `triomphe::ArcUnion` is union of two `triomphe:Arc`s which fits inside one word of memory #![allow(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] extern crate alloc; #[cfg(feature = "std")] extern crate core; #[macro_use] extern crate memoffset; #[cfg(feature = "serde")] extern crate serde; #[cfg(feature = "stable_deref_trait")] extern crate stable_deref_trait; mod arc; mod header; mod arc_union; mod arc_borrow; mod offset_arc; mod thin_arc; mod unique_arc; pub use arc::*; pub use header::*; pub use arc_union::*; pub use arc_borrow::*; pub use offset_arc::*; pub use thin_arc::*; pub use unique_arc::*; #[cfg(feature = "std")] use std::process::abort; // `no_std`-compatible abort by forcing a panic while already panicing. #[cfg(not(feature = "std"))] #[cold] fn abort() -> ! { struct PanicOnDrop; impl Drop for PanicOnDrop { fn drop(&mut self) { panic!() } } let _double_panicer = PanicOnDrop; panic!(); }