Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Explicit equivalents for every macro and doc enhancements #39

Merged
merged 1 commit into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

* `hashbrown::hash_set` macro

* `hashbrown::hash_set_e` macro

* `binary_heap_e` macro

* `btree_set_e` macro

* `hash_set_e` macro

* `vec_no_clone_e` macro

### Changed

* Explicitly typed map macros: keys also cast now (before only values were
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ let hello = hash_map! {
"de" => "Hallo",
"fr" => "Bonjour",
"es" => "Hola",
"cat" => "Hola",
"🌍" => "👋",
};
```

Expand Down
145 changes: 137 additions & 8 deletions src/_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
/// "de" => "Auf Wiedersehen",
/// "fr" => "Au revoir",
/// "es" => "Adios",
/// "cat" => "Adéu",
/// };
/// ```
///
Expand All @@ -22,8 +23,9 @@ macro_rules! hash_map {
};
}

/// Explicitly typed equivalent of [`hash_map!`], suitable for
/// [trait object values](crate#explicitly-typed-values-for-trait-objects).
/// Explicitly typed equivalent of [`hash_map!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
Expand All @@ -38,6 +40,7 @@ macro_rules! hash_map {
/// "de" => &"Auf Wiedersehen",
/// "fr" => &"Au revoir",
/// "es" => &"Adios",
/// "cat" => &"Adéu",
/// };
///
/// println!("{:?}", goodbye);
Expand All @@ -64,6 +67,7 @@ macro_rules! hash_map_e {
/// "de" => "Auf Wiedersehen",
/// "fr" => "Au revoir",
/// "es" => "Adios",
/// "cat" => "Adéu",
/// };
/// ```
///
Expand All @@ -74,8 +78,9 @@ macro_rules! btree_map {
};
}

/// Explicitly typed equivalent of [`btree_map!`], suitable for
/// [trait object values](crate#explicitly-typed-values-for-trait-objects).
/// Explicitly typed equivalent of [`btree_map!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
Expand All @@ -90,6 +95,7 @@ macro_rules! btree_map {
/// "de" => &"Auf Wiedersehen",
/// "fr" => &"Au revoir",
/// "es" => &"Adios",
/// "cat" => &"Adéu",
/// };
/// ```
///
Expand Down Expand Up @@ -121,6 +127,31 @@ macro_rules! hash_set {
};
}

/// Explicitly typed equivalent of [`hash_set!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
/// ```rust
/// use std::collections::HashSet;
///
/// use map_macro::hash_set_e;
///
/// enum Foo { A, B, C, D }
///
/// let x: HashSet<u8> = hash_set_e! { Foo::A, Foo::B, Foo::C, Foo::C, Foo::D };
///
/// assert_eq!(x.len(), 4);
/// ```
///
#[macro_export]
macro_rules! hash_set_e {
{$($v: expr),* $(,)?} => {
::std::collections::HashSet::from([$($v as _,)*])
};
}

/// Macro for creating a [`BTreeSet`](::std::collections::BTreeSet).
///
/// Syntactic sugar for [`BTreeSet::from`](::std::collections::BTreeSet::from).
Expand All @@ -142,6 +173,31 @@ macro_rules! btree_set {
};
}

/// Explicitly typed equivalent of [`btree_set!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
/// ```rust
/// use std::collections::BTreeSet;
///
/// use map_macro::btree_set_e;
///
/// enum Foo { A, B, C, D }
///
/// let x: BTreeSet<u8> = btree_set_e! { Foo::A, Foo::B, Foo::C, Foo::C, Foo::D };
///
/// assert_eq!(x.len(), 4);
/// ```
///
#[macro_export]
macro_rules! btree_set_e {
{$($v: expr),* $(,)?} => {
::std::collections::BTreeSet::from([$($v as _,)*])
};
}

/// Macro for creating a [`VecDeque`](::std::collections::VecDeque).
///
/// Follows the same syntax as the [`vec!`](::std::vec!) macro.
Expand Down Expand Up @@ -173,8 +229,9 @@ macro_rules! vec_deque {
};
}

/// Explicitly typed equivalent of [`vec_deque!`], suitable for
/// [trait object values](crate#explicitly-typed-values-for-trait-objects).
/// Explicitly typed equivalent of [`vec_deque!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
Expand Down Expand Up @@ -237,8 +294,9 @@ macro_rules! linked_list {
};
}

/// Explicitly typed equivalent of [`linked_list!`], suitable for
/// [trait object values](crate#explicitly-typed-values-for-trait-objects).
/// Explicitly typed equivalent of [`linked_list!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
Expand Down Expand Up @@ -301,6 +359,41 @@ macro_rules! binary_heap {
};
}

/// Explicitly typed equivalent of [`binary_heap!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
/// ```
/// use std::collections::BinaryHeap;
///
/// use map_macro::binary_heap_e;
///
/// enum Foo { A, B, C, D }
///
/// let v: BinaryHeap<u8> = binary_heap_e![Foo::A, Foo::B, Foo::C, Foo::D];
/// let v: BinaryHeap<u8> = binary_heap_e![Foo::A; 4];
/// ```
///
#[macro_export]
macro_rules! binary_heap_e {
{$v: expr; $c: expr} => {
{
let mut bh = ::std::collections::BinaryHeap::with_capacity($c);

for _ in 0..$c {
bh.push($v as _);
}

bh
}
};
{$($v: expr),* $(,)?} => {
::std::collections::BinaryHeap::from([$($v as _,)*])
};
}

