1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use std::hash::{Hash, Hasher};

use crate::{Number, Value};

impl Hash for Value {
    fn hash<H: Hasher>(&self, state: &mut H) {
        match &self {
            Value::Null => 0.hash(state),
            Value::Boolean(b) => b.hash(state),
            Value::String(s) => s.hash(state),
            Value::Char(c) => c.hash(state),
            Value::Number(n) => n.hash(state),
            Value::Bytes(b) => b.hash(state),
            Value::UUID(u) => u.hash(state)
        }
    }
}

impl Hash for Number {
    fn hash<H: Hasher>(&self, state: &mut H) {
        match &self {
            Number::Bit(v) => v.hash(state),
            Number::Unsigned8(n) => n.hash(state),
            Number::Signed8(n) => n.hash(state),
            Number::Unsigned16(n) => n.hash(state),
            Number::Signed16(n) => n.hash(state),
            Number::Unsigned32(n) => n.hash(state),
            Number::Signed32(n) => n.hash(state),
            Number::Unsigned64(n) => n.hash(state),
            Number::Signed64(n) => n.hash(state),
            Number::Unsigned128(n) => n.hash(state),
            Number::Signed128(n) => n.hash(state),
            Number::Float32(n) => (*n as u32).hash(state),
            Number::Float64(n) => (*n as u64).hash(state),
        }
    }
}

impl PartialEq for Number {
    fn eq(&self, other: &Self) -> bool {
        if let (Number::Bit(a), Number::Bit(b)) = (&self, &other) { a == b }
        else if let (Number::Unsigned8(a), Number::Unsigned8(b)) = (&self, &other) { a == b }
        else if let (Number::Signed8(a), Number::Signed8(b)) = (&self, &other) { a == b }
        else if let (Number::Unsigned16(a), Number::Unsigned16(b)) = (&self, &other) { a == b }
        else if let (Number::Signed16(a), Number::Signed16(b)) = (&self, &other) { a == b }
        else if let (Number::Unsigned32(a), Number::Unsigned32(b)) = (&self, &other) { a == b }
        else if let (Number::Signed32(a), Number::Signed32(b)) = (&self, &other) { a == b }
        else if let (Number::Unsigned64(a), Number::Unsigned64(b)) = (&self, &other) { a == b }
        else if let (Number::Signed64(a), Number::Signed64(b)) = (&self, &other) { a == b }
        else if let (Number::Unsigned128(a), Number::Unsigned128(b)) = (&self, &other) { a == b }
        else if let (Number::Signed128(a), Number::Signed128(b)) = (&self, &other) { a == b }
        else if let (Number::Float32(a), Number::Float32(b)) = (&self, &other) { a == b }
        else if let (Number::Float64(a), Number::Float64(b)) = (&self, &other) { a == b }
        else { false }
    }
}
impl Eq for Number {}