Skip to content

Commit dd041c0

Browse files
committed
Use autocfg to avoid breaking change
1 parent dd1bea3 commit dd041c0

11 files changed

+80
-20
lines changed

.travis.yml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ language: rust
22
sudo: false
33
matrix:
44
include:
5-
- rust: 1.36.0
5+
- rust: 1.18.0
6+
before_script:
7+
# lazy_static 1.1 requires Rust 1.21+, so downgrade it.
8+
# (we only use it in benchmarks anyway...)
9+
- cargo generate-lockfile
10+
- cargo update -p lazy_static --precise 1.0.2
611
- rust: stable
712
env:
813
- FEATURES='serde-1'
@@ -17,6 +22,6 @@ branches:
1722
script:
1823
- |
1924
cargo build --verbose --features "$FEATURES" &&
20-
cargo test --verbose --features "$FEATURES" &&
21-
cargo test --release --verbose --features "$FEATURES" &&
25+
cargo test --verbose --features "$FEATURES",force_std &&
26+
cargo test --release --verbose --features "$FEATURES",force_std &&
2227
cargo doc --verbose --features "$FEATURES"

Cargo.toml

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ indexmap.
2525
keywords = ["hashmap"]
2626
categories = ["data-structures"]
2727

28+
[package.metadata.release]
29+
no-dev-version = true
30+
31+
[package.metadata.docs.rs]
32+
features = ["serde-1"]
33+
2834
[lib]
2935
bench = false
3036

@@ -48,11 +54,34 @@ serde-1 = ["serde"]
4854
test_low_transition_point = []
4955
test_debug = []
5056

57+
force_std = []
58+
5159
[profile.bench]
5260
debug = true
5361

54-
[package.metadata.release]
55-
no-dev-version = true
62+
[build-dependencies]
63+
autocfg = "0.1.5"
5664

57-
[package.metadata.docs.rs]
58-
features = ["serde-1"]
65+
[[test]]
66+
name = "tests"
67+
required-features = [ "force_std" ]
68+
69+
[[test]]
70+
name = "serde"
71+
required-features = [ "force_std" ]
72+
73+
[[test]]
74+
name = "quick"
75+
required-features = [ "force_std" ]
76+
77+
[[test]]
78+
name = "equivalent_trait"
79+
required-features = [ "force_std" ]
80+
81+
[[bench]]
82+
name = "bench"
83+
required-features = [ "force_std" ]
84+
85+
[[bench]]
86+
name = "faststring"
87+
required-features = [ "force_std" ]

README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ indexmap
1212
.. |docs| image:: https://docs.rs/indexmap/badge.svg
1313
.. _docs: https://docs.rs/indexmap
1414

15-
.. |rustc| image:: https://img.shields.io/badge/rust-1.36%2B-orange.svg
16-
.. _rustc: https://img.shields.io/badge/rust-1.36%2B-orange.svg
15+
.. |rustc| image:: https://img.shields.io/badge/rust-1.18%2B-orange.svg
16+
.. _rustc: https://img.shields.io/badge/rust-1.18%2B-orange.svg
1717

1818
A safe, pure-Rust hash table which preserves insertion order.
1919

build.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fn main() {
2+
let ac = autocfg::new();
3+
ac.emit_has_path("std");
4+
ac.emit_has_path("alloc");
5+
}

src/lib.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,26 @@
1414
//!
1515
//! ## Rust Version
1616
//!
17-
//! This version of indexmap requires Rust 1.36 or later.
17+
//! This version of indexmap requires Rust 1.18 or later.
1818
//!
1919
//! The indexmap 1.x release series will use a carefully considered version
2020
//! upgrade policy, where in a later 1.x version, we will raise the minimum
2121
//! required Rust version.
2222
23-
#![cfg_attr(not(test), no_std)]
23+
#![cfg_attr(all(not(test), has_alloc, not(feature = "force_std")), no_std)]
2424

2525
#[cfg(test)]
2626
extern crate core;
2727

28+
#[cfg(all(has_alloc, not(feature = "force_std")))]
2829
extern crate alloc;
2930

31+
#[cfg(all(has_alloc, has_std))]
32+
extern crate std;
33+
34+
#[cfg(any(not(has_alloc), feature = "force_std"))]
35+
extern crate std as alloc;
36+
3037
#[macro_use]
3138
mod macros;
3239
#[cfg(feature = "serde-1")]

