Don't use string compare for A.NetClass == B.NetClass.

(or A.NetName == B.NetName, or != of either)
This commit is contained in:
Jeff Young 2023-08-21 14:51:10 +01:00
parent d150803dee
commit 3cade7fc47
2 changed files with 78 additions and 8 deletions

View File

@ -89,6 +89,76 @@ protected:
};
class PCB_NETCLASS_VALUE : public LIBEVAL::VALUE
{
public:
PCB_NETCLASS_VALUE( BOARD_CONNECTED_ITEM* aItem ) :
LIBEVAL::VALUE( wxEmptyString ),
m_item( aItem )
{};
const wxString& AsString() const override
{
const_cast<PCB_NETCLASS_VALUE*>( this )->Set( m_item->GetEffectiveNetClass()->GetName() );
return LIBEVAL::VALUE::AsString();
}
bool EqualTo( LIBEVAL::CONTEXT* aCtx, const VALUE* b ) const override
{
if( const PCB_NETCLASS_VALUE* bValue = dynamic_cast<const PCB_NETCLASS_VALUE*>( b ) )
return m_item->GetEffectiveNetClass() == bValue->m_item->GetEffectiveNetClass();
else
return LIBEVAL::VALUE::EqualTo( aCtx, b );
}
bool NotEqualTo( LIBEVAL::CONTEXT* aCtx, const LIBEVAL::VALUE* b ) const override
{
if( const PCB_NETCLASS_VALUE* bValue = dynamic_cast<const PCB_NETCLASS_VALUE*>( b ) )
return m_item->GetEffectiveNetClass() != bValue->m_item->GetEffectiveNetClass();
else
return LIBEVAL::VALUE::NotEqualTo( aCtx, b );
}
protected:
BOARD_CONNECTED_ITEM* m_item;
};
class PCB_NET_VALUE : public LIBEVAL::VALUE
{
public:
PCB_NET_VALUE( BOARD_CONNECTED_ITEM* aItem ) :
LIBEVAL::VALUE( wxEmptyString ),
m_item( aItem )
{};
const wxString& AsString() const override
{
const_cast<PCB_NET_VALUE*>( this )->Set( m_item->GetNetname() );
return LIBEVAL::VALUE::AsString();
}
bool EqualTo( LIBEVAL::CONTEXT* aCtx, const VALUE* b ) const override
{
if( const PCB_NET_VALUE* bValue = dynamic_cast<const PCB_NET_VALUE*>( b ) )
return m_item->GetNetCode() == bValue->m_item->GetNetCode();
else
return LIBEVAL::VALUE::EqualTo( aCtx, b );
}
bool NotEqualTo( LIBEVAL::CONTEXT* aCtx, const LIBEVAL::VALUE* b ) const override
{
if( const PCB_NET_VALUE* bValue = dynamic_cast<const PCB_NET_VALUE*>( b ) )
return m_item->GetNetCode() != bValue->m_item->GetNetCode();
else
return LIBEVAL::VALUE::NotEqualTo( aCtx, b );
}
protected:
BOARD_CONNECTED_ITEM* m_item;
};
LIBEVAL::VALUE* PCB_EXPR_VAR_REF::GetValue( LIBEVAL::CONTEXT* aCtx )
{
PCB_EXPR_CONTEXT* context = static_cast<PCB_EXPR_CONTEXT*>( aCtx );
@ -156,7 +226,7 @@ LIBEVAL::VALUE* PCB_EXPR_NETCLASS_REF::GetValue( LIBEVAL::CONTEXT* aCtx )
if( !item )
return new LIBEVAL::VALUE();
return new LIBEVAL::VALUE( item->GetEffectiveNetClass()->GetName() );
return new PCB_NETCLASS_VALUE( item );
}
@ -167,7 +237,7 @@ LIBEVAL::VALUE* PCB_EXPR_NETNAME_REF::GetValue( LIBEVAL::CONTEXT* aCtx )
if( !item )
return new LIBEVAL::VALUE();
return new LIBEVAL::VALUE( item->GetNetname() );
return new PCB_NET_VALUE( item );
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019-2022 KiCad Developers, see AUTHORS.TXT for contributors.
* Copyright (C) 2019-2023 KiCad Developers, see AUTHORS.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -116,21 +116,21 @@ static bool testEvalExpr( const wxString& expr, const LIBEVAL::VALUE& expectedRe
if( error )
return true;
LIBEVAL::VALUE result;
LIBEVAL::VALUE* result;
if( ok )
{
result = *ucode.Run( &context );
ok = ( result.EqualTo( &context, &expectedResult ) );
result = ucode.Run( &context );
ok = ( result->EqualTo( &context, &expectedResult ) );
}
if( expectedResult.GetType() == LIBEVAL::VT_NUMERIC )
{
BOOST_CHECK_EQUAL( result.AsDouble(), expectedResult.AsDouble() );
BOOST_CHECK_EQUAL( result->AsDouble(), expectedResult.AsDouble() );
}
else
{
BOOST_CHECK_EQUAL( result.AsString(), expectedResult.AsString() );
BOOST_CHECK_EQUAL( result->AsString(), expectedResult.AsString() );
}
return ok;