From 8f992d13e6b1fd0fc4aafe1900f99137acc73205 Mon Sep 17 00:00:00 2001 From: Martin Holters Date: Tue, 17 Jan 2023 07:14:50 +0100 Subject: [PATCH] Implement `==` (and `hash`) for `Element` So that e.g. `resistor(1000) == resistor(1000)`, which previously gave `false`. --- src/ACME.jl | 7 ++++++- test/runtests.jl | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ACME.jl b/src/ACME.jl index ffbec765..d78270d5 100644 --- a/src/ACME.jl +++ b/src/ACME.jl @@ -1,4 +1,4 @@ -# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021 Martin Holters +# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2023 Martin Holters # See accompanying license file. module ACME @@ -97,6 +97,11 @@ struct Element end end +Base.:(==)(e1::Element, e2::Element) = + all(f -> (getfield(e1, f) == getfield(e2, f))::Bool, fieldnames(Element)) +Base.hash(e::Element, h::UInt) = + foldl((h, f) -> hash(getfield(e, f), h)::UInt, fieldnames(Element); init=h) + for (n,m) in Dict(:nb => :mv, :nx => :mx, :nq => :mq, :nu => :mu) @eval ($n)(e::Element) = size(e.$m, 2) end diff --git a/test/runtests.jl b/test/runtests.jl index 169f1447..6f33609f 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,4 +1,4 @@ -# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Martin Holters +# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Martin Holters # See accompanying license file. include("checklic.jl") @@ -40,6 +40,16 @@ end @test !ACME.setlhs!(solver, zeros(3,3)) end +@testset "Element equality" begin + @test resistor(1e3) == resistor(1e3) + @test hash(resistor(1e3)) == hash(resistor(1e3)) + @test resistor(1e3) != resistor(2.2e3) + @test resistor(1) != voltagesource(1) + @test bjt(:npn) == bjt(:npn) + @test hash(bjt(:npn)) == hash(bjt(:npn)) + @test bjt(:npn) != bjt(:pnp) +end + @testset "simple circuits" begin @testset "empty circuit" begin circ = @circuit begin end