src/macros.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#[macro_export]
2-
/// Create an `IndexMap` from a list of key-value pairs
2+
/// Create an `IndexMap` from a list of key-value pairs. Requires `std` to be available.
33
///
44
/// ## Example
55
///
@@ -21,6 +21,7 @@
2121
/// assert_eq!(map.keys().next(), Some(&"a"));
2222
/// # }
2323
/// ```
24+
#[cfg(any(has_std, feature = "force_std", test))]
2425
macro_rules! indexmap {
2526
(@single $($x:tt)*) => (());
2627
(@count $($rest:expr),*) => (<[()]>::len(&[$(indexmap!(@single $rest)),*]));
@@ -60,6 +61,7 @@ macro_rules! indexmap {
6061
/// assert_eq!(set.iter().next(), Some(&"a"));
6162
/// # }
6263
/// ```
64+
#[cfg(any(has_std, feature = "force_std", test))]
6365
macro_rules! indexset {
6466
(@single $($x:tt)*) => (());
6567
(@count $($rest:expr),*) => (<[()]>::len(&[$(indexset!(@single $rest)),*]));

src/map.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use core::hash::Hash;
77
use core::hash::BuildHasher;
88
use core::hash::Hasher;
99
use core::iter::FromIterator;
10-
use hashbrown::hash_map::DefaultHashBuilder;
1110
use core::ops::RangeFull;
1211

1312
use core::cmp::{max, Ordering};
@@ -265,7 +264,15 @@ impl<Sz> ShortHashProxy<Sz>
265264
/// assert_eq!(letters.get(&'y'), None);
266265
/// ```
267266
#[derive(Clone)]
268-
pub struct IndexMap<K, V, S = DefaultHashBuilder> {
267+
#[cfg(any(has_std, feature = "force_std", test))]
268+
pub struct IndexMap<K, V, S = ::std::collections::hash_map::RandomState> {
269+
core: OrderMapCore<K, V>,
270+
hash_builder: S,
271+
}
272+
273+
#[derive(Clone)]
274+
#[cfg(not(any(has_std, feature = "force_std", test)))]
275+
pub struct IndexMap<K, V, S> {
269276
core: OrderMapCore<K, V>,
270277
hash_builder: S,
271278
}
@@ -356,7 +363,8 @@ macro_rules! probe_loop {
356363
}
357364
}
358365

359-
impl<K, V> IndexMap<K, V> {
366+
#[cfg(any(has_std, feature = "force_std", test))]
367+
impl<K, V> IndexMap<K, V, ::std::collections::hash_map::RandomState> {
360368
/// Create a new map. (Does not allocate.)
361369
pub fn new() -> Self {
362370
Self::with_capacity(0)

src/set.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! A hash set implemented using `IndexMap`
22
33
use core::cmp::Ordering;
4-
use hashbrown::hash_map::DefaultHashBuilder;
54
use core::fmt;
65
use core::iter::{FromIterator, Chain};
76
use core::hash::{Hash, BuildHasher};
@@ -57,7 +56,14 @@ type Bucket<T> = super::Bucket<T, ()>;
5756
/// assert!(!letters.contains(&'y'));
5857
/// ```
5958
#[derive(Clone)]
60-
pub struct IndexSet<T, S = DefaultHashBuilder> {
59+
#[cfg(any(has_std, feature = "force_std", test))]
60+
pub struct IndexSet<T, S = ::std::collections::hash_map::RandomState> {
61+
map: IndexMap<T, (), S>,
62+
}
63+
64+
#[derive(Clone)]
65+
#[cfg(not(any(has_std, feature = "force_std", test)))]
66+
pub struct IndexSet<T, S> {
6167
map: IndexMap<T, (), S>,
6268
}
6369

@@ -75,6 +81,7 @@ impl<T, S> fmt::Debug for IndexSet<T, S>
7581
}
7682
}
7783

84+
#[cfg(any(has_std, feature = "force_std", test))]
7885
impl<T> IndexSet<T> {
7986
/// Create a new set. (Does not allocate.)
8087
pub fn new() -> Self {

tests/equivalent_trait.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#[macro_use] extern crate indexmap;
32

43
use indexmap::Equivalent;

tests/quick.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#[macro_use]
32
extern crate quickcheck;
43

tests/tests.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#[macro_use]
32
extern crate indexmap;
43

0 commit comments

Comments
 (0)