anymap
Chris Morgan []
1.0.0-beta.2
Chris Morgan []
Resolve the std/hashbrown conflict situation

Big diff, but it’s mostly just whitespace changes; ignore whitespace and
it’s much smaller, though still not as tiny as it could potentially be.

Essentially, this just duplicates everything for the hashbrown variant.

It’d be possible to use generic associated types to achieve this without
the duplication, but that depends on currently-unstable features, and is
probably slightly more painful to use anyway. I’ll keep the approach in
mind for a possible version 2, but for now this is the pragmatic route.
Chris Morgan []
Remove unneeded clippy allow

I wrote this code in the short window between the lint being added and
being downgraded to pedantic.
Chris Morgan []
Revise README.md for accuracy and flow
Chris Morgan []
Rename UncheckedAnyExt, fix Extend, tweak things

The *name* UncheckedAnyExt was ending up visible in docs, but it had
become an increasingly unpleasant name. “Downcast” is suitable, though,
being private, it’s not still not perfect. But there’s no point in
making it public, as people generally can’t implement it because of
coherence rules (I tried).

Plus documentation and style changes.

As for Extend, eh, that should ideally be in a different commit, but
it’s here now, and I’m the only one working on this code base in
general, so I permit myself to be slightly lazy from time to time.
Trouble was Downcast should never have had an Any supertrait, as it was
grossly misleading, leading to type_id giving `dyn Any`’s TypeId rather
than the underlying type’s.
Chris Morgan []
chmod +x test

I had done this locally, but this particular Git repository existed on
Windows at one point so filemode was off.
Chris Morgan []
Narrow an unsafe block to the minimum

This was necessary in the days of the raw module, when inserting to the
raw map was the unsafe operation rather than getting mutable access to
the raw map, to which I have changed it now.
Chris Morgan []
1.0.0-beta.1

Not 1.0.0 after all, but let’s call it 1.0.0-beta.1 rather than 0.13.0.
Chris Morgan []
Remove Travis config (travis-ci.org has ceased)

Turns out travis-ci.org ceased building last year, and I either never
heard or had quite forgotten. I don’t care enough to sort out anything
else (I like the simple ./test script I wrote), so I’m just ditching it.

So much for the effort I put into updating this nicely today!
Chris Morgan []
Make README more approachable, give example
Chris Morgan []
Unravel another obsolete macro

With the removal of the raw module, it serves no more purpose.
Chris Morgan []
Add Entry::{or_default, and_modify}

They were stabilised in 1.28.0 and 1.27.0.
Chris Morgan []
Replace the raw module with just hash_map

When I implemented Extend<Box<A>> for Map<A>, I thought:
can I implement Extend<(TypeId, Box<A>)> for RawMap<A>,
as HashMap<K, V> implements Extend<(K, V)>?
No, I responded, for insert is unsafe,
and a trait implementation cannot be marked unsafe.
Then said I, hang on, why is insert unsafe?
For by analogy with pointers, creating a dangling pointer is safe,
it’s only dereferencing it that’s unsafe;
so too here could insertion be safe and retrieval unsafe.
Then I realised: RawMap is actually completely safe, of itself;
the reason the unsafety is needed is AsMut<RawMap<A>> for Map<A>:
that retrieval is defined as safe, so insertion need be done delicately.

And so I consulted with myself and wondered:
Would it not be better to drop AsMut,
exposing rather an `unsafe fn as_raw_mut`?
For `AsRef<RawMap<A>>` and `Into<RawMap<A>>` may yet be safe,
yet this would take RawMap towards parity with HashMap.

And yet further went I,
descending into depths unplumbed these five years,
saying unto myself:
Wherefore RawMap<A> at all?
Why not rather HashMap<TypeId, Box<A>, BuildHasherDefault<TypeIdHasher>>,
accessed freely and safely by reference or Into,
and unsafely as discussed in the previous stanza
(if I may call it such)?
Striving to understand the matter,
it was a wearisome effort,
and I could not.
I consulted with 143ee062680311ca9c2ed5b7089bb0d741bc17c0,
yet with the passage of nigh seven years it was not able to tell me
just why I had thought this might be a good idea.
For lo, those were the benighted ages before Rust 1.0.0,
though the glimmer of that bright dawn danced on the horizon
like the latter part of an arctic winter.

And so, casting away the trammels of history
I forged a new path.
For lo! had I not even then declared it
“not necessarily the final form”?
Casting RawMap away from me and clasping HashMap to my bosom,
I found the required diff in lib.rs
such a delicate thing,
so slight.
It was pleasing in my eyes, and so forthwith I decided:
hew down the unwanted abstraction,
and bind it with a band of iron and bronze,
that it may grow no more.
So need I not add more features to it,
mere shadows of the true HashMap underneath.