/// Version of the [`vec!`](::std::vec!) macro where the value does not have to implement [`Clone`].
///
/// Useful for unclonable types or where `Clone` is exerting undesired behaviour.
Expand Down Expand Up @@ -439,6 +532,7 @@ macro_rules! binary_heap {
#[macro_export]
macro_rules! vec_no_clone {
{$v: expr; $c: expr} => {

{
let mut vec = Vec::with_capacity($c);

Expand All @@ -455,3 +549,38 @@ macro_rules! vec_no_clone {
}
};
}

/// Explicitly typed equivalent of [`vec_no_clone!`].
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
/// ```
/// use std::fmt::Display;
///
/// use map_macro::vec_no_clone_e;
///
/// let v: Vec<&dyn Display> = vec_no_clone_e![&0; 4];
/// ```
///
#[macro_export]
macro_rules! vec_no_clone_e {
{$v: expr; $c: expr} => {

{
let mut vec = Vec::with_capacity($c);

for _ in 0..$c {
vec.push($v as _);
}

vec
}
};
{$($v: expr),* $(,)?} => {
{
vec![$($v as _),*]
}
};
}
60 changes: 54 additions & 6 deletions src/hashbrown.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,21 @@
//! Macros for initializing [`hashbrown`] maps and sets.
//!
//! # Supported versions of `hashbrown`
//! # Example
//!
//! ```
//! use map_macro::hashbrown::hash_map;
//!
//! let hello = hash_map! {
//! "en" => "Hello",
//! "de" => "Hallo",
//! "fr" => "Bonjour",
//! "es" => "Hola",
//! "cat" => "Hola",
//! "🌍" => "👋",
//! };
//! ```
//!
//! # Supported Versions of `hashbrown`
//!
//! As of writing this, up to the current `hashbrown` version `0.14` **all**
//! versions of `hashbrown` are supported.
Expand All @@ -15,9 +30,10 @@
//! macros from this module would break for that new version.
//!
//! **Note:** to be compatible with all versions of `hashbrown` at once, this
//! crate doesn't re-export `hashbrown`, which means that if you rename
//! `hashbrown` in your dependencies, the macros from this module won't be able
//! to import the needed types resulting in a compile-time error.
//! crate doesn't re-export `hashbrown`.
//! That means that (I) you need to specify it as a dependency yourself and
//! (II) you can't rename it or the macros from this module won't be able to
//! import the needed types, resulting in a compile-time error.
//!

/// Macro for creating a [`HashMap`](::hashbrown::HashMap).
Expand All @@ -34,6 +50,7 @@
/// "de" => "Auf Wiedersehen",
/// "fr" => "Au revoir",
/// "es" => "Adios",
/// "cat" => "Adéu",
/// };
/// ```
///
Expand All @@ -45,8 +62,9 @@ macro_rules! __hb_hash_map {
};
}

/// Explicitly typed equivalent of [`hash_map!`](self::hash_map), suitable for
/// [trait object values](crate#explicitly-typed-values-for-trait-objects).
/// Explicitly typed equivalent of [`hash_map!`](self::hash_map).
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
Expand All @@ -62,6 +80,7 @@ macro_rules! __hb_hash_map {
/// "de" => &"Auf Wiedersehen",
/// "fr" => &"Au revoir",
/// "es" => &"Adios",
/// "cat" => &"Adéu",
/// };
///
/// println!("{:?}", goodbye);
Expand Down Expand Up @@ -97,6 +116,32 @@ macro_rules! __hb_hash_set {
};
}

/// Explicitly typed equivalent of [`hash_set!`](self::hash_set).
///
/// See the [explicity typed macros](crate#explicitly-typed-macros) section.
///
/// # Examples
///
/// ```rust
/// use hashbrown::HashSet;
///
/// use map_macro::hashbrown::hash_set_e;
///
/// enum Foo { A, B, C, D }
///
/// let x: HashSet<u8> = hash_set_e! { Foo::A, Foo::B, Foo::C, Foo::C, Foo::D };
///
/// assert_eq!(x.len(), 4);
/// ```
///
#[doc(hidden)]
#[macro_export]
macro_rules! __hb_hash_set_e {
{$($v: expr),* $(,)?} => {
<::hashbrown::HashSet::<_> as ::core::iter::FromIterator<_>>::from_iter([$($v as _,)*])
};
}

#[doc(inline)]
pub use __hb_hash_map as hash_map;

Expand All @@ -105,3 +150,6 @@ pub use __hb_hash_map_e as hash_map_e;

#[doc(inline)]
pub use __hb_hash_set as hash_set;

#[doc(inline)]
pub use __hb_hash_set_e as hash_set_e;
Loading
Loading