
#![deny(unsafe_code)]
#![doc(html_root_url = "https://docs.rs/ordermap/0.4/")]

//! **NOTE: the crate ordermap has been renamed with no change in functionality
//! to indexmap; please use it under its new name.**
//!
//! [`OrderMap`] is a hash table where the iteration order of the key-value
//! pairs is independent of the hash values of the keys.
//!
//! [`OrderSet`] is a corresponding hash set using the same implementation and
//! with similar properties.
//!
//! [`OrderMap`]: map/struct.OrderMap.html
//! [`OrderSet`]: set/struct.OrderSet.html

#[macro_use]
mod macros;
#[cfg(feature = "serde-1")]
mod serde;
mod util;
mod equivalent;
mod mutable_keys;

pub mod set;
pub mod map;

pub use equivalent::Equivalent;
#[allow(deprecated)]
pub use set::OrderSet;
#[allow(deprecated)]
pub use map::OrderMap;


// shared private items

/// Hash value newtype. Not larger than usize, since anything larger
/// isn't used for selecting position anyway.
#[derive(Copy, Debug)]
struct HashValue(usize);

impl HashValue {
    #[inline(always)]
    fn get(self) -> usize { self.0 }
}

impl Clone for HashValue {
    #[inline]
    fn clone(&self) -> Self { *self }
}
impl PartialEq for HashValue {
    #[inline]
    fn eq(&self, rhs: &Self) -> bool {
        self.0 == rhs.0
    }
}

#[derive(Copy, Clone, Debug)]
struct Bucket<K, V> {
    hash: HashValue,
    key: K,
    value: V,
}

impl<K, V> Bucket<K, V> {
    // field accessors -- used for `f` instead of closures in `.map(f)`
    fn key_ref(&self) -> &K { &self.key }
    fn value_ref(&self) -> &V { &self.value }
    fn value_mut(&mut self) -> &mut V { &mut self.value }
    fn key(self) -> K { self.key }
    fn key_value(self) -> (K, V) { (self.key, self.value) }
    fn refs(&self) -> (&K, &V) { (&self.key, &self.value) }
    fn ref_mut(&mut self) -> (&K, &mut V) { (&self.key, &mut self.value) }
    fn muts(&mut self) -> (&mut K, &mut V) { (&mut self.key, &mut self.value) }
}