Oh fortunate day!
Three-hundred-odd lines removed,
(though more detailed comments offset this,
so that the end result is more like 223,)
and simplicity restored.
Well, except for this fly in the ointment:
std versus hashbrown.
Woe unto the person who calls a raw map std::collections::HashMap,
for when another comes and enables hashbrown,
the first shall crumble into nothingness and errors most distressing.
The mitigation of this is `pub type RawMap<A>`,
augmented by the very truth that,
few using this feature,
few may stumble!
Yet there are difference betwixt the twain,
seen in my cfg branching on VacantEntry and OccupiedEntry,
and this *is* a very mild violation of the principle of strictly additive features.

There ’tis: the tale of an abstraction unravelled.
Unravelled? Feels more like “not ravelled” rather than undoing ravelling.
Deravelled? Disravelled?
I shall but brand the abstraction a dead princess, as it were,
and this my pavane pour un infante défunte.

And if you, dear reader—
if reader there be of this screed that has grown rather longer than originally anticipated but also probably more entertaining if you don’t mind this sort of thing or share a similar sense of humour to me—
have aught to opine on the matter,
You know my email address.
Chris Morgan []
HashMap feature parity: impl Extend, notes on more
Chris Morgan []
no_std support

I’m quite pleased with how this has turned out.

Given the stability-despite-instability of hashbrown (that the API
surface we’re depending on hasn’t changed since 0.1.1), and the
deliberate altered SemVer guarantees for it, it was very tempting
to leave the hashbrown range open, `version = ">=0.1.1"` or at least
`version = ">=0.1.1, <1"`, but for some reason or other I ended up
deciding not to. I’m still of two minds about it, really.
Chris Morgan []
Change std to core where possible

Only one thing from std left: HashMap.
Chris Morgan []
Switch from 2015 edition to 2018

1.34 is safe for that.
Chris Morgan []
Normalise style for next release in changelog

Full sentences, past tense.

And updated the bench thing ’cos the situation has changed since I wrote
it, even though it was still completely true.
Chris Morgan []
Exclude unnecessary files from the package
Chris Morgan []
Remove obsolete items from .gitignore

Now the records are ancient.
Chris Morgan []
Add a local testing script
Chris Morgan []
Implement From, not Into
Chris Morgan []
More documentation tweaks to clarify and explain
Chris Morgan []
Drop anymap::Any in favour of std::any::Any

Casualties: Any + Sync, CloneAny + Sync. Acceptable losses.
Chris Morgan []
Flatten anymap::any out of existence

Namespaces are one honking great idea, but flat is better than nested.

anymap::raw still makes sense.
Chris Morgan []
Tweak docs, especially around safety

No semantic changes.
Chris Morgan []
Make TypeIdHasher safe, bump MSRV

Wait a few years and nice things stabilise!

• u64::from_ne_bytes([u8; 8]) is stable in 1.32.0
• TryFrom<&[u8]> for [u8; 8] is stable in 1.34.0

(There are other things I’m touching today that also require a more mild
MSRV bump, but this is the most I *need* at this time.)
Chris Morgan []
Refactor to avoid a spurious compatibility warning

Explained in the SAFETY comment. I’m not happy about *doing* this, but
it will make *using* this crate easier, since future-compatibility lints
make noise on bin crate builds, so this was polluting other people’s
code and making life harder for users.

I have traded one evil (a spurious warning) for another (unsafe code).
Chris Morgan []
Unravel the parbroken define! macro

Turns out its commenting technique was completely broken—the attributes
have to be attached to an item *inside* the macro, not outside. And
judging by https://docs.rs/anymap/0.11.0/anymap/any/trait.CloneAny.html,
it was broken from the start, and I never noticed. Sigh. Now, you get a
warning that it’s not going to work like you want. Good stuff.

Well, that macro wasn’t a great idea anyway. Doing without it ends up a
little longer, and risks inconsistent editing, but is decidedly easier
to read.
Chris Morgan []
No more bare trait objects: use `dyn Trait` syntax
Chris Morgan []
Refresh Cargo.toml, README.md

Remove superfluous things, update useful things.
Chris Morgan []
Add the BlueOak-1.0.0 license

I prefer to use BlueOak-1.0.0 now; It wasn’t around back in 2017.

There are a number of commits in this repository not made by me, all
from before Rust 1.0.0:

