# Custom attributes
The `PartialEq`, `Eq`, `PartialOrd` and `Eq` and traits support the following attributes:

* **Container attributes**
    * [`<CmpTrait>(bound="<where-clause or empty>")`](#custom-bound)
* **Field attributes**
    * [`<CmpTrait>(bound="<where-clause or empty>")`](#custom-bound)

The `PartialEq`, `PartialOrd` and `Ord` traits also supports the following attributes:

* **Container attributes**
    * [`<CmpTrait>="feature_allow_slow_enum"`](#enumerations)
* **Field attributes**
    * [`<CmpTrait>="ignore"`](#ignoring-a-field)
    * [`<CmpTrait>(compare_with="<path>")`](#compare-with)

(These attributes are not relevant for `Eq` which is just a marker trait.)

# Enumerations

Unfortunately, there is no way for derivative to derive `PartialEq`, `PartialOrd` or `Ord` on
enumerations as efficiently as the built-in `derive(…)`
[yet][discriminant].

If you want to use derivative on enumerations anyway, you can add

```rust
#[derivative(PartialEq="feature_allow_slow_enum")]
```

to your enumeration. This acts as a “feature-gate”.

# Ignoring a field

You can use *derivative* to ignore a field when comparing:

```rust
#[derive(Derivative)]
#[derivative(PartialEq)]
struct Foo {
    foo: u8,
    #[derivative(PartialEq="ignore")]
    bar: u8,
}

assert!(Foo { foo: 0, bar: 42 } == Foo { foo: 0, bar: 7});
assert!(Foo { foo: 42, bar: 0 } != Foo { foo: 7, bar: 0});
```

# Compare with

Usually fields are compared using `==`, `PartialOrd::partial_cmp` or `Ord::cmp`. You can use an alternative comparison
function if you like:

```rust
#[derive(Derivative)]
#[derivative(PartialEq)]
struct Foo {
    foo: u32,
    #[derivative(PartialEq(compare_with="path::to::my_cmp_fn"))]
    bar: SomeTypeThatMightNotBePartialEq,
}
```

`foo` will be compared with `==` and `bar` will be compared with
`path::to::my_cmp_fn` which must have the following prototype:

| Trait        | Signature |
|--------------|-----------|
| `PartialEq`  | `fn my_cmp_fn(&T, &T) -> bool;`
| `PartialOrd` | `fn my_cmp_fn(&T, &T) -> std::option::Option<std::cmp::Ordering>;`
| `Ord`        | `fn my_cmp_fn(&T, &T) -> std::cmp::Ordering;`

# Custom bound

Usually if you derive `CmpTrait`, a `T: CmpTrait` bound is added for each type parameter `T`. You can use
override this behavior if the inferred bound is not correct for you.

Eg. comparing raw pointers does not require the type to be `Eq`, so you could
use:

```rust
#[derive(Derivative)]
#[derivative(Eq)]
struct WithPtr<T: ?Sized> {
    #[derivative(Eq(bound=""))]
    foo: *const T
}
```

See [`Default`'s documentation](./Default.md#custom-bound) for more details.

[discriminant]: https://github.com/rust-lang/rfcs/pull/1696