• f1710353a039c1d5e95d15bb54effd7cab8e047f (Robert Straw; trivial: matching std enum namespacing breakage)
• de091453093fb5139de71b085411d2fad1a52275 (Robert Straw; trivial: std enum namespacing breakage)
• 2e37f0d1aebbd0c56acd0de7b46d14cd71d3e134 (Jonathan Reem; added AnyMap::contains, which had become obvious for Rust collection parity)
• 8b30c87fe6cf514544d8bc68989631daac8aeec1 (tivek; trivial: Rust syntax change in integer literal inference)
• c9d196be5f40fb0c6e53c65fa072aea60de8c3f1 (Jonathan Reem; trivial: version bump)
• 330bc5aa1e4b1644a19b3751ee3b65c849447005 (Jonathan Reem; not creative and largely no longer present: introduced Cargo support, tweaked Makefile)
• a9b1e31b7062e42248347805cbee662efe0eb713 (Tomas Sedovic; nigh-trivial and no longer present: Collection and Mutable trait implementations)
• eecc4a4b758ae743486cfe4254cefd136f829391 (Jonathan Reem; trivial: Rust syntax change)
• d51aff506409d7ffa2de275cd4e3029a88de1e2a (Jonathan Reem; trivial: rustc lint change)
• 56113c63b028e7d215f1c16cf90d9c5d902df477 (Jonathan Reem; trivial: Rust syntax change)

All but one of these are definitely trivial, obvious, and in the context
of the project and ecosystem not creative works (⅌ copyright doctrine
definition); or else no longer present. The one arguable exception is
2e37f0d1aebbd0c56acd0de7b46d14cd71d3e134, adding AnyMap::contains, since
I hadn’t added a contains method; but its *definition* is trivial with
only one possible implementation, and subsequent to that time I did go
through and check for parity with HashMap methods, to say nothing of the
code having changed shape quite a bit since then too. Therefore I’m
content to consider it immaterial for relicensing.
Chris Morgan []
Revert "removed unsafe code in favor of explicit assert"

This reverts commit 479d756c992af132c6ba45248c65dc230c5986cf.

There’s nothing wrong with this patch, but I had never pulled this
commit to my local repository and had completely forgotten about it, and
today removed the unsafe code in a *different* direction that I like
better (`bytes.try_into().map(|bytes| u64::from_ne_bytes(bytes))`), so
reverting it so I can cleanly rebase is just easier for me!
Chris Morgan []
Merge pull request #32 from hellow554/master

removed unsafe code in favor of explicit assert
Marcel Hellwig []
removed unsafe code in favor of explicit assert
Chris Morgan []
Implement Default on Map

It was implemented on RawMap, and I’m not sure quite why it wasn’t
implemented on Map. I can’t think of any reason *not* to, though, so we
might as well.

Closes #30. Thanks to Maxwell Koo <mjkoo90@gmail.com> for the fix.
Chris Morgan []
Add a note about unsafety.
Chris Morgan []
Remove an obsolete note from the README
Chris Morgan []
Remove the `bench` Cargo feature as superfluous

A better pattern is to put benchmarks in the `benches` directory;
that way, `cargo test` won’t pick them up by default,
and so it won’t fail on the stable and beta channels.
Chris Morgan []
Add a changelog.
Chris Morgan []
Remove obsolete rust-ci docs uploading

We use docs.rs these days. No manual work in it, either. Yay!
Chris Morgan []
0.12.1
Chris Morgan []
Make clippy happy.
Chris Morgan []
Put in a bunch of #[inline] attributes on fns.

Somewhere along the path I didn’t mark some functions as `#[inline]`
which they should probably be.

Small but visible benchmark improvements, but within ε so low
confidence.
Chris Morgan []
Reduce the work for rustc in the benchmarks.

This *does* mean that they no longer function as tests, which was
deliberate, but rustc is just too slow with the assertions in there as
well. If I care, I can make variants of it that actually test. For now,
I’m sufficiently happy with it.
Chris Morgan []
Use raw pointers for downcasting, not TraitObject

This mirrors a change in mopa.
Chris Morgan []
Add more benchmarking

Including a rustc/llvm pathalogical case.
Chris Morgan []
Remove superfluous Clone bound on Entry methods.

Thanks to @Kimundi for pointing this out. I presume (without checking)
that they got added along with the CloneAny stuff by accident.

Closes #26.
Chris Morgan []
Remove now-unnecessary #[allow]s.
Chris Morgan []
Make Clippy happy.
Chris Morgan []
Keep Clippy happy.
Chris Morgan []
Fix order of ptr::copy_nonoverlapping parameters.

Clippy helped me spot this. It didn’t cause any bugs, just bad
performance as all keys would hash to 0 and thus end up in the same
bucket.
Chris Morgan []
0.12.0
Chris Morgan []
s/unstable/bench/ in travis config
Chris Morgan []
Rename "unstable" feature to "bench".

Benchmarking is the only thing that requires unstable Rust in the
library any more. Yay!
Chris Morgan []
Ungate drain iterator (stable in Rust 1.6.0).
Chris Morgan []
Ungate efficient hashing (stable in Rust 1.7.0).
Chris Morgan []
0.11.2: just fixing warnings and such.
Chris Morgan []
0.11.1: Rust update for unstable.
Chris Morgan []
Test Rust stable on Travis also.
Chris Morgan []
Make tests work on beta/stable (benchmarks can’t work).
Chris Morgan []
0.11.0: merge concurrency branch.
Chris Morgan []
Rename 'nightly' feature to 'unstable'.
Chris Morgan []
Implement Debug for Map and RawMap.
Chris Morgan []
Replace Cargo features with arcane DST magicks.

(It was a toss-up between “arcane” and “eldritch” there; “arcane” won
this time. “Eldritch”, maybe you can be it next time.)
Chris Morgan []
Implement stuff for concurrency.

This took some refactoring too for best effect.
Chris Morgan []
0.10.3: Rust beta support

This is accomplished at a certain loss of efficiency, sadly.

Add the 'nightly' feature to get things back how they were.
Chris Morgan []
0.10.2: Rust update for clone feature
Chris Morgan []
0.10.1: Rust update
Chris Morgan []
0.10.0: move Clone functionality into a feature.

No more separate Git branch for it; Cargo features fit the bill well.
Chris Morgan []
0.9.13
Chris Morgan []
Use std::convert for AnyMap -> RawAnyMap.
Chris Morgan []
Rust update.
Chris Morgan []
Substantial refactoring, exposing a raw interface.

This is not necessarily the final form, but I think it’s pretty good.
The only alteration to the public interface is the removal of the
iteration methods from `AnyMap`; they are now attached to `RawAnyMap`.

The diff appears considerably more scary than it is in actual fact due
to some comparatively unnecessary changes like the field name (from
`data` to `raw`). Really, it’s minimal.
Chris Morgan []
Remove plenty of unnecessary 'statics.
Chris Morgan []
Slight Rust update.
Chris Morgan []
Remove unused stability markers.
Chris Morgan []
0.9.12: Rust update
Chris Morgan []
0.9.11: Rust update
Chris Morgan []
0.9.10: Rust update
Chris Morgan []
0.9.9: Rust update
Chris Morgan []
0.9.8: Rust update
Chris Morgan []
0.9.7: parity with the collections API

There’s some Rust updating here too.

This entails the addition of various methods and iterator types where
appropriate, based on what’s on `HashMap`, though I doubt that people
will actually be able to make all that much use of the iterators. They’d
be of more use with a basis of a trait other than `Any`, such as might
be conveniently achieved by combining this with my MOPA crate.
(Getting a little close to HKT there, innit?)

You know, I wonder sometimes if anyone ever reads these messages after
they are written, myself included. If you have read this, please drop me
a note; I’m curious.

I’ve also gone over all the stability attributes, marking things as
appropriate.
Chris Morgan []
0.9.6

Changed the deprecated `#[deriving(…)]` to `#[derive(…)]`.

(Why not 0.9.5? I messed up, publishing the `clone` branch as 0.9.5.)
Chris Morgan []
0.9.4
Chris Morgan []
Merge pull request #14 from drbawb/feature/namespaced-enums

Use namespaced enum variants for HashMap `Entry`s
Robert Straw []
Do not re-export the `Entry` enum ...

A minor [breaking-change] as downstream users will have to import the variants
themselves, or prefix the variant with the Entry enum's namespace.
Robert Straw []
Use namespaced enum variants for the map-entry slots.
Chris Morgan []
0.9.3
Chris Morgan []
Fix a slightly erroneous comment.
Chris Morgan []
Rust update.
Chris Morgan []
tuple_indexing is no longer gated! Yay!
Chris Morgan []
Update metadata, 0.9.2.
Chris Morgan []
Rust update.
Chris Morgan []
Bump version to 0.9.1.
Chris Morgan []
Implement AnyMap.entry().
Chris Morgan []
Rust update.

This includes following the standard new semantics for `insert` and
`remove`, where they return any value that was previously present, and
renaming `find` and `find_mut` to `get` and `get_mut`. For the moment,
I’ve even provided a deprecation path! Will wonders ever cease?
Chris Morgan []
Make trait bounds more explicit.
Chris Morgan []
Can I diagnose the problem with Rust CI?
Chris Morgan []
Drop the Makefile in favour of Cargo.